2017-02-07 73 views
1

我想用並行foreach循環中使用的自定義函數返回NULL。用法是,如果某些結果不符合某些標準,則結果將不會被存儲,並且會作爲後處理步驟過濾掉。如何爲%dopar%中使用的自定義函數返回null?

然而,我的程序返回

任務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) TRUEifelse()將不允許您返回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