在循环中的列表中创建多个变量
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()
我想在每个列表中创建多个列表,如下所示:
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()