Phương thức cho hàm generic cơ sở
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 9 trên 57.
Nhiều hàm trong R cơ sở là hàm generic S3: print(), format(), summary(), toString(), length(), as.character() và nhiều hàm khác. Thêm một phương thức giúp lớp của bạn hoạt động với một hàm mà mọi người dùng R đều đã biết. summary.gradebook() cung cấp thông tin về toàn bộ đối tượng:
summary.gradebook <- function(object, ...) {
paste0(length(object$marks), " marks, average ", mean(object$marks))
}
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
cat(summary(g), "\n")Đầu ra:
3 marks, average 82 Hãy kiểm tra các tham số của generic trước khi viết phương thức: summary() gọi đối số đầu tiên là object, còn toString() và format() gọi đối số đó là x. toString() nên trả về một chuỗi duy nhất:
toString.gradebook <- function(x, ...) paste(x$marks, collapse = " / ")
g <- structure(list(marks = c(70, 85, 91)), class = "gradebook")
print(toString(g))Đầu ra:
[1] "70 / 85 / 91"Phương thức length() thay đổi ý nghĩa của length() đối với lớp. Hàng đợi lưu các phần tử trong một trường có thể cho biết nó chứa bao nhiêu phần tử, thay vì số trường trong danh sách:
q <- structure(list(items = c("a", "b", "c"), name = "jobs"), class = "queue")
print(length(q))
length.queue <- function(x) length(x$items)
print(length(q))Đầu ra:
[1] 2
[1] 3Các toán tử cũng là generic. Một phương thức có tên "+.money", được viết trong dấu ngoặc kép vì tên có ký hiệu, sẽ chạy khi một trong hai vế của + là một đối tượng money. Phương thức nhận hai vế dưới dạng e1 và e2:
new_money <- function(amount) structure(list(amount = amount), class = "money")
"+.money" <- function(e1, e2) new_money(e1$amount + e2$amount)
"==.money" <- function(e1, e2) e1$amount == e2$amount
a <- new_money(5)
b <- new_money(7)
print((a + b)$amount)
print(a == b)Đầu ra:
[1] 12
[1] FALSEThử thách
DễMột ngăn xếp lưu các phần tử trong trường items, với phần tử trên cùng nằm cuối cùng. Các hàm new_stack(), push() và pop() trong Stack.R đã có sẵn. Hãy thêm ba phương thức:
length.stack()trả về số phần tử.toString.stack()trả về các phần tử từ trên cùng xuống dưới cùng, được nối bằng|, hoặcempty.summary.stack()trả vềstack of 3, top: c, hoặcstack of 0khi ngăn xếp rỗng.
Code được cung cấp đọc các lệnh push <item> và pop, sau đó in ra độ dài, toString() và summary().
Đặt code của bạn trong Stack.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("Stack.R")
# Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
s <- new_stack()
for (cmd in input) {
if (cmd == "pop") s <- pop(s) else s <- push(s, substring(cmd, 6))
}
cat("length: ", length(s), "\n", sep = "")
cat("items: ", toString(s), "\n", sep = "")
cat(summary(s), "\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