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

Create a number of variables within a list within loops

我想在每个列表中创建多个列表,如下所示:

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 我做错了什么?非常感谢。

我可以提出一个 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.

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

library(plyr)

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

#> A
#$X
#list()

#$Y
#list()

#$Z
#list()