2012-09-22 68 views
0

我對如何使用Rcpp包感到困惑。在保存以下.cpp代碼之後,什麼是使用newRcppVectorExample的R函數的R代碼,example.cpp表示?代碼是從http://dirk.eddelbuettel.com/code/rcpp.examples.htmlR代碼使用.cpp文件中的函數,基於Rcpp包

我需要創建一個包嗎?我可以直接使用example.cpp嗎?例如R CMD SHLIB example.cpp,然後使用dyn.load函數。

#include <RcppClassic.h> 
#include <cmath> 

RcppExport SEXP newRcppVectorExample(SEXP vector) { 
BEGIN_RCPP 

Rcpp::NumericVector orig(vector);       
Rcpp::NumericVector vec(orig.size());     

std::transform(orig.begin(), orig.end(), vec.begin(), ::sqrt); 

return Rcpp::List::create(Rcpp::Named("result") = vec, 
          Rcpp::Named("original") = orig) ; 

END_RCPP 
} 

回答

2

您可能需要花一些時間與文檔,無論是對R本身(即Writing R Extensions)和RCPP在那裏你可以與RCPP介紹小品開始(這也是我們Journal of Statistical Software paper)。

簡而言之,通過.Call()函數擴展R,該函數可以訪問通過程序包加載的編譯代碼,或者通過dyn.load()。但是,我在這裏重複那些材料沒什麼意義。

編輯:的,而且是你找到了你的RcppExamples包裝顯示的例子,這裏是它是如何被稱爲在同一個包:

RcppVectorExample <- function(vec=seq(1,9)^2, api=c("classic", "new")) { 

    api <- match.arg(api)    # match to classic or new 
    fun <- paste(api, "RcppVectorExample", sep="") 

    ## Make the call... 
    val <- .Call(fun,     # either new or classic 
       vec, 
       PACKAGE="RcppExamples") 

    val 
} 

這是稍微複雜得多,通常是因爲我們可以調用舊的和不推薦使用的API(但仍由RcppClassic程序包提供)或新API(您爲其選擇代碼)的示例。

關鍵是.Call()與名爲C++函數的第一個參數一起使用,後跟一組參數,最後一個參數指向找到共享庫的包。

相關問題