R6编程中的类

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(...)
{
    privateelements = list(...)
},
  
# add to the queue
enqueue = function(num) 
{
    privateelements <- append(privateelements, num)
},
  
# remove from the queue
dequeue = function()
{
    if(selfsize() == 0)
    stop("Queue is empty")
    element <- privateelements[[1]]
    privateelements <- privateelements[-1]
    element
},
  
# get the size of elements
size = function()
{
    length(privateelements)
}),
  
private = list(
      
  # queue list
  elements = list())
)
  
# create an object
QueueObject = Queuenew()
  
# add 2
QueueObjectenqueue(2)
  
# add 5
QueueObjectenqueue(5)
  
# remove 2
QueueObjectdequeue()
  
# remove 5
QueueObject$dequeue()

输出

[1] 2
[1] 5

公有和私有成员都可以被使用。队列(元素)是私有的,这样对象就不能在外部修改它。initialize函数是初始化对象的构造函数。 object$member 用于访问类外的公共成员,而 private$member 用于访问类方法内的私有成员。

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

例子

childQueue <- R6Class("childQueue",
  
# inherit Queue class which is the super class
inherit = Queue,
public = list(
initialize = function(...)
{
    privateelements <- list(...)
},
size = function()
{
    # super is used to access methods from super class
    supersize()
}
))
  
childQueueObject <- childQueuenew()
childQueueObjectenqueue(2)
childQueueObjectenqueue(3)
childQueueObjectdequeue()
childQueueObject$dequeue()

输出

[1] 2
[1] 3

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程