盒子
盒子

R, C++ and Rcpp

###Rcpp

1. 为什么使用Rcpp

R作为解释性的语言,缺点就是运行速度慢,特别是在有loop的时候。而编译性的语言在这方面有着自身的优势(先全部编译,然后链接,装载,以后就不用解释了,速度就相对较快)

2. Rcpp的两种植入方式

1).先编写一个cpp文件,然后再R语句中调用这个cpp文件中的函数


 photo Rcpp1_zpsdymstura.jpg

这里的cpp文件我们还是使用前面说过的mysweep方法来举例子,转mysweep ,需要注意的是,这里格式中一定要有// [[Rcpp::export]],感觉像是注释没有用,但是少了这句文件就运行不起来。

然后在R语言中如何引用这个函数呢?只需在R文件头加上 library(Rcpp) 和一句调用的语句 sourceCpp(mySweep_cpp.cpp),之后就可以在R中使用cpp函数mysweep_cpp 。关于从cpp到R的过程中数据类型的过度,这里有NumericMatrix,NumericVector等一些类型。很好实现两种语言的对接。

下面是纯R写的sweep函数

2

比较两中编写方式的速度:

 photo Rcpp4_zpsm6w4uybs.jpg

得到的结果为:

 photo Rcpp2_zpssy7tmtra.jpg

可见使用Rcpp能很明显提高loop的速度!

2). 不写cpp文件,直接在R语言中加入cpp语句

和上面的区别不大,但是就是只能在一个cppFunction中定义一个cppfunction。

 photo Rcpp5_zpswitzp13c.jpg