溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

R語(yǔ)言中cpp擴(kuò)展支持Rcpp模塊的示例分析

發(fā)布時(shí)間:2021-11-22 10:55:30 來(lái)源:億速云 閱讀:119 作者:柒染 欄目:云計(jì)算

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)R語(yǔ)言中cpp擴(kuò)展支持Rcpp模塊的示例分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

概述

    Rcpp包提供C++類方便C or C++代碼與R軟件包進(jìn)行交互,使用R中提供的.Call() 調(diào)用界面。 Rcpp提供R中的基礎(chǔ)數(shù)據(jù)類型的C++類供訪問(wèn)。包作者可以保持R的數(shù)據(jù)結(jié)構(gòu)而無(wú)需與C++進(jìn)行不斷的轉(zhuǎn)換。同時(shí),這些數(shù)據(jù)結(jié)構(gòu)提供C++級(jí)別的存取。數(shù)據(jù)類型可以雙向映射??梢詮?R中把數(shù)據(jù)賦給C++, 返回?cái)?shù)據(jù)從C++到R也完全一樣。下面列出支持的數(shù)據(jù)類型。

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

R 數(shù)據(jù)類型 (SEXP) 與C++對(duì)象是一致的,按照類的衍生關(guān)系。所有的R類型都支持 (vectors, functions, environment, etc ...) 并且每一種對(duì)對(duì)應(yīng)到C++的類對(duì)象。例如, numeric vectors代表類Rcpp::NumericVector的實(shí)例, environments代表Rcpp::Environment, functions代表Rcpp::Function,等等... 相應(yīng)的 C++庫(kù)都提供Rcpp::wrap函數(shù),該函數(shù)是一個(gè)模版函數(shù)負(fù)責(zé)把數(shù)據(jù)轉(zhuǎn)換為SEXP。

這個(gè)機(jī)制讓使用標(biāo)準(zhǔn)C++類型實(shí)現(xiàn)C++的邏輯變得非常直接,比如使用STL編程然后包裝為SEXP返回到R中。內(nèi)部的封裝操作使用高級(jí)元編程技術(shù),目前支持的數(shù)據(jù)類型包括:bool, int, double, size_t, Rbyte, Rcomplex, std::string, STL containers (e.g std::vector) 中T可封裝 , STL maps (e.g std::map) 中T可封裝, 支持的隱含轉(zhuǎn)換的任意的類型到SEXP。反向轉(zhuǎn)換(從R到C++)通過(guò)Rcpp::as函數(shù)模版進(jìn)行。

New features

0.7.1開(kāi)始, 提供了命名空間Rcpp。包含主要類 RObject,其他類都是從中繼承而來(lái),處理跟環(huán)境 (ENVSXP)相關(guān)的操作 , "Language" 語(yǔ)言 (LANGSXP) 和模版 XPTr 操作外部指針.

0.7.2和后續(xù)版本擴(kuò)展了這些特征,支持其他的 R 類型實(shí)現(xiàn)自動(dòng)轉(zhuǎn)換,更聰明地使用模版。

0.8.1加入的支持使用modules直接暴露C++代碼給R。對(duì)應(yīng)的 Rcpp-modules描述更多的細(xì)節(jié)。

0.8.3 加入 sugar: 表達(dá)式模版,允許像R中的緊湊矢量化的表達(dá)式但是以編譯速度實(shí)現(xiàn),詳情查看 Rcpp-sugar。

0.8.6 特殊函數(shù)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語(yǔ)言中。 0.9.0分離legacy classic API 到 RcppClassic.。

0.10.0 帶來(lái) Rcpp attributes, enhanced modules support and more.。

0.11.0 帶來(lái)簡(jiǎn)化的builds for packages using Rcpp,不再需要link。

Inline use

