【问题标题】:Determine level of nesting in R?确定R中的嵌套级别?
【发布时间】:2012-11-06 03:20:09
【问题描述】:

是否有一种简单的方法(即函数)来确定列表中的嵌套级别? 我知道有str 可用于获取此信息。但是有什么东西可以简单地返回结果吗?我可以使用这样的函数来获取所有级别的 alist 的名称(递归)吗?

【问题讨论】:

  • 您可以尝试s <- (capture.output(str(mylist, nest.lev=1))[-1]),然后使用字符串处理来捕获启动s 的每个元素的..s 的数量。 (如果我在 10 分钟后得到,到那时没有更好的答案,我会自己试一试。)

标签: r list nested


【解决方案1】:

如果所有元素都被命名,你可以使用这个(来自unlist的代码):

mylist <- list(a=list(x=1),b=list(c=list(y=c(2,3)),d=c("a","b")))
names(.Internal(unlist(mylist, TRUE, TRUE)))
#[1] "a.x"    "b.c.y1" "b.c.y2" "b.d1"   "b.d2" 

【讨论】:

    【解决方案2】:

    一个小递归函数可以为你做到这一点:

    depth <- function(this,thisdepth=0){
      if(!is.list(this)){
        return(thisdepth)
      }else{
        return(max(unlist(lapply(this,depth,thisdepth=thisdepth+1))))    
      }
    }
    

    如果你有package:testthat,这里有一个测试集:

    l1=list(1,2,3)
    l2=list(1,2,l1,4)
    l3=list(1,l1,l2,5)
    
    require(testthat)
    expect_equal(depth(l1),1)
    expect_equal(depth(l2),2)
    expect_equal(depth(l3),3)
    

    对于在变量名中使用小写 L 表示歉意。可读性失败。

    【讨论】:

    • +1 -- 更短一点是depth &lt;- function(this) ifelse(is.list(this), 1L + max(sapply(this, depth)), 0L)
    • 不错的改进!通过我的测试。 R代码高尔夫有人吗?
    • 谢谢大家。的确很好。对此没有基本解决方案,我感到有些惊讶。
    • list() 返回 -inf,快速修复:if(is.list(this) && length(this) == 0){return(0)}
    【解决方案3】:

    您现在可以使用purrr 包中的depth()

    注意:目前该功能是purrr的开发版本的一部分,但一旦包获得版本凹凸,它将成为官方CRAN版本的一部分

    【讨论】:

    • 我认为它现在在 CRAN 中为 purrr::vec_depth,但也有 plotrix::listDepth
    • listDepth 已从版本 3.8-1 中的 plotrix 包中删除。但是为purrr::vec_depth +1,可以完成工作。
    【解决方案4】:

    rrapply-package 中使用rrapply() 的另一种方法(基础rapply() 的扩展):

    library(rrapply)
    
    l1 <- list(1, 2, 3)
    l2 <- list(1, 2, l1, 4)
    l3 <- list(1, l1, l2, 5)
    
    max(rrapply(l1, f = function(x, .xpos) length(.xpos), how = "unlist"))
    #> [1] 1
    max(rrapply(l2, f = function(x, .xpos) length(.xpos), how = "unlist"))
    #> [1] 2
    max(rrapply(l3, f = function(x, .xpos) length(.xpos), how = "unlist"))
    #> [1] 3
    

    【讨论】:

      猜你喜欢
      • 2014-04-04
      • 2020-11-04
      • 2018-09-21
      • 2020-10-29
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2016-06-21
      相关资源
      最近更新 更多