2015-01-05 53 views
1

我想創建一個PDF文件,其中包含數百個以特定順序繪製的圖。在R中使用foreach()來加速ggplot2的循環

我的策略是使用foreach()並將每個ggplot2對象存儲到輸出列表中,然後將每個ggplot2對象打印到輸出文件。

例如,我想繪製價格的柱狀圖各因素「克拉」的鑽石數據集:

library(ggplot2) 
library(plyr) 
library(foreach) # for parallelization 
library(doParallel) # for parallelization 

#setup parallel backend to use 4 processors 
cl<-makeCluster(4) 
registerDoParallel(cl) 

# use diamonds dataset 
carats.summary <- ddply(diamonds, .(carat), summarise, count = length(carat)) 

m.list <- foreach(i = 1:length(carats.summary$carat), 
        .packages = "ggplot2") %dopar% { 
        jcarat = carats.summary$carat[i] 
        m <- ggplot(subset(diamonds, carat == jcarat), aes(x = price)) + 
         geom_histogram() 
        print(m) 
} 

有了這個代碼,我希望能創造GGPLOT2對象的列表,我然後可以以有序的方式(例如,在遞增的克拉中)保存到單個pdf文件中(例如使用pdf())。

但是,在運行這將導致一個錯誤消息:

Error in serialize(data, node$con) : error writing to connection 

我懷疑這是由於這樣的事實,如果我試圖GGPLOT2對象追加到一個列表,我會得到一個警告消息,這樣:

lst <- vector(mode = "list") 
lst[1] <- m 


Warning message: 
In lst[1] <- m : 
    number of items to replace is not a multiple of replacement length 

雖然這是純粹的推測,我可能是錯的。

有沒有人有想法如何使用foreach()ggplot2對象保存到列表中?或某種方式來並行for環路涉及ggplot2

在此先感謝。

+0

這是一個很好的點。 'lst [[1]] < - m'可以工作,但我不知道如何將它轉換爲我的'foreach()'循環。也許我會查看文檔中的'.combine'選項。 – jakeyeung

+0

對不起,我誤解了你的問題,那個評論並不完全相關。我現在正在處理一個實際的答案。 – nrussell

+0

沒關係,@MrFlick指出你的問題。你可能會在'foreach'循環中調用'ggsave',或者做一些不像'sapply(1:length(m.list),function(x)')的文件(file = paste0( 「; F:/ TempDir/Plot _」,x,「。pdf」)); print(m.list [[x]]); dev.off(); })''替換適當的文件路徑我的「F:/ TempDir /」)。 – nrussell

回答

3

您不應該在循環內打印對象,只需創建ggplot對象。僅在打開圖形設備時纔打印。

m.list <- foreach(i = 1:length(carats.summary$carat), 
    .packages = "ggplot2") %dopar% { 
    jcarat = carats.summary$carat[i] 
    ggplot(subset(diamonds, carat == jcarat), aes(x = price)) + 
     geom_histogram() 
} 

,那麼你可以在他們那裏得到與

m.list[[1]] 

等等