Menu
Coddy logo textTech

Methoden für Basis-Generics

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

Viele Funktionen in R-Basis sind S3-Generika: print(), format(), summary(), toString(), length(), as.character() und weitere. Das Hinzufügen einer Methode sorgt dafür, dass deine Klasse mit einer Funktion funktioniert, die jeder R-Nutzer bereits kennt. summary.gradebook() gibt Informationen über ein gesamtes Objekt aus:

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

Ausgabe:

3 marks, average 82 

Überprüfe die Parameter des Generics, bevor du die Methode schreibst: summary() nennt sein erstes Argument object, während toString() und format() es x nennen. toString() sollte eine einzelne Zeichenkette zurückgeben:

toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))

Ausgabe:

[1] "70 / 85 / 91"

Eine length()-Methode ändert, was length() für die Klasse bedeutet. Eine Warteschlange, die ihre Elemente in einem Feld speichert, kann angeben, wie viele Elemente sie enthält, anstatt die Anzahl der Felder in der Liste:

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

Ausgabe:

[1] 2
[1] 3

Operatoren sind ebenfalls Generika. Eine Methode namens "+.money", die wegen des Symbols in Anführungszeichen geschrieben wird, wird ausgeführt, wenn eine der beiden Seiten von + ein money-Objekt ist. Sie erhält die beiden Seiten als e1 und 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)

Ausgabe:

[1] 12
[1] FALSE
challenge icon

Aufgabe

Einfach

Ein Stapel speichert seine Elemente im Feld items, wobei das oberste Element das letzte ist. new_stack(), push() und pop() in Stack.R sind vorgegeben. Füge drei Methoden hinzu:

  • length.stack() gibt die Anzahl der Elemente zurück.
  • toString.stack() gibt die Elemente von oben nach unten, verbunden durch | , oder empty zurück.
  • summary.stack() gibt stack of 3, top: c zurück oder stack of 0, wenn der Stapel leer ist.

Der vorgegebene Code liest die Befehle push <item> und pop und gibt anschließend die Länge, toString() und summary() aus.

Dein Code gehört in Stack.R. main.R enthält den vorgegebenen Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

source("Stack.R")

# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn unverändert
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 = "")
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