5

我想出了一个奇怪的错误。假设我在一个名为 data 的列表中有 10 个 xts 对象。我现在使用每三个组合搜索

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

我的基本目标是对这 1080 个三元组进行 PCA。为了加快速度,我想使用包doParallel。所以这是缩短到错误发生点的代码段:

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

在这里,合并功能似乎是问题所在。错误是

任务 1 失败 - “无法将类 'c("xts", "zoo")' 强制转换为 data.frame”

但是,当将 %dopar% 更改为正常的串行 %do% 时,一切正常。

直到现在我还没有找到任何解决这个问题的方法,我什至不确定要寻找什么。

4

3 回答 3

10

比在函数中显式加载库更好的解决方案是利用foreach() 函数的.packages参数:

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)
}
于 2013-08-15T21:18:17.293 回答
4

问题可能在于您没有召集library(xts)每个工人。你没有说你正在使用什么后端,所以我不能 100% 确定。

如果这是问题所在,那么这段代码将解决它:

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)
}
于 2013-06-17T21:36:54.893 回答
0

foreach %dopar% 问题的快速解决方法是重新安装这些软件包:

install.packages("doSNOW")

install.packages("doParallel") 

install.packages("doMPI")

这些负责 R 中的并行性。这些包的旧版本中存在的错误现在已删除。它在我的情况下有效。

于 2017-08-21T09:03:59.073 回答