Определение классов S4
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 22 из 57.
S4 — это формальная объектная система R. setClass() объявляет класс с именованными слотами и типом каждого из них, а new() создаёт объект. Оператор @ считывает слот:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)Вывод:
Ada is 36setClass() также возвращает функцию генератор. Присвойте её имени, обычно имени класса, и вызывайте как конструктор:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))Вывод:
[1] 8
[1] TRUEВ отличие от S3, R проверяет слоты. Неизвестный слот или значение неправильного типа останавливает new() с ошибкой, поэтому объект S4 всегда имеет структуру, объявленную его классом:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")Вывод:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution haltedСлот, для которого не задано значение, получает пустое значение своего типа, например character(0). prototype вместо этого задаёт реальные значения по умолчанию. В старом коде слоты объявляются с помощью representation(), что означает то же самое, что и slots:
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))Вывод:
[1] FALSE
[1] 0Задание
ЛегкоОбъявите класс S4 Book в файле Book.R с тремя слотами: title и author типа character и pages типа numeric. Затем завершите функцию book_label(b), которая считывает слоты с помощью @ и возвращает Dune by Frank Herbert (412 pages).
Предоставленный код считывает строки title;author;pages, создаёт каждую книгу с помощью new("Book", ...), выводит её метку и, наконец, имена слотов класса.
Ваш код должен находиться в файле Book.R. В main.R содержится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
source("Book.R")
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\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