doParallel似乎破坏输出不明原因

问题描述:

我试图运行下面的代码并行格式(用于EWAS目的):doParallel似乎破坏输出不明原因

registerDoParallel(2) 

combined <- foreach(i = 28:78, .combine=rbind) %dopar%     
{ 
mm<-rep(NA,412) 

FIDunique<-unique(pheno$FID) 
for(j in FIDunique) 
{ 
    nn<-which(pheno1$FID==j) 
    mm[nn]<-mean(pheno1[nn,i]) 
} 
tt4<-which(!is.na(mm)) 

if(length(tt4)>19 & length(table(pheno1[,i]))>1) 
{ 
    meth<-pheno1[tt4,i] 
    mm<-mm[tt4] 

    if(length(levels(factor(pheno1$smoking)))<2) 
    { 
    lme2<-tryCatch(lme(I(meth-mm)~delta_residSpine+I(DNA_year-AGE_year)+CD8T+CD4T+NK+Bcell+Mono+Gran,random=~1|FID, control=lmeControl(msMaxIter=50000,opt="optim"), data=pheno1[tt4,]),error = function(e) rep (NaN,1)) 
    } 
    else 
    { 
    lme2<-tryCatch(lme(I(meth-mm)~delta_residSpine+I(DNA_year-AGE_year)+factor(smoking)+CD8T+CD4T+NK+Bcell+Mono+Gran,random=~1|FID, control=lmeControl(msMaxIter=50000,opt="optim"), data=pheno1[tt4,]),error = function(e) rep (NaN,1)) 
    } 

    if(!is.na(lme2)) out18[i-27,2:5]<-summary(lme2)$tTable[2,-3] 

    rm(mm,nn,meth,lme2) 
} 

out18[i-27,6]<-length(tt4) 
out18[i-27,] 
} 

我遇到的问题是,当我使用%但是当我使用%dopar%(如上面的代码所示)时,the middle four columns of combined dissapear.我想这是由于这四列是基于tryCatch分配?我一直坚持这几天,真的需要取得进展。

这也是值得什么,当我运行该程序作为%的人%,我得到警告

警告在如果out18 [我 - 27,2(is.na(lme2)!): 5] < - 摘要(lme2)$ TTable的[2,1: 条件具有长度> 1且只有第一元件将用于每次迭代中使用

,但我不下运行时得到这在所有%dopar%。

道歉,如果我还没有给出足够的信息关于变量是什么,我试图尽可能少地披露出于道德原因正在处理的实际信息。

+0

它不容易跟随你的问题。你在做什么Os? '%do%'和'%dopar%'绝对没有相同的行为,'%dopar%'可以依赖于Os。 – clemlaflemme

+0

您的问题可能来自您尝试在使用'foreach'(即out18'数组)时更新一个值,这是没有意义的。尝试使用新的矢量,并只返回它。 '.combine'选项将正确地捕获结果 – clemlaflemme

我认为你是正确的,一个意外的错误被tryCatch隐藏。例如,由于您使用的是lme函数,您不应该在工人上加载nlme包吗?如:

r <- foreach(i = 28:78, .packages='nlme', .combine=rbind) %dopar% { 
    #snip 
} 

可能还有其他的问题,例如必须明确导出的对象,所以我建议你改变你的代码就毫不掩饰意想不到的错误,尤其是在测试/调试。一个简单的方法是记录错误,然后返回适当的值:

tryCatch(foo(), error = function(e) { 
    print(e) 
    NaN 
}) 

为了看到这些日志信息,你可以使用makeCluster outfile=""选项,这样的消息将在您的终端显示。有关更多信息,请参阅this answer

我也建议你改变你的测试是这样的:

if (!identical(lme2, NaN)) ... 

这将避免该警告时lme2不是NaN因为identical永远不会返回长度为一个值> 1