2012-11-17 11 views
8

Esiste un modo semplice (ad esempio una funzione) per determinare il livello di annidamento nell'elenco? So che c'è lo str che può essere usato per ottenere queste informazioni. Ma c'è qualcosa che restituisce semplicemente il risultato? E posso usare questa funzione per ottenere i nomi di tutti i livelli di alist (in modo ricorsivo)?Determina il livello di nidificazione in R?

+1

Si potrebbe provare 's <- (capture.output (str (mylist, nest.lev = 1)) [- 1]) 'e quindi usa l'elaborazione della stringa per catturare il numero di' ..'s che inizia ogni elemento di 's'. (Se ottengo 10 minuti più tardi e non c'è risposta migliore per allora, me ne occuperò io stesso.) –

risposta

10

Un po funzione ricorsiva può fare questo per voi:

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

Se hai ha package:testthat, ecco una serie di test:

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) 

Ci scusiamo per l'utilizzo di Lowe r-case L nei nomi delle variabili. Fallimento della leggibilità.

+9

+1 - Un po 'più breve sarebbe 'depth <- function (this) ifelse (is.list (this), 1L + max (sapply (this, depth)), 0L) ' – flodel

+0

soluzione molto bella! –

+0

Bel miglioramento! Passa i miei test Codice R Golf chiunque? – Spacedman

2

Se tutti gli elementi sono chiamati, si potrebbe usare questo (dal codice di 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

Ora è possibile utilizzare depth() dal pacchetto purrr!

Nota: attualmente la funzione fa parte della versione di sviluppo di purrr ma entreranno a far parte della versione ufficiale CRAN volta che il pacchetto ottiene una versione urto

Problemi correlati