2017-05-16 4 views
1

Ich laufe auf Probleme laufen dopar innerhalb einer Funktion, bei der Registrierung doRNG und ich muss auf eine Variable zugreifen, die innerhalb der Funktion erstellt wird.R doRNG kann keine Variable finden

Mein übergeordnetes Ziel ist es, doRNG zu verwenden, um sicherzustellen, dass meine parallelen Prozesse verschiedene Ströme von Zufallszahlen erhalten. Wenn es also einen besseren Weg gibt, löst das auch mein Problem.

Ich wäre sekundär daran interessiert, warum die Verwendung doRNG schlägt fehl, weil ich versuche zu verstehen, wie Umgebungen in parallele Prozesse exportiert werden.

Der Code hier sieht ein bisschen künstlich aus, aber das ist eine Zusammenfassung eines viel größeren und komplexeren Codes.

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) 

Hinweis, wenn ich die doRNG Zeilen auf Kommentar, wird der Code in Ordnung. Auch der Wechsel von %dopar% zu %do% (und doRNG Zeilen unkommentiert) funktioniert.

ich folgend:

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

Die Verwendung von '% dorng%' anstelle von '% dopar%' ergibt keinen Fehler. Versuchte das? –

+0

@J_F eigentlich das mein Problem behoben. Also wird die Umgebung nicht auf die gleiche Weise weitergegeben, wenn Dopar von dorng gewickelt wird? Wie auch immer, das war eine schnelle Lösung für das Problem, danke! –

Antwort

0

Mein hier Geordnetes Ziel ist doRNG zu verwenden, um meine parallel Prozesse verschiedene Ströme von Zufallszahlen stellen Sie sicher, erhalten, so dass, wenn es ein besserer Weg ist zu tun Das wird auch mein Problem lösen.

Wenn Sie können Sie Problem als lapply() Anruf „umformulieren“, dann

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

des future Paket (ich bin der Autor) wird mit einem geeigneten getan wird jeder FUN(x[[i]], ...) Anruf sicher (L'Ecuyer-CMRG) RNG-Stream. Das zukünftige Paket kümmert sich auch automatisch um globale Variablen (z. B. gVar und lclVar), die ordnungsgemäß an jeden Arbeiter exportiert werden.

Sie können steuern, wie Sie mit der plan()-Funktion, z.

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

, die gleich ist:

plan(multiprocess, workers = 2L) 

Dies funktioniert genauso auf allen Betriebssystemen.

+0

danke für diese großartige Antwort. Der obige Kommentar von J_F war die schnellste Lösung, das ist also die beste Antwort. Ihre Antwort bietet jedoch einen schönen alternativen Ansatz. –