【问题标题】:Create a number of variables within a list within loops在循环内的列表中创建多个变量
【发布时间】:2015-01-21 06:23:21
【问题描述】:

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

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

【问题讨论】:

  • 如果一个答案适合你,你能关闭这个话题吗?或者说为什么一个答案不令人满意?
  • @ColonelBeauvel:谢谢!抱歉,我该如何关闭话题?
  • 如果答案适合您,您可以检查与答案相关的标记!这会对已回答类别中的问题进行排名。

标签: r list eval assign


【解决方案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

对于您想要的第一种方法(影响函数内的全局环境),您需要提及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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多