前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rcpp在R语言中实现C++与R的交互

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

作者头像
一粒沙
发布2021-03-11 15:09:24
2.8K0
发布2021-03-11 15:09:24
举报
文章被收录于专栏:R语言交流中心R语言交流中心

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++的熟悉程度了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言交流中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档