Методы show
Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 25 из 57.
При выводе объекта S4 R вызывает функцию show(). Если для класса нет метода, она перечисляет каждый слот, что правильно, но довольно объёмно:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
pВывод:
An object of class "Point"
Slot "x":
[1] 1
Slot "y":
[1] 2setMethod("show", "Point", function(object) ...) задаёт классу собственный способ вывода. Метод выводит данные с помощью cat() и используется как при выводе объекта на верхнем уровне, так и функцией print():
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) {
cat("Point(", object@x, ", ", object@y, ")\n", sep = "")
})
p <- new("Point", x = 1, y = 2)
p
print(p)Вывод:
Point(1, 2)
Point(1, 2)Слот может содержать другой объект S4: укажите его тип как имя класса. Внешний метод show() может вывести внутренний объект, вызвав для него show():
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) cat("(", object@x, ", ", object@y, ")", sep = ""))
setClass("Line", slots = c(from = "Point", to = "Point"))
setMethod("show", "Line", function(object) {
cat("line ")
show(object@from)
cat(" -> ")
show(object@to)
cat("\n")
})
new("Line", from = new("Point", x = 0, y = 0), to = new("Point", x = 3, y = 4))Вывод:
line (0, 0) -> (3, 4)Виртуальный класс, объявленный с помощью representation("VIRTUAL"), нельзя создать с помощью new(). Он существует для того, чтобы быть общим родителем других классов, на чём основывается глава «Наследование S4». isVirtualClass() позволяет различать эти два вида:
setClass("Shape", representation("VIRTUAL"))
setClass("Point", slots = c(x = "numeric"))
cat(isVirtualClass("Shape"), isVirtualClass("Point"), "\n")
msg <- tryCatch(new("Shape"), error = function(e) "cannot create a Shape")
cat(msg, "\n")Вывод:
TRUE FALSE
cannot create a Shape Задание
ЛегкоТочки и отрезки — это два класса S4 в двух файлах. Классы объявлены. Добавьте их методы show():
- В
Point.R: точка выводится какPoint(1, 2), после чего следует новая строка. - В
Segment.R: отрезок выводится какSegment Point(1, 2) to Point(4, 6), length 5, после чего следует новая строка; длина округляется до двух знаков после запятой. Сформируйте текст точки самостоятельно или с помощью вспомогательной функции; метод точки выводит собственную новую строку, поэтому не вызывайте его в середине строки отрезка.
Предоставленный код считывает строки 1,2 4,6, выводит сначала точку, а затем отрезок — оба с помощью их методов show().
Ваш код должен находиться в Point.R и Segment.R. В main.R находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
source("Point.R")
source("Segment.R")
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
n <- as.numeric(strsplit(line, "[ ,]")[[1]])
a <- new("Point", x = n[1], y = n[2])
b <- new("Point", x = n[3], y = n[4])
print(a)
print(new("Segment", from = a, to = b))
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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