Scoping -Problem, wenn sfApply innerhalb der Funktion verwendet wird (Packung Schneefall - R)
Frage
Lassen Sie mich ein weiteres Scoping -Problem in R hinzufügen, diesmal mit dem Schneefall -Paket. Wenn ich eine Funktion in meiner globalen Umgebung definiere und versuche, diese später in einer anderen Funktion () in einer anderen Funktion zu verwenden, ist meine erste Funktion nicht mehr gefunden:
#Runnable code. Don't forget to stop the cluster with sfStop()
require(snowfall)
sfInit(parallel=TRUE,cpus=3)
func1 <- function(x){
y <- x+1
y
}
func2 <- function(x){
y <- sfApply(x,2,function(i) func1(i) )
y
}
y <- matrix(1:10,ncol=2)
func2(y)
sfStop()
Das gibt :
> func2(y)
Error in checkForRemoteErrors(val) :
2 nodes produced errors; first error: could not find function "func1"
Wenn ich meine Funktion in der anderen Funktion nistet, funktioniert sie jedoch. Es funktioniert auch, wenn ich die sfapply () in der globalen Umgebung verwende. Ich möchte meine Funktion func1 in dieser Funktion2 nicht nisten, da dies dazu führen würde, dass Func1 viele Male definiert wird (Func2 wird in einer Schleifenstruktur verwendet).
Ich habe versucht, den Code bereits zu vereinfachen, um die Doppelschleife loszuwerden, aber das ist aufgrund der Art des Problems recht unmöglich. Irgendwelche Ideen?
Lösung
Ich denke du willst sfExport(func1)
, Ich bin mir jedoch nicht sicher, ob Sie es in Ihrem tun müssen .GlobalEnv
oder innerhalb von func2
. Ich hoffe, das hilft...
> y <- matrix(1:10,ncol=2)
> sfExport(list=list("func1"))
> func2(y)
[,1] [,2]
[1,] 2 7
[2,] 3 8
[3,] 4 9
[4,] 5 10
[5,] 6 11
Andere Tipps
Wenn Sie jetzt den Scoping mit parallelem Computing verwechseln. Sie berufen neue R-Sitzungen-und es liegt in der Regel in Ihrer Verantwortung, Ihre Umgebung auf den Knoten neu zu erstellen.
Eine Alternative wäre die Verwendung von Foreach et al. Es gibt Beispiele in den Dokumenten foreach (oder Iterator?), Die genau dies zeigen. Oh, sehen Sie, und Josh hat inzwischen dasselbe empfohlen.