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