2 votes

parallel::clusterExport comment passer les fonctions imbriquées de l'environnement global ?

Je crée une fonction (myFUN) qui appelle parallel::parApply à un moment donné, avec une fonction yourFUN qui est fournie comme argument.

Dans de nombreuses situations, votreFUN contiendra des fonctions personnalisées de l'environnement global.

Ainsi, alors que je peux passer "yourFUN" à parallel::clusterExport, je ne peux pas connaître à l'avance les noms des fonctions qu'il contient, et clusterExport me renvoie une erreur car il ne peut pas les trouver.

Je ne veux pas exporter l'ensemble de l'environnement de votreFUN , car il pourrait être très grand.

Existe-t-il un moyen pour moi d'exporter uniquement les variables nécessaires à l'exécution de votreFUN ?

La fonction réelle est très longue, voici un exemple minimisé de l'erreur :

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" 

Merci beaucoup !

4voto

F. Privé Points 6755

Une solution possible, l'utilisation :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X