Seamless R and C++ Integration with Rcpp
[法] 德克·埃德比特尔 著 寇强 张晔 译
Rcpp是R应用最为广泛的语言扩展包,它被应用于超过100个CRAN和BioConductor的包中。这本书是关于Rcpp的第一本综合性导论。Rcpp使得用户可以在R和C++之间来回传递数值、向量、列表或者完整的R对象,在给R分析框架带来深度的同时,也带来了C++的威力、速度和效率。
本书适用于希望使用C++ 代码对R 进行扩展的R 用户。熟悉R 语言对于阅读本书自然很有帮助;有很多其他书籍提供了回顾和特定的介绍。C++的知识也很有帮助,尽管我们不严格要求。附录为只熟悉R 语言的读者提供了一个非常简短的C++ 简介。
德克·埃德比特尔(Dirk Eddelbuettel) 成为CRAN的贡献者已逾十年,他维护了超过20个包,是R和其他量化软件在Debian/Ubuntu上的维护者,并负责编辑CRAN上的金融与高性能运算的任务视图。此外他还是R/Finance年会的共同发起人,《统计软件》期刊的编辑。他拥有法国社会科学高等研究院(巴黎)的Ph.D.学位,现就职于芝加哥任高级量化分析师。
寇强,印第安纳大学在读博士,Rcpp核心团队成员。
张晔,中山大学计算数学硕士,毕业于华南统计科学研究中心。
R 语言是一门主要用于数据处理、统计分析和可视化作图的解释型脚本语言。作为一门编程语言,R (及其“前身” S 语言)在设计之初就面临一个二选一的难题:语言的设计是应该面向用户,让使用者可以快速地建模,还是应该面向机器,以使得代码可以高速地在计算机上运行?最终,语言的设计者们选择了前者,其理念是“人的时间” 比“机器的时间” 更为宝贵。在R 语言诞生后的十几年间,事实证明这个最初的决定使得R 逐渐发展为一门具有高度灵活性和可扩展性的统计编程语言,进而极大地促进了其背后R 语言社区的发展壮大。
然而,语言的简洁性和灵活性并非恒久不变的法则。随着统计模型越来越复杂,数据量越来越大,众多的R 语言开发者和使用者开始发现效率成为了这门语言的一个瓶颈。“人的时间” 固然宝贵,但“人等待机器的时间” 同样不可忽视。如何在保持语法不变的同时提升程序执行的效率,成为了R 语言开发者们一个十分关注的话题。
事实上,在R 语言诞生的初期,其核心开发团队就给出了一个解决方案:将计算密集的算法用C/C++ 实现,然后在R 中调用这部分代码。R 语言提供了一系列的API (应用程序接口)来实现它与其他语言的交互,但在很长的一段时间里,积极使用这些接口的R 软件包开发者并不占多数,其中可能最重要的一个原因就是这些接口的使用相对繁琐,且文档资料也不够丰富,开发者空有屠龙之刀,却无屠龙之技。
幸运的是,这一局面在 Rcpp 横空出世后被彻底打破。我第一次听说 Rcpp 是在2009 年,当时在统计之都论坛的帖子上(http://cos.name/cn/topic/17665/)大家在讨论如何用R 调用C++ 程序,于是经过一些搜索后我从R 的软件仓库中找到了这个软件包。当时的 Rcpp 核心只有两个文件,代码总量不到2000 行,但那时它已经可以极大地简化R 与C++ 之间的交互。现如今, Rcpp 的代码量已经接近10 万行,在R 的官方软件包仓库中有超过300 个软件包直接依赖于 Rcpp ,而它也成为了被依赖次数最多的R 语言扩展包(除去R 自身默认提供的扩展包),没有之一。
总的来说, Rcpp 定义了一系列的类、函数和接口来增强R 与C++ 之间的交互性。用户只需懂得基本的C++ 知识,就可以写出丰富的可供R 调用的C++ 程序。与R 中传统的C 语言API 相比, Rcpp 利用了更为现代的C++ 编程技术,故而其语法更为简洁,也更富表现力和可读性。此外, Rcpp 还特意针对R 软件包开发提供了一系列便捷的辅助程序,使得开发者
可以快速地部署项目,开发软件包,省去了许多繁琐而枯燥的设置。或许,这正是 Rcpp 能迅速地获得R 软件包开发者青睐的原因。
本书的原作者,Dirk Eddelbuettel,正是 Rcpp 从最早到现在开发工作的主导者。从这个角度来说,由作者自己来阐述 Rcpp 的设计理念和使用方法是最为恰当不过的了。而更为可贵的是,作者在全书中使用了大量的实例和代码来讲解 Rcpp 的细节,可以预想,读者无论是在理念上还是在实战中都能从本书中受益。
本书的两位译者为本书中文版的面世付出了大量的时间和心血。需要特别提到的是,两位译者同样也是R 社区活跃的开发者,他们在许多R 软件包和编程项目中都大量使用了 Rcpp 。也正是因为如此,两位译者在执笔过程中融入了自己使用 Rcpp 的心得和体会,在语言上将原本可能艰涩的编程概念用更加平易近人的方式表达出来,相信读者在阅读本书的过程中会体会到译者的用心。
邱怡轩
2015 年3 月于普渡大学