parallel::clusterExport 如何从全局环境传递嵌套函数?
parallel::clusterExport how to pass nested functions from global environment?
我正在创建一个调用 parallel::parApply 的函数 (myFUN),其中一个函数 yourFUN 作为参数提供。
在很多情况下,yourFUN 将包含来自全局环境的自定义函数。
所以,虽然我可以将 "yourFUN" 传递给 parallel::clusterExport,但我无法事先知道其中的函数名称,并且 clusterExport returns 给我一个错误,因为它找不到它们。
我不想导出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"
非常感谢!
一个可能的解决方案,使用:
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)
}
我正在创建一个调用 parallel::parApply 的函数 (myFUN),其中一个函数 yourFUN 作为参数提供。
在很多情况下,yourFUN 将包含来自全局环境的自定义函数。
所以,虽然我可以将 "yourFUN" 传递给 parallel::clusterExport,但我无法事先知道其中的函数名称,并且 clusterExport returns 给我一个错误,因为它找不到它们。
我不想导出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"
非常感谢!
一个可能的解决方案,使用:
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)
}