Métodos show
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 25 de 57.
Cuando se imprime un objeto S4, R llama a la función show(). Sin un método para la clase, muestra cada ranura, lo cual es correcto pero extenso:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
p <- new("Point", x = 1, y = 2)
pSalida:
An object of class "Point"
Slot "x":
[1] 1
Slot "y":
[1] 2setMethod("show", "Point", function(object) ...) proporciona a la clase su propia impresión. El método imprime con cat() y se utiliza tanto cuando se imprime un objeto en el nivel superior como mediante print():
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) {
cat("Point(", object@x, ", ", object@y, ")\n", sep = "")
})
p <- new("Point", x = 1, y = 2)
p
print(p)Salida:
Point(1, 2)
Point(1, 2)Un slot puede contener otro objeto S4: declara su tipo como el nombre de la clase. El método externo show() puede imprimir el objeto interno llamando a show() sobre él:
setClass("Point", slots = c(x = "numeric", y = "numeric"))
setMethod("show", "Point", function(object) cat("(", object@x, ", ", object@y, ")", sep = ""))
setClass("Line", slots = c(from = "Point", to = "Point"))
setMethod("show", "Line", function(object) {
cat("line ")
show(object@from)
cat(" -> ")
show(object@to)
cat("\n")
})
new("Line", from = new("Point", x = 0, y = 0), to = new("Point", x = 3, y = 4))Salida:
line (0, 0) -> (3, 4)Una clase virtual, declarada con representation("VIRTUAL"), no puede crearse con new(). Existe para ser una clase principal común para otras clases, en la que se basa el capítulo sobre herencia S4. isVirtualClass() permite distinguir entre ambos tipos:
setClass("Shape", representation("VIRTUAL"))
setClass("Point", slots = c(x = "numeric"))
cat(isVirtualClass("Shape"), isVirtualClass("Point"), "\n")
msg <- tryCatch(new("Shape"), error = function(e) "cannot create a Shape")
cat(msg, "\n")Salida:
TRUE FALSE
cannot create a Shape Desafío
FácilLos puntos y los segmentos son dos clases S4 en dos archivos. Las clases están declaradas. Añade sus métodos show():
- En
Point.R: un punto se imprime comoPoint(1, 2)seguido de una nueva línea. - En
Segment.R: un segmento se imprime comoSegment Point(1, 2) to Point(4, 6), length 5seguido de una nueva línea, con la longitud redondeada a dos decimales. Construye tú mismo el texto del punto o utiliza un ayudante; el método del punto imprime su propia nueva línea, así que no lo llames en mitad de la línea del segmento.
El código proporcionado lee líneas 1,2 4,6, imprime el primer punto y después el segmento, ambos mediante sus métodos show().
Tu código va en Point.R y Segment.R. main.R contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
source("Point.R")
source("Segment.R")
# Código de entrada/salida suministrado: déjalo como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
n <- as.numeric(strsplit(line, "[ ,]")[[1]])
a <- new("Point", x = n[1], y = n[2])
b <- new("Point", x = n[3], y = n[4])
print(a)
print(new("Segment", from = a, to = b))
}
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