2016-12-26 7 views
1

아래 샘플 코드에서 foreach 및 doParallel을 사용하고 있습니다. 내가 envir = .GlobalEnv를 사용할 때 clusterExport의 envir 인수에 전역 및 기능 환경의 개체를 클러스터로 내보내기

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) 

는, 나는 오류

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

내가 envir를 사용할 때 = 환경()이 오류가

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

내 문제는 내가 클러스터에 모든 세계에있는 객체뿐만 아니라 기능 환경을 내보낼 수 있습니다 방법이다.

답변

0

함수에있을 때 필요한 개체를 수동으로 내보낼 필요가 없습니다. 그러나 에 의해 액세스하려는 경우 fun1fun2을 전달해야합니다. 다음과 같이하십시오.

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)