我有一个std::vector<std::vector<double>>,我想将其转换为a Rcpp::DataFrame或a Rcpp::NumericMatrix.
我目前的解决方案看起来像这样,它远非理想; 它产生了一个数字列表.
RcppExport SEXP Foo(...)
{
std::vector<std::vector<double>> result;
/// ... Do some work.
return Rcpp::wrap(result);
}
Run Code Online (Sandbox Code Playgroud)
注意事项:不会修复列数和行数.在每次运行之间,这些可以改变 我之所以提到这一点是因为到目前为止我发现的许多解决方案都涉及在编译时知道列.
如果可能的话,我希望解决方案完全包含在c ++中; 即R用户应该能够调用该函数,而不必将结果处理成数据帧或矩阵.
将a转换std::vector<std::vector<double>>为列表是我们一般可以提供的最佳选择.A DataFrame要求所有列具有相同的长度.
你必须自己手动处理.像这样做一个矩阵:
std::vector<std::vector<double>> result ;
int nc = result.size(), nr = result[0].size() ;
NumericMatrix m( nr, nc ) ;
for( int j=0; j<nc; j++){
std::vector<double>& result_j ;
if( result_j.size() != nr ) stop( "incompatible size" ) ;
for( int i=0; i<nr; i++){
m(i,j) = result_j[i] ;
}
}
Run Code Online (Sandbox Code Playgroud)
DataFrame直接制作更难,我建议先制作一个列表,然后将此列表转换为DataFrame:
List list( nc ) ;
for( int j=0; j<nc; j++) list[j] = wrap( result[j].begin(), result[j].end() ) ;
DataFrame df = list ;
Run Code Online (Sandbox Code Playgroud)
您可能需要在将列表设置为数据框之前设置列表的名称.