📜  R 编程中的 R6 类

📅  最后修改于: 2022-05-13 01:54:41.844000             🧑  作者: Mango

R 编程中的 R6 类

在 R 语言的面向对象编程 (OOP) 中,封装意味着将数据和方法绑定在一个类中。 R6包是一个封装的OOP系统,帮助我们在R中使用封装。R6包提供R6类,它类似于R中的引用类,但独立于S4类。除了私有成员和公共成员之外,R6 类也支持继承,即使这些类是在不同的包中定义的。一些使用 R6 类的流行 R 包是dplyrshiny

例子:

library(R6)
  
Queue <- R6Class("Queue",
  
# public members of the class
# that can be accessed by object
public  =  list(
      
# constructor/initializer  
initialize = function(...)
{
    private$elements = list(...)
},
  
# add to the queue
enqueue = function(num) 
{
    private$elements <- append(private$elements, num)
},
  
# remove from the queue
dequeue = function()
{
    if(self$size() == 0)
    stop("Queue is empty")
    element <- private$elements[[1]]
    private$elements <- private$elements[-1]
    element
},
  
# get the size of elements
size = function()
{
    length(private$elements)
}),
  
private = list(
      
  # queue list
  elements = list())
)
  
# create an object
QueueObject = Queue$new()
  
# add 2
QueueObject$enqueue(2)
  
# add 5
QueueObject$enqueue(5)
  
# remove 2
QueueObject$dequeue()
  
# remove 5
QueueObject$dequeue()

输出:

[1] 2
[1] 5

公共和私人成员都可以使用。队列( elements )是私有的,因此对象不能在外部修改它。初始化函数是初始化对象的构造函数。 object$member用于访问类外部的公共成员,而private$member用于访问类方法内部的私有成员。 self指的是调用该方法的对象。

以下示例是通过创建另一个继承类 Queue 的类 childQueue 来演示 R6 类中的继承。

例子:

childQueue <- R6Class("childQueue",
  
# inherit Queue class which is the super class
inherit = Queue,
public = list(
initialize = function(...)
{
    private$elements <- list(...)
},
size = function()
{
    # super is used to access methods from super class
    super$size()
}
))
  
childQueueObject <- childQueue$new()
childQueueObject$enqueue(2)
childQueueObject$enqueue(3)
childQueueObject$dequeue()
childQueueObject$dequeue()

输出:

[1] 2
[1] 3

childQueue 类可以使用 Queue 超类中的enqueue()dequeue()函数。 size 方法覆盖超类 Queue 的 size size() ) ,但在内部使用super调用 Queue 的size() 。这些类可以跨包继承。