在R中使用foreach()来加速ggplot2的循环

时间:2015-01-05 20:08:52

标签: r foreach plot parallel-processing 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)
}

使用此代码,我希望创建一个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的循环?

提前致谢。

1 个答案:

答案 0 :(得分:4)

您不应该在循环内打印对象,只需创建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]]

等...