我正在编写一个RCPP模块,希望返回作为RCPPRESULTSET列表的一个元素,其元素是向量的列表。例如, .Call("myfunc")$foo 应该像:

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

(这里的确切数字并不重要)。问题是我不知道正确的RCPP方法。我尝试通过一个 vector<vector<int> > 但是,这通过将第一个向量的长度静静地作为宽度来构建矩阵(即使矩阵的破烂!)。我尝试构建一个 RcppList 但是很难施放各种物体(例如 RcppVector)安全地进入 SEXPs。

任何人都有有关处理复杂结构的最佳实践技巧,例如RCPP中的向量列表?

有帮助吗?

解决方案

很高兴在这里看到这个,但罗曼和我通常建议 RCCP-Devel 询问列表。请在此处发布,因为该项目尚未如此大的IT保证将散布在网络上的问题。这是给予的

RcppResultSet 是老年人的一部分 经典的 API,而大量工作已经进入了我们所谓的 新的 API(从0.7。*释放开始)。看看电流 RCPP页面上的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的代码。一旦我们获得版本0.8.3的版本,这可能会被发布 RCPP (希望在几天内)。同时,您可以查看 Rquantlib SVN档案

其他提示

我倾向于使用Dirk解决方案的压缩变化:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top