Métodos predeterminados
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 8 de 57.
Cuando ningún método coincide con la clase, UseMethod() busca el método predeterminado, name.default. Es la alternativa para todas las clases que el genérico no reconoce:
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))Salida:
[1] "a dog called Rex"
[1] "something I do not know"Sin un método predeterminado, llamar al genérico con una clase desconocida termina con un error:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)Salida:
Error in UseMethod("describe") :
no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution haltedLos valores simples también se despachan. Un número sin un atributo de clase tiene la clase implícita numeric, el texto tiene character y TRUE tiene logical, por lo que los métodos para esos nombres funcionan con vectores ordinarios:
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))Salida:
[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"Un método predeterminado también puede rechazar amablemente: stop() con un mensaje que indique la clase, para que quien realiza la llamada sepa qué salió mal. class(x)[1] es la primera clase del objeto:
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")
}Salida:
4
cannot compute the area of a blob Desafío
FácilCompleta la función genérica describe(x) en Describe.R y sus métodos para vectores simples:
describe.numeric()devuelve3 numbers, sum 6.describe.character()devuelve2 words, longest: apple(la primera de las palabras más largas cuando hay un empate).describe.logical()devuelve2 of 3 are TRUE.describe.default()devuelvesomething else.
El código proporcionado lee líneas num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE o cualquier otra palabra con valores, y las convierte en una lista. Imprime describe() para cada una.
Tu código va en Describe.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Describe.R")
# Código de entrada/salida suministrado: déjalo tal como está
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 = "")
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de S3
Trabajar con archivosListas con una claseFunciones constructorasMétodos de impresión y formatoValidadores y auxiliaresRepaso: temperaturas4Encapsulación en R
Cierres como objetosEntornos como objetosFunciones de accesoProtección del estadoRepaso: parquímetro2S3 Genéricos y métodos
Genéricos y UseMethodMétodos predeterminadosMétodos para genéricos baseFundamentos de NextMethodRepaso: áreas de figuras5Clases S4
Definición de clases S4Slots y accesoComprobaciones de validezMétodos showRepaso - Catálogo de productos8Clases de referencia
Definición de clases de referenciaMétodos y actualizaciones de camposSemántica de copiaHerencia y callSuperRepaso: cola de tareas11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de R online