Definire le classi S4
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 22 di 57.
S4 è il sistema formale degli oggetti di R. setClass() dichiara una classe con slot denominati e il tipo di ciascuno, mentre new() crea un oggetto. L’operatore @ legge uno slot:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
cat(ada@name, "is", ada@age)Output:
Ada is 36setClass() restituisce anche una funzione generatrice. Assegnale un nome, di solito il nome della classe, e chiamala come un costruttore:
Person <- setClass("Person", slots = c(name = "character", age = "numeric"))
bo <- Person(name = "Bo", age = 7)
print(bo@age + 1)
print(is(bo, "Person"))Output:
[1] 8
[1] TRUEA differenza di S3, R controlla gli slot. Uno slot sconosciuto o un valore del tipo errato fa sì che new() si interrompa con un errore, quindi un oggetto S4 ha sempre la struttura dichiarata dalla sua classe:
setClass("Person", slots = c(name = "character", age = "numeric"))
p <- new("Person", name = "Cy", age = "ten")Output:
Error in validObject(.Object) :
invalid class “Person” object: invalid object for slot "age" in class "Person": got class "character", should be or extend class "numeric"
Calls: new -> initialize -> initialize -> validObject
Execution haltedUno slot a cui non viene assegnato un valore riceve un valore vuoto del suo tipo, ad esempio character(0). prototype imposta invece valori predefiniti reali. Il codice più vecchio dichiara gli slot con representation(), che significa lo stesso di slots:
setClass("Task", slots = c(title = "character", done = "logical"),
prototype = list(done = FALSE))
setClass("Note", representation(text = "character"))
t <- new("Task", title = "Write report")
print(t@done)
print(length(new("Note")@text))Output:
[1] FALSE
[1] 0Sfida
FacileDichiara la classe S4 Book in Book.R con tre slot: title e author di tipo character e pages di tipo numeric. Poi completa book_label(b), che legge gli slot con @ e restituisce Dune by Frank Herbert (412 pages).
Il codice fornito legge righe title;author;pages, crea ogni libro con new("Book", ...), stampa la sua etichetta e infine i nomi degli slot della classe.
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")))
for (line in input) {
p <- strsplit(line, ";")[[1]]
b <- new("Book", title = p[1], author = p[2], pages = as.numeric(p[3]))
cat(book_label(b), "\n", sep = "")
}
cat("slots: ", paste(slotNames("Book"), 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