Почему цикл 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". Это просто создаст дополнительные процессы на вашей машине, которые ничего не сделают.

Другие вопросы по тегам