2016-12-26 1 views
1

Ich verwende foreach und doParallel auf unter Beispielcode.Exportieren Sie Objekte in globalen und Funktionsumgebung zu einem Cluster

library(foreach) 
    library(doParallel) 
    clusters = makeCluster(4) 
    registerDoParallel(clusters) 


    fun1 <- function(param1, param2, param3) 
    { 
    param4 = param1+param2 
    param5 = param2+param3 
    param6 = param3+param1 
    print(ls(envir = environment())) 
    print(ls(envir = .GlobalEnv)) 
    # clusterExport(cl = clusters, varlist = ls(), envir = environment()) 
    clusterExport(cl = clusters, varlist = ls(), envir = .GlobalEnv) 
    mmm = foreach(i = 1:length(param1), .combine = rbind) %dopar% fun2(i, param4, param5, param6) 
    print(mmm) 
    } 

    fun2 <- function(i, param4, param5, param6) 
    { 
    j = param4[i] * param5[i] * param6[i] 
    } 

    param1 = 1:10 
    param2 = 2:11 
    param3 = 3:12 
    fun1(param1, param2, param3) 

In clusterExport des envir Argument, wenn ich envir = .GlobalEnv verwenden, erhalte ich die Fehler

**"Error in get(name, envir = envir) : object 'param4' not found"**.

Und wenn ich envir verwenden = environment(), Fehler ist

**"Error in fun2(i, param4, param5, param6) : task 1 failed - "could not find function "fun2"""**

Meine Frage ist, wie kann ich alle Objekte im globalen Export sowie Funktion Umgebung zu einem Cluster.

Antwort

0

Wenn Sie sich in einer Funktion befinden, müssen Sie die von Ihnen benötigten Objekte nicht manuell exportieren. Aber Sie müssen fun2 zu fun1 übergeben, wenn Sie möchten, dass es von der foreach in fun1 zugegriffen wird. Also, nur tun:

fun1 <- function(param1, param2, param3, fun2) 
{ 
    param4 = param1+param2 
    param5 = param2+param3 
    param6 = param3+param1 
    mmm = foreach(i = 1:length(param1), .combine = rbind) %dopar% { 
    fun2(i, param4, param5, param6) 
    } 
    print(mmm) 
} 

fun1(param1, param2, param3, fun2) 
Verwandte Themen