当前位置:首页 > 旅游指南

parameterclass R语言基于S3的面向对象编程

欢迎关注天山情报。我们是一个专注于商业智能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

上一篇

货车司机被罚后服农药自杀 究竟是什么压垮了他? 登上网络热搜了!

下一篇

泰国猕猴胖成球被强制减肥 体重飙升至40斤 目前是什么情况?

黄段 生命浇灌育桃李,园丁逆行培芬芳 !致敬东渡二小最美教师黄江林

肇庆市中小学教师继续教育网 第四届粤港澳大湾区小学英语阅读素养提升专题研讨会,10月重磅开启!

  • 肇庆市中小学教师继续教育网 第四届粤港澳大湾区小学英语阅读素养提升专题研讨会,10月重磅开启!
  • 肇庆市中小学教师继续教育网 第四届粤港澳大湾区小学英语阅读素养提升专题研讨会,10月重磅开启!
  • 肇庆市中小学教师继续教育网 第四届粤港澳大湾区小学英语阅读素养提升专题研讨会,10月重磅开启!

28岁姑娘当了39次伴娘 条件不错却至今没有对象

  • 28岁姑娘当了39次伴娘 条件不错却至今没有对象
  • 28岁姑娘当了39次伴娘 条件不错却至今没有对象
  • 28岁姑娘当了39次伴娘 条件不错却至今没有对象
学生伤害教师致死 究竟是有多大的仇才做出如此之事?

学生伤害教师致死 究竟是有多大的仇才做出如此之事?

11月14日12日下午4时,沅江三中一名学生打伤一名教师致死。目前,犯罪嫌疑人罗墨杰已被公安机关控制,案件正在进一步调查中。 2017年11月12日星期日,在这样的休息日,对于湖南省沅江市第三中学的老师鲍某来说,无疑是一个悲剧的日子。周日下午,...

查找网名 一个比 vlookup 好用10倍的查找函数,你知道吗?

  • 查找网名 一个比 vlookup 好用10倍的查找函数,你知道吗?
  • 查找网名 一个比 vlookup 好用10倍的查找函数,你知道吗?
  • 查找网名 一个比 vlookup 好用10倍的查找函数,你知道吗?

广安市教育局 关于广安市2019年公开招聘中学英语教师的公告

根据事业单位公开招聘工作人员的有关规定和公开、平等、竞争、择优的原则,我市决定面向社会公开招聘183名中学英语教师(职业预备性质)。现将有关事项公告如下: 一、招聘职位 详见2019年广安公考中学英语教师岗位表(详见附件)。 二、招聘对象和条件...

英语周报教师网 《英语周报·教师版(高中)》2019-2020学年21- 40期 目录及摘要

  • 英语周报教师网 《英语周报·教师版(高中)》2019-2020学年21- 40期 目录及摘要
  • 英语周报教师网 《英语周报·教师版(高中)》2019-2020学年21- 40期 目录及摘要
  • 英语周报教师网 《英语周报·教师版(高中)》2019-2020学年21- 40期 目录及摘要

女子闯进课堂称被男教师迷奸 广州从化警方通报!

女子闯进课堂称被男教师迷奸,广州从化警方通报!...