【问题标题】:R use foreach with nested for loopsR 使用带有嵌套 for 循环的 foreach
【发布时间】:2019-03-10 07:00:00
【问题描述】:

我一直在尝试使用 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 循环“master”将以下代码与不同的输入(从嵌套的 for 循环生成)发送到不同的“worker”
  2. “工人”运行实际函数以生成最终数据帧,然后将其放入results.ls
  3. “master”收集所有单独的 results.ls 并将它们合并到一个大列表中。

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

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

【问题讨论】:

  • 你应该先尝试让它工作......` df1
  • 请展示您尝试过的内容并提供可重现的示例。

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


【解决方案1】:

你在找这个吗??

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2016-05-28
    • 2012-02-16
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多