Sprawdzanie za pomocą inherits()
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 15 z 57.
inherits(x, "employee") sprawdza, czy employee znajduje się gdziekolwiek w wektorze klas x, więc zwraca TRUE również dla menedżerów. Porównanie z class(x) == "employee" sprawdza każdą pozycję osobno i zwraca wektor, co nie zadziała w instrukcji if:
m <- structure(list(), class = c("manager", "employee"))
print(inherits(m, "employee"))
print(inherits(m, "intern"))
print(class(m) == "employee")Wynik:
[1] TRUE
[1] FALSE
[1] FALSE TRUEDla kilku nazw inherits() zwraca TRUE, gdy obiekt ma którąkolwiek z nich. Z argumentem which = TRUE zwraca dla każdej nazwy jej pozycję w wektorze klas albo 0, jeśli jej brakuje:
p <- structure(list(), class = c("fragile", "express", "parcel"))
print(inherits(p, c("letter", "parcel")))
print(inherits(p, c("express", "letter", "parcel"), which = TRUE))Wynik:
[1] TRUE
[1] 2 0 3Funkcja, która ma sens tylko dla jednej rodziny klas, sprawdza argument za pomocą inherits() i w przeciwnym razie zatrzymuje działanie, wyświetlając jasny komunikat:
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)))Wynik:
[1] 55000
[1] "raise() needs an employee"Filter() w połączeniu z inherits() wybiera elementy jednej rodziny z mieszanej listy, w tym wszystkie podklasy:
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)))Wynik:
[1] "Ada" "Dee"Wyzwanie
ŁatwyKatalog zawiera książki, e-booki i płyty DVD. Konstruktory są podane w Item.R, Book.R, Ebook.R i Dvd.R; e-book ma klasy c("ebook", "book", "item"). W Catalogue.R uzupełnij dwie funkcje za pomocą inherits():
count_of(items, kind)zwraca liczbę elementów, które mająkindw dowolnym miejscu wektora klas.titles_of(items, kind)zwraca tytuły tych elementów w ich kolejności.
Dostarczony kod odczytuje wiersze book Dune, ebook Emma, dvd Alien oraz zapytanie ? book, a następnie wypisuje book: 2 (Dune, Emma) albo tylko dvd: 0, gdy nic nie pasuje.
Twój kod umieść w plikach Item.R, Book.R, Ebook.R, Dvd.R i Catalogue.R. main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
source("Item.R")
source("Book.R")
source("Ebook.R")
source("Dvd.R")
source("Catalogue.R")
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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))
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online