Menu
Coddy logo textTech

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 36

setClass() 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] TRUE

A 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 halted

Uno 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] 0
challenge icon

Sfida

Facile

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