Definición de clases S4
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 22 de 57.
S4 es el sistema formal de objetos de R. setClass() declara una clase con slots con nombre y el tipo de cada uno, y new() crea un objeto. El operador @ lee un slot:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)Salida:
Ada is 36setClass() también devuelve una función generadora. Asígnala a un nombre, normalmente el nombre de la clase, y llámala como un constructor:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))Salida:
[1] 8
[1] TRUEA diferencia de S3, R comprueba las ranuras. Una ranura desconocida o un valor del tipo incorrecto detiene new() con un error, por lo que un objeto S4 siempre tiene la estructura que declara su clase:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")Salida:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution haltedUn slot al que no se asigna un valor recibe un valor vacío de su tipo, como character(0). prototype establece valores predeterminados reales en su lugar. El código más antiguo declara los slots con representation(), lo que significa lo mismo que slots:
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))Salida:
[1] FALSE
[1] 0Desafío
FácilDeclara la clase S4 Book en Book.R con tres ranuras: title y author de tipo character, y pages de tipo numeric. Después completa book_label(b), que lee las ranuras con @ y devuelve Dune by Frank Herbert (412 pages).
El código proporcionado lee líneas title;author;pages, crea cada libro con new("Book", ...), imprime su etiqueta y, finalmente, los nombres de las ranuras de la clase.
Tu código va en Book.R. main.R contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
source("Book.R")
# Código de entrada/salida suministrado: déjalo como está
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), collapse = ", "), "\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