我正在运行嵌套在for()函数中的glm()函数。 glm的输出被输入矩阵。对于某些循环,有一个警告,但我只在所有循环结束时得到所有警告,所以我不知道哪个循环是坏的。我想知道每次glm计算后是否有警告,这样我就可以告诉脚本不要将此循环结果输入矩阵。任何想法如何做到这一点? 例如:
m<-matrix(nc=1,nr=100)
for(i in 1:100){
fit<-glm(y~x+v1+v2+v3,data=data)
if("there is a warning???"){
m[i,1]<-NA
}
else{
m[i,1]<-fit$coefficients[2,1]
}
"reset warning???"
}
谢谢
答案 0 :(得分:1)
除了eddi上面评论中给出的神奇链接之外,您可以尝试对错误发出警告并在错误时跳转到该函数:
options(warn = 2) # will turn warnings into errors
options(error = recover) # will allow you to browser() at the error.
根据问题的大小,上面链接中给出的选项可能会更好。但我的解决方案很容易实现。
答案 1 :(得分:1)
这是一个有时会发出警告但始终返回值的函数
f <- function() {
r <- runif(1)
if (r > 1) warning("high")
Sys.sleep(.1) # 'expensive' calculation after warning
r
}
以下循环旨在使用x[i]
返回的值更新f()
。被发现的警告被NA取代;未评估警告后f
的部分。我们对处理警告消息不感兴趣,因此我们忽略了提供给警告处理程序的参数。
x <- numeric(10)
for (i in seq_along(x)) {
x[i] <- tryCatch(f(), warning=function(...) NA)
}
例如
> set.seed(123)
> system.time(x <- replicate(100, tryCatch(f(), warning=function(...) NA)))
user system elapsed
0.052 0.000 8.364
> table(is.na(x))
FALSE TRUE
83 17
很难重现您的特定问题,因为未提供data
。我想你想做什么
m <- matrix(ncol=1, nrow=100)
for(i in 1:100) {
m[i,1] <- tryCatch({
fit <- glm(y~x+v1+v2+v3, data=data)
fit$coefficients[2, 1]
}, warning=function(...) NA)
}