Опитвах се да използвам пакета foreach
, за да паралелизирам моите (съвсем неефективни) симулации на вложен цикъл, но нямах късмет да разбера какъв е правилният синтаксис на цикъла 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
- „Главният“ събира всички отделни results.ls и ги комбинира в един голям списък.
Опитах се да заменя първия for цикъл с foreach
(така foreach(i = 1:3)
) и се опитах да поставя външен foreach
цикъл с i=1:12
(т.е. общ брой повторения), но това също не проработи.
Може ли някой да ми покаже как правилно да използвам foreach
цикъл с горната вложена for-цикъл структура? Благодаря ти много.