Каждая ошибка объединения, rbind всех переменных должны иметь одинаковую длину ... но они делают [R] - PullRequest
2 голосов
/ 20 апреля 2020

Я пытаюсь выполнить очень простую задачу foreach .combine, чтобы прочитать папку из Rds файлов и rbind их в один:

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

и получить ошибку:

ошибка вызова функции объединения: simpleError в rbind (deparse.level, ...): неверный аргумент списка: все переменные должны иметь одинаковую длину

Однако, если я oop через все файлы и спросите их length, они все одинаковые (82):

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

Ошибка foreach возникает в файле 153 из 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 для 1: 152, затем загрузил файл 153 и rbound вместе, и это тоже отлично работает. Foreach для файлов 153: 206 работает нормально (206 - последний файл). 55: 206 работает нормально (152 файла). 54: 206 не удается (153 файла). Возможно, проблема в rbinding> = 153 файлах? Моя попытка репрезентации завершилась успешно с 206 файлами, поэтому проблем с rbinding> = 153 ЛЮБОГО объекта, разумеется, нет.

Может кто-нибудь придумать причину, по которой это может происходить? У меня заканчиваются идеи. Это похоже на ошибку? Заранее спасибо.

Редактировать: Спасибо (еще раз) Флориану Приве за помощь в решении. Проблема была связана с моим использованием writeLines и sink (поскольку я не могу заставить print (или progress bars) работать параллельно, как бы я ни старался):

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

Когда я вывел в список, обнаружилось, что ошибка переполнения стека была проблемой:

screenshot

Я наконец исправил это благодаря Ответ dmi3kno и вернулся к использованию подхода .combine без ошибок.

1 Ответ

1 голос
/ 20 апреля 2020

Вы можете удалить .combine, чтобы получить список, а затем использовать do.call("rbind", your_list).

Вероятно, это будет более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...