Les environnements comme objets
Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 18 sur 57.
Un environnement est un ensemble de valeurs nommées, comme une liste, créé avec new.env(). La différence est qu’un environnement n’est jamais copié : chaque variable qui y fait référence voit le même objet, de sorte qu’une modification effectuée via un nom est visible à travers tous les autres :
e <- new.env()
e$count <- 1
alias <- e
alias$count <- 99
print(e$count)
l <- list(count = 1)
copy <- l
copy$count <- 99
print(l$count)Sortie :
[1] 99
[1] 1Une fonction qui reçoit un environnement modifie l’objet de l’appelant. Elle n’a pas besoin de renvoyer quoi que ce soit, et l’appelant n’affecte pas de résultat :
deposit <- function(acc, x) acc$balance <- acc$balance + x
acc <- new.env()
acc$balance <- 10
deposit(acc, 5)
deposit(acc, 5)
print(acc$balance)Sortie :
[1] 20assign(), get() et exists() fonctionnent avec un nom stocké dans une variable, et ls() répertorie les noms d’un environnement dans l’ordre trié :
e <- new.env()
for (fruit in c("pear", "apple")) assign(fruit, nchar(fruit), envir = e)
print(ls(e))
print(get("pear", envir = e))
print(exists("kiwi", envir = e))Résultat :
[1] "apple" "pear"
[1] 4
[1] FALSEUn environnement doté d’un attribut de classe est un objet S3 avec une sémantique de référence : ses méthodes fonctionnent comme d’habitude, et les fonctions qui le modifient le font directement :
new_wallet <- function(coins = 0) {
w <- new.env()
w$coins <- coins
class(w) <- "wallet"
w
}
print.wallet <- function(x, ...) {
cat("wallet with", x$coins, "coins\n")
invisible(x)
}
spend <- function(w, n) w$coins <- w$coins - n
w <- new_wallet(10)
spend(w, 3)
wSortie :
wallet with 7 coinsDéfi
FacileUn inventaire est un environnement de classe inventory comportant une variable, items, qui est un vecteur numérique nommé représentant le stock. Complétez Inventory.R :
new_inventory()crée l’environnement avec unitemsvide (c()convient) ainsi que la classe.add_stock(inv, item, n)ajoutenau stock de l’article, en partant de 0 pour un nouvel article.take_stock(inv, item, n)retirenet renvoieTRUElorsque la quantité est suffisante ; sinon, ne modifie rien et renvoieFALSE.stock_of(inv, item)renvoie le stock, soit 0 pour un article inconnu.
Les fonctions modifient l’inventaire sur place et ne le renvoient pas. Le code fourni lit les commandes add apple 5 et take apple 2, affiche le résultat de chaque take, puis chaque article dans l’ordre alphabétique.
Votre code doit se trouver dans Inventory.R. main.R contient le code fourni d’entrée/sortie et ne peut pas être modifié.
Essayez vous-même
source("Inventory.R")
# Code d'entrée/sortie fourni : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
inv <- new_inventory()
for (line in input) {
p <- strsplit(line, " ")[[1]]
n <- as.numeric(p[3])
if (p[1] == "add") add_stock(inv, p[2], n)
if (p[1] == "take") cat("take ", p[2], ": ", if (take_stock(inv, p[2], n)) "ok" else "not enough", "\n", sep = "")
}
for (item in sort(names(inv$items))) cat(item, ": ", stock_of(inv, item), "\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