获得从RDATA文件特定对象(Get specific object from Rdata file

2019-10-21 04:38发布

我有一个Rdata包含各种对象文件:

 New.Rdata
  |_ Object 1  (e.g. data.frame)
  |_ Object 2  (e.g. matrix)
  |_...
  |_ Object n

当然,我可以加载,数据帧load('New.Rdata')然而,有只加载一个特定对象了该文件,并放弃其他一个聪明的办法?

Answer 1:

.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()可以指定加载到一个环境,让您不必污染全局工作空间等。



Answer 2:

您可以使用attach ,而不是load ,将数据对象附加到搜索路径,那么您可以复制一个对象,你有兴趣,然后拆开.Rdata对象。

这仍然加载一切,反而是简单的比一切都加载到全局工作区(可能覆盖的东西,你不想被覆盖),那么摆脱你不想要的一切的工作。



Answer 3:

西蒙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),而不是运行的物理内存和交换。 在节省包装可能对某些用途的替代,但是。



文章来源: Get specific object from Rdata file
标签: r object rdata