Metody dla typów wbudowanych
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 28 z 57.
setMethod() dodaje również metody S4 do funkcji bazowych, takich jak length() i summary(). Funkcja bazowa nadal działa dla wszystkiego innego, a Twoja klasa zyskuje własne zachowanie:
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)))Wynik:
[1] 3
[1] 2Operatory też są metodami ogólnymi. Metoda dla + podaje klasy obu stron w signature(). Dwa argumenty nazywają się e1 i 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)Wynik:
6.50 Generyczna grupa Arith oznacza jednocześnie +, -, *, /, ^ i pozostałe operatory. Wewnątrz swojej metody callGeneric() powtarza użyty operator na przekazanych wartościach:
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)Wynik:
30 2.5 9Grupa generyczna Compare obejmuje ==, <, > i pozostałe. Jej metoda zwraca to, co callGeneric() zwraca dla slotów — wartość logiczną:
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)Wynik:
TRUE FALSE FALSEWyzwanie
ŁatwyKlasa Money w pliku Money.R ma sloty amount (numeric) i currency (character). Dodaj cztery metody:
show()wypisuje12.50 EURi znak nowej linii;+dla dwóch obiektówMoneyzwraca ich sumę lub przerywa działanie z komunikatemcannot add EUR and USD(użyjcall. = FALSE), gdy waluty się różnią;*dla obiektuMoneyi liczby zwraca przeskalowaną kwotę;==dla dwóch obiektówMoneyzwracaTRUE, gdy zarówno kwota, jak i waluta są równe.
Dostarczony kod odczytuje wiersze 10:EUR + 2.5:EUR, 4:USD * 3 lub 1:EUR == 1:EUR i wypisuje wynik albo error: i komunikat.
Twój kod umieść w pliku Money.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Money.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = ""))
}
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ów6S4: Funkcje generyczne i metody
Tworzenie funkcji generycznychMetody dla typów wbudowanychWybór metody na podstawie dwóch argumentówsetValidity i validObjectPodsumowanie — pieniądze i walutaPoćwicz samodzielnie: Kompilator R online