R对象与类
- R语言的类系统:R语言具有三种不同的类系统:S3类、S4类和引用类,各自有不同的特点和用法。
- 创建和使用类:在R中,S3类通过列表和
class()
函数创建,S4类通过setClass()
定义,引用类则使用setRefClass()
。对象的创建分别使用不同的方法,如S4类使用new()
函数。 - 类和对象的区别:类是对象的蓝图,定义了对象的结构和行为。对象是类的实例,包含具体的数据和方法。S3类较为灵活但缺乏正式定义,S4类有明确结构,而引用类更类似于其他主流编程语言中的面向对象编程。
R 是一种使用对象和类概念的功能性语言。
对象简单来说就是数据(变量)和方法(函数)的集合。同样,类是该对象的蓝图。
让我们举一个现实生活中的例子,
我们可以将类想象为房屋的草图(原型)。它包含了关于楼层、门、窗等所有细节的信息。基于这些描述,我们建造房屋。房屋就是对象。
R 中的类系统
虽然大多数编程语言都有单一的类系统,但 R 有三种类系统:
R 中的 S3 类
S3 类是 R 编程语言中最流行的类。R 中预定义的大多数类都属于这种类型。
首先,我们创建一个包含各种组件的列表,然后我们使用 class()
函数创建一个类。例如,
# 创建一个包含所需组件的列表
student1 <- list(name = "John", age = 21, GPA = 3.5)
# 适当命名类
class(student1) <- "Student_Info"
# 创建并调用对象
student1
输出
$name
[1] "John"
$age
[1] 21
$GPA
[1] 3.5
attr(,"class")
[1] "student"
在上面的示例中,我们创建了一个名为 student1
的列表,它包含三个组件。注意类的创建,
class(student1) <- "Student_Info"
这里,Student_Info
是类的名称。为了创建这个类的对象,我们将 student1
列表传递给了 class()
。
最后,我们创建了 Student_Info
类的一个对象,并称之为 student1
。
要了解有关 S3 类的更多详细信息,请访问 R S3 类。
R 中的 S4 类
S4 类是 S3 类的改进版。它们有一个正式定义的结构,有助于使同一类的对象看起来或多或少相似。
在 R 中,我们使用 setClass()
函数来定义类。例如,
setClass("Student_Info", slots=list(name="character", age="numeric", GPA="numeric"))
这里,我们创建了一个名为 Student_Info
的类,它有三个插槽(成员变量):name
、age
和 GPA
。
现在要创建一个对象,我们使用 new()
函数。例如,
student1 <- new("Student_Info", name = "John", age = 21, GPA = 3.5)
在这里,new()
函数中,我们提供了类 "Student_Info"
的名称和所有三个槽的值。
我们已经成功创建了名为 student1
的对象。
示例:R 中的 S4 类
# 创建一个带有三个成员变量的类 "Student_Info"
setClass("Student_Info", slots=list(name="character", age="numeric", GPA="numeric"))
# 创建一个类的对象
student1 <- new("Student_Info", name = "John", age = 21, GPA = 3.5)
# 调用 student1 对象
student1
输出
一个 "Student_Info" 类的对象
槽 "name":
[1] "John"
槽 "age":
[1] 21
槽 "GPA":
[1] 3.5
在这里,我们使用 setClass()
函数创建了一个名为 Student_Info
的 S4 类,以及使用 new()
函数创建了一个名为 student1
的对象。
要了解更多关于 S4 类的详细信息,请访问 R S4 类。
R 中的引用类
与其他两种相比,引用类是后来引入的。它与我们在其他主要编程语言中习惯看到的面向对象编程更为相似。
定义引用类与定义 S4 类类似。我们使用 setRefClass()
函数而不是 setClass()
。例如,
# 创建一个带有三个成员变量的类 "Student_Info"
Student_Info <- setRefClass("Student_Info",
fields = list(name = "character", age = "numeric", GPA = "numeric"))
# Student_Info() 是我们的生成器函数,可用于创建新对象
student1 <- Student_Info(name = "John", age = 21, GPA = 3.5)
# 调用 student1 对象
student1
输出
"Student_Info" 类的引 用类对象
字段 "name":
[1] "John"
字段 "age":
[1] 21
字段 "GPA":
[1] 3.5
在上面的示例中,我们使用 setRefClass()
函数创建了一个名为 Student_Info
的引用类。
我们使用我们的生成器函数 Student_Info()
来创建一个新的对象 student1
。
S3 与 S4 与引用类的比较
S3 类 | S4 类 | 引用类 |
---|---|---|
缺乏正式定义 | 使用 setClass() 定义的类 | 使用 setRefClass() 定义的类 |
通过设置类属性创建对象 | 使用 new() 创建对象 | 使用生成器函数创建对象 |
使用 $ 访问属性 | 使用 @ 访问属性 | 使用 $ 访问属性 |
方法属于泛型函数 | 方法属于泛型函数 | 方法属于类 |
遵循修改时复制语义 | 遵循修改时复制语义 | 不遵循修改时复制语义 |