n'a pas pu trouver la fonction à l'intérieur de la boucle foreach
Je suis en train d'utiliser une boucle foreach pour faire multicœur dans R.
A <-function(....) {
foreach(i=1:10) %dopar% {
B()
}
}
puis j'appelle la fonction A
dans la console. Le problème est que je suis à l'appel d'une fonction Posdef
à l'intérieur de B
qui est définie dans un autre fichier de script qui je source. J'ai dû mettre Posdef
dans la liste de l'exportation argument de foreach
: .export=c("Posdef")
. Cependant j'obtiens l'erreur suivante:
Error in { : task 3 failed - "could not find function "Posdef""
Pourquoi je ne peux pas R de trouver cette fonction définie?
source d'informationauteur statistician_in_training
Vous devez vous connecter pour publier un commentaire.
La réponse courte est que c'était un bug en parallèle backends comme
doSNOW
doParallel
etdoMPI
mais il a depuis été corrigé.La réponse plus précise que
foreach
exporte des fonctions pour les travailleurs à l'aide d'une "exportation" de l'environnement, pas l'environnement mondial. Que utilisé pour causer des problèmes pour les fonctions qui ont été créés dans l'environnement mondial, parce que l ' "exportation" de l'environnement n'était pas dans leur champ d'application, même si elles ont été définies dans ce même "exportation" de l'environnement. Ainsi, ils ne pouvaient pas voir toutes autres fonctions ou variables définies dans l ' "exportation" de l'environnement, tels que "Posdef" dans votre cas.La
doSNOW
doParallel
etdoMPI
backends maintenant changer les associés de l'environnement mondial, à l ' "exportation" de l'environnement pour les fonctions exportées par le biais d' ".à l'exportation", et semble avoir résolu ces problèmes.Donc je peux reproduire ce, pour les curieux:
J'ai réussi à contourner ce problème en mettant la fonction dans un autre fichier et de charger ce fichier dans le corps de la boucle foreach. Vous pouvez aussi évidemment déplacer la définition de la fonction dans le corps de la boucle foreach.
[EDIT -- j'avais déjà suggéré que peut-être .l'exportation ne fonctionne pas correctement avec les noms de fonction, mais a été corrigé ci-dessous.]
Quick fix pour le problème avec foreach %dopar% est de réinstaller ces paquets:
Cela a fonctionné dans mon cas.