R将foreach与嵌套的for循环一起使用

时间:2018-10-04 19:58:31

标签: r for-loop foreach parallel-processing nested-loops

我一直在尝试使用foreach包来并行化我(效率低下)的嵌套for循环仿真,但是运气不好找出foreach循环的正确语法是什么我的代码。下面的示例(虽然毫无意义)说明了我的模拟的一般形式:

results.ls <- list()
listcount <- 1
variableOnePara.v <- c("Alpha", "Beta", "Gamma")
variableTwoPara.v <- c(1, 2, 3, 4)
function1.fn <- function(variableOne.s) {
  df1 <- data.frame( a = variableOne.s, b = Sys.time() )
  return(df1)
}
function2.fn <- function(df1, variableTwo.s) {
  df <- data.frame(cbind(df1, variableTwo.s))
  return(df)
}

for(i in 1:length(variableOnePara.v)) {
  for(j in 1:length(variableTwoPara.v)) {

    variableOne.s <- variableOnePara.v[i]
    variableTwo.s <- variableTwoPara.v[j]
    df1 <- function1.fn(variableOne.s)
    df <- function2.fn(df1, variableTwo.s)

    results.ls[[listcount]] <- df
    listcount <- listcount + 1
  }
}
results.df <- do.call(rbind, results.ls) ## a dataframe of the results

从本质上讲,一个模拟所做的是获取一系列输入,通过一系列函数运行它们,最后吐出一个1行数据框。然后,我将此数据帧放在列表中,并用下一个输入序列开始下一个模拟(因此有嵌套循环)。我正在尝试并行化此过程。 (请注意,起始输入是外生的,并不取决于先前的计算结果。)

我猜我在寻找正确的语法,以便:

  1. foreach循环“主”将下面的代码以不同的输入(从嵌套的for循环生成)发送给不同的“工人”
  2. “工人”运行实际功能以生成最终数据框,然后将其放入results.ls
  3. “主人”收集所有单独的 results.ls ,并将它们合并为一个大列表。

我尝试用foreach替换第一个for循环(所以foreach(i = 1:3)),并尝试用foreach放置外部i=1:12循环(即总迭代次数)但这也不起作用。

有人可以告诉我如何正确使用带有上述嵌套for循环结构的foreach循环吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

您在寻找这个吗?

results.df = foreach(i = 1:length(variableOnePara.v),
        .combine = rbind) %:% 
  foreach(j = 1:length(variableTwoPara.v),
          .combine = rbind) %dopar% 
  {
    variableOne.s <- variableOnePara.v[i]
    variableTwo.s <- variableTwoPara.v[j]
    df1 <- function1.fn(variableOne.s)
    df <- function2.fn(df1, variableTwo.s)
    return(df)

  }

结果如下所示:

> results.df
       a                   b variableTwo.s
1  Alpha 2019-07-15 14:21:16             1
2  Alpha 2019-07-15 14:21:16             2
3  Alpha 2019-07-15 14:21:16             3
4  Alpha 2019-07-15 14:21:16             4
5   Beta 2019-07-15 14:21:16             1
6   Beta 2019-07-15 14:21:16             2
7   Beta 2019-07-15 14:21:16             3
8   Beta 2019-07-15 14:21:16             4
9  Gamma 2019-07-15 14:21:16             1
10 Gamma 2019-07-15 14:21:16             2
11 Gamma 2019-07-15 14:21:16             3
12 Gamma 2019-07-15 14:21:16             4