如何以编程方式在 foreach 中的 %do% 和 %dopar% 之间切换?

Posted

技术标签:

【中文标题】如何以编程方式在 foreach 中的 %do% 和 %dopar% 之间切换?【英文标题】:How to switch programmatically between %do% and %dopar% in foreach? 【发布时间】: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 【参考方案1】:

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

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

【讨论】:

这似乎太容易令人难以置信 - 但真的很高兴知道。这在其他情况下也可能派上用场!

以上是关于如何以编程方式在 foreach 中的 %do% 和 %dopar% 之间切换?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 List ForEach 中以编程方式激活 NavigationLink

以编程方式定义DataGridView列类型

如何以编程方式在 SwiftUI 中滚动?

如何以编程方式设置 Cron 作业?

如何以编程方式更改堆栈面板中所有(n个)texblock的字体大小?

以编程方式比较Eclipse PDE中的两个Java源文件