Seamless R and C++ Integration
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 2 个月前 | ||
| 4 个月前 | ||
| 1 个月前 | ||
| 7 年前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 8 个月前 | ||
| 2 个月前 | ||
| 2 年前 | ||
| 11 年前 | ||
| 7 个月前 | ||
| 8 年前 | ||
| 6 年前 | ||
| 2 年前 | ||
| 1 个月前 | ||
| 7 个月前 | ||
| 1 个月前 | ||
| 9 年前 | ||
| 9 个月前 | ||
| 1 个月前 | ||
| 9 年前 | ||
| 11 年前 | ||
| 8 个月前 | ||
| 15 年前 |
Rcpp:R与C++的无缝集成
概述
Rcpp 包 通过 R 函数和一个(仅头文件的)C++ 库实现了 R 与 C++ 的集成。
所有底层 R 类型和对象,即 R 内部由 SEXP 表示的一切,都与相应的 C++ 对象相匹配。这包括从向量、矩阵或列表到环境、函数等各种内容。每种 SEXP 变体都自动映射到一个专用的 C++ 类。例如,数值向量表示为 Rcpp::NumericVector 类的实例,环境表示为 Rcpp::Environment 的实例,函数表示为 Rcpp::Function 等。Rcpp-introduction 小手册(现已发表为 TAS 论文;早期的介绍 Rcpp-jss-2011.pdf 也发表为 JSS 论文)为 Rcpp 提供了良好的入门点,Rcpp 网站、Rcpp 页面 和 Rcpp 示例库 也是如此。完整文档由 Rcpp 书籍 提供。
其他亮点:
-
C++ 与 R 之间的转换由模板
Rcpp::wrap和Rcpp::as驱动,它们具有高度的灵活性和可扩展性,如 Rcpp-extending 小手册中所述。 -
Rcpp 还提供了 Rcpp 模块,这是一个允许将 C++ 函数和类暴露到 R 层面的框架。Rcpp-modules 小手册详细介绍了 Rcpp 模块当前的功能集。
-
Rcpp 包含一个称为 Rcpp sugar 的概念,它将许多 R 函数引入 C++。Sugar 利用惰性计算和表达式模板来实现出色的性能,同时提供比等效的底层循环代码更易用的语法。Rcpp-sugar 小手册对该功能进行了概述。
-
Rcpp 属性提供了一种高级语法,用于声明可从 R 调用的 C++ 函数,并自动生成调用它们所需的代码。属性旨在促进在 R 会话中交互式使用 C++ 以及支持 R 包开发。属性构建在 Rcpp 模块之上,其实现基于 inline 包中的先前工作。有关更多详细信息,请参见 Rcpp-attributes 小手册。
文档说明
该软件包附带十个 PDF vignettes,其中包括最新的 Rcpp 介绍,现已作为一篇论文发表于 TAS(并作为 PeerJ 预印本发布)。此外,还有一篇早期介绍,该介绍已作为JSS 论文发表。
其他 vignettes 包括 Rcpp 常见问题解答 和 Rcpp 属性介绍。更多文档可参考 Eddelbuettel 所著的 Rcpp 书籍(2013 年,Springer 出版);有关详细信息,请参见 'citation("Rcpp")'。
C++ 类结构文档(由 doxygen 生成)也已提供。
性能
Rcpp 遵循 C++ 的“按需付费”理念,不会带来任何运行时性能损失:在直接对比中,Rcpp 的性能优于相关软件包,例如,详情可参见 此代码库。
编译时性能可通过选择组件进行调整。但值得注意的是,使用 ccache 将(显著)优于所有此类组件选择,我们之前曾推荐过使用它。
示例
Rcpp 示例库展示了超过一百个完整记录且可运行的示例。RcppExamples 软件包包含一些涵盖核心数据类型的基本示例。
软件包中包含多个示例,以及超过一千个单元测试,这些测试提供了额外的使用示例。
Rcpp 的早期版本(包含我们现在称为“经典 Rcpp API”的内容)由 Dominick Samperi 于 2005 年和 2006 年编写。此代码已从 Rcpp 中分离出来,形成 RcppClassic 软件包,对于依赖旧接口的代码,该软件包仍然可用。新开发应始终使用此 Rcpp 软件包。
其他使用示例由使用 Rcpp 的软件包提供。截至 2025 年 7 月初,有 3043 个 CRAN 软件包使用 Rcpp(占所有软件包的 13.6%,占包含编译代码的软件包的 61.3%),在当前版本的 BioConductor 中还有 271 个软件包,以及数量未知的 GitHub、Bitbucket、R-Forge 等代码库使用 Rcpp。所有这些软件包都为 Rcpp 提供了使用示例。该软件包已被广泛使用,下载次数超过 1.006 亿次(根据 CRAN 云镜像的部分日志)。
安装
CRAN
CRAN 上发布的 Rcpp 经过了仔细的测试和筛选。CRAN 确保它们能在所有测试环境中与其他所有 CRAN 包进行互操作。这些已发布并经过测试的版本可通过 CRAN 网络的所有镜像获取,并且可以在 R 中通过以下方式安装
install.packages("Rcpp")
发布候选版本
我们通常会通过 r-universe 页面 提供临时的 候选 版本。该页面提供了一个标准的 R 仓库,对应于源代码仓库中当前的 main 分支。二进制版本和源代码版本都可以通过以下方式安装:
install.packages("Rcpp", repos = c("https://rcppcore.r-universe.dev",
"https://cloud.r-project.org"))
可根据需要设置其他仓库。
在正式发布前测试候选版本会有所帮助。如果可以,请运行此测试。
源代码
要从源代码安装,请确保您拥有 R 的完整软件包开发环境,相关文档中已对此进行讨论;另请参见 Rcpp-FAQ 中的问题 1.2 和 1.3。
不太常见的版本和平台
如果您希望在其他(未在 CRAN 上测试的)平台上运行 Rcpp,或者在早于上一版本的版本上运行,建议您进行应有的尽职调查并相应地进行测试。Rcpp 由全志愿团队提供支持,资源有限。我们努力测试 Rcpp 与数千个使用它的 CRAN 软件包的兼容性,但我们无法在过时的 R 版本或您的操作系统上进行测试。
支持
提问的最佳场所可能是 GitHub 仓库的 讨论区 或 R-forge 上的 rcpp-devel 邮件列表,该列表主要关注 使用 Rcpp 进行开发(而非 Rcpp 本身的开发,对此我们有另一个列表)。
GitHub 仓库的 问题工单 是主要的错误报告界面。与其他网络资源一样,也可以搜索以前的问题。
作者
Dirk Eddelbuettel、Romain Francois、JJ Allaire、Kevin Ushey、Qiang Kou、Nathan Russell、Iñaki Ucar、Doug Bates 和 John Chambers
许可证
GPL (>= 2)