parallel :: clusterExport如何从全局环境传递嵌套函数?

时间:2018-01-17 01:53:48

标签: r parallel-processing scoping

我正在创建一个函数(myFUN),它在一个点上调用parallel :: parApply,并带有一个作为参数提供的函数yourFUN。

在许多情况下,yourFUN将包含来自全局环境的自定义函数。

所以,虽然我可以通过" yourFUN"到parallel :: clusterExport,我事先无法知道其中的函数名称,而clusterExport返回错误,因为找不到它们。

我不想导出你的整个封闭环境,因为它可能非常大。

我有办法只导出运行你的FUN所需的变量吗?

实际功能很长,这是一个最小化的错误示例:

mydata <- matrix(data = 1:9, 3, 3)

perfFUN <- function(x) 2*x

opt_perfFUN <- function(y) max(perfFUN(y))

avg_perfFUN <- function(w) perfFUN(mean(w))

myFUN <- function(data, yourFUN, n_cores = 1){

  cl <- parallel::makeCluster(n_cores)
  parallel::clusterExport(cl, varlist = c("yourFUN"), envir = environment())

  parallel::parApply(cl, data, 1, yourFUN)

}

myFUN(data = mydata, yourFUN = opt_perfFUN)
myFUN(data = mydata, yourFUN = avg_perfFUN)

 Error in checkForRemoteErrors(val) : one node produced an error: could not find function "perfFUN" 

非常感谢!

1 个答案:

答案 0 :(得分:4)

可能的解决方案,使用:

myFUN <- function(data, yourFUN, n_cores = 1) {

  cl <- parallel::makeCluster(n_cores)
  on.exit(parallel::stopCluster(cl), add = TRUE)

  envir <- environment(yourFUN)
  parallel::clusterExport(cl, varlist = ls(envir), envir = envir)

  parallel::parApply(cl, data, 1, yourFUN)  
}