确定R中的嵌套水平?

时间:2012-11-17 17:21:44

标签: r list nested

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

4 个答案:

答案 0 :(得分:14)

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

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 :(得分:2)

如果所有元素都已命名,您可以使用它(来自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 :(得分:0)

rrapply() 包中使用 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

答案 3 :(得分:-1)

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

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