将列表结构导出到文件夹结构

时间:2017-03-20 19:21:50

标签: r export directory nested-lists

我有一个列表'list_export',其中包含两个子列表'list_plots'和'list_tables',分别包含ggplots和数据框。

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

我想将列表的树结构导出到具有正确数据类型的文件夹结构中,例如:

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

有没有办法将列表的结构直接导出到文件夹?它希望将解决方案应用于n级,而不仅仅是2级。

1 个答案:

答案 0 :(得分:1)

没有任何内置可以做这样的事情。你可以创建一个可以提供帮助的功能。也许是这样的

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)
}

在这里,我创建一个savers列表,查看不同的对象类型并将其写入光盘。然后使用样本列表

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)

我可以用

写出来
save_list(x)

请注意,您确实需要一个命名列表,以便稍后确定文件名。在这里,我明确地命名x的元素,但如果它们不存在,将使用简单的索引。您还可以换出保存功能,只需将值打印到屏幕即可查看要写的内容。

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)"

请注意,这确实假设该目录已存在。如果您需要先检查,请参阅this question了解可能的解决方案。