Rcpp在R语言中实现C++与R的交互

2021-03-11 15:09:24 浏览数 (1)

R语言为其他的语言提供了很多接口,其中最最高级的接口就是C /C。今天就给大家介绍下在R中如何直接调用C 的函数进行数据的计算。在这里需要用到的包是Rcpp。此工具包中有四个核心的包:RcppArmadillo使得线性代数的引入语法更加接近matlab;RcppEigen 高优化的线性代数计算;RInside实现在C 中调用R代码;RcppParallel基于Rcpp实现计算的并行运算。我们首先看下包的安装:

代码语言:javascript复制
install.packages('Rcpp')
install.packages("inline")

接下来我们看下C 与R进行数据交互的共有数据格式及其函数名称:

代码语言:javascript复制
向量:NumericVector、IntegerVector、CharacterVector
矩阵:NumericMatrix、IntegerMatrix、CharacterMatrix
数据框:DataFrame
列表:List
函数:Function
其他类型:Environment, ComplexVector, RawVector,DottedPair, Language, Promise, Symbol, WeakReference

我们看下Rcpp中数学运算及处理函数:

代码语言:javascript复制
数学函数: abs(), acos(), asin(), atan(),beta(), ceil(), ceiling(), choose(), cos(), cosh(), digamma(), exp(), expm1(),factorial(), floor(), gamma(), lbeta(), lchoose(), lfactorial(), lgamma(),log(), log10(), log1p(), pentagamma(), psigamma(), round(), signif(), sin(),sinh(), sqrt(), tan(), tanh(), tetragamma(), trigamma(), trunc().
汇总函数: mean(), min(), max(), sum(), sd(),and (for vectors) var()
返回向量的汇总函数: cumsum(), diff(), pmin(), andpmax()
查找函数: match(), self_match(), which_max(),which_min()
重复值处理函数: duplicated(), unique()

接下来我们看下如何构建一个可以被Rcpp识别的C 文件,我们可以直接在Rstudio中进行构建,构建结果如下:

在构建好C 文件后,我们可以通过Rcpp自带的sourceCpp将C 文件引入R语言之后其函数就可以像R中的函数一样直接被调用。

当然,我们可以自己根据自己的需要对函数进行改写,函数的书写格式如下:

那么,在R包中我们需要怎么去调用C 呢,那就需要构建对应的代码,引入所需要的库文件。

首先,我们需要在Rstudio中构建包含Rcpp 的R包的框架,具体,可以自己操作下,都是可视化的点呀点。构建好后,如下的文件结构:

另外需要运行Rcpp.package.skeleton()为DESCRIPTION文件添加Rcpp导入或者自己收到添加。

在NAMESPACE中需要添加importFrom(Rcpp,evalCpp)引入Rcpp环境。

至此,基础的Rcpp调用前期准备工作就完成了,接下来就是如何在R中进行调用。

就是.Call(‘函数名’,对应的参数)。直接看下实例就是:

代码语言:javascript复制
timesTwo <- function(x) {
 .Call(`_RCF_timesTwo`, x)##此处为反斜点,不是单引号
}
 

当然,有时候我们需要引入外部的库文件以及头文件,那就需要书写Makevars进行库的引入,一般我们会放在inst/include,文件中需要加入下面的代码:

代码语言:javascript复制
PKG_CPPFLAGS = -I ../inst/include

至此,Rcpp的基础应用已经介绍完了,当然在知道基本的原理后,再加入更深的功能或者需求就是看个人对C 的熟悉程度了。

0 人点赞