R语言中cpp扩展支持Rcpp模块的示例分析

49次阅读
没有评论

共计 3137 个字符,预计需要花费 8 分钟才能阅读完成。

这期内容当中丸趣 TV 小编将会给大家带来有关 R 语言中 cpp 扩展支持 Rcpp 模块的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

概述

 Rcpp 包提供 C ++ 类方便 C or C++ 代码与 R 软件包进行交互,使用 R 中提供的.Call() 调用界面。Rcpp 提供 R 中的基础数据类型的 C ++ 类供访问。包作者可以保持 R 的数据结构而无需与 C ++ 进行不断的转换。同时,这些数据结构提供 C ++ 级别的存取。数据类型可以双向映射。可以从 R 中把数据赋给 C ++, 返回数据从 C ++ 到 R 也完全一样。下面列出支持的数据类型。

Transfer from R to C++, and from C++ to R

R 数据类型 (SEXP) 与 C ++ 对象是一致的,按照类的衍生关系。所有的 R 类型都支持 (vectors, functions, environment, etc …) 并且每一种对对应到 C ++ 的类对象。例如, numeric vectors 代表类 Rcpp::NumericVector 的实例, environments 代表 Rcpp::Environment, functions 代表 Rcpp::Function, 等等 … 相应的 C++ 库都提供 Rcpp::wrap 函数,该函数是一个模版函数负责把数据转换为 SEXP。

这个机制让使用标准 C ++ 类型实现 C ++ 的逻辑变得非常直接,比如使用 STL 编程然后包装为 SEXP 返回到 R 中。内部的封装操作使用高级元编程技术,目前支持的数据类型包括:bool, int, double, size_t, Rbyte, Rcomplex, std::string, STL containers (e.g std::vector) 中 T 可封装 , STL maps (e.g std::map) 中 T 可封装, 支持的隐含转换的任意的类型到 SEXP。反向转换 (从 R 到 C ++) 通过 Rcpp::as 函数模版进行。

New features

0.7.1 开始, 提供了命名空间 Rcpp。包含主要类 RObject,其他类都是从中继承而来,处理跟环境 (ENVSXP)相关的操作 , Language 语言 (LANGSXP) 和模版 XPTr 操作外部指针.

0.7.2 和后续版本扩展了这些特征,支持其他的 R 类型实现自动转换,更聪明地使用模版。

0.8.1 加入的支持使用 modules 直接暴露 C ++ 代码给 R。对应的 Rcpp-modules 描述更多的细节。

0.8.3 加入 sugar: 表达式模版,允许像 R 中的紧凑矢量化的表达式但是以编译速度实现,详情查看 Rcpp-sugar。

0.8.6 特殊函数 cherished for statistics: d/p/q/r-style for most relevant distribution, in a form that is very close to what we d use in R.

0.8.7 加入 ReferenceClasses 支持 in R 2.12.0; 将 S4-based ReferenceClasses in the OO-style of Java or C++ 到 R 语言中。0.9.0 分离 legacy classic API 到 RcppClassic.。

0.10.0 带来 Rcpp attributes, enhanced modules support and more.。

0.11.0 带来简化的 builds for packages using Rcpp,不再需要 link。

Inline use

0.7.0, Rcpp 包含修改的 cfunction,从卓越的 inline package 而来,该包由 Oleg Sklyar 开发。这允许用户定义 body of a C++ function 像 标准的 R character vector — which is passed to cfunction along with a few other parameters. 该函数然后 builds 完整的 C ++ 源文件 — 然后编译, 链接和载入。这让 Rcpp interface classes 实现 R 到 C++ 非常容易 — 任何人都可以直接从 R 提示符操作而不需要 Makefiles, configuration settings 等等。

0.8.1, 扩展函数 cxxfunction 被采用 (要求 inline 0.3.5)。该函数使得在 Rcpp 中使用 C ++ 更容易。特殊地,这个强制使用 .Call interface, 加上 Rcpp 名称空间, 并且设置 exception forwarding。采用 macros BEGIN_RCPP 和 END_RCPP 封闭 user code。

更多的, 通过 cfunction (and cxxfunction), 我们甚至能 call external libraries 然后 linked。

有几个例包含在包中; 其中一个已被发表到 blog.

这个可以工作在 Windows,如果有 R tools 和 R 安装并能工作。查看 R -on-Windows FAQ 和其他文档。

0.10.0, Rcpp attributes 完成,这个比 inline 更为强大和易用 — 查看 Rcpp attributes 获取细节信息。

Unit testing

在版本 0.11.5, 超过 470 单元测试函数调用 928 个单元测试确保 API 兼容性。单元测试同时也是适用的的例子。A vignette is auto-generated with the results of the unit tests.

Usage for package building

Rcpp 提供主要的头文件 Rcpp.h 和 library,在安装包目录的 lib 中。在 R 中, 计算目录位置通过 system.file(lib , Rcpp.h , package= Rcpp)– 但同时提供通过函数 Rcpp::RcppCxxFlags()and Rcpp::RcppLdFlags()。因此可以调用像下面的形式 src/Makevars (or src/Makevars.win on Windows)

PKG_CXXFLAGS=`${R_HOME}/bin/Rscript -e  Rcpp:::CxxFlags() `
PKG_LIBS=`${R_HOME}/bin/Rscript -e  Rcpp:::LdFlags() `

查看 Rcpp-package 了解细节。并注意从 0.8.0 版本开始,LinkingTo 参数可以在 Rcpp 的包中使用。这让 R 可以确定头文件的位置,并且用户只需要使用 Rcpp::RcppLdFlags() (as detailed above) 指向实际的库

这显然是值得推荐的方法。此外,我们还添加了关于如何在包中使用 Rcpp 的完整小插曲,并进行了详细讨论。还请注意,RCPP 属性的小插曲详细说明了另一种方法。

Rcpp 手册

图书无缝 R 和 C ++ 集成与 Rcpp(Spriger-2013)为 Rcpp 提供了完整和完整的文档,以及许多示例。这里有更多信息。这本书可以直接从斯普林格拉斯、亚马逊和其他书商那里订购。

Rcpp 画廊

Rcpp 图库为 Rcpp 重新整理了 50 多篇文章和示例。它对用户贡献是开放的。

演示包

RcppExamples 包(在 CRAN 上)提供了如何使用 Rcpp 的简单说明,还可以用作部署 Rcpp 的框架。然而,这个包在示例方面有些不完整,因此请参见下面几十个使用 Rcpp 的包提供的示例。

类文档

我们现在有了 Doxygen 生成的所有类的文档,这些类在可浏览和可搜索的 htmland 中作为 apdf 文件。我们不再在源 tarball 中包含 Doxygen 生成的文档,因为它太大了。但我们有 HTML、latex 和 MAN 文档的 zip 存档。

上述就是丸趣 TV 小编为大家分享的 R 语言中 cpp 扩展支持 Rcpp 模块的示例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计3137字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)