Dirk Eddelbuettel的网站上有很多“EXTENDING R”的内容。
很多 EXTENDING R翻译过来是“扩张R”。“扩张”并不是新鲜的词汇, John Chambers早在1976年为了能够让更多用户使用Fortran,开发了S语言, 暨R语言的前身,所以说R语言本身也是“扩张”的产物。
不过,最能代表“扩张”精神的应该是Dirk Eddelbuettel和John Chambers等人共同开发的Rcpp。我们通过一些资料来看一下 Rcpp的“扩张”特点。
这篇文档来自北卡罗来纳州立大学统计系的大数据课程笔记。
R和C++的区别-
C++是编译型语言,R语言是解释型语言。在C++里,人类写出的脚本首先被编译成计算机能够理解的可执行文件,这个编译过程只执行一次。在R语言里,人类每写一条命令,R解释器就要把这条命令翻译成计算机的可执行命令。知乎里有人说,编译型语言就是把菜在厨房里做好后,端上来吃;解释型语言就是火锅,一边做一边吃。
-
C++是静态类型语言,R语言是动态类型语言。在C++里,定义变量的同时,要声明变量类型,而且还不能改。在R语言里,定义变量的时候,不需要定义变量类型,一个字符串变量可以转化为矩阵变量,也可以再由矩阵变量转化回字符串变量。R语言的灵活性比较强,适合做一些探索性的工作,但存储效率没有C++高。
-
Rcpp的作用就是把静态的、编译型的C++加载到R语言的使用环境里,让C++做比较重的工作。实际上,R语言很多内置函数都是用C++编译的。
Hadley Wickham在Advanced R中,具体说明了C++可以做哪些比较重的工作。
大力水手 C++-
R语言本身可以通过向量化编程处理loop循环,但如果迭代之间的结果相互依赖,那么用C++处理比较好。
-
递归函数,或涉及数百万次调用函数的问题。在C++里调用函数的开销比R低很多。
-
C++中有一些先进的数据结构和算法是R语言中所没有的,所以值得借鉴。
除了Rcpp之外,还有很多“EXTENDING R”的工具。Dirk Eddelbuettel 在今年4月的讲座里列举了很多。
例如,John Chambers 在2016年推出了XR工具,这款工具提供了一个新的R语言对接其他语言的接口框架,同时还推出了基于XR的XRPython和XRJulia。不过,可能是推出的时间不久,关注度不高。另外,这种工具不太依赖R自身的语法,很大程度依赖其他语言(例如python或Julia)的语法,所以使用rmarkdown可能更加方便一些。
还有一些比较专业化的工具。例如reticulate,用于调用深度学习工具tensorflow和keras的Python库。不过,tensorflow和keras都已经推出了支持R的接口,而且还挺好用的。reticulate在另外一些领域的扩张,值得关注一下,如下图所示。其中,greta是深度概率编程工具,spacyr是用来做自然语言处理的,h2ogpu是以GPU计算单元的机器学习求解器,这些都比较高大上。reticulate是基于XRPython和Rcpp开发的。
reticulateDirk Eddelbuettel比较了Rcpp、JuliaCall、reticulate、原生R的计算速度,如下图所示。Rcpp是最快的,比原生R快了246.5倍,所以使用Rcpp是值得的。
Julia也是很快的!这里讲“扩张”还有一层意思。木心说,人类最自恋,因为人类喜欢照镜子。人类中最自恋的是哲学家,因为他们嫌镜子不够大,一定要以整个宇宙作为镜子。
所以说,鉴于宇宙不断膨胀的现实,我们保持一点扩张精神终究有些好处,不要把自己变成“坚不可摧的核桃”,那样我们就没什么镜子可照的了。
网友评论