Проверка корректности
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 24 из 57.
Типы проверяет R; правила, относящиеся к значениям, определяете вы. Аргумент validity функции setClass() — это функция от object, которая возвращает TRUE, если объект корректен, или строку символов с описанием проблемы. new() запускает её для каждого объекта:
setClass("Account", slots = c(owner = "character", balance = "numeric"),
validity = function(object) {
if (object@balance < 0) return("balance must not be negative")
TRUE
})
ok <- new("Account", owner = "Ada", balance = 10)
msg <- tryCatch(new("Account", owner = "Bo", balance = -5), error = function(e) conditionMessage(e))
cat(msg)Результат:
invalid class “Account” object: balance must not be negativeФункция проверки корректности может сообщить о нескольких проблемах одновременно, возвращая вектор символов. R нумерует их в сообщении об ошибке:
setClass("Range", slots = c(lo = "numeric", hi = "numeric"),
validity = function(object) {
problems <- character(0)
if (length(object@lo) != 1) problems <- c(problems, "lo must be one number")
if (length(object@hi) != 1) problems <- c(problems, "hi must be one number")
if (length(problems) == 0) TRUE else problems
})
msg <- tryCatch(new("Range", lo = c(1, 2), hi = numeric(0)), error = function(e) conditionMessage(e))
cat(msg)Вывод:
invalid class “Range” object: 1: lo must be one number
invalid class “Range” object: 2: hi must be one number@<- проверяет тип, но не запускает функцию проверки допустимости, поэтому присваивание может нарушить правило. validObject() повторно выполняет проверку; вызывайте её после изменения слотов:
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
a <- new("Account", balance = 10)
a@balance <- -99
cat("still created:", a@balance, "\n")
msg <- tryCatch(validObject(a), error = function(e) conditionMessage(e))
cat(msg, "\n")Вывод:
still created: -99
invalid class “Account” object: balance must not be negative R помещает invalid class “Account” object: перед вашим текстом. Код, который показывает сообщение пользователю, может оставить только часть после object: :
setClass("Account", slots = c(balance = "numeric"),
validity = function(object) if (object@balance < 0) "balance must not be negative" else TRUE)
msg <- tryCatch(new("Account", balance = -1), error = function(e) conditionMessage(e))
cat(sub(".*object: ", "", msg))Результат:
balance must not be negativeЗадание
ЛегкоОбъявите класс Rating в файле Rating.R со слотами stars (числовой) и comment (текстовый), а также с функцией проверки корректности, которая возвращает первое нарушенное правило:
stars must be a whole number from 1 to 5, если значение stars не равно одному из чисел 1, 2, 3, 4, 5;comment is too long, если комментарий содержит более 20 символов.
В противном случае она возвращает TRUE. Предоставленный код считывает строки 4;Great (комментарий может отсутствовать), создаёт каждый рейтинг и выводит ok: 4/5 или текст проблемы.
Ваш код должен находиться в Rating.R. В main.R содержится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
source("Rating.R")
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
out <- tryCatch({
r <- new("Rating", stars = as.numeric(p[1]), comment = if (length(p) > 1) p[2] else "")
paste0("ok: ", r@stars, "/5")
}, error = function(e) sub(".*object: ", "", conditionMessage(e)))
cat(out, "\n", sep = "")
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы S3
Работа с файламиСписки с классомФункции-конструкторыМетоды print и formatВалидаторы и вспомогательные функцииПовторение — температуры4Инкапсуляция в R
Замыкания как объектыОкружения как объектыФункции доступаЗащита состоянияПовторение — парковочный счётчик7S4 Наследование
Расширение с помощью containscallNextMethodВиртуальные классыПроверка типов с помощью is()Повторение — смотритель зоопарка10Шаблоны проектирования, часть 2
Шаблон «Декоратор»Шаблон «Строитель»Шаблон «Состояние»Шаблон «Итератор»2Обобщённые функции и методы S3
Обобщённые функции и UseMethodМетоды по умолчаниюМетоды для базовых обобщённых функцийОсновы NextMethodПовторение — площади фигур5Классы S4
Определение классов S4Слоты и доступПроверка корректностиМетоды showПовторение — каталог товаров8Ссылочные классы
Определение ссылочных классовМетоды и обновление полейСемантика копированияНаследование и callSuperПовторение — очередь задач11Проект: Управление библиотекой
Книги и читателиВыдача книг3Наследование S3
Векторы классовПорядок поиска методовРасширение с помощью NextMethodПроверка с помощью inherits()Повторение — расчёт зарплаты сотрудниковПотренируйтесь самостоятельно: Онлайн-компилятор R