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