错误调用R中的组合函数循环foreach

时间:2017-10-18 08:25:02

标签: r foreach doparallel

以下代码:

df <- foreach(i = 1:length, .combine = cbind) %dopar% {
 ...
 ...
 m4
}

给了我一个错误:

error calling combine function:
<simpleError in data.frame(..., check.names = FALSE): arguments imply differing number of rows: 17, 0>

但是,如果我用&#34执行相同的代码;对于&#34;而不是&#34; foreach&#34;我也手动制作了cbind:

for (i in 1:lengthGeni) {
...
...
mFinaleCGunificati <- cbind(mFinaleCGunificati, m4)
}

外翻效果很好

1 个答案:

答案 0 :(得分:0)

?cbind我们了解到

  

如果有多个矩阵参数,则它们必须具有相同数量的列(或行),这将是结果的列数(或行数)。如果所有参数都是向量,则结果中的列(行)数等于最长向量的长度。

但是,如果从这两个cbind实例的比较中

# second df with one row
cbind(as.data.frame(matrix(rep(1, 10), nrow = 5)), 
      as.data.frame(matrix(rep(2, 2), nrow = 1)))
#   V1 V2 V1 V2
# 1  1  1  2  2
# 2  1  1  2  2
# 3  1  1  2  2
# 4  1  1  2  2
# 5  1  1  2  2

# second df with zero rows
cbind(as.data.frame(matrix(rep(1, 10), nrow = 5)), 
      as.data.frame(matrix(rep(2, 0), nrow = 0)))
# Error in data.frame(..., check.names = FALSE) : 
#   arguments imply differing number of rows: 5, 0

我们知道不允许零长度的对象。

因此,您应该检查循环中的结果是否具有大于0的任意行数。

library(foreach)
library(doSNOW)
cl <- makeSOCKcluster(5)
registerDoSNOW(cl)

df <- foreach(i = 1:2, .combine = cbind) %dopar% {
  if (i == 1){
    x <- as.data.frame(matrix(rep(1, 5), nrow = 5))
  } else {
    x <- as.data.frame(matrix(rep(1, 2), nrow = 1))
  }

  # check if result has at least one row
  if (nrow(x) > 0){
    x
  }
}
df 
#   V1 V1 V2
# 1  1  2  2
# 2  1  2  2
# 3  1  2  2
# 4  1  2  2
# 5  1  2  2

但是,请记住,将重复使用较短的向量。因此,这种方法可能导致代码内的冗余。

为了避免冗余,您可以考虑在foreach循环中返回结果之前匹配结果的长度。

相关问题