2012-11-17 10 views
8

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

+1

バンプなったら公式CRANバージョンの一部になるだろう - (capture.output( str(mylist、nest.lev = 1))[ - 1]) 'を実行し、' s'の各要素を開始する '..'の数を取得するために文字列処理を使用します。 (10分後にそれ以上の答えが得られない場合は、自分自身でそのショットを与えます) –

答えて

10

少し再帰関数はあなたのためにこれを行うことができます。

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

あなたがしている場合ロウを使用するための

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) 

謝罪:package:testthatだ、ここではテストセットです変数名にr-case L可読性は失敗する。

+9

+1 - 少し深くなります - 深さ 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の開発版の一部ですが、パッケージはバージョンがあなたがS < `試みることができる

関連する問題