从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。