跳到主要内容

R对象与类

提示
  1. R语言的类系统:R语言具有三种不同的类系统:S3类、S4类和引用类,各自有不同的特点和用法。
  2. 创建和使用类:在R中,S3类通过列表和class()函数创建,S4类通过setClass()定义,引用类则使用setRefClass()。对象的创建分别使用不同的方法,如S4类使用new()函数。
  3. 类和对象的区别:类是对象的蓝图,定义了对象的结构和行为。对象是类的实例,包含具体的数据和方法。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 的类,它有三个插槽(成员变量):nameageGPA

现在要创建一个对象,我们使用 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() 创建对象使用生成器函数创建对象
使用 $ 访问属性使用 @ 访问属性使用 $ 访问属性
方法属于泛型函数方法属于泛型函数方法属于类
遵循修改时复制语义遵循修改时复制语义不遵循修改时复制语义