我有一个代码,它是一系列嵌套的for循环。外部for循环遍历10个整数以生成一个数据帧。整数是完全互斥的,但是代码相当慢。我想知道是否有可能,通过并行化,同时运行几个循环。我对foreach很感兴趣,但是在一系列嵌套的for循环之后,combine功能似乎不适合生成数据帧。我对每一个人的选择都是正确的吗,还是有更好的选择?
这是我的代码的一个精选版本。最后一行是循环的输出。
foreach(tra=lowageband:highageband) %do% {
ptptdata <- fresh.data
cols <- c('FinalSalary', 'FinalDCBalance', 'FinalSSLow', 'FinalSSHigh')
trials <- 1:numtrials
##[LOTS OF VECTORIZATION REDACTED]##
#START LIFE CYCLE LOOP# <- This exact code is repeated a few times
for(trial in 1:numtrials){
[CODE REDACTED]
for(row in 1:countlc) {
[CODE REDACTED]
for (i in 1:dur){
[CODE REDACTED]
}
[CODE REDACTED]
}
[CODE REDACTED]
new_cols <- c(outer(cols, trial, paste, sep = '_'))
ptptdatalc[new_cols] <- ptptdatalc[cols]
}
final.model.data <- rbind(ptptdatalc,ptptdata_overretage)
assign(paste0("ModelDataAt",tra),final.model.data)
}
使用foreach
作为基础的doParallel
包可以做到这一点。这实际上取决于你如何构建你的数据和输出它,以便你可以将它组合回数据框架。
library(doParallel)
registerDoParallel(detectCores())
trial_results <- foreach(tra=lowageband:highageband) %dopar% {
ptptdata <- fresh.data
cols <- c('FinalSalary', 'FinalDCBalance', 'FinalSSLow', 'FinalSSHigh')
trials <- 1:numtrials
##[LOTS OF VECTORIZATION REDACTED]##
#START LIFE CYCLE LOOP# <- This exact code is repeated a few times
for(trial in 1:numtrials){
[CODE REDACTED]
for(row in 1:countlc) {
[CODE REDACTED]
for (i in 1:dur){
[CODE REDACTED]
}
[CODE REDACTED]
}
[CODE REDACTED]
new_cols <- c(outer(cols, trial, paste, sep = '_'))
ptptdatalc[new_cols] <- ptptdatalc[cols]
}
final.model.data <- rbind(ptptdatalc,ptptdata_overretage)
list(name = paste0("ModelDataAt_",tra), model_data = final.model.data)
}
一旦你完成了,你可以结合它们取决于你想如何从purrr
结合bind_rows
pluck
函数
library(purrr)
combined_data <- bind_rows(map(trial_results, .f = pluck, "model_data"))
如果你想过滤结果,你可以使用keep
:
filtered_list <- keep(trial_results,
.p = function(x) { x$name == "ModelDataAt_ABC" })
# Then combind just like previously
filtered_combine_data <- bind_rows(map(filtered_list, .f = pluck, "model_data"))