我正在尝试在并行包的顶部创建复制的并行化版本。我遇到的一个问题是,它会先评估我的表达式,然后再将它们交给可复制的复制函数:
par_replicate <- function(cl, n, expr){
parallel::clusterCall(
cl = cl,
function() replicate(n , expr)
)
}
cl <- parallel::makeCluster(2)
par_replicate(cl, 3, rnorm(1))
stopCluster(cl)
[[1]]
[1] -1.312669 -1.312669 -1.312669
[[2]]
[1] 0.5598533 0.5598533 0.5598533
如您所见,在将表达式提供给复制函数之前,该表达式已在集群中进行求值,因此复制仅返回相同编号的多个副本。我完全不知道如何解决此问题,因此将不胜感激。
答案 0 :(得分:0)
让任何人对我设法使用match.call()
和eval()
函数解决的答案感兴趣:
par_replicate <- function(cl, n, expr){
x <- match.call()
parallel::clusterCall(
cl = cl,
function() replicate(n , eval(x$expr))
)
}
cl <- parallel::makeCluster(2)
par_replicate(cl, 3, {rnorm(1)})
stopCluster(cl)
不确定这是否是最好的解决方案,但它似乎对我有用:)