Menu
Coddy logo textTech

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 3

structure() 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] 3

La 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] 2

Los 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 4
challenge icon

Desafío

Fácil

Completa 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 = "")
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