2017-12-16 1 views
0

複数のデータフレームから複数のggplotチャートを作成しようとしています。私は以下のコードを開発しましたが、最終ループは機能しません。リスト内のデータフレームをプロット関数に送信

df1 <- tibble(
    a = rnorm(10), 
    b = rnorm(10) 
) 

df2 <- tibble(
    a = rnorm(20), 
    b = rnorm(20) 
) 

chart_it <- function(x) { 
    x %>% ggplot() + 
    geom_line(mapping = aes(y=a,x=b)) + 
    ggsave(paste0(substitute(x),".png")) 
} 

ll <- list(df1,df2) 

for (i in seq_along(ll)) { 
chart_it(ll[[i]]) 
} 

私は

ll[[i]] 

を行うにはその何かを知っているが、私は、コンソールで、それは私がしたいデータフレームを与えることを置いたときので、私は理由を理解しません。また、forループの代わりにmap関数を使ってこれを行う方法がありますか?

答えて

2

の線に沿って

何か。

何らかの形でデータフレームの名前を関数に渡す必要があります。それを行う1つの方法は、名前付きリストを使用して、その名前をリスト要素の内容と一緒に渡すことです。

library(ggplot2) 
library(purrr) 

df1 <- tibble(
    a = rnorm(10), 
    b = rnorm(10) 
) 

df2 <- tibble(
    a = rnorm(20), 
    b = rnorm(20) 
) 

chart_it <- function(x, nm) { 
    p <- x %>% ggplot() + 
    geom_line(mapping = aes(y=a,x=b)) 
    ggsave(paste0(nm,".png"), p, device = "png") 
} 

ll <- list(df1=df1,df2=df2) 

for (i in seq_along(ll)) { 
    chart_it(ll[[i]], names(ll[i])) 
} 

簡潔に言えば、機能を変更することなくループを次のコマンドに置き換えることができます。

purrr::walk2(ll, names(ll),chart_it) 

または単に

purrr::iwalk(ll, chart_it) 

imaplmapありますが、彼らはあなたがやりたいものではありませんコンソール、中にいくつかの出力を残して、私は推測します。

+0

これは完璧です。本当にありがとう :) – jimbo

0

問題はchart_itの機能にあります。 ggplotは返されません。パイプの結果を変数に格納してみてください。return()(または関数の最後のステートメントとして配置してください)。私はあなたが最後に2つのdf1.pngと呼ばれるファイルやdf2.pngを見たいと仮定

chart_it <- function(x) { 
    chart <- x %>% ggplot() + 
    geom_line(mapping = aes(y=a,x=b)) 

    ggsave(paste0(substitute(x),".png")) # this will save the last ggplot figure 

    return(chart) 
} 
+0

お返事ありがとうございます。私が 'chart_it(df1)'を実行するとプロットが保存されるので、私の関数は大丈夫ですか? – jimbo

+0

試してみた 'chart_it < - function(x){ x%>%ggplot()+ geom_line(マッピング= aes(y = a、x = b))+ ggsave(paste0(代替) "エラー:' device'はNULL、文字列または関数でなければなりません。 " – jimbo

+0

更新された回答、@jimboを参照してください。 –

関連する問題