2017-02-07 3 views
1

Je veux retourner NULL avec une fonction personnalisée utilisée dans une boucle parallèle foreach. L'utilisation est que, si certains résultats ne remplissent pas certains critères, ce résultat ne sera pas stocké et il sera filtré comme une étape de post-traitement.Comment retourner null pour la fonction personnalisée utilisée dans% dopar%?

Cependant, retourne mon programme

tâche 1 a échoué - "remplacement a une longueur zéro"

Le problème peut être reproduit avec le code suivant:

library(doParallel) 
Input <- c(F,T,F) 
f.parallel <- function(x){ 
    ifelse(x,T,NULL) 
} 
no_cores <- detectCores()-1 
    # for mac OS, linux 
c1 <- makeCluster(no_cores,type = "FORK") 
    # for windows 
    # cl <- makeCluster(no_cores) 
    # clusterExport(cl, list("Input","f.parallel")) 
registerDoParallel(cl) 
output <- foreach(i=1:length(Input),.combine = cbind) %dopar% f.parallel(Input[i]) 

stopCluster(c1) 

Répondre

3

Essayez f.parallel <- function(x) if(x) TRUE. ifelse() ne vous permettra pas de retourner NULL.

Lorsque cbind() est appelée pour combiner les résultats de votre boucle, les éléments NULL seront supprimés. Si vous souhaitez les filtrer dans une étape de post-traitement, je vous recommande d'utiliser ifelse(x, TRUE, NA).

+0

cela fonctionne avec '' 'if (x) T'''. mais je pense que ifelse() peut retourner NULL. mais ça ne marche pas avec% dopar%. si je change à% do%, cela fonctionne alors. mais pourquoi est-ce ainsi? – HappyCoding

+2

C'est étrange. Ni% do% ni 'ifelse (TRUE, NULL, 1)' ne fonctionne pour moi. – coletl

+0

peut-être différentes versions? Savez-vous comment passer le nom de la colonne à la valeur dans la fonction personnalisée? – HappyCoding