2017-04-20 4 views
0

Je tente d'exécuter le code suivant (utilisé à des fins de eWAS) dans un format parallèle:doParallel semble corrompt sortie pour une raison inconnue

registerDoParallel(2) 

combined <- foreach(i = 28:78, .combine=rbind) %dopar%     
{ 
mm<-rep(NA,412) 

FIDunique<-unique(pheno$FID) 
for(j in FIDunique) 
{ 
    nn<-which(pheno1$FID==j) 
    mm[nn]<-mean(pheno1[nn,i]) 
} 
tt4<-which(!is.na(mm)) 

if(length(tt4)>19 & length(table(pheno1[,i]))>1) 
{ 
    meth<-pheno1[tt4,i] 
    mm<-mm[tt4] 

    if(length(levels(factor(pheno1$smoking)))<2) 
    { 
    lme2<-tryCatch(lme(I(meth-mm)~delta_residSpine+I(DNA_year-AGE_year)+CD8T+CD4T+NK+Bcell+Mono+Gran,random=~1|FID, control=lmeControl(msMaxIter=50000,opt="optim"), data=pheno1[tt4,]),error = function(e) rep (NaN,1)) 
    } 
    else 
    { 
    lme2<-tryCatch(lme(I(meth-mm)~delta_residSpine+I(DNA_year-AGE_year)+factor(smoking)+CD8T+CD4T+NK+Bcell+Mono+Gran,random=~1|FID, control=lmeControl(msMaxIter=50000,opt="optim"), data=pheno1[tt4,]),error = function(e) rep (NaN,1)) 
    } 

    if(!is.na(lme2)) out18[i-27,2:5]<-summary(lme2)$tTable[2,-3] 

    rm(mm,nn,meth,lme2) 
} 

out18[i-27,6]<-length(tt4) 
out18[i-27,] 
} 

La question que je vais avoir est que lorsque j'utilise% faire% dans la deuxième ligne, le programme exécute parfaitement et « combiné » contient le the correct output.

Cependant quand j'utilise% dopar% (comme il est indiqué dans le code ci-dessus), the middle four columns of combined dissapear. Je suppose que cela est dû à ces quatre colonnes étant assigné basé sur un tryCatch? Je suis coincé là-dessus depuis quelques jours et j'ai vraiment besoin de progresser.

Il est aussi ne vaut rien quand je lance le programme en tant que% ne%, je reçois l'avertissement

Avertissement si out18 [i - 27, 2 (is.na (lme2)!): 5] < - résumé (lme2) TTABLE $ [2,: la condition a une longueur> 1 et seul le premier élément sera utilisé

pour chaque itération, mais je ne suis pas du tout lors de l'exécution sous % dopar%. Excusez-moi si je n'ai pas donné assez d'informations sur ce que sont les variables, j'essaie de divulguer le moins possible sur les informations réelles traitées pour des raisons éthiques.

+0

il est pas facile de suivre votre problème. Sur quoi es-tu? '% do%' et '% dopar%' n'ont certainement pas le même comportement, et '% dopar%' peut dépendre des Os. – clemlaflemme

+0

Votre problème vient probablement du fait que vous essayez de mettre à jour une valeur en utilisant 'foreach' (à savoir le tableau' out18') qui n'a pas de sens. Essayez plutôt d'utiliser un nouveau vecteur et de le renvoyer uniquement. Les options '.combine' donneront le résultat correctement – clemlaflemme

Répondre

0

Je pense que vous avez raison qu'une erreur inattendue est cachée par le tryCatch. Par exemple, puisque vous utilisez la fonction lme, ne devriez-vous pas charger le paquet nlme sur vos travailleurs? Comme dans:

r <- foreach(i = 28:78, .packages='nlme', .combine=rbind) %dopar% { 
    #snip 
} 

Il pourrait y avoir d'autres problèmes, tels que les objets qui doivent être exportés explicitement, donc je vous conseille de changer votre code pour ne pas cacher des erreurs inattendues, en particulier lors du test/mise au point. Une approche simple consiste à enregistrer l'erreur et retourner la valeur appropriée:

tryCatch(foo(), error = function(e) { 
    print(e) 
    NaN 
}) 

Pour voir ces messages du journal, vous pouvez utiliser l'option makeCluster outfile="" sorte que les messages seront affichés dans votre terminal. Voir this answer pour plus d'informations.

Je suggère également que vous changez votre test à quelque chose comme:

if (!identical(lme2, NaN)) ... 

Cela évitera l'avertissement lorsque lme2 est pas un NaN depuis identical ne retourne une valeur de longueur> 1.