Menu
Coddy logo textTech

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 36

setClass() 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] TRUE

A 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 halted

Un 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] 0
challenge icon

Desafío

Fácil

Declara 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 = "")
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de R online