我有一个向量字符串,例如
> 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 <- ...
...这让我觉得我想要一个apply
或lapply
,但这不是简单的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()
,但是我迷路了。有什么想法吗?
答案 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"