【问题标题】:How to switch programmatically between %do% and %dopar% in foreach?如何以编程方式在 foreach 中的 %do% 和 %dopar% 之间切换?
【发布时间】:2017-09-29 16:54:50
【问题描述】:

通过在使用 foreach 时将 %dopar% 更改为 %do%,我可以按顺序运行代码。如何以编程方式执行此操作?

例如我想要以下内容,但只有一个 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)

【问题讨论】:

  • 如果你有很多代码代替print(i),那么可以将其转换为函数,或者使用source
  • 这可能是一个聪明的举动,但我看不出这对我的问题有什么帮助。代码只是一个非常不现实的例子。
  • 这是一个简单的建议,一个解决方法。试图了解使其程序化的动机。
  • 出于各种原因,即时切换可能是有意义的——有时只是出于调试原因。我真的不想每次都编辑代码,也不想引入或多或少冗余的 foreach 语句。
  • 另见match.fun

标签: r foreach parallel-foreach


【解决方案1】:

您可以使用ifelse 选择中缀函数:

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

【讨论】:

  • 这似乎太容易令人难以置信 - 但真的很高兴知道。这在其他情况下也可能派上用场!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多