欢迎关注天山情报。我们是一个专注于商业智能BI、人工智能AI和大数据分析与挖掘的垂直社区。学习、问答、求职一站搞定!对商业智能BI、大数据分析与挖掘、机器学习、python、R等数据领域感兴趣的同学加微信:tstoutiao,邀请你加入数据爱好者交流群,数据爱好者都在这里。
Alexa的个人博客http://fens.me世界排名70k。
前言
对于R语言的面向对象编程,与其他编程语言不同,R语言提供了三种类型的底层对象,一种是S3类型,一种是S4类型,一种是RC类型。
S3物体简单、动态,没有明显的结构特征。S4对象是结构化的和强大的;RC对象是2.12版之后使用的一种新类型,用于解决S3和S4的困难对象。
本文将从S3对象开始,介绍用R语言进行面向对象编程的细节。
目录
S3物体游戏攻略
创建S3对象
泛型函数和方法调用
参见S3对象的功能
S3对象继承
S3物体的缺点
S3物体的使用
1.S3物体游戏攻略
在R语言中,基于S3对象的面向对象编程是一种基于泛型函数的实现方法。泛型函数是一个特殊的函数,它根据传入对象的类型来决定调用哪个特定的方法。基于S3对象的面向对象编程不同于其他语言的面向对象编程,它是动态函数调用的模拟实现。S3对象在R的早期开发包中被广泛使用。
关于面向对象的介绍,请参考文章:
r语言面向对象编程
2.创建S3对象
本文的系统环境
Linux: Ubuntu服务器12 . 04 . 2 LTS 64位
R: 3.0.1 x86_64-pc-linux-gnu
注意:pryr只支持Linux系统环境
为了方便我们检查对象的类型,pryr包作为一个辅助工具被引入。
1#装载pryr包
2 >图书馆(pryr)
从变量创建S3对象
1 >x<。-1
2 >attr(x,' class')<。-" foo "
三
4 >x
5[1] 1
6attr(,“类”)
7[1]“foo”
八
9 >类别(x)
10[1]“foo”
11
12#使用pryr包的type函数检查x的类型
13 >otype(x)
14[1]“S3”
S3对象是由结构()函数创建的
1 >y <。-结构(2,class = "foo ")
2
3 >y
4[1] 2
5attr(,“类”)
6[1]“foo”
七
8 >等级(y)
9[1]“foo”
10
11 >ot type(y)
12[1]“S3”
创建多类型S3对象
S3对象没有明确的结构关系,S3对象可以有多种类型。S3对象的类属性可以是向量,包括多种类型。
1 >x<。-1
2 >attr(x,' class')<。- c("foo "," bar ")
3 >类别(x)
4[1]“foo”“bar”
5 >otype(x)
6[1]“S3”
3.泛型函数和方法调用
对于S3对象的使用,UseMethod()函数通常用于定义泛型函数的名称,不同的方法调用是通过传入参数的类属性来确定的。
定义教师的一般职能
+使用UseMethod()定义教师通用函数
+以老师. xxx的语法格式定义老师对象的行为
+其中老师。默认为默认行为
1#使用UseMethod()定义教师通用函数
2 >教师<。-函数(x,...)使用方法(“教师”)
三
4#使用pryr包中的ftype()函数检查教师的类型
5 >ftype(教师)
6[1]“S3”“通用”
七
8#定义教师内部职能
9 >教师讲座& lt-函数(x)打印(“讲座”)
10 >教师作业& lt-函数(x)打印(“赋值”)
11 >教师。纠正& lt-函数(x)打印(“批改作业”)
12 >教师. default & lt;-function(x) print("你不是老师")
调用方法时,通过传入参数的类属性来确定不同的方法调用。
定义一个变量A,将A的class属性设置为讲座
将变量a传递给教师泛型函数
函数教师的行为。讲座()被称为
1 >a<。-"老师"
2
3#设置教师变量的行为
4 >attr(a,' class') <。-"演讲"
五
6#执行老师的行为
7 >教师(a)
8[1]“讲座”
当然也可以直接调用老师定义的行为,如果这样做,面向对象封装的意义就失效了。
1 >教师讲座()
2[1]“讲座”
三
4 >老师讲课
5[1]“讲座”
六
7 >教师()
8[1]“你不是老师”
4.看看S3物体的功能
当我们使用S3对象进行面向对象封装时,我们可以使用methods()函数来查看S3对象中定义的内部行为函数。
1#查看教师对象
2 >教师
3函数(x,...)使用方法(“教师”)
四
5#查看教师对象的内部功能
6 >方法(教师)
老师。作业老师。批改老师。默认老师。讲座
通过方法()的generic.function参数匹配泛型函数名。
1 >方法(generic.function=predict)
2 [1] predict.ar* predict。Arima* predict.arima0*
预测,预测。HoltWinters* predict.lm
4 [7]预测.黄土*预测. mlm预测. nls*
5[10]predict . poly predict . PPR * predict . prcomp *
6[13]predict . princomp * predict . smooth . spline * predict . smooth . spline . fit *
7[16]预测。结构*
八
9不可见的函数标有星号
将类的名称与方法()的类参数相匹配。
1 >方法(class=lm)
2[1]add 1 . lm * alias . lm * ANOVA . lm case . names . lm *
3[5]confint . lm * cooks . distance . lm * deviance . lm * dfbeta . lm *
4[9]dfbetas . lm * drop 1 . lm * dummy . coef . lm * effects . lm *
5[13]Extract AIc . lm * family . lm * formula . lm * hat values . lm
6[17]impact . lm * kappa . lm labels . lm * loglik . lm *
7[21]model . frame . lm model . matrix . lm nobs . lm * plot . lm
8[25]predict . lm print . lm proj . lm * QR . lm *
9[29]残差. lm r standard . lm r student . lm simulate . lm *
10[33]summary . lm variable . names . lm * vcov . lm *
11
12个不可见的函数标有星号
使用getAnywhere()函数查看所有函数。
1#查看老师讲课功能
2 >getAnywhere(教师.讲座)
找到了3个匹配“教师.讲座”的单个对象
4它在以下地方被发现
5 .GlobalEnv
6注册S3法为教师
7有价值
八
9功能(x)打印(“讲座”)
10
11#检查不可见函数predict.ppr
12 >predict.ppr
13错误:找不到对象“predict.ppr”
14 >存在(“预测. ppr”)
15[1]假
16
17# getAnywhere()函数查找predict.ppr
18 >getAnywhere("predict.ppr ")
19A找到匹配“predict.ppr”的单个对象
20在以下地方发现
21个注册S3方法,用于根据名称空间统计数据进行预测
22命名空间:stats
23有价值
24
25函数(对象,新数据,...)
26{
27 if(缺失(newdata))
28返回(安装(物体))
29 if(!is.null(object$terms)) {
30 newdata <。- as.data.frame(newdata)
31 rn <。-row . name(new data)
32条款& lt- delete.response(object$terms)
33 m <。- model.frame(Terms,newdata,na.action = na .省略,
34 xlev = object$xlevels)
35 if(!is . null(cl & lt;- attr(术语,“数据类”))
36 .checkMFClasses(cl,m)
37 keep & lt- match(row.names(m),rn)
38 x <。- model.matrix(Terms,m,contrasts.arg = object$contrasts)
39 }
40 else {
41 x <。- as.matrix(newdata)
42 keep & lt- seq_len(nrow(x))
43 rn <。- dimnames(x)[[1L]]
44 }
45 if (ncol(x)!= object$p)
46停止(“x”中的列数错误)
47 res <。-矩阵(NA,长度(keep),对象$q,dimnames = list(rn,
48 object$ynames))
49 res[keep,]& lt;-矩阵(。Fortran(C_pppred,as.integer(nrow(x)),
50 as.double(x),as.double(object$smod),y = double(nrow(x) *
51 object$q),double(2 * object $ smod[4L])$ y,ncol = object$q)
52滴(res)
53}
54<。字节码:0x 0000000000 df 6 c2d 0 > 0。
55<。环境:名称空间:stats>。
还可以使用getS3method()函数查看不可见的函数
1# getS3method()函数查找predict.ppr
2 >gets 3方法(“预测”、“ppr”)
3函数(对象,新数据,...)
4{
5 if(缺失(newdata))
6返回(安装(物体))
7 if(!is.null(object$terms)) {
8 newdata <。- as.data.frame(newdata)
9 rn <。-row . name(new data)
10项条款& lt- delete.response(object$terms)
11 m <。- model.frame(Terms,newdata,na.action = na .省略,
12 xlev = object$xlevels)
13 if(!is . null(cl & lt;- attr(术语,“数据类”))
14 .checkMFClasses(cl,m)
15保留& lt- match(row.names(m),rn)
16 x <。- model.matrix(Terms,m,contrasts.arg = object$contrasts)
17 }
18 else {
19 x <。- as.matrix(newdata)
20保留& lt- seq_len(nrow(x))
21 rn <。- dimnames(x)[[1L]]
22 }
23 if (ncol(x)!= object$p)
24停止(“x”中的列数错误)
25 res <。-矩阵(NA,长度(keep),对象$q,dimnames = list(rn,
26 object$ynames))
27 res[keep,]& lt;-矩阵(。Fortran(C_pppred,as.integer(nrow(x)),
28 as.double(x),as.double(object$smod),y = double(nrow(x) *
29 object$q),double(2 * object $ smod[4L])$ y,ncol = object$q)
30滴(res)
31}
32<。字节码:0x 0000000000 df 6 c2d 0 > 0。
33<。环境:名称空间:stats>。
5.5的继承关系。S3物体
S3对象有一个非常简单的继承模式,这是通过NextMethod()函数实现的。
定义节点通用函数
1 >节点<。-函数(x) UseMethod("node ",x)
2 >node.default & lt-函数(x)“默认节点”
三
4#父亲功能
5 >node .父亲节& lt-函数(x) c(“父亲”)
六
7#子函数通过NextMethod()函数指向父函数
8 >node.son & lt-函数(x) c("son ",NextMethod())
九
10#定义n1
11 >n1 <。-结构(1,class = c("父亲"))
12#在node函数中传递n1,执行node .父亲()函数
13 >节点(n1)
14[1]“父亲”
15
16#定义n2并将class属性设置为2
17 >n2 <。-结构(1,class = c("儿子","父亲"))
18#将n2传递给node函数,并执行node.son()函数和node .父亲()函数
19 >节点(n2)
20[1]“儿子”“父亲”
通过将n2个参数传递给node()函数,首先执行node.son(),然后通过NextMethod()函数连续执行node .父亲节()函数。其实就是模拟一个子函数调用一个父函数的过程,在面向对象编程中实现继承。
6.6的缺点。S3物体
从上面对S3对象的介绍来看,S3对象不是一个完整的面向对象的实现,而是一个由泛型函数模拟的面向对象的实现。
S3易于使用,但在实际的面向对象编程过程中,当对象关系具有一定的复杂性时,S3对象所表达的含义就会变得不清晰。
S3封装的内部函数可以绕过泛型函数的检查直接调用。
S3参数的类属性可以任意设置,无需预处理检查。
S3参数只能通过调用class属性来调用,其他属性不会被class()函数执行。
当S3参数的类属性有多个值时,将根据程序赋值顺序调用第一个合法函数。
因此,S3只能是一个简单的面向对象的R语言实现。
7.使用7。S3物体
S3对象系统在R语言的早期发展中被广泛使用。在基础包中,有许多S3对象。
基本包装的S3物件
1#均值函数
2 >意思是
3函数(x,...)
4使用方法(“平均值”)
五
六
7 >ftype(平均值)
8[1]“S3”“通用”
九
10# t功能
11 >ft type(t)
12[1]“S3”“通用”
13
14#绘图功能
15 >ftype(绘图)
16[1]“S3”“通用”
一个定制的S3物件
1#定义数字变量a
2 >a <。- 1
3#变量a的类是数字的
4 >a类
5[1]“数字”
六
7#定义通用函数f1
8 >f1 <。-函数(x) {
9+ a <。- 2
10+ UseMethod("f1 ")
11+ }
12
13#定义f1的内部功能
14 >f1.numeric & lt-函数(x) a
15
16#将变量a传递给f1()
17 >f1(a)
18[1] 2
19
20#将数字99传递给f1()
21 >f1(99)
22[1] 2
23
24#定义f1的内部功能
25 >f1.character & lt-函数(x)粘贴(“char”,x)
26
27#将字符a传递给f1()
28 >f1(“a”)
29[1]“char a”
这样,我们对S3对象系统有了全面的了解,开始了R语言的面向对象编程之路。
美好的过去:
r语言信用记分卡:探索性数据分析
t检验是统计学中的一种检验方法,是基于r
完成R语言中文社区2018年年终文章(作者)
R语言中文社区2018年年终文章(类型文章)
微信官方账号可以在后台回复关键词学习
关于爬行动物和爬行动物三大案例的回复。回复Python 1小时破冰入门。回复数据挖掘R语言录入和数据挖掘。回复人工智能三个月。回复数据分析师的成长路径。回复机器学习。机器学习的商业应用。回复数据科学。数据科学实际上是对普通算法的回复。常见的数据挖掘算法
1.《parameterclass R语言基于S3的面向对象编程》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《parameterclass R语言基于S3的面向对象编程》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/1229543.html