问题很简单:我必须在一个图上可视化优化过程。在预先绘制的设备上,新的解决方案(如点(x,y))应该在可用时出现。我通过嵌套循环处理顺序代码,但应该可以使它并行。我尝试使用foreach包(使用doParallel后端),但生成的进程无法在父进程的设备上绘图 - 显然。 有可能用另一个包装或者无论如何克服这个问题吗?
答案 0 :(得分:1)
我认为在R中将一个流程图绘制到另一个流程的图形设备是不可能的。相反,流程需要将消息发送到执行所有图形操作的指定流程。使用parallel或foreach / doParallel相当困难,但使用foreach并使用支持动态处理工作结果的并行后端(例如doMPI或doRedis)相对容易。在这种情况下,您可以绘制组合函数中的点,因为它们是由工人计算的。这是一个简单的例子:
library(doMPI)
nworkers <- 4
cl <- startMPIcluster(nworkers)
comm <- cl$comm # get communicator number
registerDoMPI(cl)
cap <- capabilities()
if (cap['aqua']) quartz() else if (cap['X11']) X11() else windows()
plot(integer(0), integer(0),
main='Random points generated by doMPI workers',
xlab='X', ylab='Y', xlim=c(1,100), ylim=c(1,100))
legend('topright', sprintf('worker %d', 1:nworkers), pch=1:nworkers)
# The argument "p" is a list of arguments to the function "points"
plotpoint <- function(x, p) {
do.call('points', p)
x
}
foreach(i=icount(100), .combine='plotpoint',
.init=NULL, .inorder=FALSE) %dopar% {
Sys.sleep(abs(rnorm(1, mean=3)))
list(x=sample(100,1), y=sample(80,1), pch=mpi.comm.rank(comm))
}
text(50, 90, 'Finished')
Sys.sleep(10)
closeCluster(cl)
mpi.quit()
我丢弃了结果,因为它们仅用于调用points
,但您可以修改plotpoint
以将结果的某些部分保存在第一个参数x
中。只需确保将.init
参数修改为适当的数据结构。
答案 1 :(得分:0)
您可以尝试这样的事情:
foreach(i=1:10) %dopar% with(env.profile(.GlobalEnv), #Your Code#)
我不确定这是否有用。由于基本R图形工作的绘图的连续性,您可能会遇到问题。您还可以尝试创建一个列表,并在%dopar%调用期间将每次迭代的结果添加到列表中。完成后,你应该能够使用lapply(point.list,points)。