Menu
Coddy logo textTech

Listes avec une classe

Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 2 sur 57.

S3 est le système d’objets le plus ancien et le plus utilisé de R. Un objet S3 est une liste ordinaire avec un attribut class, une étiquette qui indique de quel type d’objet il s’agit. class(x) <- "dog" définit l’étiquette :

rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)

Sortie :

[1] "dog"
Rex is 3

structure() construit la valeur et définit ses attributs en un seul appel, ce qui est la manière habituelle de créer un objet S3. Les champs sont lus avec $ comme dans toute liste :

rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)

Résultat :

[1] "dog"
[1] TRUE
[1] 3

La classe n’est qu’une étiquette : R ne vérifie pas les champs que possède un objet, donc n’importe quelle liste peut être appelée dog. unclass() supprime l’étiquette et restitue la liste ordinaire :

p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))

Sortie :

$x
[1] 1

$y
[1] 2

Les objets S3 sont des valeurs. Une fonction qui modifie un objet modifie sa propre copie ; elle renvoie donc la nouvelle version et l’appelant l’assigne. L’original reste tel quel :

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)

Sortie :

3 4
challenge icon

Défi

Facile

Complétez make_pet(name, species, age) dans Pet.R. Cette fonction renvoie une liste contenant les champs name, species et age, dans cet ordre, ainsi que la classe pet. Complétez ensuite describe_pet(p), qui renvoie une phrase : un animal nommé Rex, de l’espèce dog et âgé de 3 ans donne Rex is a 3 year old dog.

Le code fourni lit le nom, l’espèce et l’âge, crée l’animal, puis affiche sa classe, les noms de ses champs et la phrase.

Votre code doit être placé dans Pet.R. main.R contient le code fourni pour les entrées et les sorties et ne peut pas être modifié.

Essayez vous-même

source("Pet.R")

# Code d'entrée/sortie fourni : le garder tel quel
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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur R en ligne