Menu
Coddy logo textTech

Definizione delle classi di riferimento

Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 37 di 57.

Le Reference Classes (RC) sono il sistema di R per gli oggetti che cambiano sul posto, come in Java o Python. setRefClass() dichiara una classe con campi tipizzati e restituisce un generatore; $new() crea un oggetto e $ legge e modifica i suoi campi:

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)

Output:

Ada 150

Un oggetto RC è un riferimento, come un ambiente. Assegnarlo a un’altra variabile o passarlo a una funzione non lo copia, quindi una modifica apportata tramite un qualsiasi nome modifica l’unico oggetto:

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)

Output:

55 55

I campi sono tipizzati. L’assegnazione di un valore della classe sbagliata viene rifiutata e il campo mantiene il valore precedente:

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")

Output:

invalid assignment for reference class field ‘balance’, should be from class “numeric” or a subclass (was class “character”) 
100 

Il generatore descrive la classe: Account$fields() elenca i campi e i relativi tipi. Un oggetto stampato senza un metodo show elenca i suoi campi; un campo a cui non è stato assegnato un valore è vuoto:

Account <- setRefClass("Account", fields = list(owner = "character", balance = "numeric"))
print(Account$fields())
Account$new(owner = "Bo")

Output:

      owner     balance 
"character"   "numeric" 
Reference class object of class "Account"
Field "owner":
[1] "Bo"
Field "balance":
numeric(0)
challenge icon

Sfida

Facile

Dichiara la classe Reference Book in Book.R con i campi title e author (character) e pages (numeric), e mantieni il generatore in Book. Poi scrivi add_pages(book, n), che aggiunge n alle pagine del libro direttamente e non restituisce nulla di utile.

Il codice fornito legge title;author;pages, crea il libro, lo assegna a una seconda variabile, aggiunge i numeri rimanenti tramite quel secondo nome e stampa il libro originale e i nomi dei campi.

Il tuo codice va in Book.R. main.R contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

source("Book.R")

# Codice di input/output fornito: lascialo così com'è
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 = "")
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore R online