在 R 中绘图时用点进行 mclapply

Posted

技术标签:

【中文标题】在 R 中绘图时用点进行 mclapply【英文标题】:mclapply with points when plotting in R 【发布时间】:2020-03-24 10:29:10 【问题描述】:

根据 R 文档,mclapply() 是 lapply() 的并行版本,但在这个简单的示例中,当尝试与 points() 一起使用时,mclapply() 不起作用。有什么解决办法吗?

plot(c(0,3),c(0,1000), type='n')
x<-runif(100,0,1000); y<-runif(100,0,1000)
lapply(x,function(a) points(1,a,col='green')) #ok
mclapply(x,function(a) points(2,a,col='red')) #ko: does not work

【问题讨论】:

我认为在对 mclapply 的调用中不会对每个内核开放一个绘图设备。最好将结果(无论您的基础操作是什么)保存在列表中,然后绘制。 嗨@Marcinthebox 是正确的,因为并行化它不会加快速度,因为您需要将它放在同一个设备中。您可以直接将其写入 png,也可以尝试 1) xyplot in lattice 或 2) hexbin cran.r-project.org/web/packages/hexbin/index.html 【参考方案1】:

这里是先用mclapply记录结果,然后绘制的例子

library(parallel)

plot(c(0,3),c(0,1000), type='n')
x<-runif(100,0,1000); y<-runif(100,0,1000)
lapply(x,function(a) points(1,a,col='green')) #ok
L <- mclapply(x,function(a) data.frame(x = 2, y = a))
lapply(L, function(X) points(y~x, X, col='red'))

【讨论】:

感谢 Marc ,但我试图在绘图时进行平行化以加快绘图速度。有可能吗? 不,我认为这不会有帮助。如果问题是您有很多点要绘制,那么您不应该直接在绘图设备中执行此操作;相反,您应该打开像png 这样的输出绘图设备,并在使用dev.off() 关闭之前将所有绘图信息发送到那里。例如,请参阅此答案:***.com/a/17477296/1199289 知道了。所以我可能不得不将我的情节分成许多部分并合并许多情节。谢谢!

以上是关于在 R 中绘图时用点进行 mclapply的主要内容,如果未能解决你的问题,请参考以下文章

R:“着色”根据另一个变量进行绘图

链接dataTableOutput和R中闪亮的绘图

在 R 中,如何在绘图的两个内部函数之间传递数据帧/小标题,然后保存绘图?

iOS drawRect的作用和调用机制

在 R markdown 中嵌入绘图输出

R mclapply vs foreach