2

考虑以下模拟示例:

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()

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

通过一个简单的for循环,这可以工作。但是,对于并行计算,它似乎不起作用。

有任何想法吗?

谢谢!

4

1 回答 1

4

请记住,集群工作者是在不同进程中执行的完全独立的 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
}

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

于 2013-11-06T01:43:37.587 回答