2017-02-17 63 views
12

我发现了一个foreach包中的功能/错误,我不明白。也许有人可以解释我的这种行为:在foreach包中的列表结构

我创建了一个for循环与foreach包(我与他们一起使用mutlicore计算,但这里只是在一个sequentiell的例子中,这个错误出现在这两个变种)。该循环运行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函数(例如ccbind)需要很多参数,并且会使用最多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