无论R中的错误如何,tryCatch都会产生相同的输出

时间:2014-06-19 20:22:47

标签: r

我正在尝试使用tryCatch在R中编写错误异常处理。

correct = 1
tryCatch({
    sqrt(b)

    },
    warning = function(w){
        print("NaNs")
    },
    finally = {
        correct = 0
    }
)
correct

如果我设置b = -5,则打印警告并且正确的值为0.如果我设置b = 5,则不打印警告。但是值仍为0.我想要的是,当有一些警告/错误要捕获时,正确的值为0.当没有警告/错误时,正确的值为1.谢谢!

3 个答案:

答案 0 :(得分:2)

您不希望finally在这里。而是在发生错误或警告时指定返回值0。

myfun <- function(b) {
    tryCatch({
        sqrt(b)
    },
    error = function(e){
        return(0)
    },
    warning = function(w){
        return(0)
    }
    )
}

> myfun(5)
# [1] 2.236068
> myfun(-5)
# [1] 0

答案 1 :(得分:1)

这是一个功能:

is.bad <- function(x) {
    as.numeric(isTRUE(tryCatch(x,
        error = function(c) TRUE,
        warning = function(c) TRUE
    )))
}

is.bad(stop())
is.bad(warning())
is.bad(message())
is.bad(3)

## > is.bad(stop())
## [1] 1
## > is.bad(warning())
## [1] 1
## > is.bad(message())
## 
## [1] 0
## > is.bad(3)
## [1] 0

答案 2 :(得分:1)

无论是否在平方根中抛出警告,都会执行finally子句。这就是为什么你最终得到correct == 0的原因。

以下代码将执行您想要的操作,但我使用了全局赋值<<-,如果您不小心,可能会导致问题。这是必要的,因为否则您无法在correct函数中更改warning的值。

correct = 1
tryCatch({
  sqrt(b)      
},
warning = function(w){
  print("NaNs")
  correct <<- 0
}
)