Структура списков в пакете 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