Методы для базовых обобщённых функций
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 9 из 57.
Многие функции базового R являются универсальными функциями S3: print(), format(), summary(), toString(), length(), as.character() и другие. Добавление метода позволяет вашему классу работать с функцией, которую уже знает каждый пользователь R. summary.gradebook() формирует отчёт обо всём объекте:
summary.gradebook <- function(object, ...) {
paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")Вывод:
3 marks, average 82 Перед написанием метода проверьте параметры обобщённой функции: summary() называет свой первый аргумент object, а toString() и format() называют его x. toString() должен возвращать одну строку:
toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))Результат:
[1] "70 / 85 / 91"Метод length() изменяет значение length() для класса. Очередь, которая хранит свои элементы в поле, может сообщать, сколько элементов она содержит, вместо количества полей в списке:
q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))Вывод:
[1] 2
[1] 3Операторы тоже являются обобщёнными функциями. Метод с именем "+.money", записанный в кавычках из-за символа, выполняется, когда одна из сторон + является объектом money. Он получает обе стороны как e1 и e2:
new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)Вывод:
[1] 12
[1] FALSEЗадание
ЛегкоСтек хранит свои элементы в поле items, причём вершина стека находится последней. В Stack.R предоставлены new_stack(), push() и pop(). Добавьте три метода:
length.stack()возвращает количество элементов.toString.stack()возвращает элементы от вершины к основанию, объединённые с помощью|, илиempty.summary.stack()возвращаетstack of 3, top: cилиstack of 0, если стек пуст.
Предоставленный код считывает команды push <item> и pop, а затем выводит длину, toString() и summary().
Ваш код должен находиться в Stack.R. В main.R содержится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
source("Stack.R")
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\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