以下代码:
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)
}
外翻效果很好
答案 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
循环中返回结果之前匹配结果的长度。