0.7.0, Rcpp 包含修改的 'cfunction',從卓越的 'inline' package 而來(lái),該包由Oleg Sklyar開(kāi)發(fā)。這允許用戶定義body of a C++ function 像 標(biāo)準(zhǔn)的R character vector -- which is passed to 'cfunction' along with a few other parameters. 該函數(shù)然后builds完整的C++ 源文件 --- 然后編譯,鏈接和載入。這讓Rcpp interface classes實(shí)現(xiàn)R到 C++非常容易 ---任何人都可以直接從R提示符操作而不需要Makefiles, configuration settings等等。

0.8.1, 擴(kuò)展函數(shù) 'cxxfunction'被采用 (要求inline 0.3.5)。該函數(shù)使得在Rcpp中使用C++更容易。特殊地,這個(gè)強(qiáng)制使用 .Call interface, 加上Rcpp 名稱空間, 并且設(shè)置exception forwarding。采用 macros BEGIN_RCPP 和 END_RCPP封閉user code。

更多的, 通過(guò) cfunction (and cxxfunction), 我們甚至能call external libraries然后linked。

有幾個(gè)例包含在包中; 其中一個(gè)已被發(fā)表到blog.

這個(gè)可以工作在Windows,如果有 'R tools' 和 R安裝并能工作。查看R-on-Windows FAQ和其他文檔。

0.10.0, Rcpp attributes完成,這個(gè)比 inline更為強(qiáng)大和易用 --- 查看Rcpp attributes獲取細(xì)節(jié)信息。

Unit testing

在版本0.11.5,超過(guò)470 單元測(cè)試函數(shù)調(diào)用928個(gè)單元測(cè)試確保API兼容性。單元測(cè)試同時(shí)也是適用的的例子。 A vignette is auto-generated with the results of the unit tests.

Usage for package building

Rcpp 提供主要的頭文件 Rcpp.h 和 library,在安裝包目錄的 lib中。在R中,計(jì)算目錄位置通過(guò)system.file("lib", "Rcpp.h", package="Rcpp")--但同時(shí)提供通過(guò)函數(shù) Rcpp::RcppCxxFlags()and Rcpp::RcppLdFlags() 。因此可以調(diào)用像下面的形式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 了解細(xì)節(jié)。并注意從0.8.0版本開(kāi)始,'LinkingTo' 參數(shù)可以在 Rcpp的包中使用。 這讓 R 可以確定頭文件的位置,并且用戶只需要使用Rcpp::RcppLdFlags() (as detailed above) 指向?qū)嶋H的庫(kù)

這顯然是值得推薦的方法。此外,我們還添加了關(guān)于如何在包中使用Rcpp的完整小插曲,并進(jìn)行了詳細(xì)討論。還請(qǐng)注意,RCPP屬性的小插曲詳細(xì)說(shuō)明了另一種方法。

Rcpp手冊(cè)

圖書無(wú)縫R和C++集成與Rcpp(Spriger-2013)為Rcpp提供了完整和完整的文檔,以及許多示例。這里有更多信息。這本書可以直接從斯普林格拉斯、亞馬遜和其他書商那里訂購(gòu)。

Rcpp畫廊

Rcpp圖庫(kù)為Rcpp重新整理了50多篇文章和示例。它對(duì)用戶貢獻(xiàn)是開(kāi)放的。

演示包

RcppExamples包(在CRAN上)提供了如何使用Rcpp的簡(jiǎn)單說(shuō)明,還可以用作部署Rcpp的框架。然而,這個(gè)包在示例方面有些不完整,因此請(qǐng)參見(jiàn)下面幾十個(gè)使用Rcpp的包提供的示例。

類文檔

我們現(xiàn)在有了Doxygen生成的所有類的文檔,這些類在可瀏覽和可搜索的htmland中作為apdf文件。我們不再在源tarball中包含Doxygen生成的文檔,因?yàn)樗罅?。但我們有HTML、latex和MAN文檔的zip存檔。

上述就是小編為大家分享的R語(yǔ)言中cpp擴(kuò)展支持Rcpp模塊的示例分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI