代码之家  ›  专栏  ›  技术社区  ›  Jonathan Chang

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

  •  29
  • Jonathan Chang  · 技术社区  · 14 年前

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

    [[1]]
    [1] 1
    
    [[2]]
    [1] 1 1
    
    [[3]]
    [1] 1 1 1
    

    (确切的数字在这里并不重要)。问题是我不知道正确的RCPP方式。我试图通过 vector<vector<int> > 但这是通过无声地将第一个向量的长度作为宽度来构造一个矩阵(即使矩阵是不规则的!).我试过构造一个 RcppList 但是很难投射出各种物体(比如 RcppVector 安全进入 SEXP S.

    有人对处理复杂结构(如RCPP中的向量列表)的最佳实践有什么建议吗?

    2 回复  |  直到 10 年前
        1
  •  41
  •   Dirk is no longer here    14 年前

    [很高兴在这里看到这个,但是罗曼和我通常推荐 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的代码。一旦我们获得0.8.3版本的 Rcpp 出去(希望几天后)。同时,你可以看到 RQuantLib SVN archive

        2
  •  24
  •   Romain Francois    10 年前

    我倾向于使用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