2017-03-20 8 views
0

私は、ggplotsとデータフレームをそれぞれ含む2つのサブリスト 'list_plots'と 'list_tables'を持つリスト 'list_export'を持っています。私のような、正しいデータ型とフォルダ構造にリストのツリー構造をエクスポートしたいリスト構造をフォルダ構造にエクスポートする

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 

は直接リストの構造をエクスポートする方法はありますフォルダに? 2レベルだけでなく、nレベルにもソリューションを適用したいと考えています。

答えて

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を参照してください。

+0

ありがとうMrFlick! –

関連する問題