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
?
在此先感謝。
這是一個很好的點。 'lst [[1]] < - m'可以工作,但我不知道如何將它轉換爲我的'foreach()'循環。也許我會查看文檔中的'.combine'選項。 – jakeyeung
對不起,我誤解了你的問題,那個評論並不完全相關。我現在正在處理一個實際的答案。 – nrussell
沒關係,@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