R语言面向对象编程
R6简介
R6是一个单独的R包,与我们熟悉的原生的面向对象系统类型S3,S4和RC类型不一样。在R语言的面向对象系统中,R6类型与RC类型是比较相似的,但R6并不基于S4的对象系统,因此我们在用R6类型开发R包的时候,不用依赖于methods包,而用RC类型开发R包的时候则必须设置methods包的依赖。
R6类型比RC类型更符合其他编程对于面向对象的设置,支持类的公有成员和私有成员,支持函数的主动绑定,并支持跨包的继承关系。由于RC类型的面向对象系统设计并不彻底,所以才会有R6这样的包出现。
library(R6)
function (classname = NULL, public = list(), private = NULL, active = NULL, inherit = NULL, lock_objects = TRUE, class = TRUE, portable = TRUE, lock_class = FALSE, cloneable = TRUE, parent_env = parent.frame(), lock)
- classname定义类名(字符串)
- public定义公有成员,包括公有方法和属性(一个列表,一般首先要初始化,用到initialize类似于python中的__init__,可以认为initialize中有几个变量,我们在实例化对象的时候就需要给他传递几个参数。)
- private定义私有成员,包括私有方法和属性。(所谓公有和私有成员,主要区别在于调用的方法上面,公有成员谁都可以调用,私有成员的调用有一定的规则。)
- active主动绑定的函数列表。
- inherit定义父类,继承关系。
- lock是否上锁,如果上锁则用于类变量存储的环境空间被锁定,不能修改。
- class是否把属性封装成对象,默认是封装,如果选择不封装,类中属性存在一个环境空间中。
- portable是否为可移植类型,默认为可移植类型,类中成员访问需要用调用selt和private对象。
- parent_env定义对象的父环境空间。
创建R6类和实例化对象
- 定义一个Person类
Person <- R6Class("Person", # 定义一个R6类
public=list(
hello = function(){ # 定义公有方法hello
print(paste0("Hello"," world!"))
}
)
)
- 查看Person的定义
Person
## <Person> object generator
## Public:
## hello: function ()
## clone: function (deep = FALSE)