Standardmethoden
Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 8 von 57.
Wenn keine Methode zur Klasse passt, sucht UseMethod() nach der Standardmethode name.default. Sie dient als Rückfallebene für jede Klasse, die das generische Verfahren nicht kennt:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
describe.default <- function(x) "something I do not know"
rex <- structure(list(name = "Rex"), class = "dog")
car <- structure(list(), class = "car")
print(describe(rex))
print(describe(car))Ausgabe:
[1] "a dog called Rex"
[1] "something I do not know"Ohne eine Standardmethode führt der Aufruf des Generics für eine unbekannte Klasse zu einem Fehler:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)Ausgabe:
Error in UseMethod("describe") :
no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution haltedAuch einfache Werte werden dynamisch dispatcht. Eine Zahl ohne Klassenattribut hat die implizite Klasse numeric, Text hat character, und TRUE hat logical, daher funktionieren Methoden für diese Namen mit gewöhnlichen Vektoren:
describe <- function(x) UseMethod("describe")
describe.numeric <- function(x) paste("numbers adding up to", sum(x))
describe.character <- function(x) paste("words:", paste(x, collapse = " "))
describe.default <- function(x) "something else"
print(describe(c(1, 2, 3)))
print(describe(c("a", "b")))
print(describe(TRUE))Ausgabe:
[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"Eine Standardmethode kann ebenfalls höflich ablehnen: stop() mit einer Meldung, die die Klasse nennt, damit der Aufrufer weiß, was schiefgelaufen ist. class(x)[1] ist die erste Klasse des Objekts:
area <- function(shape) UseMethod("area")
area.square <- function(shape) shape$side^2
area.default <- function(shape) {
stop("cannot compute the area of a ", class(shape)[1], call. = FALSE)
}
for (s in list(structure(list(side = 2), class = "square"), structure(list(), class = "blob"))) {
cat(tryCatch(area(s), error = function(e) conditionMessage(e)), "\n")
}Ausgabe:
4
cannot compute the area of a blob Aufgabe
EinfachVervollständige das generische describe(x) in Describe.R und seine Methoden für einfache Vektoren:
describe.numeric()gibt3 numbers, sum 6zurück.describe.character()gibt2 words, longest: applezurück (bei einem Gleichstand das erste der längsten Wörter).describe.logical()gibt2 of 3 are TRUEzurück.describe.default()gibtsomething elsezurück.
Der bereitgestellte Code liest Zeilen wie num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE oder ein beliebiges anderes Wort mit Werten ein und wandelt sie in eine Liste um. Für jede Zeile gibt er describe() aus.
Dein Code gehört in Describe.R. main.R enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
source("Describe.R")
# Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
values <- strsplit(p[2], ",")[[1]]
x <- switch(p[1],
num = as.numeric(values),
chr = values,
lgl = as.logical(values),
list(values))
cat(describe(x), "\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