2012-11-17 60 views
8

有没有简单的方法(即函数)来确定列表中的嵌套级别? 我知道有str可用于获取此信息。但是有没有简单地回报结果?我可以使用这样的函数来获取各级alist(递归)的名字吗?如果你已经确定R中嵌套的级别?

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

+1

你可以尝试单曲< - (capture.output( str(mylist,nest.lev = 1))[ - 1])',然后使用字符串处理来捕获''''的数量来开始每个's'的元素。 (如果我在10分钟后得到答案,那么我就会自己给出一个答案。) –

回答

10

小递归函数可以为你做这个得到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) 

道歉使用罗威r变量名称中的L。可读性失败。

+9

+1 - 稍微缩短一点就是深度< - function(this)ifelse(is.list(this ),1L + max(sapply(this,depth)),0L)' – flodel

+0

非常好的解决方案! –

+0

不错的改进!通过我的测试。 R代码高尔夫任何人? – Spacedman

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" 
0

您现在可以使用purrr包装中的​​!

注:目前该功能的purrr开发版本的一部分,但将成为正式版本CRAN一旦封装部分被一个版本撞