Ich habe ein Problem mit foreach, dass ich einfach nicht herausfinden kann. Der folgende Code nicht auf zwei Windows-Computer habe ich versucht, aber erfolgreich auf drei Linux-Rechnern, die alle die gleichen Versionen von R und doParallel ausgeführt wird:doParallel "foreach" inkonsistent Objekte aus der übergeordneten Umgebung erbt: "Fehler in {: Task 1 fehlgeschlagen -" konnte Funktion nicht finden ... "
library("doParallel")
registerDoParallel(cl=2,cores=2)
f <- function(){return(10)}
g <- function(){
r = foreach(x = 1:4) %dopar% {
return(x + f())
}
return(r)
}
g()
auf diesen zwei Windows-Computern, wird der folgende Fehler zurückgegeben:
Error in { : task 1 failed - "could not find function "f""
Dies funktioniert jedoch gut auf den Linux-Computern, und funktioniert auch gut mit% do% anstelle von% dopar% und funktioniert gut für eine normale for-Schleife.
Dasselbe gilt für Variablen, z. Einstellung i <- 10
und return(x + f())
mit return(x + i)
Für andere mit dem gleichen Problem zu ersetzen, zwei Abhilfen sind:
1) die benötigten Funktionen und Variablen mit .export explizit importieren:
r = foreach(x=1:4, .export="f") %dopar%
2) importieren alle globale Objekte:
r = foreach(x=1:4, .export=ls(.GlobalEnv)) %dopar%
Das Problem mit diesen Problemumgehungen ist, dass sie nicht Th sind Das stabilste für ein großes, sich aktiv entwickelndes Paket. In jedem Fall soll sich foreach wie für verhalten.
Irgendwelche Ideen, was das verursacht und ob es eine Lösung gibt?
Versionsinfo des Computers, der die Funktion funktioniert auf:
R version 3.2.2 (2015-08-14)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS release 6.5 (Final)
other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3
Der Computer die Funktion nicht funktioniert:
R version 3.2.2 (2015-08-14)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3
Wo ist die Funktion 'f()' in Ihrem Beispielcode? Basierend auf dem, was Sie zur Verfügung gestellt haben, scheint es, als ob der Windows-Rechner den richtigen Fehler gibt, da 'f' keine Funktion ist, sondern eine Zahl. – brittenb
Von doParallel Vignette: "Um Multicore-ähnliche Funktionalität zu verwenden, würden wir die Anzahl der zu verwendenden Kerne angeben (aber beachten, dass unter Windows versucht, mehr als einen Kern mit parallelen Ergebnissen in einem Fehler zu verwenden)" Ie: windows does nicht implementieren etwas wie 'fork' von doParallel verwendet, ist die Problemumgehung zu starten eine gesamte neue R-Sitzung, um den Job in, IIRC kopieren Sie die übergeordnete Umgebung, hier die' g' Funktion env und nicht Global. – Tensibai
@brittenb Sorry, ich habe eine unvollständige Änderung vorgenommen; Ich wollte f = function() {return (10)} machen. Bearbeiten des Originals – sssheridan