21

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

4

4 回答 4

24

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

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。可读性失败。

于 2012-11-17T18:52:35.333 回答
6

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

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

于 2017-04-24T15:58:56.657 回答
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" 
于 2012-11-17T17:37:19.080 回答
0

rrapply()在-package 中使用的另一种方法rrapply( base 的扩展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
于 2021-01-27T12:23:12.390 回答