Is there an easy way (i.e. a function) to determine the level of nesting in list?
I know there is str
which can be used to get this information. But is there something that simply gives back the result? And can I use such a function to get the names of all levels of alist (recursively) ?
A little recursive function can do this for you:
depth <- function(this,thisdepth=0){
if(!is.list(this)){
return(thisdepth)
}else{
return(max(unlist(lapply(this,depth,thisdepth=thisdepth+1))))
}
}
If you've got package:testthat
, here's a test set:
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)
Apologies for using lower-case L in variable names. Readability fail.
You can now use depth()
from the purrr
package!
Note: currently the function is part of the development version of purrr
but will become part of the official CRAN version once the package gets a version bump
If all elements are named, you could use this (from the code of 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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With