2017-05-16 4 views
1

Je rencontre des problèmes en cours d'exécution dopar à l'intérieur d'une fonction, lors de l'enregistrement doRNG et j'ai besoin d'accéder à une variable qui est créée à l'intérieur de la fonction.R doRNG impossible de trouver la variable

Mon objectif général ici est d'utiliser doRNG pour m'assurer que mes processus parallèles obtiennent différents flux de nombres aléatoires, donc s'il y a une meilleure façon de le faire, cela résoudra aussi mon problème.

Je serais secondairement intéressé par pourquoi l'utilisation doRNG échoue, parce que j'essaie de comprendre comment les environnements sont exportés vers des processus parallèles.

Le code est un peu artificiel mais résume un code beaucoup plus grand et plus complexe.

library(doParallel) 
library(foreach) 

cl <- makePSOCKcluster(2) 
registerDoParallel(cl) 

#if I comment out these two lines, code runs fine 
library(doRNG) 
registerDoRNG() 

gVar <- 'gVar' 

cols <- matrix(1:10,nrow=2) 
res <- apply(cols,2, 
    function(col) { 
    lclVar <- sum(col) 

    res <- foreach(i=icount(2), 
    .export=c('gVar'), #'lclVar' 
    .combine='c') %dopar% { #change to %do% also works 
     return(sprintf('%s %s %s',gVar,lclVar,i)) 
    } 

    return(res) 
}) 

print(res) 
stopCluster(cl) 

Remarque si je commente les doRNG lignes, le code fonctionne très bien. Passant également de %dopar% à %do% (et laissant doRNG lignes décommentées) fonctionne.

Je reçois les suivantes:

Error in { : task 1 failed - "object 'lclVar' not found" 
+0

J'ai essayé ça? –

+0

@J_F effectivement qui a résolu mon problème. Donc, d'une manière ou d'une autre, l'environnement ne se transmet pas de la même manière quand Dopar encapsule le dopar? Quoi qu'il en soit, c'était une solution rapide à la question, merci! –

Répondre

0

Mon objectif général est d'utiliser doRNG pour vous assurer que mes processus parallèles se flux différents de nombres aléatoires, donc s'il y a une meilleure façon de faire ça, ça va aussi résoudre mon problème.

Si vous pouvez « reformulez » vous problème en tant que lapply() appel, puis

y <- future_lapply(x, FUN, ..., future.seed = TRUE) 

du paquet future (je suis l'auteur) fera en sorte que chaque appel FUN(x[[i]], ...) est fait avec un bon (L'Ecuyer-CMRG) Ruisseau RNG. Le paquet futur prend également automatiquement en compte les variables globales (par exemple gVar et lclVar) exportées correctement vers chaque worker.

Vous pouvez contrôler la parallélisation avec la fonction plan(), par ex.

cl <- makePSOCKcluster(2) 
plan(cluster, workers = cl) 

qui équivaut à:

plan(multiprocess, workers = 2L) 

Cela fonctionne même sur tous les systèmes d'exploitation. L'utilisation de `% dorng%` au lieu de `% dopar%` ne donne aucune erreur.

+0

merci pour cette excellente réponse. Le commentaire ci-dessus de J_F était la solution la plus rapide, donc c'est la meilleure réponse. Cependant, votre réponse fournit une bonne approche alternative. –