我尝试将lapply
函数替换为并行foreach
。
我有两个功能:
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)
...
}
结果,我收到了错误:Error in dRetlst(a) :
task 1 failed - "can not find function "dRet""
如何在不将dRet
添加到getSum
的情况下解决此问题?
(R版本3.1.2,Windows 8)
答案 0 :(得分:4)
使用foreach .export
选项将dRet
显式导出到worker:
Es_2 <- foreach(a = stlst, .export='dRet') %dopar% dRetlst(a)
另外,我认为foreach循环更具可读性:
Es_2 <- foreach(a = stlst, .export='dRet') %dopar% {
dRet(a,perTP,sl,days)
}