【问题标题】:R: turning list items into objectsR:将列表项转换为对象
【发布时间】:2011-03-06 20:46:14
【问题描述】:

我有一个手动创建的对象列表,如下所示:

rand1 <- rnorm(1e3)
rand2 <- rnorm(1e6)

myObjects <- NULL
myObjects[[1]] <-rand1
myObjects[[2]] <-rand2
names(myObjects) <- c("rand1","rand2")

我正在编写一些代码,这些代码将对象捆绑在一起并将它们放在 S3 中。然后我在 EC2 中有代码,我想获取 myObjects 列表并自动“解绑”它。在这个例子中,列表只有两个对象并且名称是已知的,但是我如何编写代码来处理任意长度和名称的列表呢?

#pseudo code
for each thing in myObjects
  thing <- myObjects[[thing]]

我不太清楚如何获取名称(myObjects)[1] 并将其转换为我将为其分配 myObjects[[1]] 内容的对象的名称。我可以处理循环,但创建每个对象有点让我挂了。我敢肯定这很简单,但我不能完全理解它。

【问题讨论】:

标签: list r


【解决方案1】:

你可以使用assign:

for(i in 1:length(myObjects)) assign(names(myObjects)[i], myObjects[[i]])

【讨论】:

  • assign()... 这就是我缺少的部分!感谢您和 Richie 为我指明了正确的方向。
  • seq_along(myObjects) 如果length(myObjects) == 0 会更安全
  • @hadley:谢谢! seq_along() 是一个很棒的发现。如下例所示:bad = for(i in 1:length(NULL)) print(i), good = for(i in seq_along(NULL)) print(i)
【解决方案2】:

扩展 Shane 的答案:

mapply(assign, names(myObjects), myObjects, MoreArgs=list(envir = globalenv())

(您可能希望将globalenv() 更改为另一个环境。)

【讨论】:

  • 关于改变环境的好主意。我应该用那个。这是一个额外的想法!
  • 在此示例中,我看到创建了对象 rand1 和 rand2,但它似乎也输出了 myObjects 对象。如果我将此 mapply() 的结果分配给一个对象,我最终会得到一个 myObjects PLUS rand1 和 rand2 的副本。有点吵,似乎效率低下。这应该是另一种形式的 apply 吗?
【解决方案3】:

attach(myObjects)

【讨论】:

  • 我基本上已经从我的词汇表中删除了 attach(),因为我发现大多数人使用它的方式会导致难以跟踪的糟糕代码。所以我什至没有想过在这种情况下使用它。但是现在你提到它,我认为这是一个非常好的解决方案。感谢您帮助我跳出小框框思考。
  • 我不认为使用附加是一个好主意。但如果你要使用它,就使用它,不要编写你自己的版本。
  • 另请参阅:with(myObjects, { ... }) 以获得更快、更安全的替代 attach
猜你喜欢
  • 2020-09-19
  • 2014-05-17
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
相关资源
最近更新 更多