繁体   English   中英

根据函数的参数调用%do%vs%dopar%(foreach)

[英]Making a function call %do% vs %dopar% (foreach) based on an argument to the function

我正在编写一个函数,我想为用户提供并行运行的选项。 我喜欢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()

这比它看起来需要的时间更长,并且冒着我可能不记得要反映对底部顶部所做的任何更改的风险。 我宁愿做类似以下的事情(非工作),但我不知道是否可以这样做:

myfun <- function(parallel = TRUE){
  if (parallel == TRUE){
    require(doMC)
    registerDoMC(detectCores())
  }
  foreach(i = 1:10) ifelse(parallel == TRUE, %dopar%, %do%) {
    print(i)
  }
  return('OK!')
}

任何选择%do% vs %dopar%取决于函数的arg? 我想我每次都可以注册1个核心并调用%dopar% ,但这会引发关于没有注册并行后端的警告,这可能会让那些不是我的人感到困惑。

以下代码似乎有效。

(因为我使用的是Windows机器,所以我使用了doParallel而不是doMC 。)

这里的技巧是定义一个函数%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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM