Scoping -Problem, wenn sfApply innerhalb der Funktion verwendet wird (Packung Schneefall - R)

StackOverflow https://stackoverflow.com/questions/3856245

  •  27-09-2019
  •  | 
  •  

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top