Menu
Coddy logo textTech

Show-Methoden

Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 25 von 57.

Wenn ein S4-Objekt ausgegeben wird, ruft R die Funktion show() auf. Ohne eine Methode für die Klasse listet sie jeden Slot auf, was zwar korrekt, aber lang ist:

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

Ausgabe:

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

Slot "y":
[1] 2

setMethod("show", "Point", function(object) ...) verleiht der Klasse eine eigene Ausgabe. Die Methode gibt mit cat() aus und wird sowohl verwendet, wenn ein Objekt auf der obersten Ebene ausgegeben wird, als auch von 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)

Ausgabe:

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

Ein Slot kann ein anderes S4-Objekt enthalten: Deklariere seinen Typ als den Klassennamen. Die äußere show()-Methode kann das innere Objekt ausgeben, indem sie show() darauf aufruft:

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

Ausgabe:

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

Eine virtuelle Klasse, die mit representation("VIRTUAL") deklariert wird, kann nicht mit new() erstellt werden. Sie dient als gemeinsames übergeordnetes Element für andere Klassen, worauf das Kapitel zur S4-Vererbung aufbaut. isVirtualClass() unterscheidet zwischen den beiden Arten:

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

Ausgabe:

TRUE FALSE 
cannot create a Shape 
challenge icon

Aufgabe

Einfach

Punkte und Segmente sind zwei S4-Klassen in zwei Dateien. Die Klassen sind deklariert. Füge ihre show()-Methoden hinzu:

  • In Point.R: Ein Punkt wird als Point(1, 2) gefolgt von einem Zeilenumbruch ausgegeben.
  • In Segment.R: Ein Segment wird als Segment Point(1, 2) to Point(4, 6), length 5 gefolgt von einem Zeilenumbruch ausgegeben, wobei die Länge auf zwei Dezimalstellen gerundet wird. Erzeuge den Punkttext selbst oder mit einer Hilfsfunktion; die Punktmethode gibt ihren eigenen Zeilenumbruch aus, rufe sie daher nicht mitten in der Segmentzeile auf.

Der bereitgestellte Code liest Zeilen 1,2 4,6, gibt den ersten Punkt und anschließend das Segment aus, beides über ihre show()-Methoden.

Dein Code gehört in Point.R und Segment.R. main.R enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

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

# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn unverändert
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-R-Compiler