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

瘦欲@ 提交于 2019-12-19 08:56:44

问题


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.


回答1:


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



回答2:


The problem is likely that you haven't called library(xts) on each of the workers. You don't say what backend you're using, so I can't be 100% sure.

If that's the problem, then this code will fix it:

list <- foreach(i=1:ncol(combs)) %dopar% {
    library(xts)
    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)
}



回答3:


Quick fix for problem with foreach %dopar% is to reinstall these packages:

install.packages("doSNOW")

install.packages("doParallel") 

install.packages("doMPI")

These are responsible for parallelism in R. Bug which existed in old versions of these packages is now removed. It worked in my case.



来源:https://stackoverflow.com/questions/17157211/error-when-using-dopar-instead-of-do-in-r-package-doparallel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!