參考圖書:《rcpp:r 與 c++ 的無縫整合》
rcpp 的主要目的在於使得開發 r 語言的 c++ 相關拓展變得更加容易、更少出錯。
我們首先從斐波那契數列問題開始探索 rcpp。
該問題是乙個遞迴問題,首兩項為 0 和 1,而後面每一項為前兩項之和。
c++ 實現,直接根據定義進行實現:
int fibonacci(const int x)
r 通過.call()
可以在 r 和 c++ 之間傳遞物件。該函式使用的變數必須是指向 s 表示式的指標(簡稱 ***p),這需要新建乙個封裝器:
as
和wrap
是 rcpp 很重要的兩個轉換函式,這裡as
將輸入引數xs
由 r 輸入的 ***p 型別轉換為整型,而wrap
將 c++ 得到的整型結果封裝為 ***p 型別,從而可以使得這個建立的函式可以被.call()
呼叫,完成 c++ 的計算與輸入輸出的相互傳遞。
在寫好上述兩個函式後,後面的工作就是編譯函式,生成所謂的「共享庫」,這樣 r 就可以載入和呼叫它。編譯、鏈結和載入是乙個純粹的體力活,幸好,工具包 inline 可以幫助我們完成這 3 個步驟。
❝inline 包通過提供乙個涵蓋編譯、鏈結、載入三個步驟的完整封裝器,因而程式設計師可以集中精力在真正工作的**上(c、c++ 和 fortran 三者之一),而忽略針對不同作業系統特定的編譯、鏈結、載入細節。
❞
cxxfunction()
是乙個單一入口,可以將文字變數傳入的**轉換為可執行的函式!
cxxcode "
int fibonacci(const int x)
"library(inline)
fibrcpp "int"),
plugin = "rcpp",
includes = cxxcode,
body = "
int x = rcpp::as(xs);
return rcpp::wrap(fibonacci(x));")
這樣fibrcpp()
就可以在 r 中呼叫了。
在後續版本的 inline 包中,它通過引入 c++ 的 「attributes」 特性進一步對上述過程進行簡化,自動完成變數的型別轉換等工作。
在fibonacci.cpp
中寫入如下內容:
#include
using namespace rcpp;
// [[rcpp::export]]
int fibonacci(const int x)
這裡在函式的定義前通過注釋行新增了[[rcpp::export]]
這個屬性,然後該**即可通過sourcecpp()
進行呼叫。
sourcecpp("fibonacci.cpp)
fibonacci(20)
可以看到,通過 r 呼叫 c++ 簡化到了僅僅新增一些必要的標頭檔案和屬性資訊即可,不需要改動工作**本身。當然,強大的 rcpp 不僅僅如此,它還提供了諸多的與 r 互動的資料型別,後續再學習分享。
R語言 理解R效能
通過了解限制r計算效能的因素,從而更好的利用起r的效能,影響r的因素 cpu,ram,磁碟i o,演算法。所以,當資料量小時,計算複雜度高,會受到cpu影響。資料量大時,會受到磁碟i o還有ram的影響。r是解釋型語句,即每次執行r程式的時候,r 需要重新解釋翻譯成機器 即使 不變。因為每次執行時,...
R 提高R語言速度
前言 r語言在聚類中應用廣泛,所以我義無反顧的選擇它。但實驗室就我1個人用,網上資料也很少。是時候針對走過的彎路和曾有過的探索,總結一番。1.參考 r語言程式設計藝術 norman matloff chapter 14 chapter 15 2.方法 1 向量化 與非向量化 迴圈做個對比 2 r中呼...
r語言安裝r包
cran,bioconductor還有github。bioconductor一般都是生物資訊方面的r包。github是 的託管平台,很多軟體,多種語言的程式包也都在這裡發布。install.packages dyplr 注意 更改映象 options repos c cran options bio...