2016-12-28 5 views
0

以下のサンプルコードでforeachとdoParallelを使用しています。 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) 

私はENVIR = .GlobalEnvを使用する場合、私はエラーに

**"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"""**

です。

+2

あなたはスタックオーバーフロー時にアカウントを持っています。なぜこの質問を投稿していないのですか?ここで話題にはならない。 – Roland

答えて

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


fun1 <- function(param1, param2, param3) 
{ 
    param4 = param1+param2 
    param5 = param2+param3 
    param6 = param3+param1 

    mmm = foreach(i = 1:length(param1), .combine = rbind, .export = "fun2") %dopar% fun2(i, param4, param5, param6) 
    mmm 
} 

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

param1 = 1:10 
param2 = 2:11 
param3 = 3:12 
fun1(param1, param2, param3) 
#   [,1] 
#result.1  60 
#result.2 210 
#result.3 504 
#result.4 990 
#result.5 1716 
#result.6 2730 
#result.7 4080 
#result.8 5814 
#result.9 7980 
#result.10 10626 
関連する問題