r - вложенный цикл% dopar% между списками - PullRequest
0 голосов
/ 09 мая 2019

Мне нужно выполнить вложенный цикл% dopar% между двумя списками в R.

У меня есть цикл, работающий с непараллельным кодом, следующим образом:

main_lst = rep(list(list()), 10) # create main list where loop's results will be stored

lst_1 = rep(list(list()), 25) # create list no. 1

for (i in 1:length(lst_1)) {
  lst_1[[i]] = data.frame(x = seq(1:30), y = rnorm(30))
}

lst_2 = rep(list(list()), 10) # create list no. 2

for (i in 1:length(lst_2)) {
  lst_2[[i]] = data.frame(x = seq(16:30), z = rnorm(15))
}


#### Do the for loop (non parallelised)
for (h in 1:length(main_lst)) {
  for (i in 1:length(lst_1)) {

    main_lst[[h]][[i]] = merge(lst_1[[i]], lst_2[[h]][,c(1:2)], by = 'x')

  }
}

Любойпредложение о том, как я могу распараллелить вышеприведенный цикл for?Должен ли я попробовать lapply (или parlapply) вместо этого?

Вот что я пробовал, но это не работает:

### Run in Parallel
library(foreach)
library(doParallel)

#setup parallel backend to use many processors
cores=detectCores()
cl = makeCluster(cores[1]-1) 
registerDoParallel(cl)


main_lst = foreach(h=1:length(main_lst)) %:% {
  foreach(i=1:length(lst_1)) %dopar% {

    main_lst[[h]][[i]] = merge(lst_1[[i]], lst_2[[h]][,c(1:2)], by = 'x')

  }
}


#stop cluster
stopCluster(cl)

Ошибка в foreach (h = 1: main_lst)%:% {: "%:%" передан недопустимый правый операнд

1 Ответ

2 голосов
/ 09 мая 2019

Я отредактировал только несколько из них (удалил { и }, изменил предел итерации h и выделил main_lst)

main_lst = foreach(h=1:10) %:% 
  foreach(i=1:length(lst_1)) %dopar% {
    merge(lst_1[[i]], lst_2[[h]][,c(1:2)], by = 'x')
   }

Результат оператора foreach будет автоматически собираться списком (если вы не указали определенный тип, например .combine = rbind.)

Так что вам не нужно его выделять !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...