R:将列表项转换为对象

JD *_*ong 6 r list

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

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

myObjects <- NULL
myObjects[[1]] <-rand1
myObjects[[2]] <-rand2
names(myObjects) <- c("rand1","rand2")
Run Code Online (Sandbox Code Playgroud)

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

#pseudo code
for each thing in myObjects
  thing <- myObjects[[thing]]
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何取名(myObjects)[1]并将其转换为一个对象的名称,我将为其分配myObjects [[1]]的内容.我可以处理循环,但创建每个对象有点让我挂起.我确信这很简单,但我不能理解它.

Sha*_*ane 11

你可以使用assign:

for(i in 1:length(myObjects)) assign(names(myObjects)[i], myObjects[[i]])
Run Code Online (Sandbox Code Playgroud)

  • 如果`length(myObjects)== 0`,`seq_along(myObjects)`会更安全一些 (4认同)

had*_*ley 6

attach(myObjects)

  • 我不认为使用附件是个好主意.但是,如果您要使用它,请使用它,不要编写自己的版本. (4认同)
  • 我基本上从我的词汇表中选择了attach()因为我发现大多数人使用它的方式导致有点难以跟踪的糟糕代码.所以我甚至没想过在这种情况下使用它.但是现在你提到它,我认为这是一个非常好的解决方案.谢谢你帮我思考一下我的小盒子. (2认同)
  • 另请参阅:`with(myObjects,{...})`用于更快速,更安全地替换`attach`. (2认同)

Ric*_*ton 5

扩大Shane的答案:

mapply(assign, names(myObjects), myObjects, MoreArgs=list(envir = globalenv())
Run Code Online (Sandbox Code Playgroud)

(您可能希望更改globalenv()为其他环境.)