Metody dla podstawowych generics
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 9 z 57.
Wiele funkcji w bazowym R to generyki S3: print(), format(), summary(), toString(), length(), as.character() i inne. Dodanie metody sprawia, że Twoja klasa współpracuje z funkcją, którą zna już każdy użytkownik R. summary.gradebook() przedstawia podsumowanie całego obiektu:
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")Wynik:
3 marks, average 82 Sprawdź parametry funkcji generycznej, zanim napiszesz metodę: summary() nazywa swój pierwszy argument object, podczas gdy toString() i format() nazywają go x. toString() powinno zwracać pojedynczy ciąg znaków:
toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))Wynik:
[1] "70 / 85 / 91"Metoda length() zmienia znaczenie length() dla klasy. Kolejka, która przechowuje swoje elementy w polu, może podawać, ile elementów zawiera, zamiast liczby pól na liście:
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))Wynik:
[1] 2
[1] 3Operatory również są generyczne. Metoda o nazwie "+.money", zapisana w cudzysłowie ze względu na symbol, jest wywoływana, gdy jedną ze stron + jest obiekt money. Otrzymuje obie strony jako e1 i 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)Wynik:
[1] 12
[1] FALSEWyzwanie
ŁatwyStos przechowuje swoje elementy w polu items, a element znajdujący się na szczycie stosu jest ostatni. Funkcje new_stack(), push() i pop() w pliku Stack.R są już dostępne. Dodaj trzy metody:
length.stack()zwraca liczbę elementów.toString.stack()zwraca elementy od szczytu do dołu, połączone za pomocą|, lubempty.summary.stack()zwracastack of 3, top: clubstack of 0, gdy stos jest pusty.
Dostarczony kod odczytuje polecenia push <item> i pop, a następnie wyświetla długość, toString() i summary().
Umieść swój kod w pliku Stack.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Stack.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")
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