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+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告