2017-02-07 14 views
1

Я хочу вернуть NULL с помощью специальной функции, используемой в параллельном цикле . Использование заключается в том, что если какой-то результат не удовлетворяет определенным критериям, этот результат не будет сохранен, и он будет отфильтрован как шаг постпроцесса.Как вернуть значение null для пользовательской функции, используемой в% dopar%?

Однако моя программа возвращает

задача 1 не удалось - "замена имеет нулевую длину"

Проблема может быть воспроизведена с помощью следующего кода:

library(doParallel) 
Input <- c(F,T,F) 
f.parallel <- function(x){ 
    ifelse(x,T,NULL) 
} 
no_cores <- detectCores()-1 
    # for mac OS, linux 
c1 <- makeCluster(no_cores,type = "FORK") 
    # for windows 
    # cl <- makeCluster(no_cores) 
    # clusterExport(cl, list("Input","f.parallel")) 
registerDoParallel(cl) 
output <- foreach(i=1:length(Input),.combine = cbind) %dopar% f.parallel(Input[i]) 

stopCluster(c1) 

ответ

3

Попробуйте f.parallel <- function(x) if(x) TRUE. ifelse() не позволит вам вернуть NULL.

Когда cbind() вызывается для объединения результатов вашего цикла, элементы NULL будут удалены. Если вы хотите отфильтровать их на этапе после обработки, я бы рекомендовал использовать ifelse(x, TRUE, NA).

+0

работает с '' 'if (x) T'''. но я думаю, что ifelse() может вернуть NULL. но он просто не работает с% dopar%. если я перехожу на% do%, тогда он работает. но почему это так? – HappyCoding

+2

Это странно. Ни% do%, ни 'ifelse (TRUE, NULL, 1)' не работают для меня. – coletl

+0

возможно разные версии? знаете ли вы, как передать имя столбца в значение в пользовательской функции? – HappyCoding