Memeriksa dengan inherits()
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 15 dari 57.
inherits(x, "employee") memeriksa apakah employee ada di mana saja dalam vektor class milik x, jadi hasilnya TRUE juga untuk manager. Membandingkannya dengan class(x) == "employee" memeriksa setiap posisi secara terpisah dan menghasilkan vektor, sehingga gagal digunakan dalam 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 TRUEJika diberikan beberapa nama, inherits() bernilai TRUE jika object memiliki salah satunya. Dengan which = TRUE, fungsi ini mengembalikan posisi setiap nama dalam vektor class, atau 0 jika nama tersebut tidak ada:
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 3Fungsi yang hanya sesuai untuk satu kelompok class memeriksa argumennya dengan inherits() dan berhenti dengan pesan yang jelas jika tidak sesuai:
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() dengan inherits() memilih anggota dari satu keluarga dalam daftar campuran, termasuk setiap subclass:
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"Tantangan
MudahKatalog berisi buku, ebook, dan DVD. Constructor tersedia di Item.R, Book.R, Ebook.R, dan Dvd.R; sebuah ebook memiliki class c("ebook", "book", "item"). Di Catalogue.R, lengkapi dua fungsi dengan inherits():
count_of(items, kind)mengembalikan jumlah item yang memilikikinddi mana pun dalam vektor class-nya.titles_of(items, kind)mengembalikan judul item tersebut sesuai urutannya.
Kode yang disediakan membaca baris book Dune, ebook Emma, dvd Alien dan kueri ? book, lalu mencetak book: 2 (Dune, Emma), atau hanya dvd: 0 jika tidak ada yang cocok.
Tulis kodemu di Item.R, Book.R, Ebook.R, Dvd.R, dan Catalogue.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Item.R")
source("Book.R")
source("Ebook.R")
source("Dvd.R")
source("Catalogue.R")
# Kode input/output yang disediakan: biarkan apa adanya
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))
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar S3
Bekerja dengan fileList dengan classFungsi KonstruktorMethod print dan formatValidator dan helperUlasan: Suhu4Enkapsulasi di R
Closure sebagai objectEnvironment sebagai objectFungsi accessorMelindungi stateRangkuman: Meter Parkir2S3 Generics dan Method
Generics dan UseMethodMethod DefaultMethod untuk Base GenericsDasar-Dasar NextMethodRekap: Luas Bangun5S4 class
Mendefinisikan class S4Slots dan AksesPemeriksaan ValiditasMethod showRingkasan: Katalog Produk8Kelas Referensi
Mendefinisikan Kelas ReferensiPembaruan method dan fieldSemantik PenyalinanPewarisan dan callSuperRangkuman: Antrean Tugas11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Pewarisan S3
Vektor classUrutan Pencarian methodMemperluas dengan NextMethodMemeriksa dengan inherits()Ulasan: Penggajian StafLatihan sendiri: Compiler R online