Kiểm tra với inherits()
Thuộc phần Lập trình hướng đối tượng trong hành trình R của Coddy. Bài học 15 trên 57.
inherits(x, "employee") kiểm tra xem employee có nằm ở bất kỳ vị trí nào trong vectơ lớp của x hay không, nên kết quả là TRUE cả với quản lý. So sánh với class(x) == "employee" sẽ kiểm tra riêng từng vị trí và trả về một vectơ, khiến câu lệnh if gặp lỗi:
m <- structure(list(), class = c("manager", "employee"))
print(inherits(m, "employee"))
print(inherits(m, "intern"))
print(class(m) == "employee")Đầu ra:
[1] TRUE
[1] FALSE
[1] FALSE TRUEVới một số tên, inherits() trả về TRUE khi đối tượng có bất kỳ tên nào trong số đó. Với which = TRUE, hàm trả về vị trí của từng tên trong vectơ lớp, hoặc 0 nếu tên đó không có:
p <- structure(list(), class = c("fragile", "express", "parcel"))
print(inherits(p, c("letter", "parcel")))
print(inherits(p, c("express", "letter", "parcel"), which = TRUE))Đầu ra:
[1] TRUE
[1] 2 0 3Một hàm chỉ phù hợp với một nhóm lớp nhất định sẽ kiểm tra đối số bằng inherits() và dừng lại kèm thông báo rõ ràng nếu không đáp ứng điều kiện:
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)))Đầu ra:
[1] 55000
[1] "raise() needs an employee"Filter() kết hợp với inherits() chọn các thành viên thuộc một nhóm từ danh sách hỗn hợp, bao gồm cả mọi lớp con:
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)))Đầu ra:
[1] "Ada" "Dee"Thử thách
DễMột danh mục lưu trữ sách, sách điện tử và DVD. Các hàm khởi tạo nằm trong Item.R, Book.R, Ebook.R và Dvd.R; sách điện tử có lớp c("ebook", "book", "item"). Trong Catalogue.R, hãy hoàn thành hai hàm bằng inherits():
count_of(items, kind)trả về số lượng mục cókindở bất kỳ vị trí nào trong vector lớp của chúng.titles_of(items, kind)trả về tiêu đề của những mục đó theo đúng thứ tự.
Code được cung cấp đọc các dòng book Dune, ebook Emma, dvd Alien, truy vấn ? book và in ra book: 2 (Dune, Emma), hoặc chỉ in ra dvd: 0 khi không có mục nào khớp.
Code của bạn nằm trong Item.R, Book.R, Ebook.R, Dvd.R và Catalogue.R. main.R chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
source("Item.R")
source("Book.R")
source("Ebook.R")
source("Dvd.R")
source("Catalogue.R")
# Đoạn code đầu vào/đầu ra được cung cấp sẵn: giữ nguyên
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))
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về S3
Làm việc với tệpDanh sách với một lớpHàm khởi tạoPhương thức in ra và định dạngTrình xác thực và hàm hỗ trợÔn tập: nhiệt độ4Tính đóng gói trong R
Closure dưới dạng đối tượngMôi trường dưới dạng đối tượngHàm truy cậpBảo vệ trạng tháiÔn tập: đồng hồ tính phí đỗ xe2S3, hàm generic và phương thức
Hàm generic và UseMethodPhương thức mặc địnhPhương thức cho hàm generic cơ sởCơ bản về NextMethodÔn tập: diện tích hình5Các lớp S4
Định nghĩa lớp S4Slot và quyền truy cậpKiểm tra tính hợp lệPhương thức showÔn tập: Danh mục sản phẩm3S3 Tính kế thừa
Vector lớpThứ tự tra cứu phương thứcMở rộng với NextMethodKiểm tra với inherits()Ôn tập, tính lương nhân viênTự luyện tập: Trình biên dịch R online