Métodos para genéricos base
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 9 de 57.
Muchas funciones de R base son genéricas S3: print(), format(), summary(), toString(), length(), as.character() y más. Añadir un método hace que tu clase funcione con una función que todo usuario de R ya conoce. summary.gradebook() informa sobre un objeto completo:
summary.gradebook <- function(object, ...) {
paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")Salida:
3 marks, average 82 Comprueba los parámetros del genérico antes de escribir el método: summary() llama object a su primer argumento, mientras que toString() y format() lo llaman x. toString() debe devolver una sola cadena:
toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))Salida:
[1] "70 / 85 / 91"Un método length() cambia lo que significa length() para la clase. Una cola que almacena sus elementos en un campo puede indicar cuántos elementos contiene, en lugar del número de campos de la lista:
q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))Salida:
[1] 2
[1] 3Los operadores también son genéricos. Un método llamado "+.money", escrito entre comillas debido al símbolo, se ejecuta cuando cualquiera de los lados de + es un objeto money. Recibe ambos lados como e1 y e2:
new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)Salida:
[1] 12
[1] FALSEDesafío
FácilUna pila mantiene sus elementos en el campo items, con la parte superior de la pila al final. Se proporcionan new_stack(), push() y pop() en Stack.R. Añade tres métodos:
length.stack()devuelve el número de elementos.toString.stack()devuelve los elementos de arriba abajo, unidos por|, oempty.summary.stack()devuelvestack of 3, top: c, ostack of 0cuando está vacía.
El código proporcionado lee los comandos push <item> y pop, después imprime la longitud, toString() y summary().
Tu código va en Stack.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Stack.R")
# Código de entrada/salida suministrado: mantenlo tal como está
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\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