Phương thức mặc định
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 8 trên 57.
Khi không có phương thức nào khớp với lớp, UseMethod() sẽ tìm phương thức mặc định, name.default. Đây là phương án dự phòng cho mọi lớp mà hàm tổng quát không nhận biết:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
describe.default <- function(x) "something I do not know"
rex <- structure(list(name = "Rex"), class = "dog")
car <- structure(list(), class = "car")
print(describe(rex))
print(describe(car))Đầu ra:
[1] "a dog called Rex"
[1] "something I do not know"Nếu không có phương thức mặc định, gọi hàm tổng quát với một lớp chưa biết sẽ dừng lại và báo lỗi:
describe <- function(x) UseMethod("describe")
describe.dog <- function(x) paste("a dog called", x$name)
car <- structure(list(), class = "car")
describe(car)Đầu ra:
Error in UseMethod("describe") :
no applicable method for 'describe' applied to an object of class "car"
Calls: describe
Execution haltedCác giá trị thông thường cũng được điều phối. Một số không có thuộc tính lớp có lớp ngầm định numeric, văn bản có character, còn TRUE có logical, vì vậy các phương thức mang những tên đó hoạt động với các vector thông thường:
describe <- function(x) UseMethod("describe")
describe.numeric <- function(x) paste("numbers adding up to", sum(x))
describe.character <- function(x) paste("words:", paste(x, collapse = " "))
describe.default <- function(x) "something else"
print(describe(c(1, 2, 3)))
print(describe(c("a", "b")))
print(describe(TRUE))Đầu ra:
[1] "numbers adding up to 6"
[1] "words: a b"
[1] "something else"Phương thức mặc định cũng có thể từ chối một cách lịch sự: dùng stop() kèm thông báo nêu tên lớp, để bên gọi biết đã xảy ra lỗi gì. class(x)[1] là lớp đầu tiên của đối tượng:
area <- function(shape) UseMethod("area")
area.square <- function(shape) shape$side^2
area.default <- function(shape) {
stop("cannot compute the area of a ", class(shape)[1], call. = FALSE)
}
for (s in list(structure(list(side = 2), class = "square"), structure(list(), class = "blob"))) {
cat(tryCatch(area(s), error = function(e) conditionMessage(e)), "\n")
}Đầu ra:
4
cannot compute the area of a blob Thử thách
DễHoàn thiện hàm tổng quát describe(x) trong Describe.R và các phương thức của hàm này cho các véc-tơ thông thường:
describe.numeric()trả về3 numbers, sum 6.describe.character()trả về2 words, longest: apple(từ dài nhất đầu tiên nếu có nhiều từ dài bằng nhau).describe.logical()trả về2 of 3 are TRUE.describe.default()trả vềsomething else.
Code được cung cấp đọc các dòng num 1,2,3, chr apple,kiwi, lgl TRUE,FALSE,TRUE hoặc bất kỳ từ nào khác kèm các giá trị, rồi chuyển chúng thành một danh sách. Code in ra describe() cho từng dòng.
Code của bạn nằm trong Describe.R. main.R chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.
Tự làm thử
source("Describe.R")
# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
values <- strsplit(p[2], ",")[[1]]
x <- switch(p[1],
num = as.numeric(values),
chr = values,
lgl = as.logical(values),
list(values))
cat(describe(x), "\n", sep = "")
}
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ẩmTự luyện tập: Trình biên dịch R online