从Rdata文件中获取特定对象

Seb*_*Seb 50 r object rdata

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

 New.Rdata
  |_ Object 1  (e.g. data.frame)
  |_ Object 2  (e.g. matrix)
  |_...
  |_ Object n
Run Code Online (Sandbox Code Playgroud)

当然我可以加载数据框load('New.Rdata'),但是,是否有一种智能方法只从该文件中加载一个特定对象并丢弃其他对象?

Sim*_*nek 69

.RData文件没有索引(内容被序列化为一个大型的pairlist).你可以通过一种方式来浏览一下pairlist并只分配你喜欢的条目,但这并不容易,因为你无法在R级别进行.

但是,您可以简单地将.RData文件转换为延迟加载数据库,该数据库分别序列化每个条目并创建索引.好处是加载将是按需的:

# convert .RData -> .rdb/.rdx
e = local({load("New.RData"); environment()})
tools:::makeLazyLoadDB(e, "New")
Run Code Online (Sandbox Code Playgroud)

加载数据库然后只加载索引而不加载内容.内容在使用时加载:

lazyLoad("New")
ls()
x # if you had x in the New.RData it will be fetched now from New.rdb
Run Code Online (Sandbox Code Playgroud)

就像load()你可以指定一个加载的环境,所以你不需要污染全局工作区等.

  • 这些功能变得不那么内部的可能性有多大? (9认同)

Gre*_*now 16

您可以使用attach而不是load将数据对象附加到搜索路径,然后您可以复制您感兴趣的一个对象并分离.Rdata对象.

这仍然可以加载所有内容,但是比将所有内容加载到全局工作区(可能会覆盖您不想覆盖的内容)然后删除您不想要的所有内容更简单.

  • 这个答案很好但是通过一个例子可以更完整,因为从搜索路径中分离.RData对象并不直观.从`someFile.RData`中检索`someObj`的示例:`attach('someFile.RData'); someObj < - someObj; 分离( '文件:someFile.RData')` (8认同)
  • @C8H10N4O2,你的例子很好(而且非常明确)。但是,如果您在默认位置 (2) 附加并且在调用 detach 之前不附加任何其他内容,则默认值有效,您可以不带任何参数调用 `detach()`,它将分离文件。这更快更简单;你的方法更安全。 (2认同)

Mar*_*ars 5

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
Run Code Online (Sandbox Code Playgroud)

我猜这是由于 R 的当前实现的限制(我有 2.15.2)而不是物理内存和交换用完。但是,saves包可能是某些用途的替代方案。

  • 这更多的是扩展评论而不是答案。 (2认同)

GGA*_*son 5

函数对于提取单个对象而不加载 RData 文件中的所有内容非常有用。

extractorRData <- function(file, object) {
      #' Function for extracting an object from a .RData file created by R's save() command
      #' Inputs: RData file, object name
      E <- new.env()
      load(file=file, envir=E)
      return(get(object, envir=E, inherits=F))
    }
Run Code Online (Sandbox Code Playgroud)

请参阅此处的完整答案。/sf/answers/4617484581/