从Rdata文件中获取特定的对象
我有一个包含各种对象的Rdata
文件:
New.Rdata |_ Object 1 (eg data.frame) |_ Object 2 (eg matrix) |_... |_ Object n
当然,我可以通过load('New.Rdata')
加载数据框,但是,是否有一种聪明的方式来从这个文件中只加载一个特定的对象,并放弃其他的?
.RData文件没有索引(内容被序列化为一个大的pairs)。 你可以通过一个方法来通过pairlist,只分配你喜欢的条目,但这并不容易,因为你不能在R级。
但是,您可以简单地将.RData文件转换为延迟加载数据库,该数据库将分别序列化每个条目并创build一个索引。 好的是加载将是按需的:
# 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
将数据对象附加到searchpath,然后您可以复制您感兴趣的一个对象并分离.Rdata对象。
这仍然会加载所有内容,但是与将全部内容加载到全局工作空间(可能覆盖不想覆盖的内容)然后清除所有不需要的内容相比,更简单。
Simon 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)的当前实现的限制,而不是用完了物理内存和交换。 然而, 保存包可能是某些用途的替代scheme。