jak*_*ung 2 parallel-processing foreach plot r ggplot2
我想创建一个 PDF 文件,其中包含按特定顺序排列的数百个绘图。
我的策略是使用 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)
}
Run Code Online (Sandbox Code Playgroud)
通过这段代码,我希望创建一个 ggplot2 对象列表,然后我可以将其pdf()以有序方式(例如,按升序克拉)保存到单个 pdf 文件中(例如使用 )。
但是,运行此命令会导致错误消息:
Error in serialize(data, node$con) : error writing to connection
Run Code Online (Sandbox Code Playgroud)
我怀疑这是因为如果我尝试将 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
Run Code Online (Sandbox Code Playgroud)
尽管这纯粹是猜测,我可能是错的。
有人知道如何使用foreach()将对象保存ggplot2到列表中吗?或者某种方法来并行化for涉及 的循环ggplot2?
提前致谢。
您不应该在循环内打印对象,而只需创建 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()
}
Run Code Online (Sandbox Code Playgroud)
然后你可以用
m.list[[1]]
Run Code Online (Sandbox Code Playgroud)
ETC...
| 归档时间: |
|
| 查看次数: |
1700 次 |
| 最近记录: |