2016-04-12 20 views
1

bulamadık, bu garip bir hatayla karşılaştı, sistem bu, buR foreach fonksiyonu "% dopar%"

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

spesifik olmak gerekirse ben

yaptıklarını edilir atar
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 

    } 

} 

Buraya kadar her şey ben foreach kullanarak iki işlev ntw ve lambda yarattık, İYİ olduğunu. Mükemmel çalıştılar.

# 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) 

Tipi jl(guess):

> jl(guess) 
Show Traceback 

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

herhangi bir fikir yanlış neler

Sonra da foreach kullanarak üçüncü işlevi oluşturun? foreach% dopar% ile sorun için

+1

Paralelleştirilmiş kodun içinde paralelleştirilmemelisiniz (yapamazsınız). Bunun yerine, yuvalama operatörü '%:%' kullanın. (Ve döngülerinizden bazılarını vectorized işlemlere dönüştürebileceğinizi ciddi olarak düşünmelisiniz. Bu şekilde performansınız, paralelleştirme işleminden göreceli olarak küçük kazançlar ile karşılaştırıldığında, büyüklük sıralarına göre artar.) – Roland

+0

Teşekkürler @Roland, programı yeniden yazarım. İlk iki fonksiyonun "foreach" kullanması ve sadece son fonksiyonun paralel kullanılması fikrinin ortaya çıkması ve işe yaraması. Vektörize gelince, benim durumumda nasıl yapılacağından emin değilim. – skyindeer

cevap

0

Hızlı çözüm bu paketleri yeniden yüklemektir: paketlerinin üstünde

install.packages("doSNOW") 

install.packages("doParallel") 

install.packages("doMPI") 

şimdi kaldırılır Bu paketlerin eski sürümlerinde varolan R. Bug paralellik sorumludur. Bu paketleri kodunuzda kullanmamanıza rağmen büyük olasılıkla yardımcı olacağını belirtmeliyim.