Вот кусок кода, чтобы сделать это с помощью пакета pbmcapply
. Пакет mcapply
также будет работать нормально и будет работать так же, но таким образом вы получите индикатор выполнения, что удобно.
library(tidyverse)
library(magrittr)
library(pbmcapply)
allSpecies <-
iris %>%
pull(Species) %>%
unique
geoMaxMean <-
function(species, data){
data <- data[data$Species == species,]
pLen <- data$Petal.Length
pWid <- data$Petal.Width
rm(data)
out <-
tibble(maxLen = max(pLen),
geoMean = sqrt(max(pLen) * max(pWid))
)
return(out)
}
nCores <-
detectCores() %>%
subtract(2)
gIris <-
allSpecies %>%
as.list %>%
pbmclapply(geoMaxMean,
data = iris,
mc.cores = nCores
) %>%
bind_rows %>%
tibble("Species" = allSpecies, .)
Ключевым отличием здесь является то, что вы должны переосмыслить то, что входит в функцию, которую вы вводите в распараллеленную функцию apply
. Ваш оригинальный фрагмент кода назначил все вычисления функции, а затем попытался сгруппировать все впоследствии. Если вы спроектировали свою функцию для разделения данных на подгруппы, а затем выполнили свои вычисления, распараллелить очень легко, используя список всех меток группировки в качестве входного списка в pbmclapply
, и просто предоставьте свои данные в качестве аргумента для функция, а не вход.
Надеюсь, это поможет.