r語言rcpp 無法載入 R從 R 到 Rcpp

2021-10-12 18:06:41 字數 1785 閱讀 9869

參考圖書:《rcpp:r 與 c++ 的無縫整合》

rcpp 的主要目的在於使得開發 r 語言的 c++ 相關拓展變得更加容易、更少出錯。

我們首先從斐波那契數列問題開始探索 rcpp。

該問題是乙個遞迴問題,首兩項為 0 和 1,而後面每一項為前兩項之和。

c++ 實現,直接根據定義進行實現:

int fibonacci(const int x) 

r 通過.call()可以在 r 和 c++ 之間傳遞物件。該函式使用的變數必須是指向 s 表示式的指標(簡稱 ***p),這需要新建乙個封裝器:

aswrap是 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...