2017-05-02 3 views
3

En changeant% dopar% en% do% en utilisant foreach, je peux exécuter le code séquentiellement. Comment puis-je faire cela par programme?Comment basculer par programme entre% do% et% dopar% dans foreach?

E.g. Je veux que le suivant mais avec une seule instruction foreach:

library(doParallel) 
library(foreach) 

registerDoParallel(cores = 4) 

runner <- function(parallel = FALSE) { 
    if (parallel) 
    foreach(i=1:10) %dopar% { 
     print(i) 
    } 
    else 
    foreach(i=1:10) %do% { 
     print(i) 
    } 
} 

runner() 
runner(TRUE) 
+0

Si vous avez beaucoup de code à la place de 'impression (i)', alors peut-être le convertir en une fonction, ou utiliser 'source'. – zx8754

+0

Cela pourrait être un mouvement intelligent mais je ne vois pas comment cela m'aide avec ma question. Le code était juste un exemple très non réaliste. – katsumi

+0

C'était une suggestion simple, une solution de contournement. Essayer de comprendre la motivation pour le rendre programmatique. – zx8754

Répondre

4

Vous pouvez utiliser ifelse choisir la fonction infix:

runner <- function(parallel = FALSE) { 
    `%myinfix%` <- ifelse(parallel, `%dopar%`, `%do%`) 
    foreach(i=1:10) %myinfix% { 
     print(i) 
    } 
} 
+0

qui semble être trop facile à être vrai - mais vraiment bon à savoir. Cela pourrait aussi être utile dans d'autres scénarios! – katsumi