📜  R 编程中的 R6 类(1)

📅  最后修改于: 2023-12-03 15:34:35.996000             🧑  作者: Mango

R6 类介绍

在 R 编程中,R6 类是一种面向对象编程的方法,它提供了一种更加现代、灵活且易于使用的对象模型。

什么是 R6 类?

R6 类是一种用于在 R 语言中实现面向对象编程的方法。它与传统的 S3 和 S4 类型不同,具有更加现代的语法和更加灵活的对象模型。相较于 S3 和 S4 类,R6 类不需要使用特定的函数 create object,而是提供了更加灵活、易于扩展的方法和属性。

与 S3 类型不同的是,R6 类有一个明确的构造函数,可以修改对象的属性,并且支持继承和多态性。它还提供了一些内置方法,例如通过 print() 来打印对象的属性,以及通过 clone() 来复制对象。

如何创建 R6 类?

创建一个 R6 类很简单,只需要使用 R6 包中的 R6Class() 函数即可:

library(R6)

Person <- R6Class("Person",
        public = list(
          name = NA_character_,
          age = NA_real_,

          initialize = function(name, age) {
            self$name <- name
            self$age <- age
          },
          
          get_age = function() {
            self$age
          }
        )
      )

bob <- Person$new("Bob", 32)

这个例子创建了一个名为 Person 的 R6 类,包含两个属性:nameage,以及一个名为 initialize() 的构造函数,它会在创建对象时自动调用,并传递 nameage 作为参数。

之后,我们创建了 bob 这个对象,它继承自 Person 类,并调用了 initialize() 构造函数。

通过 bob$get_age(),我们可以获取 bob 的年龄属性。

如何修改 R6 类属性?

我们可以通过 self$属性名 <- 新值 的方式,来修改 R6 类的属性:

bob$age <- 33

这样,我们就成功将 bob 的年龄修改为了 33 岁。

同时,R6 类中还有一个特殊的属性 private,它用来限制对象中哪些属性和方法是私有的,只能在对象内部访问和修改。例如:

Person <- R6Class("Person",
        public = list(
          name = NA_character_,
          age = NA_real_,

          initialize = function(name, age) {
            self$name <- name
            self$age <- age
          },
          
          get_age = function() {
            self$age
          }
        ),
        private = list(
          _secret = 12345
        )
      )

bob <- Person$new("Bob", 32)
bob$_secret # Error: object '_secret' not found

通过 _secret 属性,我们将其限定为了私有属性,并不能直接访问。

如何拓展 R6 类?

我们可以通过继承 R6 类的方式,来创建一个新的 R6 类,并扩展其属性和方法。

PersonWithName <- R6Class("PersonWithName",
        inherit = Person,
        public = list(
          set_name = function(name) {
            self$name <- name
          }
        )
      )

alice <- PersonWithName$new("Alice", 28)

这样,我们就继承了 Person 类,并添加了一个新的 set_name() 方法。

R6 类 VS S3 类型

与传统的 S3 类型不同,R6 类包含了更加现代、灵活、易于理解的对象模型和语法,支持继承和多态性。相比于 S3,R6 类更符合当前人们的开发思维和实际需求,更加易于使用和扩展。

在实际场景中,使用 R6 类可以更好地管理和组织代码,提高程序的可重用性和可扩展性。

R6 类 VS S4 类型

与 S4 类型相比,R6 类更加易于使用和开发。S4 类型需要使用一种较为繁琐的语法来定义类的属性和方法,而且没有内置的构造函数和其他方法。

相比之下,R6 类提供了更加直观的语法和对象模型,并且具有内置属性和方法,开发者可以更加方便地编写和测试代码。

总结

在 R 编程中,R6 类是一种现代、灵活的面向对象编程方法,支持继承和多态性,并提供了更加易于扩展、可重用的对象模型和语法。使用 R6 类,可以在具有更高效的代码控制和更好的可重用性和扩展性的同时,提高代码的可读性和易于调试性。

通过 R6Class() 函数和 publicprivate 属性,我们可以创建一个新的 R6 类,并定义它的属性和方法。通过继承和多态性,我们可以创建一个新的类,并扩展其功能。