Структура списков в пакете foreach

Я нашел функцию/ошибку в пакете foreach, который я не понимаю. Возможно, кто-то может объяснить мне такое поведение:

Я создал цикл for с пакетом foreach (я использую их вместе с вычислениями mutlicore, но здесь, как раз в примере с последовательностью, ошибка появляется в обоих вариантах). Этот цикл работает r раз. В каждом запуске возвращается список с c. Поэтому я ожидаю список с элементами r, и каждая запись состоит из списков c.

Мой код был следующим:

library(foreach)

clusters <- 10
runs <- 100

temp <- foreach(r = 1:runs,
                .combine = 'list',
                .multicombine = TRUE) %do% {

              signal_all <- lapply(1:clusters, function(x){

                return(1)

              })

              return(signal_all)
            } ## end do

С помощью этого кода все работает как ожидается, см. следующий рисунок:

введите описание изображения здесь

Но при увеличении runs <- 101 вывод temp таков:

enter image description here

Ожидаемая структура списка уничтожается. Но при комментировании строки .combine = 'list' все работает так, как ожидалось.

library(foreach)

clusters <- 10
runs <- 100

temp <- foreach(r = 1:runs,
                .multicombine = TRUE) %do% {

              signal_all <- lapply(1:clusters, function(x){

                return(1)

              })

              return(signal_all)
            } ## end do

введите описание изображения здесь

Может кто-нибудь объяснить это поведение? Спасибо за любую помощь!

Ответ 1

Между тем я нашел решение.

Функция foreach знает, что некоторые comine-функции (например, c или cbind) принимают много аргументов и будут вызывать их до 100 аргументов (по умолчанию), чтобы повысить производительность. С аргументом .maxcombine вы можете установить их вручную.

library(foreach)

clusters <- 10
runs <- 101

temp <- foreach(r = 1:runs,
                .combine = 'list',
                .maxcombine = runs,
                .multicombine = T) %do% {

              signal_all <- lapply(1:clusters, function(x){

                return(1)

              })

              return(signal_all)
            } ## end do