Metodi per gli elementi integrati
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 28 di 57.
setMethod() aggiunge anche metodi S4 alle funzioni di base come length() e summary(). La funzione di base continua a funzionare per tutto il resto, mentre la tua classe ottiene un comportamento specifico:
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)))Output:
[1] 3
[1] 2Anche gli operatori sono generici. Un metodo per + specifica le classi di entrambi gli operandi in una signature(). I due argomenti si chiamano e1 ed 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)Output:
6.50 Il generico di gruppo Arith rappresenta +, -, *, /, ^ e tutti gli altri operatori contemporaneamente. All'interno del suo metodo, callGeneric() ripete l'operatore utilizzato, sui valori che passi:
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)Output:
30 2.5 9Il generico di gruppo Compare comprende ==, <, > e gli altri. Il suo metodo restituisce ciò che callGeneric() restituisce per gli slot, un valore logico:
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)Output:
TRUE FALSE FALSESfida
FacileLa classe Money in Money.R ha gli slot amount (numerico) e currency (carattere). Aggiungi quattro metodi:
show()stampa12.50 EURe una nuova riga;+per due oggettiMoneyrestituisce la loro somma oppure si interrompe concannot add EUR and USD(usacall. = FALSE) quando le valute sono diverse;*perMoneye un numero restituisce l'importo moltiplicato;==per due oggettiMoneyèTRUEquando sia l'importo sia la valuta sono uguali.
Il codice fornito legge righe come 10:EUR + 2.5:EUR, 4:USD * 3 o 1:EUR == 1:EUR e stampa il risultato oppure error: e il messaggio.
Il tuo codice va in Money.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Money.R")
# Codice di input/output fornito: lascialo così com'è
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 = ""))
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Nozioni di base su S3
Lavorare con i fileListe con una classeFunzioni costruttriciMetodi di stampa e formattazioneValidatori e funzioni di supportoRipasso - Temperature4Incapsulamento in R
Chiusure come oggettiAmbienti come oggettiFunzioni di accessoProteggere lo statoRiepilogo - Parcometro2Generics e metodi S3
Generics e UseMethodMetodi predefinitiMetodi per i generics di baseNozioni di base su NextMethodRiepilogo - Aree delle forme5Classi S4
Definire le classi S4Slot e accessoControlli di validitàMetodi showRiepilogo - Catalogo prodotti8Classi di riferimento
Definizione delle classi di riferimentoMetodi e aggiornamenti dei campiSemantica della copiaEreditarietà e callSuperRiepilogo - coda di attività11Progetto: Gestione della biblioteca
Libri e iscrittiPrestito dei libri3Ereditarietà S3
Vettori di classeOrdine di ricerca dei metodiEstendere con NextMethodVerificare con inherits()Riepilogo - Retribuzioni del personale6Generici e metodi S4
Creare genericiMetodi per gli elementi integratiDispatch su due argomentisetValidity e validObjectRiepilogo - Denaro e valutaEsercitati da solo: Compilatore R online