Définition des classes de référence
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 37 sur 57.
Les classes de référence (RC) sont le système de R pour les objets qui changent sur place, comme en Java ou en Python. setRefClass() déclare une classe avec des champs typés et renvoie un générateur ; $new() crée un objet, et $ lit et modifie ses champs :
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
a$balance <- a$balance + 50
cat(a$owner, a$balance)Sortie :
Ada 150Un objet RC est une référence, comme un environnement. L’affecter à une autre variable ou le passer à une fonction ne le copie pas : une modification effectuée via n’importe quel nom modifie donc le même objet :
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
pay_fee <- function(acc) acc$balance <- acc$balance - 5
a <- Account$new(owner = "Ada", balance = 100)
b <- a
b$balance <- 60
pay_fee(a)
cat(a$balance, b$balance)Résultat :
55 55Les champs sont typés. L’affectation d’une valeur de classe incorrecte est refusée, et le champ conserve son ancienne valeur :
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
a <- Account$new(owner = "Ada", balance = 100)
msg <- tryCatch({ a$balance <- "lots"; "changed" }, error = function(e) conditionMessage(e))
cat(msg, "\n")
cat(a$balance, "\n")Résultat :
invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”)
100 Le générateur décrit la classe : Account$fields() répertorie les champs et leurs types. Un objet affiché sans méthode show répertorie ses champs ; un champ auquel aucune valeur n’a été attribuée est vide :
Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")Résultat :
owner balance
"character" "numeric"
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)Défi
FacileDéclarez la classe de référence Book dans Book.R avec les champs title et author (caractère) et pages (numérique), et conservez le générateur dans Book. Écrivez ensuite add_pages(book, n), qui ajoute n au nombre de pages du livre sur place et ne renvoie rien d’utile.
Le code fourni lit title;author;pages, crée le livre, le donne à une deuxième variable, ajoute les nombres restants en utilisant ce deuxième nom, puis affiche le livre d’origine et les noms des champs.
Votre code doit se trouver dans Book.R. main.R contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
source("Book.R")
# Code d'entrée/sortie fourni : conservez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
p <- strsplit(input[1], ";")[[1]]
b <- Book$new(title = p[1], author = p[2], pages = as.numeric(p[3]))
alias <- b
for (n in as.numeric(input[-1])) add_pages(alias, n)
cat(b$title, " by ", b$author, ": ", b$pages, " pages\n", sep = "")
cat("fields: ", paste(names(Book$fields()), collapse = ", "), "\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