R 如何使用变量名创建未知深度的列表?

R 如何使用变量名创建未知深度的列表?,r,list,R,List,我想创建一个未知深度的列表 这与我的另一个问题()有关,但我认为这可能值得发表自己的文章 在犯了一些错误之后,我发现可以通过以下方式创建这样一个列表: rtn = list() rtn$a$f$t=6 rtn 这给出了深度4的列表(根据purrr:vec_depth(rtn)),这正是预期的输出 不幸的是,当我尝试使用名称时,rtn[[“a”][[“f”][[“t”]]=“6”不起作用: 这里,rtn是一个列表,其中rtn$a是一个简单的向量,“t”索引被删除 阅读?Extract,我注意到有

我想创建一个未知深度的列表

这与我的另一个问题()有关,但我认为这可能值得发表自己的文章

在犯了一些错误之后,我发现可以通过以下方式创建这样一个列表:

rtn = list()
rtn$a$f$t=6
rtn
这给出了深度4的列表(根据
purrr:vec_depth(rtn)
),这正是预期的输出

不幸的是,当我尝试使用名称时,
rtn[[“a”][[“f”][[“t”]]=“6”
不起作用:

这里,
rtn
是一个列表,其中
rtn$a
是一个简单的向量,“t”索引被删除


阅读
?Extract
,我注意到有一章是关于“递归(类似列表的)对象”的,它说明了
[之间的区别。您可以使用
eval
parse
创建具有变量名的未知深度列表

rtn=list()

rtn$a$f$t解决此类问题的简单方法是使用递归函数。一种方法是(完全编辑的原始帖子):

在更新现有列表时对其进行测试:

rtn = list()
rtn$a$f$t = 6
rtn$a$j$r = 19
rtn$b$r = 3
rtn$b$v$f$w = 42
rtn$c$e = 11

rtn2 = ff(c("a", "f", "t"), 6)
rtn2 = ff(c("a", "j", "r"), 19, rtn2)
rtn2 = ff(c("b", "r"), 3, rtn2)
rtn2 = ff(c("b", "v", "f", "w"), 42, rtn2)
rtn2 = ff(c("c", "e"), 11, rtn2)

identical(rtn, rtn2)
#[1] TRUE

这很有趣,有时可能很有用,但我认为它缺乏灵活性。我可以编写
rtn$a$f$t=6;rtn$a$j$r=19
来更新列表,但使用这个递归函数,我只能编写一个值。@DanChaltiel:你说得对;我忽略了更新现有列表的情况。我进行了快速编辑;似乎是b除非我漏掉了什么,否则我现在就对了。
$a
  f 
"6"
`[[<-`=`$<-` #yuck...
rtn = list()
rtn$a$f$t=6
rtn[["a"]][["f"]][["t"]]="6" #this works!
xx="b"
rtn[[xx]][["f"]][["t"]]="6" #but this does not: unexpectedly it creates a level "xx" instead of "b"
rm(`[[<-`) #better safe than sorry
rtn
rtn = list()
rtn$a$f$t  <- 6
rtn[[c("a","f","t")]] <- 7
xx="b"
eval(parse(text=paste0("rtn$",xx,"$f$t <- 8")))
rtn
#$a
#$a$f
#$a$f$t
#[1] 7

#$b
#$b$f
#$b$f$t
#[1] 8
ff = function(nms, val, init = list())
{
  if(!length(nms)) return(val)
  init[[nms[1]]] = c(init[[nms[1]]], ff(nms[-1], val))
  return(init)
}
rtn = list()
rtn$a$f$t = 6
rtn$a$j$r = 19
rtn$b$r = 3
rtn$b$v$f$w = 42
rtn$c$e = 11

rtn2 = ff(c("a", "f", "t"), 6)
rtn2 = ff(c("a", "j", "r"), 19, rtn2)
rtn2 = ff(c("b", "r"), 3, rtn2)
rtn2 = ff(c("b", "v", "f", "w"), 42, rtn2)
rtn2 = ff(c("c", "e"), 11, rtn2)

identical(rtn, rtn2)
#[1] TRUE