Menu
Coddy logo textTech

Liste con una classe

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

S3 è il sistema di oggetti più antico e più usato di R. Un oggetto S3 è una normale lista con un attributo class, un'etichetta che indica di che tipo di oggetto si tratta. class(x) <- "dog" imposta l'etichetta:

rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)

Output:

[1] "dog"
Rex is 3

structure() crea il valore e ne imposta gli attributi in un'unica chiamata, che è il modo usuale per creare un oggetto S3. I campi si leggono con $, come in qualsiasi lista:

rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)

Output:

[1] "dog"
[1] TRUE
[1] 3

La classe è solo un'etichetta: R non controlla quali campi ha un oggetto, quindi qualsiasi lista può essere chiamata dog. unclass() rimuove l'etichetta e restituisce la lista semplice:

p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))

Output:

$x
[1] 1

$y
[1] 2

Gli oggetti S3 sono valori. Una funzione che modifica un oggetto modifica la propria copia, quindi restituisce la nuova versione e chi la chiama la assegna. L'originale rimane com'era:

birthday <- function(d) {
  d$age <- d$age + 1
  d
}
rex <- structure(list(name = "Rex", age = 3), class = "dog")
older <- birthday(rex)
cat(rex$age, older$age)

Output:

3 4
challenge icon

Sfida

Facile

Completa make_pet(name, species, age) in Pet.R. Restituisce una lista con i campi name, species e age, in quest’ordine, e la classe pet. Poi completa describe_pet(p), che restituisce una frase: un animale domestico chiamato Rex, di specie dog e di età 3 dà Rex is a 3 year old dog.

Il codice fornito legge il nome, la specie e l’età, crea l’animale domestico e stampa la sua classe, i nomi dei suoi campi e la frase.

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

Provalo tu

source("Pet.R")

# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
p <- make_pet(input[1], input[2], as.numeric(input[3]))
cat("class: ", class(p), "\n", sep = "")
cat("fields: ", paste(names(p), collapse = ", "), "\n", sep = "")
cat(describe_pet(p), "\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