library(sloop)
otype(1:10)
#> [1] "base"
otype(mtcars)
#> [1] "S3"
<- stats4::mle(function(x = 1) (x - 2)^2)
mle_obj otype(mle_obj)
#> [1] "S4"
R 中的面向对象(1)
面向对象
概述
成为面对对象的五个条件
- 类
- 对象
- 继承
- 封装
- 多态
定义一个类,这个类有一些属性和方法,方法被封装为接口和实现;类可以实例化一个对象;类之间具有父子关系,子类可以继承父类的属性和方法;不同类的方法名是重复的,可以根据类选择对应的实现,这称之为多态。
为什么使用面向对象:
- 封装提供了标准的使用接口,能够降低系统的耦合度。
- 继承允许子类继承父类的特性,提高了代码的重用性。
- 多态允许相同函数对于不同的类有不同的行为,提高了代码的灵活性。
想象一下,当你想更新一个函数的使用方法,但是又得保持和以前的兼容性,你只需要再创建一个子类,然后重新实现父类的方法,就可以了。
R 中的面向对象
R 语言中存在多种面向对象的编程,包括封装类的如RC,R6;泛函类的如S3,S4等。
- 基于S3的面向对象编程基于泛型函数(generic function),
不基于类层级结构,没有类的继承,没有严格的层级结构式继承。 - 基于S4的面向对象编程,相对S3健全,
实现了类的继承,具有严格的层级结构式类继承,但是是在函数封装过程中同S3一样,基于泛型函数。 - 基于RC(也称S5)的面向对象编程则更加完善,符合上面的要求。
- 基于
R6
包的面向对象编程,同样符合上面的要求。 - 基于
proto
包的面向对象编程在ggplot2
包中使用。 - 基于
R.oo
包的面向对象编程类似S3。
sloop 包
包中的函数sloop::otype()
可以用来检查对象的面向对象编程类型。