R语言的一些看法


就整个编程语言的圈子来说 R语言 是比较小众的,其应用领域主要是统计学以及与统计相关的地方。R语言在最开始就没有被设计成一个通用的语言(指一些跟系统底层有关的操作),而只专注于数据分析和绘图,因此在业界(其实我也说不好这个业界具体指什么,暂且意会吧= =)它一直没有得到广泛应用。但之前所说的小众又是相对而言的,对于统计分析人员以及统计科研人员来说R语言的意义非常重大。

R语言最强大的地方就是它的统计计算功能,这可以从数据结构和算法两方面来说。

首先,它的许多数据结构都是为数据处理的需要而设计的。例如其中有一个叫做data.frame的数据类型,它本质上就是一张二维表,每一行是一条记录,每一列是一个字段(按统计学的术语来说,每一行是一个观测,每一列是一个变量)。data.frame是一种类矩阵结构,可以对行和列进行一系列的操作,但它又允许每一列的数据是不同的类型,这跟现实中的很多数据是相符的。当然,其它各种流行的语言要实现这些操作都不是难事,只不过R语言是把这些数据结构作为内置的一部分。
此外,R语言的绝大多数操作都是向量化的,这和Matlab很像,因此省去了很多显式的循环。例如,如果x是一个向量,那么我要将它标准化(减去均值,再除以标准差)就只需要
(x - mean(x)) / sd(x)
形式上就像是在写数学公式。

除去基础的数据结构之外,数据处理最重要的一点就是各种统计方法,在这一点上R语言可以不太谦虚地说是无言能及。R语言的统计方法更新很快,目前已经有3000多个附加软件包,其中大多数都是统计学专业的老师和学生,以及数据分析人员贡献的。当然这有好处也有坏处,好处是你永远可以找到最新的统计方法,因为那些大牛们发paper时基本上都会将程序编好然后挂到网站上;坏处是新的方法往往还不太成熟,而且包的质量参差不齐,有时候你可能不敢轻易使用。
而这一点是很多开源项目共同的劣势。商业机构提供的软件会经过工程师的检验和调试,而R语言是开源项目,并不对使用它而产生的后果负责,因此从公司的角度来说往往不愿意承担这方面的风险。

关于R的效率。R是一种脚本语言,肯定不如C++等编译型语言快,但R语言设计的初衷不是追求效率,而是符合统计编程的思维。R语言的优势在于能够快速实现各种比较复杂的算法,比如说你新提出了一种统计方法,就可以用R语言快速地做一些模拟实验,如果效果不好,也不会浪费太多的时间。而如果你用FORTRAN或者C来写,可能编程的时间比你思考的时间更长,万一效果不好,还得推倒重来。因此比较合理的一种做法是用R语言来构建模型,如果模型比较成熟了,再用C或者FORTRAN来实现高效的运算。

事实上,R语言和其它语言也是可以互相调用的,目前我知道的有:
Python通过RPy库调用R,.NET通过COM组件,JAVA通过JRI库,C和C++可以直接从R的dll调用R。而反向来说,R有内置的调用C/C++和FORTRAN的方法,还可以通过rJava包来调用JAVA。
其中用得比较多的,一个是从R调用C和FORTRAN,目的是提升运算速度;另一个是从.NET调用R,目的是用.NET快速做出图形界面,然后把数据分析交给后台的R,再从R返回运算结果到前台。

最后说一个R的有意思的应用。

R语言有个很实用的功能,就是与LaTeX进行整合,来进行动态的文档生成,这个功能叫做Sweave。在编写LaTeX文档时,可以在其中加入特定的R程序区域块,然后编译这份文档时,R会首先计算其中的程序代码,得到输出结果,然后再将这些结果插入到LaTeX文档中。这也是Donald Knuth老爷子提出的Literate programming的一个实现。比如下面的这段LaTeX文档,


...
\begin{document}
现在,我们先生成10个正态随机数:
<<echo=FALSE>>=
x = rnorm(10);
print(x);
@
然后计算出它的均值等于\Sexpr{round(mean(x), 3)}。
\end{document}


会首先被翻译成


...
\begin{document}
现在,我们先生成10个正态随机数:
[1]  -0.35165957  -0.96620642    0.96028362  -0.10754500  -1.17599252    0.41813888
[7]    1.27305011    0.56903124    0.08912148  -0.28017186
然后计算出它的均值等于0.043。
\end{document}


然后再将翻译出的LaTeX文档编译成pdf。试想,如果你每个月都要整理出一份统计分析报告,而其中用到的方法其实是固定的,只是数据源不同,那么就可以编写出这样一份Sweave文档,然后每个月只要改动一下数据的来源,报告就可以自动生成了。


最后的最后再说明一下,写这个帖子主要是分享一下自己使用R语言几年来的一些体会,顺便把它介绍给将来可能会用到的人。前面说了这么多,主要都是一些优点,但客观地来说,R语言存在的问题也是很多的。首先一点,就是它缺乏更加专业的技术支持。R语言的贡献者(包括核心开发人员R cores和软件包贡献者)大都是统计学出身,论编程的能力,我相信与计算机专业的人还是有一些差距,因此在一些底层的优化上,与其它比较成熟的脚本语言相比仍显不足。第二点是软件包的管理。目前R core们对于附加包的态度基本上是无为而治,放任自由,只要你的软件包能通过自身的语法检验,就都能挂到服务器上供其他人下载使用,这就使得包的质量参差不齐,需要一定的筛选。第三点是运行的效率。这也是R语言的使用者最头疼的一个问题,但根据伟大的人品守恒定律,一种编程语言如果太过灵活,那么它的效率肯定会打折扣。要解决这个问题,最好的办法当然就是……好好学习,努力工作,赚大把大把的钱,然后换台更牛的机器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值