R 中的面向对象编程是什么?17 Mar 2025 | 6 分钟阅读 面向对象编程 (OOP) 是最流行的编程语言。 借助 OOP 概念,我们可以构建模块化的代码片段,用于构建大型系统的块。 R 是一种函数式语言,我们可以使用 OOP 风格进行编程。 在 R 中,OOP 是管理大型程序复杂性的绝佳工具。 ![]() 在面向对象编程中,S3 和 S4 是两个重要的系统。 S3 在 OOP 中,S3 用于重载任何函数。 这样我们就可以用不同的名称调用函数,这取决于输入参数的类型或参数的数量。 S4 S4 是 OOP 最重要的特征。 但是,这是一个限制,因为它很难调试。 S4 有一个可选的引用类。 R 中的对象和类在 R 中,一切都是对象。 因此,程序员在 R 中编写代码时会执行 OOPS 概念。 对象是一种数据结构,它具有一些可以对其属性进行操作的方法。 在 R 中,类是对象的轮廓或设计。 类封装了数据成员以及函数。 在 R 中,有两个最重要的类,即 S3 和 S4,它们在执行 OOP 概念中起着重要的作用。 让我们逐一讨论这两个类,并提供示例,以便更好地理解。 1) S3 类借助 S3 类,我们可以利用实现通用函数 OO 的能力。 此外,仅使用第一个参数,S3 就可以进行调度。 S3 与传统的编程语言(例如 Java、C++ 和 C#)不同,后者实现了 OO 传递消息。 这使得 S3 易于实现。 在 S3 类中,通用函数调用该方法。 S3 非常随意,没有类的正式定义。 S3 只需要程序员很少的知识。 创建 S3 类在 R 中,我们定义一个函数,该函数将创建一个类并返回所创建类的对象。 创建一个包含相关成员的列表,确定该列表的类,然后返回该列表的副本。 以下是创建类的语法 示例 输出 ![]() 以下是我们定义通用函数打印的方式。 当我们执行或运行上面的代码时,它将给我们以下输出 ![]() 像 print 函数一样,我们将创建一个通用函数 GPA,以将新值分配给我们的 GPA 成员。 按照以下方式,我们将创建通用函数 GPA 创建通用函数 GPA 后,我们将为其实现默认函数 之后,我们将以下列方式为我们的 GPA 函数创建一个新方法 最后我们将运行 GPA 方法,如下所示 输出 ![]() S3 中的继承继承意味着将一个类的特征提取到另一个类中。 在 R 的 S3 类中,通过在向量中应用 class 属性来实现继承。 对于继承,我们首先创建一个函数,该函数以下列方式创建 faculty 类的新对象 之后,我们将为通用函数 print() 定义一个方法,如下所示 现在,我们将创建一个 InternationalFaculty 类的对象,该对象将从 faculty 类继承。 此过程将通过分配类名的字符向量来完成,如下所示 所以, 当我们运行我们讨论过的上述代码时,它将生成以下输出 ![]() 我们可以在上面看到,我们没有定义任何形式为 print 的方法。 InternationalFaculty (),该方法调用 print.Faculty()。 Faculty 类的此方法被继承。 因此,我们的下一步是以以下方式定义 print.InternationalFaculty() 上面的函数将覆盖为 faculty 类定义的方法,如下所示 ![]() getS3method 和 getAnywhere 函数R 中有两种最常见和最流行的 S3 方法函数。第一种方法是 getS3method(),第二种方法是 getAnywhere()。 S3 查找与类关联的适当方法,并且查看方法的实现方式很有用。 有时,这些方法是不可见的,因为它们隐藏在命名空间中。 我们使用 getS3method 或 getAnywhere 来解决此问题。 getS3method ![]() getAnywhere 函数 2) S4 类S4 类与 S3 相似,但比后者更正式。 它在两个不同的方面与 S3 不同。 首先,在 S4 中,有正式的类定义,这些定义提供了类的描述和表示。 此外,它还具有用于定义方法和泛型的特殊辅助函数。 S4 还提供多个调度。 这意味着通用函数能够根据基于类的多个参数来采用方法。 创建 S4 类在 R 中,我们使用 setClass() 命令来创建 S4 类。 在 S4 类中,我们将指定一个函数来验证数据一致性,并指定默认值。 在 R 中,成员变量称为槽。 要创建 S3 类,我们必须定义该类及其槽。 以下是创建 S4 类的步骤 步骤 1 在第一步中,我们将创建一个名为 faculty 的新类,其中包含三个槽:name、age 和 GPA。 setClass() 函数还有许多其他可选参数,我们可以使用 ?setClass 命令来探索它们。 ![]() 步骤 2 在下一步中,我们将创建 S4 类的对象。 R 提供了 new() 函数来创建 S4 类的对象。 在此新函数中,我们按照以下方式传递类名和槽的值 它将生成以下输出 ![]() 使用生成器函数创建 S4 对象setClass() 函数返回一个生成器函数。 此生成器函数有助于创建新对象。 它充当构造函数。 它将生成以下输出 ![]() 现在我们可以使用上面的构造函数函数来创建新对象。 构造函数反过来使用 new() 函数来创建对象。 这只是一个包装。 让我们看一个示例,以了解如何在生成器函数的帮助下创建 S4 对象。 示例 输出 ![]() S4 类中的继承与 S3 类一样,我们也可以在 S4 类中执行继承。 派生类将继承父类的属性和方法。 让我们开始了解如何在 S4 类中执行继承。 以下是在 S4 类中执行继承的方法 步骤 1 在第一步中,我们将使用适当的槽创建或定义类,如下所示 步骤 2 定义类后,我们的下一步是为 display() 通用函数定义类方法。 这将以下列方式完成 步骤 3 在下一步中,我们将使用参数 contains 定义派生类。 派生类的定义如下 在我们的派生类中,我们仅定义了一个属性,即 country。 其他属性将从其父类继承。 ![]() 当我们执行 show(s) 时,将调用为 faculty 类定义的方法。 我们可以像在 S3 系统的情况下那样,也为基类的派生类定义方法。 下一个主题R 调试 |
我们请求您订阅我们的新闻通讯以获取最新更新。