Menu
CoddyTech

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)

Résultat :

[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 se lisent avec $, comme dans n’importe quelle liste :

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

Sortie :

[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 renvoie la liste ordinaire :

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

Résultat :

$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 inchangé :

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)

Résultat :

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 et affiche sa classe, les noms de ses champs et la phrase.

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

Essayez vous-même

source("Pet.R")

# Code d'entrée/sortie fourni : conservez-le 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