2017-02-17 31 views
12

Znalazłem funkcję/błąd w pakiecie foreach, którego nie rozumiem. Być może ktoś może mi wyjaśnić to zachowanie:Struktura list w pakiecie foreach

Stworzyłem pętlę for z pakietem foreach (używam ich razem z obliczeniami mutlicore, ale tutaj, tylko w przykładzie sekwencyjnym, błąd pojawia się w obu wariantach). Ta pętla uruchamia r razy. W każdym przebiegu zwracana jest lista z wpisami c. Spodziewam się więc listy z wpisami r, a każdy wpis składa się z c list.

Mój kod był następujący:

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 

Z tym kodem, wszystko działa zgodnie z oczekiwaniami, patrz poniższy obrazek:

enter image description here

Ale kiedy wzrasta runs <- 101 wyjście temp jest to:

enter image description here

Oczekiwana struktura listy zostanie zniszczona. Ale podczas komentowania linii .combine = 'list' wszystko działa zgodnie z oczekiwaniami.

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

Może ktoś wyjaśnić to zachowanie? Dzięki za pomoc!

Odpowiedz

4

Tymczasem znalazłem rozwiązanie.

Funkcja foreach wie, że niektóre funkcje-kominy (na przykład c lub cbind) pobierają wiele argumentów i wywołują je z maksymalnie 100 argumentami (domyślnie) w celu zwiększenia wydajności. Za pomocą argumentu .maxcombine możesz ustawić je ręcznie.

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