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 3structure() 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] 3La 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] 2Gli 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 4Sfida
FacileCompleta 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 = "")
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