Menu
Coddy logo textTech

Metody wyświetlania

Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 25 z 57.

Gdy wyświetlany jest obiekt S4, R wywołuje funkcję show(). Jeśli dla klasy nie ma metody, wyświetla wszystkie sloty, co jest poprawne, ale zajmuje dużo miejsca:

setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
p

Wynik:

An object of class "Point"
Slot "x":
[1] 1

Slot "y":
[1] 2

setMethod("show", "Point", function(object) ...) nadaje klasie własny sposób wyświetlania. Metoda wyświetla dane za pomocą cat() i jest używana zarówno wtedy, gdy obiekt jest wyświetlany na najwyższym poziomie, jak i przez 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)

Wynik:

Point(1, 2)
Point(1, 2)

Slot może przechowywać inny obiekt S4: zadeklaruj jego typ jako nazwę klasy. Zewnętrzna metoda show() może wyświetlić obiekt wewnętrzny, wywołując na nim 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))

Wynik:

line (0, 0) -> (3, 4)

Klasa wirtualna, deklarowana za pomocą representation("VIRTUAL"), nie może zostać utworzona za pomocą new(). Służy jako wspólna klasa nadrzędna dla innych klas, co stanowi podstawę rozdziału o dziedziczeniu S4. isVirtualClass() pozwala odróżnić te dwa rodzaje:

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")

Wynik:

TRUE FALSE 
cannot create a Shape 
challenge icon

Wyzwanie

Łatwy

Punkty i odcinki to dwie klasy S4 w dwóch plikach. Klasy są już zadeklarowane. Dodaj ich metody show():

  • W Point.R: punkt jest wyświetlany jako Point(1, 2), po czym następuje znak nowej linii.
  • W Segment.R: odcinek jest wyświetlany jako Segment Point(1, 2) to Point(4, 6), length 5, po czym następuje znak nowej linii, a długość jest zaokrąglana do dwóch miejsc po przecinku. Utwórz tekst punktu samodzielnie lub za pomocą funkcji pomocniczej; metoda punktu wyświetla własny znak nowej linii, więc nie wywołuj jej w środku wiersza odcinka.

Dostarczony kod odczytuje wiersze 1,2 4,6, wyświetla pierwszy punkt, a następnie odcinek, oba za pomocą ich metod show().

Umieść swój kod w plikach Point.R i Segment.R. main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

source("Point.R")
source("Segment.R")

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator R online