Повторный перехват приводит к одному и тому же результату независимо от ошибки в R

#r

#r

Вопрос:

Я пытаюсь написать обработку исключений ошибок в R, используя tryCatch.

 correct = 1
tryCatch({
    sqrt(b)

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

Если я устанавливаю b = -5, выводится предупреждение, а значение correct равно 0. Если я установил b = 5, предупреждение не выводится. Однако значение по-прежнему равно 0. Я бы хотел, чтобы при обнаружении какого-либо предупреждения / ошибки значение correct было равно 0. Когда нет предупреждения / ошибки, значение correct равно 1. Спасибо!

Ответ №1:

Вы не хотите 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
  

Ответ №2:

Вот функция:

 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
  

Ответ №3:

finally Предложение выполняется независимо от того, выдается ли предупреждение в квадратном корне. Вот почему вы в конечном итоге получаете correct == 0 независимо.

Следующий код будет делать то, что вы хотите, хотя я использовал глобальное присвоение <<- , которое может вызвать проблемы, если вы не будете осторожны. Это было необходимо, потому что в противном случае вы не сможете изменить значение correct из warning функции.

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