我对tryCatch()
的使用没有足够的了解,但发现很难在正在进行的讨论中找到一个好的解决方案。
我有一个自编程函数可以返回一个对象。它实际上是一个列表对象,但为简单起见假设它是一个标量。我正在使用for()
循环来引导此功能。我的循环具有以下形式:
boot<-1000
for(i in 1:boot){
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
out[i]<-myfunction(bootstrap_data,X,...)
}
myfunction()
有时会返回错误消息,因为它使用lm()
在数据子集上拟合模型,然后从不同的子集预测新数据。然后可能发生这样的情况:对于某些因素,偶然的某些级别不会出现在用于拟合的数据中,但它们确实出现在预测子集中。这种情况很少发生(例如,大约每15,000次迭代),但确实发生了(我需要多次引导myfunction()
)。
我想使用tryCatch()
或类似函数来捕获我的引导循环。此外,我想定义一个索引来计算循环tryCatch()
必须捕获函数的频率。最后,无论错误发生的次数如何,我都希望得到一个常数boot
。
R返回以下消息:
Error in model.frame.default(Terms,newdata,na.action=na.action,
xlev=object$xlevels) : factor X has new levels 2
X
是lm()
中用户指定的预测变量。我不确定2代表什么,我猜新级别的数量(?)。
答案 0 :(得分:3)
这是一个有时失败的功能
f <- function() {
r <- rnorm(1)
if (r > 1)
stop("oops")
r
}
我们分配一个结果向量并设置一个计数器来更新第i个元素
out <- numeric(100)
i <- 0
然后反复尝试调用该函数。如果有错误,我们不会增加i或记录结果,而是直接进入下一次迭代
while (i < length(out)) {
tryCatch({
out[[i + 1]] <- f()
i <- i + 1
}, error=function(...) NULL)
}
答案 1 :(得分:2)
包装有时会在“尝试”中抛出错误的函数通常对我有效。
boot<-1000
for(i in 1:boot){
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
out[i] = NA #
try({
out[i]<-myfunction(bootstrap_data,X,...)
}, silent=T)
}
如果你想计算引发的错误数量,你可以总结出NA。
sum(is.na(out))