簡體   English   中英

R代碼使用.cpp文件中的函數,基於Rcpp包

[英]R code to use a function from .cpp file, based on Rcpp package

我對如何使用Rcpp包感到困惑。 在保存以下.cpp代碼之后,使用newRcppVectorExample的R函數的R代碼是什么,例如example.cpp? 代碼來自http://dirk.eddelbuettel.com/code/rcpp.examples.html

我必須創建一個包嗎? 我可以直接使用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
}

您可能希望花一些時間閱讀文檔,包括R本身(即編寫R擴展 )和Rcpp,您可以從Rcpp介紹插圖(也是我們的統計軟件期刊論文 )開始。

簡而言之,可以通過.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 ++函數的第一個參數一起使用,后跟一組參數和一個指向找到共享庫的包的最終參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM