新版本参见 http://blog.sciencenet.cn/home.php?mod=space&uid=255662&do=blog&id=835970
注: 本文需要读者了解:
- R函数的基本知识
- 编写R程序包
- C++的基础知识, 包括 类, 以及namespace等。
为什么要用R调用C++函数? 原因可能有以下几点:
R开发虽然很快, 涉及到一些循环的时候, 执行效率却常常相当于C++的1/100,甚至更慢
C++中有一些已经开发好的库, 人们不希望再重写一遍R的代码。 而是最好通过编译之后直接调用。
Rcpp程序包为用R调用C++代码提供了方便。
用户直接在R的源代码src文件夹下加入cpp和h文件, rtools即可对C++文件进行编译。 但是为了从R的console能够直接调用cpp写的函数, 还必须对cpp的函数进行修改。
修改需要遵循以下原则:
- 所有从R输入到cpp的对象, 都是SEXP
- 从cpp返回到R的对象也必须是SEXP
- C++中, 返回值如为数值, 可以用wrap()帮忙, 直接返回为SEXP的对象, 实现R的调用
换句话说, 只有加了SEXP这样一个标签,C++函数在 R和C++中才都能识别。 Rcpp提供了SEXP处理的响应的类, 使得两者之间的数据传输变得容易。
以下是用R调用C++的一个简单例子:
如果在windows中要使用Rcpp, 则需要
安装Rcpp程序包,install.packages(“Rcpp”)
安装Rtools, 并配制好启动路径。电脑>属性>高级系统设置>高级>环境变量>系统变量>路径
在R console 中运行 library(Rcpp) , 之后调用 Rcpp.package.skeleton函数,
1 | Rcpp.package.skeleton( "test" ) |
在生成的R包 skeleton中, 可以找到rcpp_hello_world.cpp文件, 可以尝试添加几个函数, 修改成如下样式 (注意以下代码为C++文件,扩展名为cpp):
1 | ////////////////////// C++文件开始////////////////// |
对R程序包test的骨架进行修改后, 即可开始安装,
在windows下, 在 开始, cmd, 输入 Rcmd INSTALL test, 安装test程序包
之后转入 R console, library(test)
即可加载响应的动态链接库dll文件。 只是此时调用dll中的文件, 还稍微有些不方便。 此时调用dll中函数的方法如下
1 | .Call('Eccentricity', JD= 2314543) |
不过每次使用.Call函数, 仍然让人觉得不太满意。为了需要写一个R的wrapper function例如
1 | expfunR <- function(x){ |
调用方式同R函数,
1 | expfunR(2) |
这时候就和一般的R函数没有区别了。