Metody domyślne
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 8 z 57.
Gdy żadna metoda nie pasuje do klasy, UseMethod() szuka metody domyślnej, name.default. Jest ona rozwiązaniem awaryjnym dla każdej klasy, której nie zna funkcja generyczna:
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))Wynik:
[1] "a dog called Rex"
[1] "something I do not know"Bez metody domyślnej wywołanie funkcji generycznej dla nieznanej klasy kończy się błędem:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)Wynik:
Error in UseMethod("describe") :
no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution haltedZwykłe wartości również podlegają wyborowi metod. Liczba bez atrybutu klasy ma niejawną klasę numeric, tekst ma klasę character, a TRUE ma klasę logical, więc metody o tych nazwach działają na zwykłych wektorach:
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))Wynik:
[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"Metoda domyślna może też uprzejmie odmówić: stop() z komunikatem podającym klasę, dzięki czemu wywołujący wie, co poszło nie tak. class(x)[1] to pierwsza klasa obiektu:
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")
}Wynik:
4
cannot compute the area of a blob Wyzwanie
ŁatwyUzupełnij funkcję generyczną describe(x) w pliku Describe.R oraz jej metody dla zwykłych wektorów:
describe.numeric()zwraca3 numbers, sum 6.describe.character()zwraca2 words, longest: apple(pierwsze z najdłuższych słów w przypadku remisu).describe.logical()zwraca2 of 3 are TRUE.describe.default()zwracasomething else.
Dostarczony kod odczytuje wiersze num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE lub dowolne inne słowo z wartościami, które zamienia na listę. Wyświetla wynik describe() dla każdego z nich.
Twój kod umieść w pliku Describe.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Describe.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online