获取R脚本中的警告指示

获取R脚本中的警告指示,r,R,我正在运行嵌套在for()函数中的glm()函数。glm的输出输入到矩阵中。对于某些周期有一个警告,但我只在所有周期结束时收到所有警告,因此我无法知道哪个周期是坏的。我想知道在每次glm计算之后是否有警告,这样我就可以告诉脚本不要将这个循环结果输入到矩阵中。有什么办法吗? 例如: m除了eddi在上述评论中给出的精彩链接外,您还可以尝试对错误发出警告,并在出现错误时跳转到函数: options(warn = 2) # will turn warnings into errors options(

我正在运行嵌套在for()函数中的glm()函数。glm的输出输入到矩阵中。对于某些周期有一个警告,但我只在所有周期结束时收到所有警告,因此我无法知道哪个周期是坏的。我想知道在每次glm计算之后是否有警告,这样我就可以告诉脚本不要将这个循环结果输入到矩阵中。有什么办法吗? 例如:


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)
}