获取R脚本中的警告指示
我正在运行嵌套在for()函数中的glm()函数。glm的输出输入到矩阵中。对于某些周期有一个警告,但我只在所有周期结束时收到所有警告,因此我无法知道哪个周期是坏的。我想知道在每次glm计算之后是否有警告,这样我就可以告诉脚本不要将这个循环结果输入到矩阵中。有什么办法吗? 例如:获取R脚本中的警告指示,r,R,我正在运行嵌套在for()函数中的glm()函数。glm的输出输入到矩阵中。对于某些周期有一个警告,但我只在所有周期结束时收到所有警告,因此我无法知道哪个周期是坏的。我想知道在每次glm计算之后是否有警告,这样我就可以告诉脚本不要将这个循环结果输入到矩阵中。有什么办法吗? 例如: m除了eddi在上述评论中给出的精彩链接外,您还可以尝试对错误发出警告,并在出现错误时跳转到函数: options(warn = 2) # will turn warnings into errors options(
m除了eddi在上述评论中给出的精彩链接外,您还可以尝试对错误发出警告,并在出现错误时跳转到函数:
options(warn = 2) # will turn warnings into errors
options(error = recover) # will allow you to browser() at the error.
根据问题的大小,上面链接中给出的选项可能会更好。但是我的解决方案很容易实现。这里有一个函数,它有时会发出警告,但总是返回一个值
f <- function() {
r <- runif(1)
if (r > 1) warning("high")
Sys.sleep(.1) # 'expensive' calculation after warning
r
}
比如说
> 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
当我需要这样做时,我会将结果以及所有警告和错误存储在一个列表中,然后处理这些警告,如下所述:谢谢Martin,tryCatch()就是我所需要的。glm的输出是一个列表,示例中的警告是NA。因此,我通过询问is.list()过滤了所需的输出,如下所示:m@hans我试图在回答中更直接地说明你的情况。
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
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)
}