Как написать свою первую функцию tryCatch() в R


Вы можете использовать функцию tryCatch() в R, чтобы вернуть значение некоторого выражения или создать собственное сообщение, если обнаружено предупреждение или ошибка.

Эта функция использует следующий базовый синтаксис:

my_function <- function (x, y){
 tryCatch (
 #try to do this
 {
 #some expression
 },
 #if an error occurs, tell me the error
 error= function (e) {
 message('An Error Occurred')
 print(e)
 },
 #if a warning occurs, tell me the warning
 warning= function (w) {
 message('A Warning Occurred')
 print(w)
 return (NA)
 }
 )
}

В следующих примерах показано, как использовать функцию tryCatch() на практике.

Пример: создание функции tryCatch() в R

Предположим, мы создаем следующую функцию tryCatch() , которая пытается взять журнал одного значения, а затем разделить на второе значение.

Если произойдет ошибка, мы создадим сообщение «Произошла ошибка», а затем распечатаем ошибку в R.

Если возникает предупреждение, мы создадим сообщение «Произошло предупреждение», напечатаем предупреждение в R, а затем вернем значение NA.

Если не возникает ни ошибки, ни предупреждения, мы просто вернем результат функции.

log_and_divide <- function (x, y){
 tryCatch (
 {
 result = log(x) / y
 return (result)
 },
 error= function (e) {
 message('An Error Occurred')
 print(e)
 },
 warning= function (w) {
 message('A Warning Occurred')
 print(w)
 return (NA)
 }
 )
}

Давайте запустим эту функцию в разных сценариях.

Сценарий 1: никаких ошибок или предупреждений не возникает.

В следующем коде показано, как использовать функцию в сценарии, в котором не возникает ошибок или предупреждений.

#run function
log_and_divide(10, 2)

[1] 1.151293

Поскольку ошибок или предупреждений не возникает, функция просто возвращает результат выражения, который оказывается равным 1.151293 .

Сценарий 2: Произошла ошибка.

В следующем коде показано, как использовать функцию в случае возникновения ошибки:

#run function
log_and_divide(10)

An Error Occurred
<simpleError in doTryCatch(return(expr), name, parentenv, handler):
 argument "y" is missing, with no default>

Поскольку мы предоставили функции только один аргумент, мы получаем сообщение « Произошла ошибка », а также видим точную ошибку, созданную R.

Сценарий 3: появляется предупреждение.

В следующем коде показано, как использовать функцию в сценарии, в котором возникает предупреждение:

#run function
log_and_divide(-10, 2)

A Warning Occurred
<simpleWarning in log(x): NaNs produced>
[1] NA

Поскольку мы предоставили отрицательное значение для первого аргумента, R не может вычислить журнал отрицательного значения, поэтому мы получаем сообщение о том, что « Произошло предупреждение », мы видим точное предупреждение, созданное R, и функция возвращает NA как результат.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в R:

Как создать вложенный цикл for в R
Как добавить значения к вектору с помощью цикла в R
Как вернуть значение из функции в R