R Academy · Урок

Ошибки, предупреждения и сообщения в R

Разберитесь с тремя типами сигналов и узнайте, когда возникает каждый из них.

Урок 1 из 413 шагов

«Ошибки, предупреждения и сообщения в R» — бесплатный урок R Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Система условий R

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

# Each condition type behaves differently
message('This is a message')
warning('This is a warning')
# stop() would halt here, so wrap it
tryCatch(stop('This is an error'), error = function(e) print(e))

stop() — генерация ошибок

stop(msg) создаёт условие ошибки. Выполнение немедленно прекращается, а сообщение об ошибке отображается. Функция используется внутри функций, чтобы прервать выполнение при недопустимых входных данных или обнаружении неисправимой ситуации.

divide <- function(x, y) {
  if (y == 0) stop('Division by zero is not allowed')
  x / y
}
tryCatch(divide(10, 0), error = function(e) cat('Error:', conditionMessage(e), '\n'))
divide(10, 2)

warning() — некритические предупреждения

warning(msg) создаёт условие предупреждения. В отличие от ошибок, предупреждения не останавливают выполнение: функция продолжает работу, а предупреждение сохраняется. По умолчанию предупреждения выводятся после завершения всего кода или сразу, если установлено options(warn=1).

safe_sqrt <- function(x) {
  if (x < 0) {
    warning('Negative input; returning NaN')
    return(NaN)
  }
  sqrt(x)
}
result <- safe_sqrt(-4)
cat('Result:', result, '\n')

message() — информационные условия

message(msg) создаёт условие сообщения. Оно выводится в stderr, автоматически завершается переводом строки и может быть подавлено с помощью suppressMessages(). Используйте сообщения для уведомлений о ходе выполнения функций, а не для ошибок или предупреждений.

load_data <- function(n) {
  message('Loading ', n, ' records...')
  seq_len(n)
}
data <- suppressMessages(load_data(100))
cat('Got', length(data), 'records\n')

Объекты simpleError и simpleWarning

Создавая условие, R помещает сообщение в объект условия. simpleError('msg') и simpleWarning('msg') позволяют создавать объекты условий вручную. Проверить их можно с помощью conditionMessage().

e <- simpleError('something went wrong')
w <- simpleWarning('this looks suspicious')
cat('Error class   :', class(e), '\n')
cat('Warning class :', class(w), '\n')
cat('Error message :', conditionMessage(e), '\n')
cat('Warning msg   :', conditionMessage(w), '\n')

conditionMessage() и conditionCall()

conditionMessage(cond) извлекает текст сообщения из любого объекта условия. conditionCall(cond) извлекает вызов, запустивший это условие. Обе функции полезны внутри обработчиков ошибок для ведения журнала или повторной передачи условий.

tryCatch(
  log(-1),
  warning = function(w) {
    cat('Caught warning :', conditionMessage(w), '\n')
    cat('From call      :', deparse(conditionCall(w)), '\n')
  }
)

options(warn = 2) — считать предупреждения ошибками

Установка options(warn = 2) превращает все предупреждения в ошибки, вызывая немедленную остановку выполнения. Это полезно во время разработки, чтобы своевременно обнаруживать код, порождающий предупреждения. Вернуть прежнее поведение можно с помощью options(warn = 0).

old_warn <- options(warn = 0)  # default: collect warnings
log(-1)  # just a warning
options(warn = 0)
tryCatch({
  options(warn = 2)
  log(-1)   # now fatal
}, error = function(e) cat('Caught as error:', conditionMessage(e), '\n'),
finally = options(old_warn))

Немедленные и отложенные предупреждения

При options(warn = 0) (значение по умолчанию) предупреждения накапливаются и выводятся в конце. При options(warn = 1) каждое предупреждение выводится сразу после возникновения. При warn = 2 предупреждения превращаются в ошибки.

# warn=1: print warnings immediately as they happen
old <- options(warn = 1)
result1 <- log(-1)
result2 <- sqrt(-4)
cat('Results:', result1, result2, '\n')
options(old)

Ошибка и предупреждение: критические и некритические условия

Ключевое различие таково: ошибка полностью останавливает выполнение, если её не перехватит обработчик. Предупреждение сохраняется, но выполнение продолжается. Поэтому недопустимые входные данные могут незаметно привести к неправильным результатам, если использовать предупреждения там, где нужны ошибки.

# With warning: execution continues
f_warn <- function(x) { if (x < 0) warning('negative'); x^2 }
cat('warn result:', f_warn(-3), '\n')  # still computes 9

# With error: execution stops
f_stop <- function(x) { if (x < 0) stop('negative'); x^2 }
tryCatch(f_stop(-3), error = function(e) cat('stopped:', e$message, '\n'))

Вложенные условия

Условия можно создавать внутри других обработчиков условий. Обработчик предупреждения может вызвать stop(), повысив предупреждение до ошибки. Это распространённый способ сделать код сторонних разработчиков более строгим.

strict_log <- function(x) {
  withCallingHandlers(
    log(x),
    warning = function(w) {
      stop(paste('Strict mode: warning treated as error:', conditionMessage(w)))
    }
  )
}
tryCatch(strict_log(-1), error = function(e) cat('Error:', e$message, '\n'))
cat('log(4) =', strict_log(4), '\n')

suppressWarnings() и suppressMessages()

suppressWarnings(expr) вычисляет выражение, молча перехватывая и отбрасывая все предупреждения. suppressMessages(expr) делает то же самое с условиями сообщений. Используйте эти функции экономно: подавление предупреждений может скрыть реальные проблемы.

# Without suppression: warning shown
result1 <- log(-1)
# With suppression: warning hidden
result2 <- suppressWarnings(log(-1))
cat('Both are NaN:', is.nan(result1), is.nan(result2), '\n')

Быстрая проверка

Какое из следующих утверждений о различии между warning() и stop() верно?

Условия: основные выводы

Основные выводы об условиях R:

  • stop() = ошибка = критическое условие, немедленная остановка; warning() = некритическое условие, выполнение продолжается; message() = информационное условие, выводится в stderr
  • Все три создают объекты условий с иерархией классов
  • conditionMessage(e) извлекает текст из любого условия
  • options(warn=1) немедленно выводит предупреждения; warn=2 считает их ошибками
  • suppressWarnings() и suppressMessages() подавляют условия
  • Для недопустимых входных данных используйте stop(), если продолжение работы приведёт к неверному результату
# Summary of the three condition functions
tryCatch({
  message('Step 1 starting')
  warning('something looks odd')
  stop('cannot continue')
}, message = function(m) cat('MSG:', conditionMessage(m)),
   warning = function(w) cat('WARN:', conditionMessage(w), '\n'),
   error   = function(e) cat('ERR:', conditionMessage(e), '\n'))
Можно начать бесплатно

Изучай R с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
43
Уроки
159

Часто задаваемые вопросы

Урок «Ошибки, предупреждения и сообщения в R» бесплатный?

Да — полный текст урока «Ошибки, предупреждения и сообщения в R» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ошибки, предупреждения и сообщения в R»?

Разберитесь с тремя типами сигналов и узнайте, когда возникает каждый из них. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Ошибки, предупреждения и сообщения в R»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Ошибки, предупреждения и сообщения в R
  2. tryCatch() для восстановления после ошибок
  3. withCallingHandlers() и перезапуски
  4. Надёжные функции с stop() и warning()
← Назад к R Academy