簡介 前幾天搗鼓了一下Ubuntu,正是想用一下我舊電腦上的N卡,可以用GPU來跑代碼,體驗一下多核的快樂。 還好我這破電腦也是支持Cuda的: $ sudo lshw -C display *-display description: 3D controller product: GK208M [ ...
轉載自:R語言教程
面向對象的編程側重於數據和對象,而不是程式。面向對象的模型有助於我們對現實生活中的對象進行建模。為了在數據科學領域出類拔萃,掌握面向對象的編程概念很重要。每個程式都有特殊類型的類。在本教程中,將重點討論R語言中的S3和S4類、泛型函數、類之間的繼承性和多態性。在本教程中,我們將討論R中面向對象的編程概念
R中的面向對象編程
面向對象編程是一種圍繞著類和對象而不是函數的編程模式。在R中,我們還可以創建兩種特殊類型的類,即S3和S4。OOPS的概念使我們能夠創建模塊化的作品,作為大型系統的構建塊。S3和S4是面向對象編程中的兩個重要類。S3類允許重載任何函數。S4類與S3略有不同,它包含用於定義方法和泛型的輔助函數。
R中的類和對象
類是一種用戶定義的數據類型,對象就是從這種類型中創建的。它們有時也被稱為藍圖。這是因為它們定義了對象的結構。一個類是一個被動的實體,而一個對象是一個主動的實體。
R認為所有事物都是對象。一個對象是一個類的單一實例。R為我們提供了一個class()函數,它既可以用來定義一個函數的類,也可以為一個已經定義的對象獲取類的信息。
R中的類是以矢量形式存在的。由於這個屬性,對象可以繼承許多類,而且我們還可以指定繼承的順序,即使是複雜的類。
示例
Names <-c("Bhuwanesh","Jai", "Piyush", "Anil", "Hitesh", "Naveen")
print(class(Names))
輸出
[1] "character"
由於該類元素屬於字元類,因此顯示了 “字元”。
示例
現在讓我們看看如何追加一個對象的類別–
Names <-c("Bhuwanesh", "Jai", "Piyush", "Anil", "Hitesh", "Naveen")
class(Names)<-append(class(Names), "boys")
print(class(Names))
輸出
[1] "character" "boys"
正如你在輸出中看到的,我們已經附加了向量的類別。
R中的類
S3 Class
S3類是R中最常用的類之一。這個類很容易實現,許多預定義的類都是這種類型。
一個S3類的對象是一個列表,該列表具有用一些名稱分配的類屬性。列表的組成部分由對象的成員變數表示。
創建S3類
我們可以通過以下步驟創建一個S3對象—-。
- 編製一份具有所需組件價值的清單。
-
然後,我們可以使用class()函數輕鬆地創建一個類,同時給這個類附加一個名字。
示例
# Creating list
myList <- list(Name ="Bhuwanesh", Enrollment_Number = 3496303119,
Course = "Btech", Branch = "Information Technology")
# class
class(myList) <- "University"
myList
輸出
$Name
[1] "Bhuwanesh"
$Enrollment_Number
[1] 3496303119
$Course
[1] "Btech"
$Branch
[1] "Information Technology"
attr(,"class")
[1] "University"
通用功能
我們在R中擁有通用函數,可以達到多態性的目的(就像許多其他哎呀語言:C++,Java等)。
多態性 是指形式。它指出,一條信息可以有一個以上的不同形式,或者它可以為不同的目的服務。
例如,在R語言中,summary()函數是一個由許多summary()函數組成的集合,可以用於不同的數據類型和數據結構。這類函數根據作為參數傳遞的對象的類型,調用一個適當的函數。我們可以使用methods()函數看到summary()函數的各種實現。
methods(summary)
我們可以在R中創建我們自己的通用函數。讓我們考慮以下程式,它創建了一個名為 “myList “的列表,然後從中創建一個類。
示例
現在我們使用summary()函數來顯示這個類的摘要 –
# Create a list
myList <- list(Name ="Bhuwanesh",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
# Define the class
class(myList) <- "University"
# Display the summary
print(summary(myList))
輸出
Length Class Mode
Name 1 -none- character
Enrollment_Number 1 -none- numeric
Course 1 -none- character
Branch 1 -none- character
屬性
屬性是與一個對象相關的額外信息,用於處理該對象。我們可以使用 attributes() 函數來獲取一個對象的屬性。
示例
# Create a list
myList <- list(Name ="Bhuwanesh",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
# Define a class
class(myList) <- "University"
# Display attributes
print(attributes(myList))
輸出
$names
[1] "Name" "Enrollment_Number" "Course"
[4] "Branch"
$class
[1] "University"
我們也可以在attr()函數的幫助下將我們自己的屬性應用到一個對象上,讓我們考慮下麵的例子來說明這個函數的工作原理
示例
# Create a list
myList <- list(Name ="Bhuwanesh",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
# Define class
class(myList) <-"University"
# Defining custom attributes
attr(myList,"Grade")<-c('A')
# Display attribute
print(attributes(myList))
輸出
$names
[1] "Name" "Enrollment_Number" "Course"
[4] "Branch"
$class
[1] "University"
$Grade
[1] "A"
S3類中的繼承性
繼承性 是面向對象編程語言的最重要支柱之一,它允許一個類繼承另一個類的屬性。這一特點帶來了代碼可重用性等好處。
S3類並不包含任何特定的定義模式。
示例
# Create a list
myList1 <- list(Name ="Bhuwanesh", Enrollment_Number = 3496303119,
Course = "Btech", Branch = "Information Technology")
# Define the class
class(myList1) <- "University"
# Create a list
myList2 <- list(College_Rank = 14, State = 'Uttarakhand')
# Define the inheritance relation
class(myList2) <- c("College", "University")
print(myList2)
輸出
$College_Rank
[1] 14
$State
[1] "Uttarakhand"
attr(,"class")
[1] "College" "University"
正如你在輸出中看到的,”學院 “類繼承了 “大學 “類。
現在讓我們嘗試使用基類 “大學 “的一個對象來訪問和修改基類 “大學 “的組件-
示例
# Create a list
myList1 <- list(Name ="Bhuwanesh", Enrollment_Number = 3496303119,
Course = "Btech", Branch = "Information Technology")
# Define a class
class(myList1) <- "University"
myList2 <- list(College_Rank = 14, State = 'Uttarakhand')
class(myList2) <- c("College", "University")
# Define the attribute
myList2$Name = "Harshit"
print(myList2)
輸出
$College_Rank
[1] 14
$State
[1] "Uttarakhand"
$Name
[1] "Harshit"
attr(,"class")
[1] "College" "University"
你可以在輸出中看到,”姓名 “屬性已被修改為 “Harshit”。
S4 Class
R允許我們使用另一種特殊的類,稱為 “S4 “類。這個類包含預定義的定義。這個類包含定義方法和泛型的函數。這個類還為我們提供了定義泛型和方法的輔助函數。
setClass()函數創建了一個S4類。R為我們提供了new()函數,用來創建一個S4類的對象—-。
示例
# Define a list
myList1 <- list(Name ="Bhuwanesh",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
# Set the class
setClass("University", slots = list(Name ="character",
Enrollment_Number = "numeric",
Course = "character",
Branch = "character"))
# Define the object
myObject <- new("University",
Name = "Bhuwanesh Nainwal",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
print(myObject)
輸出
An object of class "University"
Slot "Name":
[1] "Bhuwanesh Nainwal"
Slot "Enrollment_Number":
[1] 3496303119
Slot "Course":
[1] "Btech"
Slot "Branch":
[1] "Information Technology"
S4類中的繼承性
繼承是面向對象編程語言的最重要支柱之一,它允許一個類繼承另一個類的屬性。這一特性帶來了代碼可重用性等好處。
S4類包含了一個適當的模式來定義它。派生類有足夠的能力來繼承基類的屬性和方法。為了達到這個目的,我們可以
示例
# Set class
setClass("University",
slots = list(Name = "character",
Enrollment_Number = "numeric",
Branch = "character")
)
# Set methods
setMethod("show", "University",
function(object){
cat(object@Name, "
")
cat(object@Enrollment_Number, "
")
cat(object@Branch, "
")
}
)
# Inherit
setClass("College",
slots = list(Grade= "character"),
contains = "University"
)
# Define the object
object <- new("College", Name = "Bhuwanesh Nainwal",
Branch="Information Technology",
Enrollment_Number = 3496303119)
# Display the object
show(object)
輸出
Bhuwanesh Nainwal
3496303119
Information Technology
結論
在這篇文章中,我們討論了與R相關的面向對象的編程概念,並對S3和S4等類進行了詳細的討論。我們相信,這個教程肯定會增強你在數據科學領域的知識。