我正在尝试使用tryCatch在R中编写错误异常处理。
correct = 1
tryCatch({
sqrt(b)
},
warning = function(w){
print("NaNs")
},
finally = {
correct = 0
}
)
correct
如果我设置b = -5,则打印警告并且正确的值为0.如果我设置b = 5,则不打印警告。但是值仍为0.我想要的是,当有一些警告/错误要捕获时,正确的值为0.当没有警告/错误时,正确的值为1.谢谢!
答案 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
}
)