我想使用 R'parallel' 库来并行生成一些使用 'ggplot2' 库的绘图,并且在尝试在 RStudio 中执行此操作时遇到了障碍。在 IDE 中,mclapply 交替冻结会话,或者无法运行 ggsave(( 将绘图写入磁盘(未给出错误或警告(。在 RStudio 之外运行时,它在 100% 的时间内都能完美运行。我猜 RStudio 正在对图形设备做一些令人讨厌的事情,但我无法弄清楚是什么或解决方法(我也尝试过 png((/dev.off((,同样的问题(。下面是重现该问题的代码:
library(ggplot2)
library(parallel)
mclapply(
0:4,
function(n) {
df <- data.frame(x = runif(10), y = runif(10))
p <- ggplot(df, aes(x, y)) + geom_point()
ggsave(
paste0('mclapply-', n, '.png'),
plot = p,
device = 'png',
width = 4,
height = 4
)
return(n)
}
)
有什么解决方法吗?
编辑:R 3.4.4 + RStudio 1.1.419 + ggplot2 2.2.1 在 macOS 10.13.4 上; mclapply(( 在 Windows 上恢复 lapply(((不支持(。
如果您使用foreach
包而不是mcapply
,ggsave
似乎在并行处理期间有效:
library(foreach)
cl <- parallel::makeCluster(parallel::detectCores())
doParallel::registerDoParallel(cl)
foreach(n = 1:4, .packages = 'ggplot2') %dopar% {
df <- data.frame(x = runif(10), y = runif(10))
p <- ggplot2::ggplot(df, aes(x, y)) + geom_point()
ggplot2::ggsave(
paste0('mclapply-', n, '.png'),
plot = p,
device = 'png',
width = 4,
height = 4
)
return(n)
}
parallel::stopCluster(cl)
这在:macOS 10.13.6,R 3.5.1和RStudio 1.1.453