我想在下面的每个列表中创建一些列表:
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做了什么错误?非常感谢。
答案 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()