我尝试用并行 foreach
替换 lapply
函数。
我有两个功能:
dRet <- function(x,per,sloss,daysToReopt){
...
}
getSum <- function(curEnv,perTP){
...
dRetlst <- function(x) return(dRet(x,perTP,sl,days))
Es_1 <- lapply(stlst,dRetlst)
Es_2 <- foreach(a = stlst) %do% dRetlst(a)
...
}
perTp,sl,days
- 是常数。
STLst
是(xts 的)列表列表。
如果我这样做,一切都会好起来的(Es_1
等于 Es_2
)。
我已经替换了getSum
函数:
getSum <- function(curEnv,perTP){
...
dRetlst <- function(x) return(dRet(x,perTP,sl,days))
cl<-makeCluster(2)
registerDoParallel(cl)
#registerDoSNOW(cl)
Es_2 <- foreach(a = stlst) %dopar% dRetlst(a)
stopCluster(cl)
...
}
结果,我遇到了错误:dRetlst(a) 中出现错误:
任务 1 失败 - “找不到函数“dRet””
如何在不将 dRet
添加到 getSum
中的情况下解决此问题?
(R 版本 3.1.2,Windows 8)
最佳答案
使用 foreach .export
选项将 dRet
显式导出到工作线程:
Es_2 <- foreach(a = stlst, .export='dRet') %dopar% dRetlst(a)
另外,我认为 foreach 循环将更具可读性:
Es_2 <- foreach(a = stlst, .export='dRet') %dopar% {
dRet(a,perTP,sl,days)
}
关于R foreach并行找不到全局函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28561546/