我有一个std::vector<std::vector<double>>
,我希望将其转换为Rcpp::DataFrame
或Rcpp::NumericMatrix
。
我目前的解决方案看起来像这样,并且远非理想;它产生了一个数字列表。
RcppExport SEXP Foo(...)
{
std::vector<std::vector<double>> result;
/// ... Do some work.
return Rcpp::wrap(result);
}
注意事项:不会修复列数和行数。在每次运行之间,这些可以改变我之所以提到这一点,是因为到目前为止我找到的许多解决方案都涉及在编译时知道列。
如果可能的话,我希望解决方案完全包含在c ++中;即R用户应该能够调用该函数,而不必将结果处理成数据帧或矩阵。
答案 0 :(得分:6)
将std::vector<std::vector<double>>
转换为列表是我们一般可以提供的最佳选择。 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] ;
}
}
直接制作DataFrame
有点困难,我建议先制作一个列表,然后将此列表转换为DataFrame
:
List list( nc ) ;
for( int j=0; j<nc; j++) list[j] = wrap( result[j].begin(), result[j].end() ) ;
DataFrame df = list ;
您可能需要在将列表设置为数据框之前设置列表的名称。