2012-11-17 8 views
8

Czy istnieje łatwy sposób (tj. Funkcja) do określenia poziomu zagnieżdżenia na liście? Wiem, że istnieje str, za pomocą którego można uzyskać te informacje. Ale czy jest coś, co po prostu daje wynik? Czy mogę użyć takiej funkcji, aby uzyskać nazwy wszystkich poziomów alist (rekursywnie)?Ustal poziom zagnieżdżenia w R?

+1

Można spróbować 's <- (capture.output (str (mylist, nest.lev = 1)) [- 1]) ', a następnie użyj przetwarzania ciągów, aby przechwycić liczbę' ..', które rozpoczynają każdy element 's'. (Jeśli dostanę 10 minut później i nie otrzymam lepszej odpowiedzi, to sam sobie to zrobię.) –

Odpowiedz

10

Trochę funkcja rekurencyjna może zrobić dla Ciebie:

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

Jeśli masz dostał package:testthat, oto zestaw testowy:

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) 

Przeprosiny za korzystanie Lowe r-case L w nazwach zmiennych. Czytelność nie działa.

+9

+1 - Trochę krótszy będzie "głębokość <- funkcja (to) ifelse (is.list (this), 1L + max (sapply (this, depth)), 0L) ' – flodel

+0

bardzo ładne rozwiązanie! –

+0

Niezła poprawa! Przechodzi moje testy. R Code Golf ktoś? – Spacedman

2

Jeśli wszystkie elementy są nazywane, można użyć tego (z kodem 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

Możesz teraz użyć depth() z pakietu purrr!

Uwaga: obecnie funkcja jest częścią wersji rozwojowej purrr ale staną się częścią oficjalnej wersji CRAN gdy pakiet zostanie wersja wpadać