||
R语言是一种统计绘图用的计算机脚本语言。近年来在生态学与环境、进化、遗传学、经济学等领域都得到广泛应用。截至2018年6月,R程序包集成网络CRAN上已经有12000多个程序包,并且仍在增加中。此外,在Bioconductor, R-Forge, Github等多个网站上还有为数众多的R程序包。了解和学习R编程无疑能帮助科研人员用好这些宝贵的资源。
最近,生态学与进化研究领域的论文公开研究数据及计算机程序成为一大趋势。 R语言是其中不可或缺的重要分析工具,其中,由Rstudio公司谢益辉等编写的knitr, rmarkdown, bookdown, blogdown等R程序包更是可重复研究的中坚力量。在knitr和rmarkdown程序包帮助下,markdown文档中可直接运行R脚本,编译后的文档可保存运行结果以及绘制的图形,并转换为网页文件、 PDF文件等多种格式。不仅如此, 众多的程序包也在使用Rmarkdown撰写使用说明。因此,掌握Rmarkdown文档,无疑在R程序包编写以及R文档共享中发挥重要作用。本课程的全部内容就都是用Rmarkdown编写,用Rstudio编译为pdf的。
工欲善其事,必先利其器。编写R程序包所需要的工具软件一般包括 Rtools、MikTeX和Rstudio等。由于R软件有时候会用C, C++或者Fortran等语言的源代码,在使用时需要将这些语言的源代码编译成为动态链接库, 因此需要Rtools中提供的gcc等编译器。MikTeX保证能将R帮助文档和Sweave文档转换为pdf。 Rstudio则提供了一系列工具,结合devtools和roxygen2等程序包,为编写、检查、安装R程序包提供了极大方便。
任何程序都以结果准确为第一重要,同时要方便调用,能高效运行等。 要做到这些,需要编写程序的人有扎实的编程功底。
首先, 对数据类型、结构以及基本操作的理解与熟练掌握无疑是十分重要的。向量、矩阵、数据框、列表以及下标、索引、 流程控制、向量化编程,字符串操作等等,都是编写R函数的基础, 需要扎实掌握。
其次, R程序包看似结构简单,但是对于非计算机专业的科学家来说,各种知识点仍然比较多。如程序包需要有好的结构, NAMESPACE, DESCRIPTION文件, R, man, data, vignettes, test, src等文件夹中的对象和撰写要求,非常琐碎和细致。
再次,R面向对象编程。虽然R面向对象编程的功能比较弱, 但是S3 和S4这两种方式也是广泛应用的, 都能够降低R程序包的使用难度。S3和S4在泛型函数、子函数、类型创建等几乎都是编写R程序包所必需的。Bioconductor网站更是要求所有的R程序包都遵循S4编程。
最后,R的编程风格是保证程序可读性的重要保证。R中对象中的名称要精心设计,做到“观其名,知其意”,并撰写详尽的帮助文件和使用指南等。
近几年新工具也在不断涌现,常给人一种无所适从的感觉。因此本课程较为系统地介绍这些零散的知识点,以便熟悉编程过程中的各种概念和流程,主要包括:
第一,R程序包的结构,编译和检查。过去编写R程序包,一般是用package.skeletons()函数生成R程序包的骨架,然后对其中的各文件修改后,再进行编译和检查。这样生成的程序包虽然结构比较简单,但其文档是用类似Latex代码写成的Rd文件, 但难以维护。最近五年来的新工具在一定程度是降低了R程序包的开发和维护的门槛。如devtools程序包整合了Rcmd工具中检查、安装等命令,用户不必再通过Windows的Command Prompt运行Rcmd命令即可编译。而Roxygen2程序包能将R脚本中的oxygen标签转换为Rd文件,省去了寻找和编辑Rd文件的麻烦。
第二, 程序是否能准确运行,需要进行准确测试,以确定在不同的情形下各函数以及程序包的行为是否符合预期。Hadley Wickham编写的testthat程序包能够很好地解决这个问题。
第三, R程序包的版本控制和共享。任何程序都可能会出错,发现错误后不得不对源代码进行修改。 此时就会用到版本控制软件,如git和svn软件等。R程序包编写好后又离不开分享,主要分享渠道是github, rforge, CRAN, Bioconductor等网站。每个网站都有对程序包几乎都有不同的要求,这是编程人员需要特别留意的。
《R语言编程概述》是为2018年6月23日在广州热带林业研究所举办的《基于R语言的生态与环境科学数据分析培训班》准备的,内容包括上述各方面,幻灯片和练习的代码保存在 https://github.com/helixcn/programing_in_r_cn 。不过当时只有三小时的时间讲解, 将这么多内容高度浓缩是很困难的。限于篇幅和讲解时间,不能对每一部分都深入展开,一些高级内容, 如用Rcpp程序包整合C++程序编程,也无法收录,只能在将来有机会再介绍了。
由于本人学识和水平有限,幻灯片中难免有不少错误和不足, 敬请各位读者批评指正。
张金龙
2018年6月25日
于香港大埔
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 19:07
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社