R използвайте foreach с вложени for цикли

Опитвах се да използвам пакета 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-редов кадър с данни в края. След това поставям този кадър с данни в списък и започвам следващата симулация със следващата поредица от входове (оттук и вложените цикли). Опитвам се да паралелизирам този процес. (Имайте предвид, че началните входове са екзогенни и не зависят от резултатите от предишно изчисление).

Предполагам, че това, което търся, е правилният синтаксис, така че:

  1. „Главният“ цикъл foreach изпраща кода по-долу с различни входове (генерирани от вложените цикли for) до различни „работници“
  2. „Работниците“ изпълняват действителните функции, за да генерират крайната рамка с данни, която след това се поставя в results.ls
  3. „Главният“ събира всички отделни results.ls и ги комбинира в един голям списък.

Опитах се да заменя първия for цикъл с foreach (така foreach(i = 1:3)) и се опитах да поставя външен foreach цикъл с i=1:12 (т.е. общ брой повторения), но това също не проработи.

Може ли някой да ми покаже как правилно да използвам foreach цикъл с горната вложена for-цикъл структура? Благодаря ти много.


person fragf    schedule 04.10.2018    source източник
comment
Първо трябва да опитате да го накарате да работи ... ` df1 ‹- function(variableOne.s)` не е пълен израз, не може да работи.   -  person lebatsnok    schedule 04.10.2018
comment
Моля, покажете какво сте опитали и предоставете възпроизводим пример.   -  person Roman Luštrik    schedule 04.10.2018


Отговори (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
person Steve Lee    schedule 15.07.2019