2017-02-07 40 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