【问题标题】:Load a .rda file and iterate over its objects加载 .rda 文件并遍历其对象
【发布时间】:2019-09-02 12:37:12
【问题描述】:

我加载了一个 rda 文件,它基本上是一个数据帧列表。 如何迭代对象?

>load(data)
>attach(data)
 The following objects are masked _by_ .GlobalEnv:

GSE109597, GSE18897, GSE32575, GSE53232, GSE55205, GSE69039,
GSE83223, GSE87493, GSE98895
> R » objects()
[1] "GSE109597" "GSE18897"  "GSE32575"  "GSE53232"  "GSE55205"  "GSE69039" 
[7] "GSE83223"  "GSE87493"  "GSE98895" 

【问题讨论】:

  • data 是 rda 文件的路径吗? load() 命令将返回一个向量,其中包含所有已加载对象的名称。您可以使用mget() 获取所有这些对象的列表:objs <- load(data); myobjs <- mget(objs)。我不鼓励您使用attach()。这不是一个很好的做法,看起来您可能已经做了几次,但没有正确调用 detach(),因此会出现警告消息。

标签: r rda


【解决方案1】:

两个想法:

  1. 显式加载到一个新的空环境中,然后在那里处理它们:

    e <- new.env(parent = emptyenv())
    load(filename, envir = e)
    out <- eapply(e, function(x) {
      # do something with x
    })
    
  2. ?load,它返回一个“创建的对象名称的字符向量,不可见”。如果您捕获(不可见)矢量,您应该能够执行以下操作:

    nms <- load(data)
    for (nm in nms) {
      x <- get(nm)
      # do something with x
      # optional, save it back with assign(nm, x)
    }
    # or to capture all data into a list (similar to bullet 1 above)
    out <- lapply(lapply(nms, get), function(x) {
      # do something with x
    })
    

出于以下几个原因,我更喜欢第一个(基于环境的)解决方案:

  • 永远不会覆盖.GlobalEnv 中的任何内容...在经历了不可重现的问题的艰难历程之后,这对我来说意义重大
  • 它鼓励类似列表的做事方式,当.rda 文件中的大多数或所有对象都是相同的“事物”(例如,框架、列表)并且我计划执行相同的操作时更重要给他们每个人
  • 如果对数据来源​​有任何疑问,它不会弄乱我的任何命名空间或全局环境

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2019-08-16
    • 2016-12-08
    • 2021-12-05
    • 2014-04-08
    • 2015-11-10
    • 2018-08-04
    • 2014-07-16
    相关资源
    最近更新 更多