Fundamentos de NextMethod
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 10 de 57.
Dentro de un método, NextMethod() llama al siguiente método en la línea para el mismo genérico, con los mismos argumentos. Para un objeto con una sola clase, el siguiente método es el predeterminado, por lo que un método puede reutilizar la respuesta general y añadirle contenido:
describe <- function(x) UseMethod("describe")
describe.default <- function(x) paste("an object with", length(x), "fields")
describe.task <- function(x) paste0(NextMethod(), ", titled ", x$title)
t <- structure(list(title = "Buy milk", done = FALSE), class = "task")
print(describe(t))Salida:
[1] "an object with 2 fields, titled Buy milk"Un objeto puede tener varias clases en un vector, como c("urgent", "task"). El despacho las prueba en orden, y NextMethod() en el primer método pasa al método de la siguiente clase:
describe <- function(x) UseMethod("describe")
describe.task <- function(x) paste("task:", x$title)
describe.urgent <- function(x) paste("URGENT", NextMethod())
fix <- structure(list(title = "Fix the leak"), class = c("urgent", "task"))
print(describe(fix))Salida:
[1] "URGENT task: Fix the leak"NextMethod() transmite todos los argumentos que recibió el método, incluidos los adicionales como sep. El método siguiente ve los mismos valores sin que tengas que enumerarlos de nuevo:
label <- function(x, sep = ": ") UseMethod("label")
label.default <- function(x, sep = ": ") paste0("item", sep, x$name)
label.box <- function(x, sep = ": ") paste0("[", NextMethod(), "]")
b <- structure(list(name = "tools"), class = "box")
print(label(b))
print(label(b, sep = " = "))Salida:
[1] "[item: tools]"
[1] "[item = tools]"Base R usa NextMethod() para conservar una clase cuando se obtiene un subconjunto de un vector. El [ predeterminado elimina la clase, por lo que un método "[.percent" le permite hacer el trabajo y vuelve a añadir la clase:
format.percent <- function(x, ...) paste0(unclass(x) * 100, "%")
"[.percent" <- function(x, i) structure(NextMethod(), class = "percent")
p <- structure(c(0.1, 0.25, 0.5), class = "percent")
print(format(p[2:3]))Salida:
[1] "25%" "50%"Desafío
FácilLas tareas y las tareas urgentes son dos clases en dos archivos. En Task.R, completa el método genérico describe(), el método predeterminado, que devuelve an item, y describe.task(), que devuelve an item: Buy milk al llamar a NextMethod() y añadir el título. En Urgent.R, completa describe.urgent(), que devuelve URGENT an item: Fix bug al llamar a NextMethod().
Los constructores están dados: una tarea urgente tiene la clase c("urgent", "task"). El código proporcionado lee las líneas task Buy milk, urgent Fix bug o cualquier otra palabra con un título, que se convierte en un objeto de esa clase, e imprime describe() para cada uno.
Tu código va en Task.R y Urgent.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Task.R")
source("Urgent.R")
# Código de entrada/salida suministrado: déjalo como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
kind <- sub(" .*", "", line)
title <- sub("^[a-z]+ ", "", line)
t <- if (kind == "urgent") new_urgent(title) else if (kind == "task") new_task(title) else structure(list(title = title), class = kind)
cat(describe(t), "\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