Métodos para funciones incorporadas
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 28 de 57.
setMethod() también añade métodos S4 a funciones base como length() y summary(). La función base sigue funcionando para todo lo demás, y tu clase obtiene su propio comportamiento:
setClass("Playlist", slots = c(name = "character", songs = "character"))
setMethod("length", "Playlist", function(x) length(x@songs))
pl <- new("Playlist", name = "gym", songs = c("a", "b", "c"))
print(length(pl))
print(length(c(1, 2)))Salida:
[1] 3
[1] 2Los operadores también son genéricos. Un método para + nombra las clases de ambos lados en una signature(). Los dos argumentos se llaman e1 y e2:
setClass("Money", slots = c(amount = "numeric"))
setMethod("show", "Money", function(object) cat(sprintf("%.2f", object@amount), "\n"))
setMethod("+", signature("Money", "Money"), function(e1, e2) {
new("Money", amount = e1@amount + e2@amount)
})
new("Money", amount = 2.5) + new("Money", amount = 4)Salida:
6.50 El genérico de grupo Arith representa +, -, *, /, ^ y el resto a la vez. Dentro de su método, callGeneric() repite el operador que se haya utilizado, sobre los valores que pases:
setClass("Money", slots = c(amount = "numeric"))
setMethod("Arith", signature("Money", "numeric"), function(e1, e2) {
new("Money", amount = callGeneric(e1@amount, e2))
})
m <- new("Money", amount = 10)
cat((m * 3)@amount, (m / 4)@amount, (m - 1)@amount)Salida:
30 2.5 9El genérico de grupo Compare abarca ==, <, > y los demás. Su método devuelve lo que callGeneric() devuelve para los slots, un valor lógico:
setClass("Money", slots = c(amount = "numeric"))
setMethod("Compare", signature("Money", "Money"), function(e1, e2) {
callGeneric(e1@amount, e2@amount)
})
a <- new("Money", amount = 5)
b <- new("Money", amount = 8)
cat(a < b, a == b, a >= b)Salida:
TRUE FALSE FALSEDesafío
FácilLa clase Money en Money.R tiene los slots amount (numérico) y currency (carácter). Añade cuatro métodos:
show()imprime12.50 EURy una nueva línea;+para dos objetosMoneydevuelve su suma, o se detiene concannot add EUR and USD(usacall. = FALSE) cuando las monedas difieren;*paraMoneyy un número devuelve la cantidad escalada;==para dos objetosMoneyesTRUEcuando tanto la cantidad como la moneda son iguales.
El código proporcionado lee líneas como 10:EUR + 2.5:EUR, 4:USD * 3 o 1:EUR == 1:EUR e imprime el resultado o error: y el mensaje.
Tu código va en Money.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
source("Money.R")
# Código de entrada/salida suministrado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
parse_money <- function(t) {
p <- strsplit(t, ":")[[1]]
new("Money", amount = as.numeric(p[1]), currency = p[2])
}
for (line in input) {
p <- strsplit(line, " ")[[1]]
a <- parse_money(p[1])
tryCatch({
if (p[2] == "+") print(a + parse_money(p[3]))
if (p[2] == "*") print(a * as.numeric(p[3]))
if (p[2] == "==") cat(a == parse_money(p[3]), "\n", sep = "")
}, error = function(e) cat("error: ", conditionMessage(e), "\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 libros3Herencia en S3
Vectores de claseOrden de búsqueda de métodosExtensión con NextMethodComprobación con inherits()Repaso - Nómina del personal6S4 Genéricos y métodos
Creación de genéricosMétodos para funciones incorporadasDespacho sobre dos argumentossetValidity y validObjectRepaso: dinero y monedaPractica por tu cuenta: Compilador de R online