动态为深层嵌套列表分配值

时间:2019-09-26 09:02:21

标签: r list recursion dynamic reflection

我有一个向量字符串,例如

> cc <- c("a", "b", "c")
> cc
[1] "a" "b" "c"

...并且我有一个结构类似的列表:

> ll <- list("a" = list("b" = list("c" = "hola")))
> ll
$a
$a$b
$a$b$c
[1] "hola"

使用ll动态访问cc的元素的最简单方法是什么,以便我可以重新分配列表的值而不建立新列表?基本上,我想访问引用 ll$a$b$c,而不是它的值。

对此进行硬编码,我们将使用以下语法:

ll[[cc[1]]][[cc[2]]][[cc[3]]] <- ... # or
ll[["a"]][["b"]][["c"]] <- ... # or
ll$a$b$c <- ...

...这让我觉得我想要一个applylapply,但这不是简单的lapply(cc, ...),因为这不会递归地将选择应用于ll 。相反,它将执行以下操作:

ll[c[1]] <- ...
ll[c[2]] <- ...
ll[c[3]] <- ...

所以我认为我需要使用Reduce()。因为从本质上讲,我想做的是将函数应用于变量,然后将函数应用于结果,然后将函数应用于结果,等等:

temp <-   ll[[c[1]]]
temp <- temp[[c[2]]]
temp <- temp[[c[3]]]
...

但是我不确定这也行不通,因为我们没有在ll[[c[1]]]中保存对temp的引用,而是在保存其值(第二行应该引发错误)

我感到解决方案将涉及Reduce,将列表访问函数称为`[[`,并且可能称为do.call(),但是我迷路了。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

只需使用:

ll[[cc]]
#[1] "hola"

这不是基本[[运算符的常用用法,但对我来说,这恰恰是您所追求的。

?"[["中,“递归(类似列表)对象”部分:

  

‘[[’可以递归应用于列表,因此如果单个        索引“ i”是长度为“ p”的向量,“ alist [[i]]”等价于        “ alist [[i1]] ... [[ip]]”提供除最终索引外的所有内容        产生一个列表。

当然,您也可以使用它来重新分配值:

ll[[cc]] <- "hello"
ll
#$a
#$a$b
#$a$b$c
#[1] "hello"