Listas con una clase
Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 2 de 57.
S3 es el sistema de objetos más antiguo y utilizado de R. Un objeto S3 es una lista ordinaria con un atributo class, una etiqueta que indica qué tipo de objeto es. class(x) <- "dog" establece la etiqueta:
rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)Salida:
[1] "dog"
Rex is 3structure() construye el valor y establece sus atributos en una sola llamada, que es la forma habitual de crear un objeto S3. Los campos se leen con $, como en cualquier lista:
rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)Salida:
[1] "dog"
[1] TRUE
[1] 3La clase solo es una etiqueta: R no comprueba qué campos tiene un objeto, por lo que cualquier lista puede llamarse dog. unclass() elimina la etiqueta y devuelve la lista simple:
p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))Salida:
$x
[1] 1
$y
[1] 2Los objetos S3 son valores. Una función que cambia un objeto cambia su propia copia, por lo que devuelve la nueva versión y quien la llama se la asigna. El original permanece como estaba:
birthday <- function(d) {
d$age <- d$age + 1
d
}
rex <- structure(list(name = "Rex", age = 3), class = "dog")
older <- birthday(rex)
cat(rex$age, older$age)Salida:
3 4Desafío
FácilCompleta make_pet(name, species, age) en Pet.R. Devuelve una lista con los campos name, species y age, en ese orden, y la clase pet. Después completa describe_pet(p), que devuelve una oración: una mascota llamada Rex, de especie dog y edad 3 produce Rex is a 3 year old dog.
El código proporcionado lee el nombre, la especie y la edad, crea la mascota e imprime su clase, los nombres de sus campos y la oración.
Tu código va en Pet.R. main.R contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
source("Pet.R")
# Código de entrada/salida suministrado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
p <- make_pet(input[1], input[2], as.numeric(input[3]))
cat("class: ", class(p), "\n", sep = "")
cat("fields: ", paste(names(p), collapse = ", "), "\n", sep = "")
cat(describe_pet(p), "\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