Foreach combine error, rbind all variables should have the same length...但他们这样做 [R]

Foreach combine error, rbind all variables should have the same length... but they do [R]

我正在尝试一个超级简单的 foreach .combine 任务来读取包含 Rds 个文件的文件夹并将它们 rbind 合并为一个:

all_dfs <- foreach(j = list.files(pattern = ".Rds"),
 .errorhandling = "pass",
 .combine = rbind,
 .multicombine = TRUE) %dopar% {eachRdsFile <- readRDS(j)}

并得到错误:

error calling combine function: simpleError in rbind(deparse.level, ...): invalid list argument: all variables should have the same length

但是,如果我遍历所有文件并询问它们的 length,它们都是相同的 (82):

for (j in list.files(pattern = ".Rds")) {
 eachRdsFile <- readRDS(j)
 print(length(eachRdsFile))}

foreach 错误发生在文件 153 of 206 上。它适用于 1:152。我打开并调查了文件 153,它看起来不错,与 152 相同。我尝试了一个最小的可重现示例:

library(parallel)
library(doMC)
mycores <- 8
registerDoMC(cores = mycores)
testdfs <- foreach(j = 1:206,.errorhandling = "pass",.combine = rbind,.multicombine = TRUE) %dopar% {
  eachdf <- data.frame(A = runif(10), B = runif(10))}

但它工作正常。我 运行 foreach for 1:152 然后一起加载文件 153 和 rbound 它们也可以正常工作。 Foreach 在文件 153:206 上工作正常(206 是最后一个文件)。 55:206 工作正常(152 个文件)。 54:206 失败(153 个文件)。所以问题可能出在 rbinding >=153 个文件上?我的 reprex 尝试成功处理了 206 个文件,因此显然 rbinding >=153 的任何对象都没有问题。

谁能想出发生这种情况的原因?我 运行 没主意了。这感觉像个错误?提前致谢。

编辑:(再次)感谢 Florian Privé 帮助解决问题。问题与我使用 writeLinessink 有关(因为无论我多么努力,我都无法让 print(或 progress bars)并行工作) :

writeLines(c(""), "log.txt")
all_dfs <- foreach(...){
sink("log.txt", append = TRUE)

当我输出到list时,发现是sink stack full错误的问题:

感谢 dmi3kno's answer,我终于解决了这个问题,然后又回到使用 .combine 方法,没有出现任何错误。

您可以删除 .combine 以获取列表,然后使用 do.call("rbind", your_list)

它可能也会更有效率。