使用深度名称向量作为索引替换嵌套列表
Replacing nested list using a vector of names of depths as an index
取一个简单的嵌套列表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
还有一个向量,为我想要 select 来自 L
的每个部分提供一系列深度:
sel <- c("lev1","lev2")
索引时我想要的结果是:
L[["lev1"]][["lev2"]]
#[1] "bit1" "bit2"
我可以像这样使用 Reduce
概括一下:
Reduce(`[[`, sel, init=L)
#[1] "bit1" "bit2"
现在,我想扩展这个逻辑来做一个替换,像这样:
L[["lev1"]][["lev2"]] <- "new val"
,但我真的很困惑如何生成递归 [[
selection,这样我也可以分配给它。
您可以 eval()
和 parse()
通过连接所有内容。我不确定你能做到多普遍:
``` r
L <- list(lev1 = list(lev2 = c("bit1","bit2")), other=list(yep=1))
L
#> $lev1
#> $lev1$lev2
#> [1] "bit1" "bit2"
#>
#>
#> $other
#> $other$yep
#> [1] 1
sel <- c("lev1","lev2")
eval(parse(text = paste0('L', paste0('[["', sel, '"]]', collapse = ''), '<- "new val"')))
L
#> $lev1
#> $lev1$lev2
#> [1] "new val"
#>
#>
#> $other
#> $other$yep
#> [1] 1
由 reprex package (v0.3.0)
于 2019-11-25 创建
为什么你不能做
L[[sel]] <- "new val"
好吧,如果你想走很长的路那么
您仍然可以将 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
取一个简单的嵌套列表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
还有一个向量,为我想要 select 来自 L
的每个部分提供一系列深度:
sel <- c("lev1","lev2")
索引时我想要的结果是:
L[["lev1"]][["lev2"]]
#[1] "bit1" "bit2"
我可以像这样使用 Reduce
概括一下:
Reduce(`[[`, sel, init=L)
#[1] "bit1" "bit2"
现在,我想扩展这个逻辑来做一个替换,像这样:
L[["lev1"]][["lev2"]] <- "new val"
,但我真的很困惑如何生成递归 [[
selection,这样我也可以分配给它。
您可以 eval()
和 parse()
通过连接所有内容。我不确定你能做到多普遍:
``` r
L <- list(lev1 = list(lev2 = c("bit1","bit2")), other=list(yep=1))
L
#> $lev1
#> $lev1$lev2
#> [1] "bit1" "bit2"
#>
#>
#> $other
#> $other$yep
#> [1] 1
sel <- c("lev1","lev2")
eval(parse(text = paste0('L', paste0('[["', sel, '"]]', collapse = ''), '<- "new val"')))
L
#> $lev1
#> $lev1$lev2
#> [1] "new val"
#>
#>
#> $other
#> $other$yep
#> [1] 1
由 reprex package (v0.3.0)
于 2019-11-25 创建为什么你不能做
L[[sel]] <- "new val"
好吧,如果你想走很长的路那么
您仍然可以将 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