Параллельный::clusterExport, как передать вложенные функции из глобальной среды?
Я делаю функцию (myFUN), которая вызывает параллель::parApply в одной точке, с функцией yourFUN, которая предоставляется в качестве аргумента.
Во многих ситуациях yourFUN будет содержать пользовательские функции из глобальной среды.
Поэтому, хотя я могу передать "yourFUN" в параллельный::clusterExport, я не могу заранее знать имена функций внутри него, и clusterExport возвращает мне ошибку, потому что не может их найти.
Я не хочу экспортировать всю окружающую среду вашего Fun, поскольку она может быть очень большой.
Есть ли способ для меня экспортировать только переменные, необходимые для запуска 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"
Большое спасибо!
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)
}