温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-11-22 10:55:30 来源:亿速云 阅读:130 作者:柒染 栏目:云计算

这期内容当中小编将会给大家带来有关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存档。

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI