【问题标题】:Replacing nested list using a vector of names of depths as an index使用深度名称向量作为索引替换嵌套列表
【发布时间】:2020-03-21 08:26:19
【问题描述】:

取一个简单的嵌套列表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

还有一个向量,为我想从L中选择的每个部分提供一系列深度:

sel <- c("lev1","lev2")

索引时我想要的结果是:

L[["lev1"]][["lev2"]]
#[1] "bit1" "bit2"

我可以像这样使用Reduce 进行概括:

Reduce(`[[`, sel, init=L)
#[1] "bit1" "bit2"

现在,我想扩展这个逻辑来做一个替换,像这样:

L[["lev1"]][["lev2"]] <- "new val"

,但我真的很困惑如何生成递归[[ 选择,然后我也可以分配给它。

【问题讨论】:

    标签: r list nested assign


    【解决方案1】:

    您可以通过连接所有内容来 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 日创建

    【讨论】:

      【解决方案2】:

      你为什么不能这样做

      L[[sel]] <- "new val"
      

      如果你想走很长的路 您仍然可以将ReducemodifyList 一起使用,或者您可以使用[[&lt;-。这是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[[sel]] 会按预期工作。
      • 来自?list - "'[[' 可以递归地应用于列表,因此如果单个索引'i'是长度为'p'的向量,'alist[[ i]]' 等价于 'alist[[i1]]...[[ip]]' 提供除了最终索引结果之外的所有结果。"
      • 唯一的区别似乎是L &lt;- list(); L[[c("lev1","lev2")]] &lt;- 1 会出错,而L &lt;- list(); L[["lev1"]][["lev2"]] &lt;- 1 按预期工作。
      • @thelatemail 当你有一个空列表时,你不是REPLACING 而是CREATING 一个新值,这就是它会出错的原因。但是替换后,您可以按照文档中的说明直接使用它
      • 是的。只是认为值得注意的区别。
      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 2016-04-03
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      相关资源
      最近更新 更多