Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error when using %dopar% instead of %do% in R (package doParallel)

I've come up with a strange error. Suppose I have 10 xts objects in a list called data. I now search for every three combinations using

   data_names <- names(data)
   combs <- combn(data_names, 3)

My basic goal is to do a PCA on those 1080 triples. To speed things up I wanted do use the package doParallel. So here is the snippet shortened till the point where the error occurs:

list <- foreach(i=1:ncol(combs)) %dopar% {
    tmp_triple <- combs[,i]

    p1<-data[tmp_triple[[1]]][[1]]
    p2<-data[tmp_triple[[2]]][[1]]
    p3<-data[tmp_triple[[3]]][[1]]

    data.merge <- merge(p1,p2,p3,all=FALSE)
}

Here, the merge function seems to be the problem. The error is

task 1 failed - "cannot coerce class 'c("xts", "zoo")' into a data.frame"

However, when changing %dopar% to a normal serial %do% everything works as accepted.

Till now I was not able to find any solution to this problem and I'm not even sure what to look for.

like image 870
user1356695 Avatar asked Jun 17 '13 21:06

user1356695


1 Answers

A better solution rather than explicitly loading the libraries within the function would be to utilise the .packages argument of the foreach() function:

list <- foreach(i=1:ncol(combs),.packages=c("xts","zoo")) %dopar% {
    tmp_triple <- combs[,i]

    p1<-data[tmp_triple[[1]]][[1]]
    p2<-data[tmp_triple[[2]]][[1]]
    p3<-data[tmp_triple[[3]]][[1]]

    data.merge <- merge(p1,p2,p3,all=FALSE)
}
like image 64
Adam Erickson Avatar answered Oct 05 '22 23:10

Adam Erickson