从开始学习R就见相关介绍称R是面向对象的语言,但是感觉R除了包是类似对象的,介绍R的相关资料几乎没有看到有关如何用R编写自己的类的相关内容,而且看到的绝大多数资料都是类似于面向过程的编程方式。R是否可以像Java、python、ruby等语言一样编写自己的类呢?如果可以有没有相关的资料呢?
R是否可以编写类,如何编写?
回复 第1楼 的 smurf:R语言艺术和 GETTING STARTED WITH RSTUDIO 可能帮到你
《R语言艺术》没有查到呀?英文名称是什么?有没有相关链接呀?
回复 第3楼 的 smurf:the art of r programming
回复 第3楼 的 smurf:再等几天 《R语言编程艺术》的中文版就上市了
回复 第1楼 的 smurf:
传统的非面向对象的语言,比如 C / Pascal / Fortran 里面,一个数值,一个字符的逐个地进行处理的过程。多个数值形成的对象怎么处理呢?用个什么包起来,用个结构啥的,里面几个东西还是要分别处理。
比如:
<br />
typedef struct SAMPLE {<br />
int a;<br />
float b;<br />
int *c;<br />
} Sample;</p>
<p>Sample *x_sample = malloc(...);<br />
x_sample->a+=1;<br />
x_sample->b-=100.01;<br />
...</p>
<p>
</p>
而所谓面向对象, 海峡那边叫面向物件,我还是觉得“物件”比较好,对象这个词,总是让人觉得有个成“对”的过程,然后就有“象”了。还不如“物件”清晰明亮。来了一堆数据,这个就是“物件儿”么。
面向物件中主要的能力有:多态,继承,和重载。R 本身就是这样处理的。
那什么是 R 里的物件呢? 一个 matrix , 一个 list , 一个 data-frame , 甚至 vector 都是物件。R 的本质就是面向这些进行处理的。
比如多态,R里简单举个函数,比如 mean, 你可以用 mean 来处理多数类型,matrix, vector, 数值型的都可以。
例如:
<br />
aaa<-seq(1.0,10.0,by=0.11)<br />
mean(aaa)</p>
<p>aaa<-seq(10,100,by=11)<br />
mean(aaa)<br />
</p>
不要执迷于一定要明写 class 才是对象编程,而 data-frame 就不是咱家的 "物件儿"。
面向对象编程是种程序编写代码过程中的思考方法。你可以理直气壮地用R来面向物件思考。
了解程序编辑的两个思想就比较容易理解‘对象’了。开始的程序编写都是线性的,解释器只需要逐行的执行程序员所键入的代码即可进行相应的执行操作。此为‘面向过程编程’。优点是比较容易理解和叙述,缺点也是显而易见的。当对数千行代码进行组织时,噩梦就拉开了帷幕。比如编写一个程序段需要呼叫另一个程序段,并需要携带前一程序段的变量信息,而又不能与既有代码的其他变量名称产生冲突,最主要就是当你进行debug时,你需要纵横于不同的程序段中找到那个‘臭虫’。当然,还有一个问题,就是每一个软件项目都需要重写大部分代码,且维护起来也是非常复杂的。
随着对软件需求的增加,新的程序编辑思想也就出现了——面向对象编程。它是以软件开发需求建立程序框架,在此基础上构建不同的程序对象,进一步通过类框架进行构建。比如窗口类,数据类,通信类等。而后你就可以依据每个类的不同定义进一步的编辑其功能函数即可。这样你就可以在类的层面进行类与类之间的组合去快速构建程序功能,而类的内部会通过子类,模块,函数,方法,属性进行扩展,而类的内部可以通过public和private进行进一步的划分,类的内部还可以进行继承指定。
感兴趣看看C ++ Primer,他用300页告诉你什么是基于过程的程序,再用400页告诉你什么是基于对象的程序;入门图书,虽然大多数人都不认为是入门读物。
具体到R,更多的面向对象编程还是涉及到package构建上;一般的代码编写,function就可以胜任了。当然,如果你希望写一些通用函数,A绘图类,B统计类,C数据预处理类,来使得你的日常工作变得更容易,效率更高,那就去设计类吧。给他一个数据对象他如果消化不了,他会说“error data object”。如果没问题,他会在内部把那个对象分解,然后各部分逐一消化,处理完毕返回给你一个全面的结果——数据概要、统计图表、处理数据,并且还帮你把对象进一步的转换成为你所定义的对象内部结构,方便你对这个处理后的对象应用其他的类。
最后,如果你希望编写你的类,请阅读一下链接中的文献,其中涉及R的S3 and S4的编辑,里面有代码有真相。
https://stat.ethz.ch/pipermail/r-help/2006-January/085209.html
ps:object 我也认为应该翻译为‘物’(我讨论的不是Oxford dic.)。因为在一些国外社科学术研究领域,object往往指的是物,相对应的objective指的是客观(早期西方观点认为存在主观世界和客观世界,主观世界的基础是人的意识,客观世界是自然万物,18th就出现了唯心和唯物的两个对立阵营,近现代使用主体人和客体物概念体系),从词根词缀和语言使用上是具有明显的关联性的。插一个对象进去,显得有点不伦不类。当然,如果应用在特定领域是没有问题的比如计算机,但扩展就不好了。因为那会导致概念体系的混乱。
回复 第6楼 的 lyxmoo:
你说的'对'和'像'不会是sex object[s:19]:
a person considered only for their sexual attraction and not for their character or their intelligence
这个教程很实用
A (Not So) Short Introduction to S4 V0.5.1
http://cran.r-project.org/doc/contrib/Genolini-S4tutorialV0-5en.pdf