当为非并行版本传入函数名称或函数名称在并行版本中硬编码时,下面的代码可以正常工作。我需要进行哪些更改才能传入并行版本的函数名称(在 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"