2010-06-21 58 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 
相关问题