2015-03-24 17 views
10

Supponiamo che io ho il seguente elenco, che rappresenta una struttura di directory:creare un elenco ricorsivo da un elenco di vettori

> pages <- list("about.Rmd", "index.Rmd", c("stats", "index.Rmd"), c("stats", "substats", "index.Rmd")) 
> pages 
[[1]] 
[1] "about.Rmd" 

[[2]] 
[1] "index.Rmd" 

[[3]] 
[1] "stats"  "index.Rmd" 

[[4]] 
[1] "stats"  "substats" "index.Rmd" 

mi piacerebbe creare una versione ricorsiva di questa lista, qualcosa che avrebbe simile a questa:

> rpages <- list("about.Rmd", "index.Rmd", stats=list("index.Rmd", substats=list("index.Rmd"))) 
> rpages 
[[1]] 
[1] "about.Rmd" 

[[2]] 
[1] "index.Rmd" 

$stats 
$stats[[1]] 
[1] "index.Rmd" 

$stats$substats 
$stats$substats[[1]] 
[1] "index.Rmd" 

ho provato diversi modi per farlo, ma temo ora sto perso in un mare di lapply e sapply.

Grazie in anticipo per qualsiasi suggerimento.

risposta

8

Credo che questo lo fa:

build_list = function(item, res) { 
    if (length(item) > 1) { 
    res[[item[1]]] = build_list(tail(item, -1), res[[item[1]]]) 
    } else { 
    res = c(res, list(item)) 
    } 
    res 
} 

res = list() 
for (i in seq_along(pages)) res = build_list(pages[[i]], res) 

res 
#[[1]] 
#[1] "about.Rmd" 
# 
#[[2]] 
#[1] "index.Rmd" 
# 
#$stats 
#$stats[[1]] 
#[1] "index.Rmd" 
# 
#$stats$substats 
#$stats$substats[[1]] 
#[1] "index.Rmd" 
+1

molto più semplice di quello che pensavo; grazie per aver segnalato il mio errore in precedenza (ti avrei dato la risposta dal mio A se potessi) – BrodieG

+0

Great! Molte grazie. – juba

Problemi correlati