2017-02-17 16 views
12

Я нашел особенность/ошибку в пакете 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 

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

enter image description here

Но при увеличении 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 

enter image description here

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

ответ

4

Тем временем я нашел решение.

Функция 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