2014-05-11 95 views
2

有一個類我必須移植到R.我已將它公開爲Rcpp模塊。但是,我還需要在R之外使用該類。我的意思是我想用谷歌測試來測試這個類。爲了編譯測試,類不得使用Rcpp中的任何內容。在Rcpp中暴露類 - 工廠而不是構造函數

不幸的是,創建該類實例的函數必須具有相當靈活的參數列表。我想使用命名參數,因爲會有許多參數可供您選擇指定。因爲這個原因,我不能聲明在R中有任何用法的構造函數。如果我可以定義一個可以作爲工廠方法執行的函數,那就沒問題。我做到了。

RcppExport SEXP CEC__new(SEXP args); 

RCPP_MODULE(cec) { 
    using namespace Rcpp; 
    class_<CEC>("cec") 
    .method("test", &CEC::test) 
    .method("loop", &CEC::loop) 
    .method("singleLoop", &CEC::singleLoop) 
    .method("entropy", &CEC::entropy) 
    ; 
} 
setClass("cec", representation(pointer = "externalptr")) 

setMethod("initialize", "cec", function(.Object, ...) { 
    [email protected] <- .Call("CEC__new", ...) 
    .Object 
}) 

的問題是,我不能把我創建實例的任何方法。看起來我必須在R中爲類定義'$'。我不想那樣做。我想利用漂亮,小巧的Rcpp模塊優惠。你能建議我如何解決這個問題?

回答

2

您可以使用.factory將免費函數註冊爲類的構造函數,但在這種情況下,該函數應返回指向CEC的指針。事情是這樣的:

CEC* CEC__new(SEXP args); 

RCPP_MODULE(cec) { 
    using namespace Rcpp; 
    class_<CEC>("cec") 
    .factory(CEC__new) 
    .method("test", &CEC::test) 
    .method("loop", &CEC::loop) 
    .method("singleLoop", &CEC::singleLoop) 
    .method("entropy", &CEC::entropy) 
    ; 
} 

或許:

.factory<SEXP>(CEC__new) 
相關問題