作为我正在使用R进行分析的大量数据的一部分,我在一系列数据集中从包robustbase中重复调用lmrob。
for (i in uniq.w) {
y <- x[x$w==i,4]
t<-seq(length(y))
result <- try(lmrob(y~t,na.action=na.exclude))
if(class(result) == "try-error") next;
output[[i]] <- result
}
然而,一些数据集返回错误“特征误差(ret,symmetric = TRUE):'x'中的无限或缺失值”。上述错误处理不会抑制这些错误。
所以我尝试了类似
的东西for (i in uniq.w) {
y <- x[x$w==i,4]
t<-seq(length(y))
result <- suppressWarnings(tryCatch(lmrob(y~t,na.action=na.exclude),error=function(e) e))
if(inherits(result,"error")) next
output[[i]] <- result
}
这确实可以抑制错误和警告。但是它们似乎仍然存在于系统的某个地方。当我对lmrob进行后续调用时,它不起作用。相反,它返回与上一次调用相同的结果。 (当然很可能还有一些我忽略的问题)。
解决这种情况的正确方法是什么,这样我就可以反复调用R函数,而不会影响后续批处理。
稍后我检查结果以确保解决方案收敛并丢弃任何结果。感谢您的帮助。
答案 0 :(得分:1)
定义在循环中调用的函数
f.lmrob <- function(i){
y <- x[x$w==i,4]
t<-seq(length(y))
lmrob(y~t,na.action=na.exclude)
}
然后使用tryCatch
,使用自定义代码标记错误输入,例如:
lapply(uniq.w, function(i)
tryCatch(f.lmrob(i), error=function(e)-1000-i))