gpt4 book ai didi

R - optim 调用的函数内部的 foreach %dopar% 问题

转载 作者:行者123 更新时间:2023-12-02 05:37:53 28 4
gpt4 key购买 nike

从 optim 调用包含 foreach %dopar% 构造的函数会导致错误:

> workers <- startWorkers(6) # 6 cores
>
> registerDoSMP(workers)
>
> t0 <- Sys.time()
>
> optim(w,maxProb2,control=list(fnscale=-1))
>
> Error in { : task 1 failed - "unused argument(s) (isPrebuilt = TRUE)"
>
> Sys.time()-t0
>
> Time difference of 2.032 secs
>
> stopWorkers(workers)

被调用的函数如下所示:

> maxProb2 <- function(wp) {
>
> r <- foreach (i=s0:s1, .combine=c) %dopar% { pf(i,x[i,5],wp,isPrebuilt=TRUE) }
>
> cat("w=",wp,"max=",sum(r),"\n")
>
> sum(r)
>
> }

pf 是其他函数,x 是预先计算元素的静态表。

同样调用一次要优化的函数也会导致同样的错误:

> workers <- startWorkers(6) # 6 cores
>
> Warning message:
> In startWorkers(6) : there is an existing doSMP session using doSMP1
>
> registerDoSMP(workers)
>
> maxProb2(w)
> Error in { : task 1 failed - "unused argument(s) (isPrebuilt = TRUE)"
>
> stopWorkers(workers)

奇怪的是,相同的代码在直接调用一次时工作正常(optim 多次调用相同的函数):

> workers <- startWorkers(6) # 6 - ilosc rdzeni
>
> Warning message:
> In startWorkers(6) : there is an existing doSMP session using doSMP1
>
> registerDoSMP(workers)
>
> r <- foreach (i=s0:s1, .combine=c) %dopar% { pf(i,x[i,5],w,isPrebuilt=TRUE) }
>
> sum(r)
> [1] 187.1781
>
> stopWorkers(workers)

当使用 %do% 而不是 %dopar% 时,被调用的函数 (maxProb2) 工作正常。

如何正确调用包含 foreach %dopar% 结构的函数?

2011-07-17 更新:

我已将 pf 函数重命名为 probf,但问题仍然存在。

probf 函数是在脚本中定义的,而不是在某些外部包中定义的。

两个注释:操作系统:Windows 7,IDE:Revolution Analytics Enterprise 4.3

> workers <- startWorkers(workerCount = 3)
>
> registerDoSMP(workers)
>
> maxProb2(w)
>
Error in { : task 1 failed - "could not find function "probf""

最佳答案

我遇到了同样的问题,问题是环境未包含在子线程中。你的错误

Error in { : task 1 failed - "could not find function "simple_fn""

可以通过这个非常简单的例子来重现:

simple_fn <- function(x)
x+1

test_par <- function(){
library("parallel")
no_cores <- detectCores()
library("foreach")
cl<-makeCluster(no_cores)
library("doSNOW")
registerDoSNOW(cl)
out <- foreach(i=1:10) %dopar% {
simple_fn(i)
}

stopCluster(cl)
return(out)
}

test_par()

现在您需要做的就是将 foreach(i=1:10) 更改为 foreach(i=1:10, .export=c("simple_fn")) 。如果您想导出完整的全局环境,那么只需编写.export=ls(envir=globalenv()),无论好坏,您都会拥有它。

关于R - optim 调用的函数内部的 foreach %dopar% 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6689937/

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