我正在尝试以并行格式运行以下代码(用于EWAS目的):
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,]
}
我遇到的问题是,当我在第二行使用%do%时,程序执行完美,'combined'包含the correct output.
但是,当我使用%dopar%时(如上面的代码所示),the middle four columns of combined dissapear.我想这是因为基于tryCatch分配了这四列?我已经坚持了几天,真的需要取得进展。
当我以%do%运行程序时,我也得到了警告
警告if(!is.na(lme2))out18 [i - 27,2:5]&lt; - summary(lme2)$ tTable [2,: 条件的长度> 1,只使用第一个元素
对于每次迭代,但是当在%dopar%下运行时,我根本得不到这个。
道歉,如果我没有提供足够的变量信息,我试图尽可能少地披露因道德原因而处理的实际信息。
答案 0 :(得分:0)
我认为你是对的,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
永远不会返回长度为&gt;的值1。