Danh sách với một lớp
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 2 trên 57.
S3 là hệ thống đối tượng lâu đời nhất và được dùng nhiều nhất của R. Đối tượng S3 là một danh sách thông thường có thuộc tính class, một nhãn cho biết đó là loại đối tượng nào. class(x) <- "dog" đặt nhãn:
rex <- list(name = "Rex", age = 3)
class(rex) <- "dog"
print(class(rex))
cat(rex$name, "is", rex$age)Đầu ra:
[1] "dog"
Rex is 3structure() tạo giá trị và thiết lập các thuộc tính trong một lần gọi, đây là cách thông thường để tạo đối tượng S3. Bạn đọc các trường bằng $ như với mọi danh sách:
rex <- structure(list(name = "Rex", age = 3), class = "dog")
print(class(rex))
print(is.list(rex))
print(rex$age)Đầu ra:
[1] "dog"
[1] TRUE
[1] 3Lớp chỉ là một nhãn: R không kiểm tra một đối tượng có những trường nào, vì vậy bất kỳ danh sách nào cũng có thể được gọi là dog. unclass() xóa nhãn và trả lại danh sách thuần:
p <- structure(list(x = 1, y = 2), class = "point")
print(unclass(p))Đầu ra:
$x
[1] 1
$y
[1] 2Đối tượng S3 là các giá trị. Hàm (function) thay đổi một đối tượng sẽ làm thay đổi bản sao của chính nó, vì vậy hàm trả về phiên bản mới và bên gọi gán giá trị đó. Bản gốc vẫn giữ nguyên:
birthday <- function(d) {
d$age <- d$age + 1
d
}
rex <- structure(list(name = "Rex", age = 3), class = "dog")
older <- birthday(rex)
cat(rex$age, older$age)Đầu ra:
3 4Thử thách
DễHoàn thiện make_pet(name, species, age) trong Pet.R. Hàm (function) này trả về một danh sách có các trường name, species và age, theo thứ tự đó, cùng lớp pet. Sau đó, hoàn thiện describe_pet(p), hàm này trả về một câu: thú cưng tên Rex, loài dog, tuổi 3 sẽ cho kết quả Rex is a 3 year old dog.
Code được cung cấp đọc tên, loài và tuổi, tạo thú cưng rồi in lớp của nó, tên các trường và câu mô tả.
Viết code của bạn trong Pet.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("Pet.R")
# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
p <- make_pet(input[1], input[2], as.numeric(input[3]))
cat("class: ", class(p), "\n", sep = "")
cat("fields: ", paste(names(p), collapse = ", "), "\n", sep = "")
cat(describe_pet(p), "\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