【问题标题】:parallel::clusterExport how to pass nested functions from global environment?parallel::clusterExport 如何从全局环境中传递嵌套函数?
【发布时间】:2018-06-25 19:51:56
【问题描述】:

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

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

所以,虽然我可以将“yourFUN”传递给parallel::clusterExport,但我无法事先知道其中的函数名称,并且clusterExport 会因为找不到它们而返回错误。

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

有没有办法让我只导出运行 yourFUN 所需的变量?

实际函数很长,这里是一个最小化的错误例子:

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" 

非常感谢!

【问题讨论】:

    标签: r parallel-processing scoping


    【解决方案1】:

    一个可能的解决方案,使用:

    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)  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2018-02-16
      相关资源
      最近更新 更多