2016-04-12 311 views
1

,我遇到这个奇怪的错误,系统将引发此[R的foreach找不到函数“%dopar%”

" Error in { : task 1 failed -could not find function "%dopar%"

具体而言,这是我做的

library(doParallel) 
cl <- makeCluster(4) 
registerDoParallel(cl) 
# Read the data 
coin95 <-read.csv('~/Documents/coin95.csv') 
coin95 <- coin95[,!(names(coin95) %in% c("X"))] 
coin95[c("Person")] <- sapply(coin95[c("Person")],as.character) 
# create the name list 
coin95_name <- as.character(coin95$Person) 
coin95_name <- unique(coin95_name) 
n <- as.numeric(length(coin95_name)) 

# the average counting process 

ntw <- function(now){ 
    foreach (Ii = coin95_name,.combine = "+",.export = c("coin95","n")) %dopar% { 
    time <-subset(coin95, subset = coin95$Person == Ii)$duration 
    stepfun(time,seq(0,length(time)))(now)/n 
    } 
} 

# the average cumulative hazard 
lambda <- function(now,params){ 
    b <- params[1] 
    sigma <- params[2] 
    mu <- params[3] 
    xi <- params[4] 
    beta1 <- params[5] 
    beta2 <- params[6] 

    k <- function(spread){ 
    L0 <- (1+(spread -mu)*xi/sigma)^(-1/xi) 
    return(L0) 
    } 

    foreach(Ii = coin95_name,.combine = "+",.export = c("coin95","n")) %dopar% { 
    time <- subset(coin95, subset = coin95$Person == Ii)$duration 
    noncov <- subset(coin95, subset = coin95$Person == Ii)$noncovered 
    reim <- subset(coin95, subset = coin95$Person == Ii)$reimbursement 
    (b*now+sum(exp(-k(now-time[(time < now)])+beta1*noncov[(time < now)]+beta2*reim[(time <now)])))/n 

    } 

} 

到目前为止,一切都很好,我已经建立使用foreach两个功能ntwlambda。他们完美地工作。

然后,我创建也使用foreach第三个功能:

# the distance 
Time <- coin95$duration 
Time <- sort(as.double(Time)) 

jl <- function(params){ 
     res<-foreach(Ii = Time,.combine = "rbind",.export = c("ntw","lambda")) %dopar% { 
     (ntw(Ii)-ntw(Ii-1e-7)) * (ntw(Ii)- lambda(Ii,params))^2 
     } 
     return(sqrt(sum(res))) 
    } 

guess<-c(0.0,1.3333,0.0,0.1,-1.2,3e-3) 

类型jl(guess)

> jl(guess) 
Show Traceback 

Rerun with Debug 
Error in { : task 1 failed -could not find function "%dopar%" 

任何想法是怎么回事?

+1

你不应该(不能?)并行化并行化的代码。改为使用嵌套运算符'%:%'。 (你应该认真考虑,如果你不能把你的一些循环变成矢量化的操作,那么你的性能比并行化的相对小的增益提高几个数量级。) – Roland

+0

谢谢@Roland,我重写了程序,给了认为前两个函数使用'foreach'并且只有最后一个函数使用并行,这是有效的。至于矢量化,我不知道如何在我的情况下做到这一点。 – skyindeer

回答

0

为用foreach%dopar%的问题快速修复是重新安装这些程序包:

install.packages("doSNOW") 

install.packages("doParallel") 

install.packages("doMPI") 

以上套餐负责在河并行的Bug存在,其在旧版本的这些包现已删除。我应该提到,即使您没有在代码中使用这些软件包,它也很有可能会有所帮助。

相关问题