R использовать foreach с вложенными для циклов - PullRequest
0 голосов
/ 04 октября 2018

Я пытался использовать пакет 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?Большое спасибо.

1 Ответ

0 голосов
/ 15 июля 2019

Вы ищете это?

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
...