Rcpp實現R與C++的無縫連線
阿新 • • 發佈:2019-01-03
R的for迴圈非常慢,當看見這句話時:Thanks to the abstractions provided by Rcpp, the code implementing gibbs in C++ is nearly identical to the code you’d write in R, but runs 20 times faster.採用Rcpp實現R和C++的無縫連線是非常有必要的,至少從效率上講。下面簡單的介紹下我的初步成果:
首先在R裡面安裝包Rcpp:install.packages('Rcpp')
然後編寫自己的c++檔案,假設在Rstudio裡面編寫c/c++ script 如下:一個簡單的迴圈輸出迴圈變數程式
指令碼輸出:#include <Rcpp.h>//必須的標頭檔案 using namespace Rcpp; // [[Rcpp::export]] void gibbs(int N, int thin) { for(int i = 0; i < N; i++) { for(int j = 0; j < thin; j++) { std::cout<<i<<" "<<j<<std::endl;//可以在前面using namespace std; } } //return(N);//可以定義返回值和函式返回值相同然 } //下面是R指令碼程式 /*** R #格式非得這樣:/*** R gibbs(3,1) */
0 0 1 0 2 0
假設上面的程式儲存為test.cpp,然後在R裡先載入包library(Rcpp),載在R裡執行命令:sourceCpp("test.cpp") 就會有輸出結果了,注意這裡假設test.cpp位於R的工作目錄下,若不在R的工作目錄下可以在test.cpp前加上路徑,如:sourceCpp("../../../test.cpp")。
若是在Rstudio裡面的話還有個更簡單的方法:在視窗內寫c/c++ script後同時按:ctrl+shift+enter後會自動執行指令碼。
這裡只是編寫的c/c++程式為什麼會有輸出呢?這是因為test.cpp的最後幾句:/*** R 後那幾句是R指令碼程式,這裡相當於執行gibbs(3,1)函式,那個/*** R格式是固定的,改了後會報錯~