Verificare con inherits()
Fa parte della sezione Programmazione orientata agli oggetti del percorso R di Coddy. Lezione 15 di 57.
inherits(x, "employee") verifica se employee compare in un punto qualsiasi del vettore di classi di x, quindi è TRUE anche per i manager. Il confronto con class(x) == "employee" verifica separatamente ogni posizione e restituisce un vettore, che causa un errore in un if:
m <- structure(list(), class = c("manager", "employee"))
print(inherits(m, "employee"))
print(inherits(m, "intern"))
print(class(m) == "employee")Output:
[1] TRUE
[1] FALSE
[1] FALSE TRUEDati diversi nomi, inherits() restituisce TRUE quando l’oggetto ne ha almeno uno. Con which = TRUE restituisce, per ogni nome, la sua posizione nel vettore delle classi, oppure 0 se è assente:
p <- structure(list(), class = c("fragile", "express", "parcel"))
print(inherits(p, c("letter", "parcel")))
print(inherits(p, c("express", "letter", "parcel"), which = TRUE))Output:
[1] TRUE
[1] 2 0 3Una funzione che ha senso solo per una famiglia di classi verifica il proprio argomento con inherits() e, in caso contrario, si interrompe mostrando un messaggio chiaro:
raise <- function(x, pct) {
if (!inherits(x, "employee")) stop("raise() needs an employee", call. = FALSE)
x$salary <- x$salary * (1 + pct / 100)
x
}
m <- structure(list(salary = 50000), class = c("manager", "employee"))
print(raise(m, 10)$salary)
print(tryCatch(raise(list(salary = 1), 10), error = function(e) conditionMessage(e)))Output:
[1] 55000
[1] "raise() needs an employee"Filter() con inherits() seleziona i membri di una famiglia da un elenco misto, incluse tutte le sottoclassi:
staff <- list(
structure(list(name = "Ada"), class = c("manager", "employee")),
structure(list(name = "Bo"), class = "employee"),
structure(list(name = "Cy"), class = c("intern", "employee")),
structure(list(name = "Dee"), class = c("director", "manager", "employee"))
)
managers <- Filter(function(x) inherits(x, "manager"), staff)
print(vapply(managers, function(x) x$name, character(1)))Output:
[1] "Ada" "Dee"Sfida
FacileUn catalogo contiene libri, ebook e DVD. I costruttori sono definiti in Item.R, Book.R, Ebook.R e Dvd.R; un ebook ha la classe c("ebook", "book", "item"). In Catalogue.R, completa due funzioni con inherits():
count_of(items, kind)restituisce quanti elementi hannokindin qualsiasi posizione nel loro vettore di classi.titles_of(items, kind)restituisce i titoli di quegli elementi, nell’ordine in cui compaiono.
Il codice fornito legge le righe book Dune, ebook Emma, dvd Alien e la query ? book, e stampa book: 2 (Dune, Emma), oppure solo dvd: 0 quando non ci sono corrispondenze.
Il tuo codice va inserito in Item.R, Book.R, Ebook.R, Dvd.R e Catalogue.R. main.R contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
source("Item.R")
source("Book.R")
source("Ebook.R")
source("Dvd.R")
source("Catalogue.R")
# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
items <- list()
for (line in input) {
p <- strsplit(line, " ")[[1]]
rest <- paste(p[-1], collapse = " ")
if (p[1] == "?") {
titles <- titles_of(items, p[2])
shown <- if (length(titles) > 0) paste0(" (", paste(titles, collapse = ", "), ")") else ""
cat(p[2], ": ", count_of(items, p[2]), shown, "\n", sep = "")
} else {
items[[length(items) + 1]] <- switch(p[1], book = new_book(rest), ebook = new_ebook(rest), dvd = new_dvd(rest))
}
}
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 libri3Ereditarietà S3
Vettori di classeOrdine di ricerca dei metodiEstendere con NextMethodVerificare con inherits()Riepilogo - Retribuzioni del personaleEsercitati da solo: Compilatore R online