Menu
Coddy logo textTech

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 halted

Auch 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 
challenge icon

Aufgabe

Einfach

Vervollständige das generische describe(x) in Describe.R und seine Methoden für einfache Vektoren:

  • describe.numeric() gibt 3 numbers, sum 6 zurück.
  • describe.character() gibt 2 words, longest: apple zurück (bei einem Gleichstand das erste der längsten Wörter).
  • describe.logical() gibt 2 of 3 are TRUE zurück.
  • describe.default() gibt something else zurü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 = "")
}
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