2013-07-01 5 views
6

グローバル環境で定義されていない別の関数の中にparLapplyを使用しようとしています。ワーカー関数は他の関数のリストを使用しています。これはあらかじめグローバル環境で定義されていないclusterExportになります。私の問題は、両方の関数が評価環境をクラスターにエクスポートすることです。クラスターは膨大なものであり、必要ではありません。クラスタ化する方法評価環境なしで関数をエクスポートする

作業者関数workerFunctionと関数リストfunctionListを呼び出してみましょう。

workerFunction <- function(i) { 
     intermediateOutput <- functionList[[i]](y) 
     result <- otherCalculations(intermediateOutput) 
     return(result)  
    } 

    library(parallel) 
    cl <- makeCluster(detectCores()) 
    environment(workerFunction) <- .GlobalEnv 
    environment(functionList) <- .GlobalEnv 
    clusterExport(cl, varlist=c("functionList", "y"), envir=.GlobalEnv) 
    output <- parLapply(cl, inputVector, workerFunction) 

私が取得:

Error in get(name, envir = envir) (from <text>#53) : object 'functionList' not found 

私はその後、functionListの巨大囲む環境がクラスタにエクスポートされ、environment(functionList) <- .GlobalEnvを設定ドント場合。なぜ地球環境でfunctionListが見つからないのですか?

答えて

10

完全な例がないと問題を推測するのは難しいですが、parLapplyではなく、エラーメッセージがclusterExportから来ていないのだろうかと思います。 envir引数で変数をエクスポートする環境が指定されているため、functionListがグローバル環境ではなく関数で定義されている場合に発生します。

は、同じ関数から、関数内で定義された変数をエクスポートするには、使用します。

clusterExport(cl, varlist=c("functionList", "y"), envir=environment()) 

を私はどれだけか、どこを私は知らないので、これはあなたのための問題かもしれません推測していますfunctionListと定義される。 clusterExportは常にクラスタワーカーのグローバル環境に変数を割り当てます。

リストの環境を設定しているようにも思われます。それは合法的だと思われますが、そのリスト内の関数の環境が変更されるとは思いません。実際、リスト内の作業者に関数をエクスポートすると、まだ遭遇していない他の問題が発生する可能性があります。私はあなたの例で自由を撮影したので、私はこれがあなたの問題に対応する方法もわからないんだけど

mainFunction <- function(cl) { 
    fa <- function(x) fb(x) 
    fb <- function(x) fc(x) 
    fc <- function(x) x 
    y <- 7 
    workerFunction <- function(i) { 
     do.call(functionNames[[i]], list(y)) 
    } 
    environment(workerFunction) <- .GlobalEnv 
    environment(fa) <- .GlobalEnv 
    environment(fb) <- .GlobalEnv 
    environment(fc) <- .GlobalEnv 
    functionNames <- c("fa", "fb", "fc") 
    clusterExport(cl, varlist=c("functionNames", functionNames, "y"), 
        envir=environment()) 
    parLapply(cl, seq_along(functionNames), workerFunction) 
} 

library(parallel) 
cl <- makeCluster(detectCores()) 
mainFunction(cl) 
stopCluster(cl) 

注:私はこのようなものを使用します。

+0

ありがとう、clusterExportが本当に問題でした – Ronert

関連する問題