Trong hướng dẫn R này, chúng ta sẽ thảo luận về một trong những khái niệm quan trọng nhất tức là Lập trình hướng đối tượng trong R. Chúng ta sẽ thảo luận về khái niệm đối tượng và class trong ngôn ngữ R, quá trình tạo các class S3 và S4, kế thừa trong các class này và các phương thức của nó trong ngôn ngữ lập trình R.
Các bài viết liên quan:
Lập trình hướng đối tượng trong R là gì?
Lập trình hướng đối tượng (OOP) là một ngôn ngữ lập trình phổ biến. Sử dụng các khái niệm của nó, chúng ta có thể xây dựng các đoạn mã mô-đun có thể được sử dụng để xây dựng các khối cho các hệ thống lớn. R là một ngôn ngữ chức năng. Hỗ trợ cũng tồn tại để lập trình theo kiểu OOP. Lập trình hướng đối tượng trong R là một công cụ tuyệt vời để quản lý độ phức tạp trong các chương trình lớn hơn. Nó đặc biệt thích hợp cho phát triển GUI.
S3 và S4 là hai hệ thống quan trọng trong Lập trình hướng đối tượng:
- S3 được sử dụng để quá tải bất kỳ chức năng nào. Do đó, chúng ta có thể gọi các tên khác nhau của hàm. Và, nó phụ thuộc vào loại tham số đầu vào hoặc số lượng tham số.
- Một đặc tính quan trọng của OOP là S4. Tuy nhiên, nó đặt ra một hạn chế là gỡ lỗi khá phức tạp. Thay thế cho S4 là class tham chiếu.
Đối tượng và class trong R là gì?
- Người lập trình có thể thực hiện lập trình OOP trong R. Tức là mọi thứ trong R đều là một đối tượng.
- Một đối tượng là một cấu trúc dữ liệu. Nó có một số phương thức có thể hoạt động dựa trên các thuộc tính của nó.
- Các class được sử dụng như một phác thảo hoặc thiết kế cho đối tượng. Nó đóng gói các thành viên dữ liệu cùng với các chức năng.
Xem thêm OOP trong C++
Các class trong R
class S3
Với sự trợ giúp của class S3, bạn có thể tận dụng khả năng của nó để triển khai chức năng chung OO. Ngoài ra, chỉ sử dụng đối số đầu tiên, S3 có thể gửi. S3 khác với các ngôn ngữ lập trình thông thường như Java, C ++ và C # thực hiện thông báo truyền OO. Điều này làm cho S3 dễ thực hiện hơn. Trong class S3, hàm chung thực hiện lệnh gọi phương thức. S3 rất bình thường và không có bất kỳ định nghĩa chính thức nào về các lớp.
S3 yêu cầu rất ít kiến thức từ phía lập trình viên.
class S4
S4 Class là một chút tương tự như S3 nhưng nó trang trọng hơn so với sau này. Nó khác với S3 theo hai cách khác nhau. Thứ nhất, trong S4, có các định nghĩa class chính thức cung cấp mô tả và đại diện cho các lớp. Hơn nữa, nó có các chức năng trợ giúp đặc biệt để xác định các phương pháp và generic. S4 cũng tạo điều kiện cho nhiều công văn. Điều này có nghĩa là các hàm chung có thể chọn các phương thức dựa trên class bao gồm nhiều đối số.
Hãy hiểu các class R này với sự trợ giúp của các ví dụ.
Tạo class S3
Chúng tôi sẽ chỉ ra cách định nghĩa một hàm sẽ tạo và trả về một đối tượng của một class nhất định. Một danh sách được tạo với các thành viên có liên quan, class của danh sách được thiết lập và một bản sao của danh sách đang được trả về.
Xây dựng class S3 mới
s <- list(name = "websitehcm", age = 29, GPA = 4.0) class(s) <- "student" s
Bây giờ chúng ta hãy xác định hàm in chung của chúng ta.
print function (x, ...) UseMethod("print")
Đầu ra:
Bây giờ, chúng ta sẽ tạo một hàm chung – GPA
GPA <- function(obj) { UseMethod("GPA") }
Bây giờ chúng ta hãy triển khai một phương thức mặc định cho hàm GPA của chúng ta –
GPA.default <- function(obj) { cat("This is a generic function\n") }
Bây giờ, chúng tôi sẽ tạo một phương pháp mới cho class học “sinh viên”
GPA.student <- function(obj) { cat("Total GPA is", obj$GPA, "\n") }
Bây giờ, chúng ta hãy chạy phương pháp này.
Điểm trung bình
Đầu ra:
Xem thêm hướng đối tượng trong java
Kế thừa trong S3
Trong S3, kế thừa đạt được bằng cách áp dụng thuộc tính class trong một vectơ.
Ví dụ:
> fit <- glm(rpois(100, lambda = 1) ~ + 1, family = "poisson") > class(fit) > methods("residuals") > methods("model.matrix")[/php]
Đầu ra:
Nếu không tìm thấy phương thức nào cho class đầu tiên, class thứ hai sẽ được kiểm tra.
Các chức năng hữu ích của phương pháp S3
- getS3method (“print”, “person”)
- getAnywhere
S3 nhận phương thức thích hợp được liên kết với một class và rất hữu ích khi xem cách một phương thức được triển khai.
Đôi khi, các phương thức không hiển thị, vì chúng bị ẩn trong một không gian tên. Chúng tôi sử dụng getS3method hoặc getAnywhere để giải quyết vấn đề này.
require(stats) exists("predict.ppr") # False getS3method("predict", "ppr")
Đầu ra:
getAnywhere("simpleloess")
class S4
Tạo một class S4
Chúng ta sử dụng lệnh setClass () để tạo class S4. Chúng tôi chỉ định một chức năng để xác minh rằng dữ liệu là nhất quán (xác thực) và cũng chỉ định các giá trị mặc định (nguyên mẫu).
Xem thêm Class trong Python – OOP trong python
Xây dựng một class S4 mới
Chúng ta phải xác định class và các vị trí của nó, và mã để xác định class như sau:
Agent <- setClass( # tên của class "Agent", # định nghĩa slot slots = c( location = "numeric", velocity = "numeric", active = "logical" ), # định nghĩa giá trị mặc định prototype=list( location = c(0.0,0.0), active = TRUE, velocity = c(0.0,0.0) ), # giá trị consistent. # hàm được gọi khi khởi tạo! validity=function(object) { if(sum(object@velocity^2)>100.0) { return("The velocity level is out of bounds.") } return(TRUE) } )
Đầu ra:
Chúng ta có thể tạo một đối tượng có class là Tác nhân, vì mã để định nghĩa class như sau:
a <- Agent() > a
Đầu ra:
Chúng ta có thể có được thông tin chi tiết về các phần tử bằng lệnh SlotNames như sau:
is.object(a) > isS4(a) > slotNames(a) > slotNames("Agent")
Đầu ra:
Có hai hàm is.object và lệnh isS4 .
- Chúng tôi sử dụng lệnh is.object để xác định xem một biến có tham chiếu đến một đối tượng hay không.
- Chúng tôi sử dụng lệnh isS4 để xác định xem một biến có phải là một đối tượng S4 hay không.
- Điều quan trọng của các lệnh là chỉ riêng lệnh isS4 không thể xác định rằng một biến là một đối tượng S3. Đầu tiên, chúng ta cần xác định xem biến có phải là một đối tượng hay không và sau đó quyết định xem nó có phải là S4 hay không.
Trong một đối tượng, chúng tôi sử dụng một tập hợp các lệnh để lấy thông tin về các phần tử dữ liệu hoặc các vị trí trong một đối tượng. Đầu tiên là lệnh slotNames có thể lấy một đối tượng hoặc tên của một lớp. Chúng tôi nhận được tên của các vị trí có liên quan đến class dưới dạng chuỗi.
> slotNames(a) > slotNames("Agent")
Đầu ra:
Lệnh getSlots và slotNames tương tự nhau vì chúng đều lấy tên của một class dưới dạng một chuỗi. Đổi lại, chúng tôi nhận được một vectơ có các mục nhập bao gồm các loại được liên kết với các vị trí. Tên của các mục nhập là tên của các vị trí.
> getSlots("Agent") location velocity active "numeric" "numeric" "logical" > s <- getSlots("Agent") > s[1] location "numeric" > s[[1]] > names(s)
Đầu ra:
Lệnh tiếp theo mà chúng ta sẽ kiểm tra là lệnh getClass . Nó có hai dạng. Nếu bạn gán class S4 như một biến, nó sẽ trả về một danh sách các vị trí cho class được liên kết với biến. Khác, nếu bạn gán một chuỗi ký tự với tên của một lớp, nó sẽ cung cấp các vị trí và kiểu dữ liệu của chúng.
> getClass(a) An object of class "Agent" Slot "location": Slot "velocity": Slot "active": > getClass("Agent") Class "Agent" [in ".GlobalEnv"] Slots: Name: location velocity active Class: numeric numeric logical
Đầu ra:
Lệnh cuối cùng để kiểm tra là lệnh slot . Trong một đối tượng để thiết lập giá trị của slot, chúng ta có thể sử dụng lệnh slot. Toán tử “@” được sử dụng ở vị trí của lệnh slot.
slot(a,"location") > slot(a,"location") <- c(1,5) > a
Đầu ra:
Kết luận về đối tượng trong R
class và đối tượng là những khái niệm quan trọng nhất của ngôn ngữ lập trình hướng đối tượng (OOP). Chúng tôi đã cố gắng mô tả rất chi tiết về Lập trình hướng đối tượng trong R.
Nếu trong trường hợp bạn có bất kỳ câu hỏi nào, đừng ngại chia sẻ với chúng tôi. Chúng tôi sẽ rất vui khi giải quyết các thắc mắc của bạn.
Xem thêm OOP trong php là gì ?