使用 foreach R 优化并将值附加到数据框

Optimize and append values to dataframe with foreach R

我想通过将它们与 foreach 包并行化来优化我的嵌套 for 循环。我是这个主题的新手,我尝试了几种方法将值附加到数据框。我知道 for 循环有些问题,因为它 returns 是一个值,但我想组合这些值并将它们存储到数据框中。我试图用 foreach 循环替换遍历行的 for 循环,但我无法使其工作。这个想法是为了更好地理解并行化 for 循环。

library(foreach)
library(doParallel)

cl <- makeCluster(2)
registerDoParallel(cl)

df <- data.frame(x=sample(10), y=sample(10), z = sample(10))
repeats <- 2

FUN <- function(df, repeats) {

   foreach(k=1:repeats, .combine = 'rbind') %dopar% {

       for(i in 1:nrow(df)) {
  
          for(j in 1:ncol(df)) {
    
             c(k=k ,i=i ,j=j , value=df[i, 1] * j )
    
          }
       }
    } 
}


FUN(df, repeat)
stopCluster(cl)

如前所述,我尝试用foreach替换for循环。同样,这些值没有正确存储。

foreach(k=1:repeats, .combine = 'rbind') %:% {

       foreach(i=1:nrow(df), .combine = 'c') %dopar%{
  
          for(j in 1:ncol(df)) {
    
             c(k=k ,i=i ,j=j , value=df[i, 1] * j )
    
          }
       }
    } 

输出示例

  k i j value
  1 1 1 3
  1 1 2 6

foreach 有一个用于嵌套循环的特殊语法(参见 vignette("nested"):

FUN <- function(df, repeats) {
  
  foreach(k=1:repeats, .combine = 'rbind') %:%
    foreach(i = 1:nrow(df), .combine = 'rbind') %:%
    foreach(j = 1:ncol(df),  .combine = 'rbind') %dopar% {
      
      c(k=k ,i=i ,j=j , value=df[i, 1] * j )
      
    }
}
`rownames<-`(FUN(df, repeats), NULL)

我的输出比你的长,所以我不确定你要做什么。此外,每当您提供使用随机数据的示例时,请使用 set.seed。所以我们每次都得到相同的结果。