Methoden für eingebaute Funktionen
Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 28 von 57.
setMethod() fügt S4-Methoden auch Basisfunktionen wie length() und summary() hinzu. Die Basisfunktion funktioniert weiterhin für alles andere, und deine Klasse erhält ihr eigenes Verhalten:
setClass("Playlist", slots = c(name = "character", songs = "character"))
setMethod("length", "Playlist", function(x) length(x@songs))
pl <- new("Playlist", name = "gym", songs = c("a", "b", "c"))
print(length(pl))
print(length(c(1, 2)))Ausgabe:
[1] 3
[1] 2Operatoren sind ebenfalls generisch. Eine Methode für + benennt die Klassen beider Seiten in einer signature(). Die beiden Argumente heißen e1 und e2:
setClass("Money", slots = c(amount = "numeric"))
setMethod("show", "Money", function(object) cat(sprintf("%.2f", object@amount), "\n"))
setMethod("+", signature("Money", "Money"), function(e1, e2) {
new("Money", amount = e1@amount + e2@amount)
})
new("Money", amount = 2.5) + new("Money", amount = 4)Ausgabe:
6.50 Das Gruppen-Generic Arith steht auf einmal für +, -, *, /, ^ und den Rest. Innerhalb seiner Methode wiederholt callGeneric() den jeweils verwendeten Operator auf den Werten, die du übergibst:
setClass("Money", slots = c(amount = "numeric"))
setMethod("Arith", signature("Money", "numeric"), function(e1, e2) {
new("Money", amount = callGeneric(e1@amount, e2))
})
m <- new("Money", amount = 10)
cat((m * 3)@amount, (m / 4)@amount, (m - 1)@amount)Ausgabe:
30 2.5 9Das Gruppen-Generic Compare umfasst ==, <, > und weitere Operatoren. Seine Methode gibt für die Slots das zurück, was callGeneric() zurückgibt, also einen logischen Wert:
setClass("Money", slots = c(amount = "numeric"))
setMethod("Compare", signature("Money", "Money"), function(e1, e2) {
callGeneric(e1@amount, e2@amount)
})
a <- new("Money", amount = 5)
b <- new("Money", amount = 8)
cat(a < b, a == b, a >= b)Ausgabe:
TRUE FALSE FALSEAufgabe
EinfachDie Klasse Money in Money.R besitzt die Slots amount (numerisch) und currency (Zeichen). Füge vier Methoden hinzu:
show()gibt12.50 EURund eine neue Zeile aus;+für zweiMoney-Objekte gibt ihre Summe zurück oder bricht mitcannot add EUR and USDab (verwendecall. = FALSE), wenn sich die Währungen unterscheiden;*fürMoneyund eine Zahl gibt den skalierten Betrag zurück;==für zweiMoney-Objekte istTRUE, wenn Betrag und Währung gleich sind.
Der bereitgestellte Code liest Zeilen wie 10:EUR + 2.5:EUR, 4:USD * 3 oder 1:EUR == 1:EUR und gibt das Ergebnis oder error: und die Nachricht aus.
Dein Code gehört in Money.R. main.R enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
source("Money.R")
# Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
parse_money <- function(t) {
p <- strsplit(t, ":")[[1]]
new("Money", amount = as.numeric(p[1]), currency = p[2])
}
for (line in input) {
p <- strsplit(line, " ")[[1]]
a <- parse_money(p[1])
tryCatch({
if (p[2] == "+") print(a + parse_money(p[3]))
if (p[2] == "*") print(a * as.numeric(p[3]))
if (p[2] == "==") cat(a == parse_money(p[3]), "\n", sep = "")
}, error = function(e) cat("error: ", conditionMessage(e), "\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 ausleihen3S3-Vererbung
KlassenvektorenReihenfolge der MethodensucheErweitern mit NextMethodPrüfen mit inherits()Rückblick – Mitarbeiterabrechnung6S4 Generics und Methoden
Generics erstellenMethoden für eingebaute FunktionenDispatch für zwei ArgumentesetValidity und validObjectRückblick – Geld und WährungÜbe selbstständig: Online-R-Compiler