35

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

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

(确切的数字在这里并不重要)。问题是我不知道这样做的正确 Rcpp 方式。我尝试传递 a vector<vector<int> >,但这通过默默地将第一个向量的长度作为宽度来构造一个矩阵(即使矩阵是参差不齐的!)。我尝试构建一个RcppList但很难将各种对象(如RcppVector)安全地转换为SEXPs。

有人对处理复杂结构(例如 Rcpp 中的向量列表)的最佳实践有提示吗?

4

2 回答 2

50

[ 很高兴在这里看到这一点,但 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);

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

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

并且Rcpp::List还应该能够列出列表列表......虽然我不确定我们是否对此进行了单元测试 --- 但在 500 多个单元测试中有很多示例。

碰巧的是,过去几天我将大量RQuantLib代码从经典 API 转换为新 API。这可能会在我们发布 0.8.3 版Rcpp后发布(希望在几天内)。同时,您可以查看RQuantLib SVN 存档

于 2010-06-21T21:50:13.060 回答
25

我倾向于使用 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
于 2010-06-22T07:16:05.863 回答