Metodi predefiniti
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 8 di 57.
Quando nessun metodo corrisponde alla classe, UseMethod() cerca il metodo predefinito, name.default. È la soluzione di riserva per ogni classe che il generico non conosce:
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))Output:
[1] "a dog called Rex"
[1] "something I do not know"Senza un metodo predefinito, chiamare il generico su una classe sconosciuta provoca un errore:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)Output:
Error in UseMethod("describe") :
no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution haltedAnche i valori semplici vengono instradati. Un numero senza un attributo di classe ha la classe implicita numeric, il testo ha character e TRUE ha logical, quindi i metodi con quei nomi funzionano sui vettori ordinari:
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))Output:
[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"Anche un metodo predefinito può rifiutare educatamente: stop() con un messaggio che indica la classe, così chi chiama sa cosa è andato storto. class(x)[1] è la prima classe dell’oggetto:
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")
}Output:
4
cannot compute the area of a blob Sfida
FacileCompleta la funzione generica describe(x) in Describe.R e i suoi metodi per vettori semplici:
describe.numeric()restituisce3 numbers, sum 6.describe.character()restituisce2 words, longest: apple(la prima delle parole più lunghe in caso di parità).describe.logical()restituisce2 of 3 are TRUE.describe.default()restituiscesomething else.
Il codice fornito legge righe num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE o qualsiasi altra parola con valori, che trasforma in una lista. Stampa describe() per ciascuna.
Il tuo codice va in Describe.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Describe.R")
# Supplied input/output code: keep it as it is
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 = "")
}
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