如何在Rcpp中创建向量列表?

Jon*_*ang 30 r rcpp

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

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1
Run Code Online (Sandbox Code Playgroud)

(这里确切的数字并不重要).问题是我不知道正确的Rcpp方式.我尝试传递一个vector<vector<int> >但是这通过静默地将第一个向量的长度作为宽度来构造矩阵(即使矩阵是粗糙的!).我已经尝试构建一个RcppList但很难RcppVector安全地将各种对象(例如)投射到SEXPs中.

任何人都有关于处理复杂结构的最佳实践的提示,例如Rcpp中的向量列表?

Dir*_*tel 43

[很高兴看到这里,但Romain和我一般推荐rccp-devel列表提问.请在那里发布,因为项目还不是那么大,它保证在网络上散布问题.]

RcppResultSet是旧的经典 API的一部分,而很多工作已经进入了我们所谓的 API(从0.7.*版本开始).看看CRAN上的当前Rcpp页面和小插图列表 - 六个和计数.

使用新API,您将返回类似的内容

return Rcpp::List::create(Rcpp::Named("vec") = someVector,
                          Rcpp::Named("lst") = someList,
                          Rcpp::Named("vec2") = someOtherVector);
Run Code Online (Sandbox Code Playgroud)

所有在一个语句中(可能使用显式Rcpp::wrap()调用),创建R中的内容

list(vec=someVector, lst=someList, vec2=someOtherVector)
Run Code Online (Sandbox Code Playgroud)

而且Rcpp::List也应该能够做到列表的列表清单...虽然我不知道我们有这个单元测试---但也有在500+单元测试的例子不胜枚举.

碰巧,我花了几天将有很多RQuantLib从经典的API代码,新的API.一旦我们得到Rcpp的 0.8.3版本(希望在几天内),这可能会被释放.在此期间,您可以查看RQuantLib SVN存档


Rom*_*ois 24

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

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

另外,回到最初的问题,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" ) 
Run Code Online (Sandbox Code Playgroud)

我明白了:

> fx() 

[[1]]
[1] 0

[[2]]
[1] 0 0

[[3]]
[1] 0 0 0
Run Code Online (Sandbox Code Playgroud)