Почему цикл foreach с использованием%dopar% не дает всех результатов
Я запускаю код ниже и получаю только результаты для i=1.
Как я могу получить матрицу строк со всеми результатами: i=2 и i=3?
library(doMC)
library(foreach)
number_of_cpus=4
cl<-makeCluster(number_of_cpus)
registerDoMC(cores=4)
split_results2 <-
foreach(i=1:3, .combine=rbind, .inorder=TRUE, mc.cores=4) %dopar% {
Split_factor=as.character(split_factors[1,i])
Data$Split_Factor = as.character(Data$Split_Factor)
Data_new=Data[Data$Split_Factor==Split_factor,]
GetSplit(Data_new,Data_ind,num_vars,num_factors,r_jobs,probs) }
1 ответ
Функция foreach не имеет аргумента с именем "mc.cores", поэтому она рассматривается как переменная итерации, но, поскольку вы указали для нее только одно значение, она ограничивает цикл одной итерацией. Просто удалите аргумент "mc.cores", и он должен работать так, как вы ожидаете.
Рассмотрим этот цикл:
foreach(i=1:3, j=10) %dopar% {
c(i, j)
}
Он ограничен "j", возвращая список с одним элементом, в то время как этот цикл:
foreach(i=1:3, j=10:100) %dopar% {
c(i, j)
}
ограничено "i", возвращая список с тремя элементами.
Foreach выполняет итерацию по всем указанным итерационным переменным параллельно, поэтому цикл ограничен итерационной переменной с наименьшим количеством значений. Обратите внимание, что в этом отношении foreach работает не так, как "mapply", который повторяет итерационную переменную с меньшим количеством значений.
Также обратите внимание, что нет причин создавать кластер "cl". Это просто создаст дополнительные процессы на вашей машине, которые ничего не сделают.