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"

由於類元素屬於字元類,因此顯示了“character”。

示例

現在讓我們看看如何追加物件的類:

Names <-c("Bhuwanesh", "Jai", "Piyush", "Anil", "Hitesh", "Naveen")
class(Names)<-append(class(Names), "boys")
print(class(Names))

輸出

[1] "character" "boys"     

如您在輸出中看到的,我們已追加了向量的類。

R 中的類

S3 類

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 等)。

多型性由兩個片語成——polymorphism,其中poly 表示許多,morphism 表示形式。它指出單個訊息可以有多種不同的形式,或者可以服務於不同的目的。

例如,在 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"

如您在輸出中看到的,類“College”繼承了類“University”。

示例

現在讓我們嘗試使用基類“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"

您可以在輸出中看到,“Name”屬性已修改為“Harshit”。

S4 類

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 等類。我們相信本教程一定提高了您在資料科學領域的知識。

更新於:2023年1月17日

2K+ 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告