2017-09-12 3 views
1

Je veux paralléliser le code ci-dessous dans R. Il s'agit d'une boucle imbriquée.paralléliser une boucle imbriquée dans 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) 
    } 
} 

Je suis en train le code ci-dessous à l'aide 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)) 

mais je reçois l'erreur suivante:

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

Y at-il une meilleure façon de paralléliser ce code (peuvent utiliser parLapply)? Si non, comment puis-je corriger le code ci-dessus?

+0

Je pense que 'lapply (my_dataset_preprocessed, fonction (x) pmin (x, 0,1))' serait plus simple à faire. – Benjamin

+2

Si vos données sont une matrice, cela devrait fonctionner: 'my_dataset [my_dataset> 0.1] <- 0.1' – emilliman5

Répondre

0

Vous n'avez pas déclaré cl. Ce qui suit travaillé si vous supprimez 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

J'ai déjà déclaré cl, ce n'est pas le problème. même si je supprime cette ligne, il lance la même erreur –

+0

Ok. BTW, j'ai commencé une nouvelle session R, et cela a fonctionné à nouveau sans erreur ... donc je ne sais pas pourquoi il y a une différence. Pourriez-vous essayer votre même code avec '% do%' au lieu de '% dopar%'? – CPak

+0

% do% me donne la même erreur. J'ai essayé votre matrice et elle a fonctionné correctement. Donc, le problème est avec la structure alors. Ci-dessous le retraçage de l'erreur: \t 5 arrêt (simpleError (msg, appel = expr)) \t 4 e fun $ (obj, substitut (ex), parent.frame(), e $ data) \t 3 foreach (i = 1: nrow (X))%:% foreach (j = 1: Ncol (X))% dopar% { \t \t co = min (x [i, j], 0,1) \t} \t 2 threshold_par (test) \t 1 system.time (threshold_par (test)) –