0

当为非并行版本传入函数名称或函数名称在并行版本中硬编码时,下面的代码可以正常工作。我需要进行哪些更改才能传入并行版本的函数名称(在 bpar 设置为 TRUE 时调用)?

require(doParallel)

MyFunc <- function(fname, bpar) {
    fname1 <- function(n) { data.frame(a=rep(3,n), b=rep(4,n)) }
    fname2 <- function(n) { data.frame(a=rep(1,n), b=rep(2,n)) }

    nobs <- 100
    if(bpar) {
        incr <- ceiling(nobs/getDoParWorkers())
        out.dt <- foreach(ind=seq(1,nobs,incr), .combine=rbind, .multicombine=TRUE) %dopar% {
            do.call('rbind', lapply(seq(ind,min(ind+incr-1,nobs)), fname ))
        }
    } else {
        out.dt <- do.call('rbind', lapply(1:nobs, fname))
    }
}

df1 <- MyFunc("fname1", FALSE)  #works
df2 <- MyFunc("fname2", FALSE)  #works

cl <- makeCluster(3)
registerDoParallel(cl)
df3 <- MyFunc("fname1", TRUE)   #fails
df4 <- MyFunc("fname2", TRUE)   #fails
stopCluster(cl)

我得到的错误是:

Error in { : 
  task 1 failed - "object 'fname1' of mode 'function' was not found"
Error in { : 
  task 1 failed - "object 'fname2' of mode 'function' was not found"
4

0 回答 0