2017-09-12 13 views
1

以下のコードをRで並列化したいと思います。これは入れ子のforループです。入れ子のforループを並列化するR

for (i in 1:nrow(my_dataset_preprocessed)){ 
    for (j in 1:ncol(my_dataset_preprocessed)){ 
     my_dataset_preprocessed[i,j] = min(my_dataset_preprocessed[i,j], 0.1) 
    } 
} 

私はdoParallel

library(foreach) 
library(doParallel) 
registerDoParallel(detectCores()) 
clusterExport(cl, "my_dataset") 

threshold_par <- function (X) { 
    co <- foreach(i=1:nrow(X)) %:% 
       foreach (j=1:ncol(X)) %dopar% { 
        co = min(X[i,j], 0.1) 
       } 
    matrix(unlist(co), ncol=ncol(X)) 
} 

system.time(threshold_par(my_dataset)) 

を使用して以下のコードをしようとしています。しかし、私は次のエラーを取得しています:

Error in { : task 1 failed - "invalid 'type' (list) of argument"

は、このコードを並列化するために任意のより良い方法はあります(使用することができますparLapply)?そうでない場合は、上記のコードをどのように修正すればよいですか?

+0

を削除する場合は、次のは、働いていた私は、 'lapply(my_dataset_preprocessed、関数(x)は、PMIN(X、0.1))'行うにはシンプルなことだと思います。 – Benjamin

+2

データが行列の場合、これはうまくいくはずです: 'my_dataset [my_dataset> 0.1] < - 0.1' – emilliman5

答えて

0

clを宣言していません。あなたはclusterExport(cl, "my_dataset")

library(foreach) 
library(doParallel)  
registerDoParallel(detectCores()) 
getDoParWorkers() 
# [1] 8 

threshold_par <- function (X) { 
    co <- foreach(i=1:nrow(X)) %:% 
       foreach (j=1:ncol(X)) %dopar% { 
        co = min(X[i,j], 0.1) 
       } 
    matrix(unlist(co), ncol=ncol(X)) 
} 

test <- matrix(1:4, ncol=2) 
system.time(threshold_par(test)) 
#  user system elapsed 
#  0.01 0.00 0.02 
+0

私は前に宣言しましたが、それは問題ではありません。その行を削除しても同じエラーが返されます –

+0

btw、私は新しいRセッションを開始しました、そして、それはエラーなしで再び働きました...なぜ違いがあるのか​​分かりません。 '%dopar% 'の代わりに'%do% 'で同じコードを試してみることができますか? – CPak

+0

%do%は私に同じエラーを与えます。私はあなたの行列を試して、それは正常に実行されました。ですから、問題は構造体にあります。以下は、エラーのトレースバックです: \t 5停止(simpleError(MSG)= exprのを呼び出す) \t 4 E $楽しい(OBJ、代替(EX)、parent.frame()、電子の$データ) \t 3 foreachの(I = 1:nrow(X))%:%foreachの(J = 1:NcoI部位(X))%dopar%{ \t \t CO =分(X [I、J]、0.1) \t} \t 2 threshold_par(test) \t 1 system.time(threshold_par(test)) –

関連する問題