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