使用深度名称向量作为索引替换嵌套列表

the*_*ail 3 nested r list assign

拿一个简单的嵌套列表L

L <- list(lev1 = list(lev2 = c("bit1","bit2")), other=list(yep=1))
L
#$lev1
#$lev1$lev2
#[1] "bit1" "bit2"
#
# 
#$other
#$other$yep
#[1] 1
Run Code Online (Sandbox Code Playgroud)

还有一个向量,它提供了我要从中选择的每个部分的一系列深度L

sel <- c("lev1","lev2")
Run Code Online (Sandbox Code Playgroud)

索引时我想要的结果是:

L[["lev1"]][["lev2"]]
#[1] "bit1" "bit2"
Run Code Online (Sandbox Code Playgroud)

我可以这样概括Reduce

Reduce(`[[`, sel, init=L)
#[1] "bit1" "bit2"
Run Code Online (Sandbox Code Playgroud)

现在,我想扩展此逻辑以进行替换,如下所示:

L[["lev1"]][["lev2"]] <- "new val"
Run Code Online (Sandbox Code Playgroud)

,但是对于如何生成递归[[选择,我确实感到很困惑,这将使我也可以为其分配。

Ony*_*mbu 5

你为什么不能做

L[[sel]] <- "new val"
Run Code Online (Sandbox Code Playgroud)

那么,如果你想要做的很长的路要走,那么你仍然可以使用Reduce具有modifyList或者你可以使用[[<-。这是一个示例modifyList

modifyList(L,Reduce(function(x,y)setNames(list(x),y),rev(sel),init = "new val"))
$lev1
$lev1$lev2
[1] "new val"


$other
$other$yep
[1] 1
Run Code Online (Sandbox Code Playgroud)