R foreach并行找不到全局函数

时间:2015-02-17 12:30:34

标签: r foreach parallel-processing lapply

我尝试将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)

1 个答案:

答案 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)
}