1. 程式人生 > >Rcpp實現R與C++的無縫連線

Rcpp實現R與C++的無縫連線

         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格式是固定的,改了後會報錯~