我正在编写一个Rcpp模块,希望作为RcppResultSet列表的一个元素返回一个列表,其元素是向量。例如,.Call("myfunc")$foo
应该是这样的:
[[1]]
[1] 1
[[2]]
[1] 1 1
[[3]]
[1] 1 1 1
(确切的数字在这里并不重要)。问题是我不知道正确的Rcpp方式。我尝试传递一个vector<vector<int> >
,但这通过静默地将第一个向量的长度作为宽度来构造矩阵(即使矩阵是粗糙的!)。我已经尝试构建RcppList
但很难将各种对象(例如RcppVector
)安全地投射到SEXP
中。
任何人都有关于处理复杂结构的最佳实践的提示,例如Rcpp中的向量列表?
答案 0 :(得分:42)
[很高兴看到这里,但Romain和我通常会推荐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
答案 1 :(得分:24)
我倾向于使用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