涵盖了R的思想,使用工具,創新等的一系列要点以我个人的学习和体验去诠释R的强大。
R语言作为统计学一门语言一直在小众领域闪耀着光芒。直到大数据的爆发R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入R语言的社区在迅速扩大成长。现在已不仅仅是统计領域教育,银行电商,互联网….都在使用R语言
要成为有理想的极客,我们不能停留在语法上要掌握牢固的数学,概率统计知识,同时还要有创新精神把R语言发挥到各个领域。让我们一起动起来吧开始R的极客理想。
面向对象是一种对现实世界理解和抽象的方法当代码复杂度增加难以维护的时候,面向对象就会显得非常重要我经历过Java和Javascript两种语言从面向过程到面向对象思路的改造,并感觉这种變化也会出现在R语言中在工业界的引导下,R将走向大规则的企业应用因此面向对象的编程方式将成为R语言的一种非常重要的发展方向,动起来迎接R的进步
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的產物早期的计算机编程是基于面向过程的方法,例如实现算术运算2+3+4=9通过设计一个算法就可以解决当时的问题。
随着计算机技术的不断提高计算机被用于解决越来越复杂的问题。一切事物皆对象通过面向对象的方式,将现实世界的事物抽象成对象现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计與编程同时,面向对象能有效提高编程的效率通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统面向对象是指一种程序设计范型,同时也是一种程序开发的方法对象指的是类的集合。它将对象作为程序的基本单元将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性
面向对象的3个特征:封装,继承多态
封装:是把客观事物封装成抽象的类,并且类可以把自己的數据和方法只让可信的类或者对象操作对不可信的进行信息隐藏。
我们通过面向对象的思想定义老师和学生两个对象,并分别定义老師和学生的行为
通过封装就把两个客观事物进行了抽象,并设置了事情的行为
继承:子类自动共享父类数据结构和方法的机制,这是类之间的一种关系在定义和实现一个类的时候,可以在一个已經存在的类的基础之上来进行使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展通过继承创建的新类稱为“子类”或“派生类”;被继承的类称为“基类”、“父类”或“超类”。
通常每门课都会从学生中选出这门课的课代表来帮助老師和其他同学的沟通。课代表会有一些比普通同学更多特权通过继承关系,把普通同学和课代表区别为两个子类课代表不仅有普通同學的行为,还有帮助老师批作业的行为
多态: 指由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应
临近期末考试时,总有考的好的同学和考的不好的同学所以,对于优等生来说他的考试结果是优;次等生,考试结果就不是太好相同行为对于由继承而产生的相关的不同的对象,结果是不同的
所以,通过面向对象的思想我们可以把客观世界的事物都进行抽象。
在客观世界中有若幹类这些类之间有一定的结构关系。通常有两种主要的结构关系is a,和 has a
R主要面向统计计算,而且代码量一般不会很大几十行,幾百行使用面向过程的编程方法就可以很好地完成编程的任务。
不过虽然R语言的持续手热,伴随着越来越多的工程背景的人的加入R語言开始向更多的领域发展。原来的少量的代码的面向过程的编码方式会越来越难以维护海量代码的项目,所以必须有一种新的编程方式来代码原来的面向过程的编码思路这种新的编程方式就是面向对象编程(Object Oriented Programming, OOP)。
面向对象编程早在C++/Java时代就被广泛使用了,几乎90%以上的Java框架嘟是按面向对象的方法设计的;8年前Javascript各种面向过程编码让前端开发困难重重直到Google的Gmail的Web端出现,才让大家认识到原来Javascript也可以面向对象编程随后的jQuery, ExtJS等类库的完全面向对象的实现,终于让Javascript承得起前端的天空后来的Node的诞生更是让Javascript拓宽了应用领域。
当R语言被大家所看好的同时峩们也要开始思考,如何才能让R成为工业界的开发语言应用如何构建非统计计算的项目?如何用R有效的编写10万行以上的代码
我想这个答案就是以面向对象进行编程,现在的R就像8年前的Javascript需要大公司和牛人来推动。从我的观察来看以Hadley Wickham为代表的R语言领军人物,已经开始在R包中全面引入面向对象思路进行R包的开发了以面向对象思想开发的R包memoise,请参考文章:
R的面向对象编程是基于泛型函数(generic function)的而不是基于类層次结构。接下来我从面向对象的3个特征入手,分别用R语言进行实现使用的案例为上文中,老师和学生的3幅图
3.1 R语言实现封装
# 定义老師对象和行为
# 定义同学对象和行为
# 定义两个变量,a老师和b同学
# 给老师变量设置行为
# 给同学变量设置行为
# 定义一个变量既是老师又是同学
# 汾别设置不同对象的行为
3.2 R语言实现继承
# 给同学对象增加新的行为
# 辅助变量用于设置初始值
# 定义构造函数,创建对象
# 给课代表增加批改作業的行为
# 查看普通同学的对象实例
# 查看课代表的对象实例
3.3 R语言实现多态
# 创建优等生和次等生,两个实例
# 修改同学考试的行为大于85分结果為优秀,小于70分结果为及格
# 执行优等生的考试行为并输入分数为90
# 执行次等生的考试行为,并输入分数为66
这样通过R语言的泛型函数我们僦实现了面向对象的编程。
接下来我们再次对比用R语言用面向过程实现上面的逻辑。
4.1 定义老师和同学两个对象和行为
# 辅助变量用于设置初始值
# 定义老师对象和行为
# 定义同学对象和行为
# 执行老师的一个行为
# 执行同学的一个行为
4.2 区别普通同学和课代表的行为
# 重定义同学的函数增加角色判断
# 以普通同学的角色,执行课代表的行为
# 以课代表的角色执行课代表的行为
[1] "帮助老师批改作业"
我在修改student_fun()函数的同时,已经增加了原函数的复杂度
4.3 参加考试,以成绩区别出优等生和次等生
# 修改同学的函数定义增加考试成绩参数
# 执行考试函数,考试成绩为大於85分为优等生
# 执行考试函数,考试成绩为小于70分为次等生
我再一次用面向过程的代码,实现了整个的编辑逻辑再用到面向过程来写程序的时候,每一次的需求变化都需要对原始代码进行修改,从而不仅增加了复杂度而且不利于长久的维护。更多思考留给了大家!
夲文抛砖引玉地讲了R语言的面向对象的编程其中部分代码有些不够严谨,本文只希望给大家思路上的认识更具体的面向对象编程实例,会在以后的文章中进行讨论