Slots et accès
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 23 sur 57.
obj@slot <- value modifie un slot. Comme les objets S3, les objets S4 sont des valeurs : une fonction qui en modifie une agit sur sa propre copie et la renvoie :
setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
p@age <- p@age + 1
p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)Sortie :
36 37slot(obj, "name") fait la même chose que @ avec le nom du slot sous forme de chaîne, et fonctionne donc avec un nom stocké dans une variable. slotNames() liste les slots d’une classe ou d’un objet :
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)Sortie :
name = Ada
age = 36
[1] 37Chaque affectation est vérifiée par rapport au type déclaré, et pas seulement new(). Une valeur incorrecte est refusée et l’objet conserve son ancienne valeur :
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"Sortie :
Error in (function (cl, name, valueClass) :
assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution haltedgetSlots() renvoie chaque nom de slot avec son type déclaré, ce qui permet au code de convertir une entrée textuelle vers le type attendu par un slot :
setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)Sortie :
name age
"character" "numeric"
[1] 41Défi
FacileLa classe Profile dans Profile.R possède les slots name et city (caractère), ainsi que age (numérique). Complétez deux fonctions :
update_profile(p, field, value)s’arrête avecno field email(utilisezcall. = FALSE) lorsque le champ n’est pas un slot ; sinon, elle convertit le textevalueavecas.numeric()lorsque le slot est numérique, définit le slot avecslot()et renvoie le profil modifié.profile_lines(p)renvoie une ligne par slot, dans l’ordre des slots :name: Ada.
Le code fourni lit un nom, puis des lignes comme city=Paris ou age=36, applique chacune d’elles et affiche les lignes du profil.
Votre code doit être placé dans Profile.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("Profile.R")
# Code d'entrée/sortie fourni : le laisser tel quel
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
kv <- strsplit(line, "=")[[1]]
p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
cat("error: ", conditionMessage(e), "\n", sep = "")
p
})
}
for (l in profile_lines(p)) cat(l, "\n", sep = "")
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
1Bases de S3
Travailler avec les fichiersListes avec une classeFonctions constructricesMéthodes print et formatValidateurs et fonctions utilitairesRécapitulatif - Températures4Encapsulation dans R
Les fermetures comme objetsLes environnements comme objetsFonctions d’accèsProtéger l’étatRécapitulatif - Parcmètre2S3 : génériques et méthodes
Génériques et UseMethodMéthodes par défautMéthodes pour les génériques de baseNotions de base sur NextMethodRécapitulatif - Aires des formes5Classes S4
Définir des classes S4Slots et accèsVérifications de validitéMéthodes showRécapitulatif - Catalogue de produits8Classes de référence
Définition des classes de référenceMéthodes et mises à jour des champsSémantique de copieHéritage et callSuperRécapitulatif - File d’attente des tâches11Projet : gestion de bibliothèque
Livres et membresEmprunter des livres3Héritage S3
Vecteurs de classesOrdre de recherche des méthodesÉtendre avec NextMethodVérifier avec inherits()Récapitulatif - Paie du personnelEntraînez-vous par vous-même : Compilateur R en ligne