在foreach dopar循环内绘制

时间:2013-11-05 19:04:43

标签: r foreach plot parallel-processing

考虑以下模拟示例:

library(foreach)
library(doParallel)
cl <- makeCluster(3)
registerDoParallel(cl)

pdf("mypdf.pdf", width = 8, height = 8)
layout(matrix(c(1,2,3,4), nrow=2, byrow=TRUE), heights = c(1,1))

result <- foreach(i=1:10000) %dopar% {
    if(i %in% c(5,10,15,20)) {plot(i)}
    i + 2
}

dev.off()

这就是我要做的:对于i中的1:10000,我想要返回i+2。并且,如果i等于5,10,15,20,我想将点i绘制为pdf。我希望所有的图(4个图)都在同一个pdf中。

使用简单的for循环,这是有效的。但是,使用并行计算,它似乎不起作用。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

请记住,集群工作者是在不同进程中执行的完全独立的R会话。您的代码使用for循环,因为它在一个进程内执行。使用foreach循环,您只需在主进程中设置PDF图形设备驱动程序,同时在工作程序中进行绘图。相反,你需要做这样的事情:

result <- foreach(i=1:10000) %dopar% {
    if(i %in% c(5,10,15,20)) {
        pdf(sprintf('task_%03d.pdf', i))
        plot(i)
        dev.off()
    }
    i + 2
}

当然,这会创建四个单独的绘图文件。如果要合并它们,则必须找到一个工具来执行此操作,并在组合函数中或在foreach循环退出后从master调用它。您可能希望以不同的格式创建打印文件,并将合并的文件转换为PDF。

相关问题