在R脚本中获得警告的指示

时间:2013-04-08 19:45:54

标签: r

我正在运行嵌套在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???"
    }

谢谢

2 个答案:

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