假设我们需要开发一个使用 Rcpp、RcppArmadillo 和 OPENMP 的 R 包,并且把 c++ 函数包装成 R 函数,我们需要准备以下文件:
toyPackage # 包名,也是根目录名
├── man # 文档目录,后续可以自动生成
├── src
│ ├── Makevars # OPENMP 的配置文件
│ ├── Makevars.win # Windows 的配置文件
│ └── code.cpp # 源代码文件
├── R # R 代码目录
│ └── code.R
├── DESCRIPTION # 包的描述文件
├── NAMESPACE # 包的命名空间,可以自己写
└── README.md # 包的说明文件我们用一个具体的例子来说明,假设我们希望计算一个
- 在
DESCRIPTION中添加包的描述信息(注意R包的命名规则) - 在
NAMESPACE中添加包的命名空间信息 - 在
src/code.cpp中编写c++函数 - 在
R/code.R中编写R函数调用c++函数
做好以后,在根目录下运行如下脚本:
R -e "Rcpp::compileAttributes()" # 编译 `c++` 函数
R -e "roxygen2::roxygenise()" # 生成 `man` 目录下的 `code.Rd` 文件关于 *.Rd 说明文件:如果实现了 Rcpp 函数 sum_matrix() 和 R 函数 sum.matrix(),并且后者调用前者实现,假如不希望导出 Rcpp 函数,也不希望导出 Rcpp 函数的说明文档,那么不要在 NAMESPACE 中导出 Rcpp 函数,也不要在 Rcpp 函数声明前加上 roxygen2 注释,只要 // [[Rcpp::export]] 注释即可。
这样就生成了 man 目录下的 code.Rd 文件,然后编译安装 R 包:
cd .. ; R CMD build toyPackage
R CMD check toyPackage_0.1.0.tar.gz
R CMD INSTALL toyPackage_0.1.0.tar.gz这样就安装好了 R 包,可以测试一下:
R -e "library(toyPackage) ; sum.matrix(matrix(1:10, 2, 5))"当提交到 GitHub 以后,可以通过 remotes::install_github 安装 R 包:
remotes::install_github("chia202/toyPackage")