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