用途:在 R 包中集成 C++ 代码以加速性能关键操作。适用情形包括:R 函数过慢且剖析确认瓶颈、需对接已有 C/C++ 库、实现适合编译代码的算法(循环、递归)、用 RcppArmadillo 做线性代数。
主要步骤与能力:
- 搭建基础设施。运行 usethis::use_rcpp(),它会创建 src/ 目录、在 DESCRIPTION 的 LinkingTo 与 Imports 中加入 Rcpp、生成含 @useDynLib 与 @importFrom Rcpp sourceCpp 的包级文档文件,并更新 .gitignore。若用 Armadillo 则运行 usethis::use_rcpp_armadillo()。失败时需手动创建 src/ 并在 DESCRIPTION 与包级文档中补上相应条目。
- 编写 C++ 函数。新建 src/my_function.cpp,使用 #include <Rcpp.h>,在函数签名上方单独一行写 // [[Rcpp::export]] 注解,配 roxygen 注释;Armadillo 版用 #include <RcppArmadillo.h> 并加 // [[Rcpp::depends(RcppArmadillo)]]。
- 生成导出。运行 Rcpp::compileAttributes() 与 devtools::document(),自动生成 R/RcppExports.R 与 src/RcppExports.cpp。
- 验证编译与测试。用 devtools::load_all() 编译加载,再用 testthat 编写测试,验证结果与等价 R 实现一致,并覆盖空向量、NA 等边界。
- 清理与构建忽略。创建 src/Makevars 设置编译标志,添加 cleanup 脚本并执行 chmod +x cleanup,在 .Rbuildignore 中排除 ^src/..o$、^src/..so$、^src/.*.dll$。
验证要求:load_all 无警告、结果正确、边界测试通过、R CMD check 无编译警告、RcppExports 已生成并提交。
常见陷阱:修改 C++ 后忘记重跑 compileAttributes;用 int 导致整数溢出(大数据建议用 double);误手动释放内存(Rcpp 类型自动管理);忽略 R 的 NA(用 NumericVector::is_na() 检查);使用平台相关特性(需在 Windows、macOS、Linux 测试);包级文档缺少 @useDynLib。
限制:文档未提供收费、价格或具体性能数字;平台与编译器依赖情况需自行按上述注意事项处理。