确定R中的嵌套水平?

Mat*_*ert 15 nested r list

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

Spa*_*man 17

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

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

如果你有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)
Run Code Online (Sandbox Code Playgroud)

抱歉在变量名中使用小写字母L. 可读性失败.

  • +1 - 更短一点是`depth < - function(this)ifelse(is.list(this),1L + max(sapply(this,depth)),0L) (13认同)
  • list() 返回 -inf,快速修复: if(is.list(this) &amp;&amp; length(this) == 0){return(0)} (2认同)

Man*_*l R 7

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

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

  • 我认为它现在在 CRAN 中为 `purrr::vec_depth`,但也有 `plotrix::listDepth` (8认同)