Как программно переключаться между% do% и% dopar% в foreach?

Изменяя% dopar% на% do% при использовании foreach, я могу запускать код последовательно. Как я могу сделать это программно?

Например. Я хочу следующее, но только с ОДНИМ оператором 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)

person katsumi    schedule 02.05.2017    source источник
comment
Если вместо print(i) у вас много кода, то можно преобразовать его в функцию или использовать source.   -  person zx8754    schedule 02.05.2017
comment
Это может быть разумный ход, но я не понимаю, как это поможет мне с моим вопросом. Код был просто очень нереалистичным примером.   -  person katsumi    schedule 02.05.2017
comment
Это было простое предложение, обходной путь. Пытаюсь понять мотивацию, чтобы сделать это программным.   -  person zx8754    schedule 02.05.2017
comment
По разным причинам может иметь смысл переключаться на лету - иногда просто по причинам отладки. Я действительно не хочу редактировать код каждый раз, и я также не хочу вводить более или менее избыточные операторы foreach.   -  person katsumi    schedule 02.05.2017
comment
Также см. match.fun.   -  person zx8754    schedule 02.05.2017


Ответы (1)


Вы можете использовать ifelse, чтобы выбрать инфиксную функцию:

runner <- function(parallel = FALSE) {
     `%myinfix%` <- ifelse(parallel, `%dopar%`, `%do%`)
     foreach(i=1:10) %myinfix% {
         print(i)
     } 
}
person user1981275    schedule 02.05.2017
comment
это кажется слишком простым, чтобы быть правдой, но это действительно полезно знать. Это может пригодиться и в других сценариях! - person katsumi; 02.05.2017