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 等)。
多态性由两个词组成——poly 和morphism,其中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 等类。我们相信本教程一定提高了您在数据科学领域的知识。