如何以编程方式在 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