21

リスト内のネストのレベルを決定する簡単な方法(つまり関数)はありますか?strこの情報を取得するために使用できるものがあることを私は知っています。しかし、単に結果を返す何かがありますか?そして、そのような関数を使用して、すべてのレベルのリストの名前を(再帰的に)取得できますか?

4

4 に答える 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

-package(ベースの拡張)で使用rrapply()する別のアプローチ:rrapplyrapply()

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 に答える