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é 帮助解决问题。问题与我使用 writeLines
和 sink
有关(因为无论我多么努力,我都无法让 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)
。
它可能也会更有效率。
我正在尝试一个超级简单的 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é 帮助解决问题。问题与我使用 writeLines
和 sink
有关(因为无论我多么努力,我都无法让 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)
。
它可能也会更有效率。