定义 S4 泛型函数
在前面的例子中,我们可以看出 S4 比 S3 更正式,因为 S4 类有类的正式定义。同样,
S4 的泛型函数也更加正式。
在一个关于形状的例子中,我们定义了一系列具有继承关系的 S4 类,只是继承关系的层级
结构比较简单。首先,Shape 是处于根节点的类,Polygon 和 Circle 都继承自 Shape,而
Triangle 和Rectangle 继承自Polygon。这些形状的继承结构如图10-5 所示。

图 10-5
除了 Shape 类,其他每个类都有一些用于描述这个类必要的字段:
setClass("Shape")
setClass("Polygon",
representation(sides = "integer"),
contains = "Shape")
setClass("Triangle",
representation(a = "numeric", b = "numeric", c = "numeric"),
prototype(a = 1, b = 1, c = 1, sides = 3L),
contains = "Polygon")
setClass("Rectangle",
representation(a = "numeric", b = "numeric"),
prototype(a = 1, b = 1, sides = 4L),
contains = "Polygon")
setClass("Circle",
representation(r = "numeric"),
prototype(r = 1, sides = Inf),
contains = "Shape")
定义了这些类,我们就可以构建一个泛型函数来计算一个 Shape 对象的面积。为此,
我们需要调用 setGeneric( )创建一个新的泛型函数:area( ),并为 area( )提供
一个调用 standardGeneric("area")的函数来使这个新的泛型函数可用于 S4 方法分
派。参数 valueClass 是用来确保每种方法的返回值必须是 numeric 类:
setGeneric("area", function(object) {
standardGeneric("area")
}, valueClass = "numeric")
## [1] "area"
一旦构建了泛型函数,我们就可以为不同种类的形状实现不同的方法。对于 Triangle,
给定三角形的 3 个边长,使用海伦公式[Heron's formula(https://en.wikipedia.org/wiki/Heron's_
formula)]来计算它的面积:
setMethod("area", signature("Triangle"), function(object) {
a <- object@a
b <- object@b
c <- object@c
s <- (a + b + c) / 2
sqrt(s * (s -a) *(s -b) * (s -c))
})
## [1] "area"
对于 Rectangle 和 Circle,我们可以很容易地写出它们的面积公式:
setMethod("area", signature("Rectangle"), function(object) {
object@a *object@b
})
## [1] "area"
setMethod("area", signature("Circle"), function(object) {
pi *object@r ^2
})
## [1] "area"
现在,我们创建一个 Triangle 类的对象实例,并查看泛型函数 area( )是否会分
派正确的方法,然后返回正确的答案:
triangle <- new("Triangle", a = 3, b = 4, c = 5)
area(triangle)
## [1] 6
再创建一个 Circle 类对象实例,看看方法分派是否正常进行:
circle <- new("Circle", r = 3)
area(circle)
## [1] 28.27433
两个答案都是正确的。泛型函数 area( )的工作方式与 S3 的泛型函数类似,都是根
据输入对象的类执行方法分派。
定义 S4 泛型函数的更多相关文章
- 排序算法 2 qsort 库函数,泛型函数
_____谈谈排序算法 交换排序——>冒泡排序-->快速排序 选择排序——>简单选择排序——>堆排序 插入排序——>直接插入排序——>希尔排序 _____排序算法对 ...
- Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Swift泛型和泛型函数
泛型(generic)可以使我们在程序代码中定义一些可变的部分,在运行的时候指定.使用泛型可以最大限度地重用代码.保护类型的安全以及提高性能.在Swift集合类中,已经采用了泛型.一.一个问题的思考怎 ...
- Java泛型函数的运行时类型检查的问题
在一个数据持久化处理中定义了数据保存和读取的 泛型函数的,但是在运行时出现类型转换错误,类型不匹配,出错的位置不是load方法,而是在调用load方法之后,得到了列表数据,对列表数据进行使用时出现的. ...
- 定义 S4 类
S3 类仅用一个字符向量表示,与之不同的是,S4 类要求对类和方法有正式定义.为了定义一个 S4 类,我们需要调用 setClass( ),并提供一种类成员的表示,这种表示被称为字段(slots).通 ...
- 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数
1.指针数组 数组里面的每一个元素都是指针. 指针数组的案比例如以下: 易犯错误: 2.数组指针 归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来. 数组指针:(一个指针指向了数组.一般 ...
- kotlin之函数的范围和泛型函数
kotlin 中函数可以定义为局部函数,成员函数以及扩展函数 局部函数:就是嵌套在函数内的函数 成员函数就是定义在类或者对象之内的函数 泛型函数就是函数可以带有泛型参数,可通过尖括号来指定
- Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数
11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...
- C++中为什么要将析构函数定义成虚函数
构造函数不可以是虚函数的,这个很显然,毕竟虚函数都对应一个虚函数表,虚函数表是存在对象内存空间的,如果构造函数是虚的,就需要一个虚函数表来调用,但是类还没实例化没有内存空间就没有虚函数表,这根本就是个 ...
随机推荐
- SSL安装方法一:在Windows Server 2008安装SSL证书(IIS 7.0)
购买的是GlobalSign 公司的通配符域名型SSL 大致的意思就是“通配符公用名填写*.域名.com,这个下面的所有子域名是不受数量限制的,*可以换成任意字符” 1 生成数字证书签名请求文件(CS ...
- JSTL的一些使用规范,坑
三目表达式要加空格不然有些服务器解析不了 var maxBanners = ${maxBanners==null ? 3 : maxBanners}; forEach循环的长度正确使用方式 <c ...
- Comparable 与 Comparator的区别
Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序 ...
- SQL---->mySQl数据库1------jdbc简单入门
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问. 目的:不用学习每个数据库的驱动,学 ...
- Grafana+Prometheus监控
添加模板一定要看说明以及依赖 监控redis https://blog.52itstyle.com/archives/2049/ http://www.cnblogs.com/sfnz/p/65669 ...
- 解决Eclipse中新建jsp文件总是以ISO8859-1编码问题
eclipse --> window -->Preferences-->web-->jsp-->utf-8
- 将expression转化为数据类型int时发生算术溢出错误
在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...
- mysql 表的增删改查
一.表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 对于一张表来说,字段是必须要有的. 数据表 类似于excel id,name,qq, ...
- 【spring mvc】扒一扒tomcat
1.TOMCAT的目录 主要说一下webapps目录,WEB应用的目录结构:假设在$CATALINA_HOME/webapps下有helloapp的web应用 /helloapp:Web应用的根目录, ...
- java-基础-【四】实际编程中的对象
一.概述 实际编程开发中,仅仅一个数据库对象映射是满足不了各种复杂需求. O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关 ...