gpt4 book ai didi

r - 根据函数的参数进行函数调用 %do% 与 %dopar% (foreach)

转载 作者:行者123 更新时间:2023-12-05 00:56:16 25 4
gpt4 key购买 nike

我正在编写一个函数,我想让用户选择是否并行运行。我更喜欢 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()

这比看起来需要的时间长,并且冒着我可能不记得反射(reflect)对底部顶部所做的任何更改的风险。我更愿意做以下事情(非工作),但我不知道是否有可能这样做:
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%对比 %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)

关于r - 根据函数的参数进行函数调用 %do% 与 %dopar% (foreach),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36456454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com