2010-06-21 40 views
26

我正在寫一個Rcpp模塊,並希望返回RcppResultSet列表的一個元素列表,其元素是向量。例如,.Call("myfunc")$foo應該是這樣的:如何在Rcpp中創建一個向量列表?

[[1]] 
[1] 1 

[[2]] 
[1] 1 1 

[[3]] 
[1] 1 1 1 

(具體的數字是這裏並不重要)。問題是我不知道這樣做的正確Rcpp方式。我嘗試傳遞一個vector<vector<int> >,但是通過靜默地將第一個向量的長度作爲寬度(即使矩陣是粗糙的!)來構造矩陣。我試過構建一個RcppList,但很難安全地將各種物體(如RcppVector)鑄造成SEXP s。

任何人都有處理複雜結構(如Rcpp中的向量列表)的最佳實踐的提示?

回答

37

[很高興看到這裏,但羅曼和我一般建議rccp-devel名單的問題。請在那裏發帖,因爲這個項目還沒有那麼大,所以我們需要在整個網絡上散佈問題。 ]

RcppResultSet是老經典 API,而很多工作已經進入了我們所說的 API的一部分(從0.7。*版本)。看看目前的Rcpp page on CRAN和小插曲列表 - 六和數。

有了新的API,你會返回類似

return Rcpp::List::create(Rcpp::Named("vec") = someVector, 
          Rcpp::Named("lst") = someList, 
          Rcpp::Named("vec2") = someOtherVector); 

都在一個聲明中(也可能是使用顯式Rcpp::wrap()調用),創建於R這將是

list(vec=someVector, lst=someList, vec2=someOtherVector) 

而且Rcpp::List也應該是能夠列出清單列表...雖然我不確定我們是否有單元測試 - 但在500多個單元測試中有很多例子。

碰巧,我花了幾天的時間將大量RQuantLib代碼從傳統的API轉換爲新的API。一旦我們獲得了Rcpp的0.8.3版本(希望在幾天內),這可能會被釋放。在此期間,你可以看看RQuantLib SVN archive

+0

酷,謝謝!如果你堅持新的'Rcpp :: ...'類,一切都會有效! – 2010-06-21 22:58:12

+0

的確很酷。我仍然需要編寫新的類'Rcpp :: Date'和'Rcpp :: Datetime' ---但是你絕對可以在沒有舊的'RcppParams','RcppResultSet','RcppVector'等的情況下生活。免費提供新的單元測試或示例,或添加到文檔中。然後在'rcpp-devel'上見到你:) – 2010-06-22 00:04:48

+0

你讓我的生活更輕鬆。儘管我學習Rcpp已經過去了幾天,但我無法想象回到R&C的組合。 – 2012-10-13 18:30:26

21

我會傾向於使用德克的解決方案的一個壓縮的變化:

using namespace Rcpp ; 
return List::create( 
    _["vec"] = someVector, 
    _["lst"] = someList, 
    _["vec2"] = someOtherVector 
) ; 

而且,回來原來的問題,vector< vector<int> >應該自己換到一個列表整數向量,而不是矩陣。請參閱:

require(Rcpp) 
require(inline) 
require(RUnit) 

fx <- cxxfunction(, ' 

    std::vector< std::vector<int> > v ; 

    std::vector<int> x1(1) ; v.push_back(x1); 
    std::vector<int> x2(2) ; v.push_back(x2); 
    std::vector<int> x3(3) ; v.push_back(x3); 

    return wrap(v) ; 

', plugin = "Rcpp") 

我得到:

> fx() 

[[1]] 
[1] 0 

[[2]] 
[1] 0 0 

[[3]] 
[1] 0 0 0 
相關問題