Foreach combine错误,rbind所有变量应该具有相同的长度......但它们确实是[R]。

问题描述 投票:2回答:1

我正在尝试一个超级简单的 foreach .combine 任务,读取文件夹中的 Rds 文件和 rbind 它们合二为一。

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

然后得到错误信息:

错误调用组合函数: 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))}

(82): The foreach 206的153号文件发生错误。在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 为1:152,然后加载文件153和 rbound 一起,也能正常工作。Foreach 153:206的文件可以正常工作(206是最后一个文件)。55:206工作正常(152个文件)。54:206失败(153个文件)。所以可能是问题出在 rbinding >=153个文件?我的reprex尝试成功了,有206个文件,所以没有问题。rbinding >=153的任何对象,显然。

谁能想到为什么会发生这种情况?我快想不出来了。这感觉像是一个bug?先谢谢你了。

编辑:(再次)感谢Florian Privé的帮助,解决了这个问题。这个问题与我使用的 writeLinessink (因为我不能得到 print (或 progress bars)来并行工作,无论我如何努力)。)

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

当我输出到list时,发现问题出在sink stack full错误。

screenshot

我终于解决了这个问题,多亏了 dmi3kno 的回答,并回到使用 .combine 的方法,但没有错误。

r foreach rbind
1个回答
1
投票

您可以删除 .combine 得到一个列表,然后用 do.call("rbind", your_list).

可能也会更有效率。

© www.soinside.com 2019 - 2024. All rights reserved.