2017-03-20 6 views
0

Ich habe eine Liste 'list_export' mit zwei Unterlisten 'list_plots' und 'list_tables', die jeweils ggplots und Datenrahmen enthalten.Exportieren von Listenstruktur in Ordnerstruktur

list_plots <- list(plot1, plot2, plot3) 
list_tables <- list(table1, table2, table3) 
list_export <- list(list_plots, list_tables) 

Ich mag würde die Baumstruktur der Liste in eine Ordnerstruktur mit dem richtigen Datentyp, wie exportieren:

list_export/list_plots/plots[1-3].png 
list_export/list_tables/tables[1-3].csv 

Gibt es eine Möglichkeit, die Struktur der Liste direkt zu exportieren zu Ordnern? Es möchte die Lösungen auf n-Ebenen anwenden, nicht nur 2.

Antwort

1

Es gibt nichts eingebaut in das würde so etwas tun. Sie könnten eine Funktion erstellen, die Ihnen helfen könnte. Vielleicht so etwas wie

savers <- list(
    "ggplot" = function(pp, base) ggsave(filename=paste0(base,".png"), plot=pp), 
    "data.frame" = function(dd, base) write.table(dd, file=paste0(base,".txt")) 
) 

save_list <- function(x, prefix=deparse(substitute(x)), savers=savers) { 
    ids = as.character(if(!is.null(names(x))) {names(x)} else {seq_along(x)}) 
    ids[nchar(ids)<1] <- as.character(seq_along(x)[nchar(ids)<1]) 
    ret <- Map(function(x, id) { 
    found <- FALSE 
    for(type in names(savers)) { 
     if(inherits(x, type)) { 
      found <- TRUE 
      ret <- savers[[type]](x, file.path(prefix, id)) 
      return(ret) 
     } 
    } 
    if (!found) { 
     if (class(x)=="list") { 
      save_list(x, file.path(prefix, id), savers=savers) 
     } else { 
      stop(paste("unable to save object of type:", class(x))) 
     } 
    } 
    }, x, ids) 
    invisible(ret) 
} 

Hier erstelle ich eine Liste von savers, die an den verschiedenen Objekttypen suchen und sie auf eine Disc schreiben. Dann mit einer Beispielliste

plot_list <- Map(function(x) ggplot(mtcars) + geom_point(aes(cyl, disp)) + ggtitle(x), paste("plot", 1:3)) 
data_list <- replicate(4, data.frame(x=runif(10), y=rnorm(10)), simplify=FALSE) 
x <- list(plot_list=plot_list, data_list=data_list) 

Ich kann sie mit

save_list(x) 

Hinweis schreiben, dass Sie wirklich eine benannte Liste benötigen, um die späteren Dateinamen zu bestimmen. Hier benenne ich explizit die Elemente von x, aber wenn sie nicht vorhanden sind, wird eine einfache Indizierung verwendet. Sie können die Speicherfunktionen auch austauschen, um zu sehen, was beim Drucken des Wertes auf dem Bildschirm geschrieben wird.

noop <- list(
    "ggplot" = function(pp, fn) print(paste(paste0(fn,".png"),"(plot)")), 
    "data.frame" = function(dd, fn) print(paste(paste0(fn,".txt"), "(df)")) 
) 
save_list(x, savers=noop) 
# [1] "x/plot_list/plot 1.png (plot)" 
# [1] "x/plot_list/plot 2.png (plot)" 
# [1] "x/plot_list/plot 3.png (plot)" 
# [1] "x/data_list/1.txt (df)" 
# [1] "x/data_list/2.txt (df)" 
# [1] "x/data_list/3.txt (df)" 
# [1] "x/data_list/4.txt (df)" 

Beachten Sie, dass davon ausgegangen wird, dass das Verzeichnis bereits vorhanden ist. Wenn Sie zuerst nachsehen müssen, finden Sie unter this question mögliche Lösungen.

+0

Vielen Dank MrFlick! –