Menu
Coddy logo textTech

Методы 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] 2

setMethod("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 
challenge icon

Задание

Легко

Точки и отрезки — это два класса 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))
}
quiz iconПроверьте себя

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

Все уроки раздела Объектно-ориентированное программирование

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