如何捕获特定警告消息并执行调用

时间:2017-10-03 20:09:47

标签: r try-catch warnings

最近,当我运行在生存包中使用coxph的代码时 coxph(frml,data = data),我现在收到以下类型的警告消息

  

1:在model.matrix.default中(术语,mf,对比= contrast.arg):    部分参数匹配'对比'对比'对比.arg'

     
    

2:在seq.default(from = temp)中:      '沿'的部分参数匹配到'沿着'"

  

我不确定为什么突然间这些部分参数匹配警告突然爆发,但我认为它们不会影响我。

但是,当我收到以下警告消息时,我想要coxph(frml,data = data) = NA

  

3:在钳工(X,Y,strats,偏移,初始化,控制,权重=权重,:     Loglik在变量2之前收敛; beta可能是无限的。

     
    

6:在coxph(frml,data = data)中:       X矩阵被认为是单数;变量1 3 4

  

当我没有使用此代码获取部分参数匹配警告时,我使用了tryCatch,如果嵌套的tryCatch收到警告或错误消息,则返回NA

coxphfit = tryCatch(tryCatch(coxph(frml,data = data), error=function(w) return(NA)), warning=function(w) return(NA))

但是,现在我得到了部分参数匹配警告,如果出现错误或者我收到上述警告消息3和4,我只需要返回NA。有关如何捕获这些特定警告消息并在这些情况下返回NA的任何想法吗?

1 个答案:

答案 0 :(得分:1)

这实际上是一个有趣的问题,如果您正在寻找快速而肮脏的捕获警告的方法,您可以这样做:

   withCallingHandlers({
    warning("hello")
    1 + 2
}, warning = function(w) {
    w ->> w 
}) -> res

在此示例中,在父环境中创建的对象 w 将是:

>> w
<simpleWarning in withCallingHandlers({    warning("hello")    1 + 2}, warning = function(w) {    w <<- w}): hello>

然后你可以询问它:

grepl(x = w$message, pattern = "hello")
# [1] TRUE

作为

>> w$message
# [1] "hello"

对象res将包含您想要的结果:

>> res
[1] 3

这不是超级整洁的方式,但我认为你总是可以引用对象 w 并检查警告消息是否包含您感兴趣的短语。