我有一个Rdata
包含各种对象文件:
New.Rdata
|_ Object 1 (e.g. data.frame)
|_ Object 2 (e.g. matrix)
|_...
|_ Object n
当然,我可以加载,数据帧load('New.Rdata')
然而,有只加载一个特定对象了该文件,并放弃其他一个聪明的办法?
我有一个Rdata
包含各种对象文件:
New.Rdata
|_ Object 1 (e.g. data.frame)
|_ Object 2 (e.g. matrix)
|_...
|_ Object n
当然,我可以加载,数据帧load('New.Rdata')
然而,有只加载一个特定对象了该文件,并放弃其他一个聪明的办法?
.RData文件没有索引(内容序列化作为一个大的成对列表)。 你可以砍的方式去通过成对列表,并指定只有你喜欢的项目,但因为你不能将R级这样做,这并不容易。
但是,您可以在.RData文件简单地转换成单独序列化的每个条目,并创建索引的延迟加载数据库。 这种做法的好处是,装载将点播:
# convert .RData -> .rdb/.rdx
e = local({load("New.RData"); environment()})
tools:::makeLazyLoadDB(e, "New")
加载数据库然后只加载索引而不是内容。 内容加载,因为它们被使用:
lazyLoad("New")
ls()
x # if you had x in the New.RData it will be fetched now from New.rdb
只是像load()
可以指定加载到一个环境,让您不必污染全局工作空间等。
您可以使用attach
,而不是load
,将数据对象附加到搜索路径,那么您可以复制一个对象,你有兴趣,然后拆开.Rdata对象。
这仍然加载一切,反而是简单的比一切都加载到全局工作区(可能覆盖的东西,你不想被覆盖),那么摆脱你不想要的一切的工作。
西蒙Urbanek的答案是非常,非常好。 一个缺点是,它似乎并没有工作,如果要保存的对象太大:
tools:::makeLazyLoadDB(
local({
x <- 1:1e+09
cat("size:", object.size(x) ,"\n")
environment()
}), "lazytest")
size: 4e+09
Error: serialization is too large to store in a raw vector
我猜,这是由于目前实施的R的限制(我有2.15.2),而不是运行的物理内存和交换。 在节省包装可能对某些用途的替代,但是。