Slot e accesso
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 23 di 57.
obj@slot <- value modifica uno slot. Come gli oggetti S3, gli oggetti S4 sono valori: una funzione che ne modifica uno opera sulla propria copia e la restituisce:
setClass("Person", slots = c(name = "character", age = "numeric"))
birthday <- function(p) {
p@age <- p@age + 1
p
}
ada <- new("Person", name = "Ada", age = 36)
older <- birthday(ada)
cat(ada@age, older@age)Output:
36 37slot(obj, "name") fa lo stesso di @ con il nome dello slot in una stringa, quindi funziona con un nome contenuto in una variabile. slotNames() elenca gli slot di una classe o di un oggetto:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
for (s in slotNames(ada)) cat(s, "=", format(slot(ada, s)), "\n")
slot(ada, "age") <- 37
print(ada@age)Output:
name = Ada
age = 36
[1] 37Ogni assegnazione viene verificata rispetto al tipo dichiarato, non solo new(). Un valore non corretto viene rifiutato e l’oggetto conserva quello precedente:
setClass("Person", slots = c(name = "character", age = "numeric"))
ada <- new("Person", name = "Ada", age = 36)
ada@age <- "old"Output:
Error in (function (cl, name, valueClass) :
assignment of an object of class “character” is not valid for @‘age’ in an object of class “Person”; is(value, "numeric") is not TRUE
Execution haltedgetSlots() restituisce ogni nome di slot con il tipo dichiarato, consentendo al codice di convertire l'input testuale nel tipo previsto da uno slot:
setClass("Person", slots = c(name = "character", age = "numeric"))
types <- getSlots("Person")
print(types)
value <- "40"
if (types[["age"]] == "numeric") value <- as.numeric(value)
print(value + 1)Output:
name age
"character" "numeric"
[1] 41Sfida
FacileLa classe Profile in Profile.R ha gli slot name e city (carattere) e age (numerico). Completa due funzioni:
update_profile(p, field, value)si interrompe conno field email(usacall. = FALSE) quando il campo non è uno slot; altrimenti converte il testovalueconas.numeric()quando lo slot è numerico, imposta lo slot conslot()e restituisce il profilo modificato.profile_lines(p)restituisce una riga per ogni slot, nell'ordine degli slot:name: Ada.
Il codice fornito legge un nome, poi righe come city=Paris o age=36, applica ciascuna modifica e stampa le righe del profilo.
Il tuo codice va in Profile.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Profile.R")
# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
p <- new("Profile", name = input[1], city = "unknown", age = 0)
for (line in input[-1]) {
kv <- strsplit(line, "=")[[1]]
p <- tryCatch(update_profile(p, kv[1], kv[2]), error = function(e) {
cat("error: ", conditionMessage(e), "\n", sep = "")
p
})
}
for (l in profile_lines(p)) cat(l, "\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