【发布时间】:2017-08-21 16:53:26
【问题描述】:
从 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)
奇怪的是,相同的代码在直接调用一次时运行良好(优化多次调用相同的函数):
> 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""
【问题讨论】:
-
请始终在您的问题中包含确切的错误消息。
标签: r parallel-processing