Menu
Coddy logo textTech

Предупреждения и finally

Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 54 из 64.

Предупреждение сообщает о проблеме, не останавливая выполнение: функция возвращает значение, а R выводит предупреждение в конце. as.numeric() выдаёт предупреждение для текста, который не является числом, и возвращает NA:

x <- as.numeric("abc")
print(x)

Вывод:

[1] NA
Warning message:
NAs introduced by coercion 

Как и ошибки, предупреждения выводятся в поток ошибок, поэтому на Coddy они приводят к провалу теста. suppressWarnings() подавляет их, когда вы самостоятельно проверяете результат, а tryCatch(..., warning = ) преобразует предупреждение в значение:

x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)

Вывод:

[1] TRUE
[1] "warned: NAs introduced by coercion"

warning("message") вызывает предупреждение из вашего собственного кода. Обработчик для него работает так же, как обработчик ошибки:

ratio <- function(a, b) {
  if (b == 0) warning("b is zero, returning Inf")
  a / b
}
r <- tryCatch(ratio(1, 0), warning = function(w) conditionMessage(w))
print(r)

Вывод:

[1] "b is zero, returning Inf"

finally = ... выполняется после выражения и любого обработчика, независимо от того, произошла ошибка или нет. Используй его для действий, которые должны выполняться всегда, например для вывода сообщения о завершении:

load <- function(x) {
  tryCatch({
    if (x < 0) stop("negative")
    x * 10
  }, error = function(e) NA,
  finally = cat("finished", x, "\n"))
}
print(load(2))
print(load(-1))

Результат:

finished 2 
[1] 20
finished -1 
[1] NA
challenge icon

Задание

Легко

Завершите to_numbers(texts). Преобразуйте каждый текст в число. Значения, которые невозможно преобразовать, становятся NA, при этом предупреждение не выводится. Верните две строки: Numbers: с преобразованными числами, разделёнными пробелами (включая значения NA), и Invalid: с количеством значений, преобразование которых не удалось.

Предоставленный код считывает тексты в виде строки, разделённой запятыми, и выводит каждую возвращённую строку.

Попробуйте сами

to_numbers <- function(texts) {
  # Напишите ваш код здесь
  c("Numbers: ", "Invalid: 0")
}

# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), sep = "\n")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор R