我一直在尝试使用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
循环“主”将下面的代码以不同的输入(从嵌套的for循环生成)发送给不同的“工人” results.ls
我尝试用foreach
替换第一个for循环(所以foreach(i = 1:3)
),并尝试用foreach
放置外部i=1:12
循环(即总迭代次数)但这也不起作用。
有人可以告诉我如何正确使用带有上述嵌套for循环结构的foreach
循环吗?非常感谢。
答案 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