Generics e UseMethod
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 7 di 57.
Un generico è una funzione il cui corpo è UseMethod("name"). Quando viene chiamata, esamina la classe del suo primo argomento e chiama il metodo name.class. print() e format() funzionano così; puoi scrivere anche i tuoi generici:
speak <- function(x) UseMethod("speak")
speak.dog <- function(x) paste(x$name, "says woof")
speak.cat <- function(x) paste(x$name, "says meow")
rex <- structure(list(name = "Rex"), class = "dog")
tom <- structure(list(name = "Tom"), class = "cat")
print(speak(rex))
print(speak(tom))Risultato:
[1] "Rex says woof"
[1] "Tom says meow"Il chiamante scrive una chiamata e ogni oggetto risponde a modo suo. Questo è polimorfismo: il codice che scorre una lista mista non ha bisogno di un if per ogni classe:
speak <- function(x) UseMethod("speak")
speak.dog <- function(x) paste(x$name, "says woof")
speak.cat <- function(x) paste(x$name, "says meow")
pets <- list(structure(list(name = "Rex"), class = "dog"),
structure(list(name = "Tom"), class = "cat"),
structure(list(name = "Bo"), class = "dog"))
for (p in pets) cat(speak(p), "\n")Output:
Rex says woof
Tom says meow
Bo says woof Un metodo riceve gli argomenti del generico. Assegna al generico un parametro ... in modo che i metodi possano accettare argomenti aggiuntivi propri, come digits per un cerchio:
area <- function(shape, ...) UseMethod("area")
area.square <- function(shape, ...) shape$side^2
area.circle <- function(shape, digits = 2, ...) round(pi * shape$r^2, digits)
sq <- structure(list(side = 3), class = "square")
ci <- structure(list(r = 1), class = "circle")
print(area(sq))
print(area(ci))
print(area(ci, digits = 4))Output:
[1] 9
[1] 3.14
[1] 3.1416UseMethod() passa la chiamata al metodo e non torna mai indietro: qualunque cosa restituisca il metodo è il risultato del generico, e il codice dopo UseMethod() non viene eseguito. Un generico è quindi di una sola riga:
size <- function(x) {
UseMethod("size")
cat("this line never runs\n")
}
size.box <- function(x) x$w * x$h
b <- structure(list(w = 2, h = 5), class = "box")
print(size(b))Output:
[1] 10Sfida
FacileLe forme sono suddivise in tre file. Completa la funzione generica area() in Shape.R, poi aggiungi i metodi area.circle() (pi greco per il raggio al quadrato) in Circle.R e area.rectangle() (larghezza per altezza) in Rectangle.R. I costruttori sono forniti.
Il codice fornito legge righe circle 2 o rectangle 3 4 e stampa la classe e l'area di ogni forma con due cifre decimali: circle: 12.57.
Il tuo codice va inserito in Shape.R, Circle.R e Rectangle.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Shape.R")
source("Circle.R")
source("Rectangle.R")
# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
s <- if (p[1] == "circle") new_circle(as.numeric(p[2])) else new_rectangle(as.numeric(p[2]), as.numeric(p[3]))
cat(sprintf("%s: %.2f", class(s), area(s)), "\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 libriEsercitati da solo: Compilatore R online