在循环内的列表中创建许多变量

时间:2015-01-21 06:23:21

标签: r list eval assign

我想在下面的每个列表中创建一些列表:

A = list()
B = list()
C = list()
D = list()
A$X = list()
A$Y = list()
A$Z = list()
# ...
D$X = list()
D$Y = list()
D$Z = list()

我没有输入长列表,而是使用下面的代码,但它并没有完全有效:

strVar = LETTERS[1:4]
strGrp = LETTERS[24:26]
for (i in 1:length(strVar)) {
  assign(strVar[i],list())
  for (j in 1:length(strGrp)) {
    # Option 1: Doesn't work and work to make it work along the line
    assign(paste0(strVar[i],'[[\'',strGrp[j],'\']]'),list())
    # Option 2: Does work but want to avoid using eval(parse)
    eval(parse(text=paste0(strVar[i],'$',strGrp[j],'=list()')))       
  }
}

选项1给出一个名为A [[' X']]的变量,而选项2给出变量A这是一个列表,而在A中,有变量X,Y和Z这就是我想要的。

我对选项1做了什么错误?非常感谢。

1 个答案:

答案 0 :(得分:0)

我可以提出assign的解决方案,但这非常糟糕,因为你想要没有副作用的功能(不是以偷偷摸摸的方式修改全局环境而是返回结果) 。

不要忘记R范式是通过值传递的!

这是一个采用公平方法的解决方案:

library(magrittr)

res = setNames(replicate(3, list()), strGrp) %>% 
    list %>% 
    replicate(4, .) %>% 
    setNames(strVar)

#> res$A
#$X
#list()

#$Y
#list()

#$Z
#list()
如果你想保持l_plyr为基数,

lapply可以被R取代。

对于您想要的第一种方法(影响函数中的全局环境),您需要在envir中提及您在其中创建变量的assign。这是一种方法:

library(plyr)

l_ply(strVar, function(u){
    assign(u, setNames(replicate(3, list()), strGrp), envir=.GlobalEnv)
})

#> A
#$X
#list()

#$Y
#list()

#$Z
#list()