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 150Un 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 55I 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)Sfida
FacileDichiara 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 = "")
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
1Nozioni di base su S3
Lavorare con i fileListe con una classeFunzioni costruttriciMetodi di stampa e formattazioneValidatori e funzioni di supportoRipasso - Temperature4Incapsulamento in R
Chiusure come oggettiAmbienti come oggettiFunzioni di accessoProteggere lo statoRiepilogo - Parcometro2Generics e metodi S3
Generics e UseMethodMetodi predefinitiMetodi per i generics di baseNozioni di base su NextMethodRiepilogo - Aree delle forme5Classi S4
Definire le classi S4Slot e accessoControlli di validitàMetodi showRiepilogo - Catalogo prodotti8Classi di riferimento
Definizione delle classi di riferimentoMetodi e aggiornamenti dei campiSemantica della copiaEreditarietà e callSuperRiepilogo - coda di attività11Progetto: Gestione della biblioteca
Libri e iscrittiPrestito dei libriEsercitati da solo: Compilatore R online