R> как условно добавить результат цикла doPar обратно к основному набору данных результатов - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь реализовать итерацию параллельного цикла R, но не знаю, как ее обусловить так, чтобы она только возвращала результат (присоединение строки) к основному набору данных результата, если выполняется определенное условие.Это означает, что в некоторых ситуациях я не хочу, чтобы конкретный шаг итерации возвращал что-либо.Псевдо-пример ниже:

library(foreach)
library(doParallel)

registerDoParallel(makeCluster(detectCores() - 1))

final.result <- foreach(i = 1:100, .combine=cbind) %dopar% {
   getResultDS = functionXYZ()
   ...
   ...
   ...
   # append function result to final.result only if getResultDS[1] > 0
   if (getResultDS[1,] == 0) {
      getResultDS
   }
}
...
...
...

Оцените чей-либо вклад здесь, спасибо!

1 Ответ

0 голосов
/ 22 октября 2018

Описанное поведение может быть достигнуто путем определения функции .combine, которая игнорирует значения NA.

cbind_ignoreNA <- function(...){
    ll <- list(...)
    ll <- ll[unlist(lapply(ll, function(x) !(length(x)==1 && is.na(x))))]
    do.call("cbind", ll)                            
}

Тогда можно вернуть NA (длины один), если результат итерации не должен появиться в выходных данных foreach().В следующем примере результат итерации i=2 игнорируется:

library(foreach)
library(doParallel); registerDoParallel(2)
test <- foreach(i=1:4, .combine=cbind_ignoreNA) %dopar% {
    if(i==2)
        r <- NA
    else
        r <- i:(i+3)
    r
}
test
      [,1] [,2] [,3]
[1,]    1    3    4
[2,]    2    4    5
[3,]    3    5    6
[4,]    4    6    7
...