【发布时间】: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 行数据帧。然后我将此数据框放在一个列表中,并使用下一系列输入开始下一个模拟(因此是嵌套循环)。我正在尝试并行化这个过程。 (请注意,起始输入是外生的,不依赖于先前计算的结果)。
我想我正在寻找的是正确的语法,以便:
-
foreach循环“master”将以下代码与不同的输入(从嵌套的 for 循环生成)发送到不同的“worker” - “工人”运行实际函数以生成最终数据帧,然后将其放入
results.ls - “master”收集所有单独的 results.ls 并将它们合并到一个大列表中。
我尝试用foreach(所以foreach(i = 1:3))替换第一个for循环,并尝试用i=1:12(即总迭代次数)放置一个外部foreach循环,但这也不起作用。
有人可以告诉我如何正确使用foreach 循环和上述嵌套的for循环结构吗?非常感谢。
【问题讨论】:
-
你应该先尝试让它工作......` df1
-
请展示您尝试过的内容并提供可重现的示例。
标签: r for-loop foreach parallel-processing nested-loops