2016-04-11 7 views
0

Rで並列計算を使用しようとしていますが、何か問題があります。関数内のforeachがリストを認識できない

#standard 
ntw <- function(now){ 
    L2 <- 0 
    for (Ii in species){ 
    time <- subset(df, subset = species == Ii)$time 
    time <- sort(time) 
    L2 <- L2 + stepfun(time,seq(0,length(time)))(now) 

    } 
    return(L2) 
} 

を試してみてくださいステップ関数の和の並べ替えを取得するために

df <- data.frame(species = rep(c(1:100), each = 100), time = runif(10000,150, 1008)) 
species <- unique(df$species) 

その後、私は次のコードを実行し、次のよう

まず、私は種と時間で構成されてリストを生成します

> ntw(152) 
[1] 27 

これまでのところ、今はdoParallelを読み込み、同じものを複製しようとしています並列コンピューティングを歌う:

library(doParallel) 
library(foreach) 
cl <- makeCluster(2) 
registerDoParallel(cl) 
#parallel 
nt <- function(now){ 
    L2 <- 0 
    foreach(i = species,.combine = rbind) %dopar% { 
    time <- subset(df, subset = species ==i)$time 
    time <- sort(time) 
    L2 <- L2 + stepfun(time,seq(0,length(time)))(now) 
    } 
    return(L2) 
} 

> nt(152) 
Error in { : task 1 failed - "could not find 'df'" 

は何が起こっているのか理解していない試してみてください。

------------------

アップデート:@ chinsoon12と@brittenbによって 後のアドバイス、私は次のコード

#parallel 
nt <- function(now){ 
    L2 <- 0 
    foreach(i = species,.combine = rbind,.export = "df") %dopar% { 
    time <- subset(df, subset = species ==i)$time 
    time <- sort(time) 
    L2 <- L2 + stepfun(time,seq(0,length(time)))(now) 
    } 
    return(L2) 
} 
と輸出を指定

は今標準のものと矛盾している

> nt(152) 
[1] 0 

してみてください。何か案が ?

+0

を使用しているときは常にset.seed(xxx)が含まれますが、各クラスタにchinsoon12 @ – chinsoon12

+0

感謝をDFと種をエクスポートする必要がありますが、あなたは、より具体的なことができますか?私はかなり今doParallel – skyindeer

+0

パラレル関数は自動的に変数と関数を現在のスコープ内で "エクスポート"します。だから、新種のRセッションに「種」を輸出して使うことができるようにする必要があります。 'foreach'のヘルプページを見て、変数、関数、パッケージをエクスポートする方法を読んでください。 – brittenb

答えて

1

あなたはstepfunへの各呼び出しの結果をINGのrbindことにより、あなたのケースでは、アレイが構築されforeach、の戻り値を取得する必要があります。

nt <- function(now){ 
     result <- foreach(i = species,.combine = "rbind", .export = "df") %dopar% { 
       time <- subset(df, subset = species ==i)$time 
       time <- sort(time) 
       stepfun(time,seq(0,length(time)))(now) 
     } 
     return(sum(result)) 
} 

nt(152) 
[1] 28 

ここで大きなミスが値を割り当てるしようとしています並行してL2へ:

:あなたは

はまた、あなたが "+"コンバイナを使用して、このビットに簡単に書き換えることができます...別のプロセスではなく、同じ変数に同時に複数の値を代入しようとしています優れた再現性のために
nt <- function(now){ 
     foreach(i = species,.combine = "+", .export = "df") %dopar% { 
       time <- subset(df, subset = species ==i)$time 
       time <- sort(time) 
       stepfun(time,seq(0,length(time)))(now) 
     } 
} 

nt(152) 
[1] 28 

(*)ランダム

+0

ありがとうございます!たくさん !!!!!! – skyindeer

関連する問題