7.2 S4方法

7.2 S4方法

S4方法和绿色的书一致.

S3方法简单而强大,还有一点是显得比较临时.S4方法移除了这个临时性–它们更加直接和普遍.S4方法像一条严厉的绳子–当你将自己悬挂在上面,它肯定不会断.但基本上这才是重点–为了让使用者对输出结果更加信赖,程序员是受限制的.不管怎样,这就是设计初衷,它也经常起到作用.

7.2.1 多重调度

多重调度是S4方法从S3方法那里剔除的一个特色.假设你有”foo”类的一个对象和”bar”类的一个对象,并且你想调用fun()函数去处理这些对象.下面的结果

fun(foo, bar)

fun(bar, foo)

的结果相同或者不同.
这里写图片描述
如果一个函数有很多类或者很多对类型敏感的入参,这可以说是一个大问题.S4方法将如此复杂的情形变得相对简单了.

我们知道UseMethod()创造了S3泛型函数.S4泛型函数则由standardGeneric()创造.

7.2.2 S4结构

S4对于一个特定的类中的对象的格式有相当严格的要求.相反,S3方法允许你给任何一个对象仅仅加上class属性而没有惩罚–只要这个方法可以正常运行.对于一个类的对象进行严格地结构管理的关键优势是–这些对象可以在C语言(通过.Call())中使用而不需要大量的类型检查.

对于S4对象的苛刻同时也创造了一些新词汇.对象的这一片(组件)被称作为slots.slots@操作获取.如果你看到像这样的代码:

x@Data  

这就说明x是一个S4类型的对象.

现在你将会注意到S4方法就像S3方法那样由类属性来驱动.这个共性或许使这两个系统看起来比他们更相似.在S3中决定什么方法将会被使用是在这个函数被调用的时候实时决定的.在S4中这种决定是在代码加载到R空间时就已经实现–由一个表来管理所有类型的关系.showMethods()可以用来查看布局.

S4和S3一样都有继承关系.但是仍旧,它们有一些微妙的不同.比如,S4中和S3不同的是包含.如果S4中的类型”B”拥有类型”A”的所有slots,那么类型”B”包含类型”A”.

7.2.3 讨论

S4将会完全取代S3吗?答案是极不可能.一个原因是向后兼容性–因为还有很大一部分代码是基于S3方法建立起来的.除此之外,S3方法也是便利的.非常简单地我们就可以给一个特定问题(一个仿真,或许)创造出一个plot()或者summary()以加快分析进展.

因此,本质上S3和S4效劳于不同的目的.S4对于大的,工业级的工程很有作用.S3则作用于临时性的工程.

如果你计划用S4方法(或者甚至S3)编程,推荐你看看<>.不要误解:即使不会使用这些方法,这本书也是有用的.

两种类型的对象是完全不够的.幸运的是,这里还有OOP,R.oo和proto包提供了另外的三个方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值