我正在编写一个函数,我想为用户提供并行运行的选项.foreach出于各种原因,我更喜欢竞争对手.到目前为止,我已经将其设置为类似于下面的虚拟函数:
library(foreach)
myfun <- function(parallel = TRUE){
if (parallel == TRUE){
require(doMC)
registerDoMC(detectCores())
foreach(i = 1:10) %dopar% {
print(i)
}
} else {
foreach(i = 1:10) %do% {
print(i)
}
}
return('OK!')
}
myfun()
Run Code Online (Sandbox Code Playgroud)
这比它看起来需要的时间更长,并且冒着我可能不记得反映对底部顶部所做的任何更改的风险.我宁愿做类似以下的事情(非工作),但我不知道是否可以这样做:
myfun <- function(parallel = TRUE){
if (parallel == TRUE){
require(doMC)
registerDoMC(detectCores())
}
foreach(i = 1:10) ifelse(parallel == TRUE, %dopar%, %do%) {
print(i)
}
return('OK!')
}
Run Code Online (Sandbox Code Playgroud)
任何选择%do%vs的方法都%dopar%取决于函数的arg?我想我可以只注册1个内核并且%dopar%每次调用,但是这会引发一个关于没有注册并行后端的警告,这可能会让那些不是我的人感到困惑.
以下代码似乎有效.
(我使用的是doParallel代替,doMC因为我使用的是Windows机器.)
这里的技巧是定义一个%fun%取值%do%或的函数%dopar.这是有效的,因为R中的函数是第一类对象,您可以使用现有函数的值分配新函数.唯一的小细节是你必须使用封闭的%do%反引号.
library(foreach)
require(doParallel)
foo <- function(parallel = TRUE){
`%fun%` <- `%do%`
if (parallel == TRUE){
require(doParallel)
cl <- makePSOCKcluster(detectCores())
registerDoParallel(cl)
`%fun%` <- `%dopar%`
}
foreach(i = 1:10) %fun% {
print(i)
}
return('OK!')
}
foo(FALSE)
foo(TRUE)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
498 次 |
| 最近记录: |