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] 3Operatoren 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] FALSEAufgabe
EinfachEin 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|, oderemptyzurück.summary.stack()gibtstack of 3, top: czurück oderstack 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 = "")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1S3-Grundlagen
Arbeiten mit DateienListen mit einer KlasseKonstruktorfunktionenPrint- und Format-MethodenValidatoren und HilfsfunktionenRückblick – Temperaturen4Kapselung in R
Closures als ObjekteUmgebungen als ObjekteZugriffsfunktionenZustand schützenRückblick – Parkuhr2S3-Generics und Methoden
Generics und UseMethodStandardmethodenMethoden für Basis-GenericsGrundlagen von NextMethodWiederholung – Flächeninhalte von Formen5S4-Klassen
S4-Klassen definierenSlots und ZugriffGültigkeitsprüfungenShow-MethodenRückblick – Produktkatalog8Referenzklassen
Referenzklassen definierenMethoden und FeldänderungenKopiersemantikVererbung und callSuperZusammenfassung – Aufgabenwarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-R-Compiler