[Rcpp-devel] Please help! A list containing dataframe

Mark Clements mark.clements at ki.se
Fri Sep 27 16:12:23 CEST 2013


This can be done more generally. 

Following an earlier suggestion from Romain, we can use boost::tuple from the BH package - for a row of fixed size with general types. Then we can use a template to read in the data-frame and work with the set of rows.

Variadic templates would be nice here, rather than needing to enumerate for tuples of different lengths.

Out of interest, is this poor style for Rcpp?

Sincerely, Mark.

require(inline)
testReadDf <-
  rcpp(signature(df="data.frame"),
       includes="
#include <boost/tuple/tuple.hpp>
#include <vector>
#include <algorithm>
// general function to read a data-frame
template <class T1, class T2, class T3, class T4>
std::vector<boost::tuple<T1,T2,T3,T4> > read_df( DataFrame df ){
     typedef boost::tuple<T1,T2,T3,T4> Row;
     int n = df.nrows() ;
     std::vector<Row> rows(n) ;
     Vector<traits::r_sexptype_traits<T1>::rtype> df0 = df[0];
     Vector<traits::r_sexptype_traits<T2>::rtype> df1 = df[1];
     Vector<traits::r_sexptype_traits<T3>::rtype> df2 = df[2];
     Vector<traits::r_sexptype_traits<T4>::rtype> df3 = df[3];
     for( int i=0; i<n; i++)
         rows[i] = Row(df0[i],df1[i],df2[i],df3[i]);
     return rows ;
}
// example function
typedef boost::tuple<int,int,int,int> MyRow;
int fun(MyRow row) {
  return boost::get<0>(row)+2*boost::get<1>(row)+3*boost::get<2>(row)+4*boost::get<3>(row);
}
",
       body="
// read in the data-frame as a vector of rows
std::vector<MyRow> v = read_df<int,int,int,int>(df);
int n = v.size();
std::vector<int> out(n);
std::transform(v.begin(),v.end(),out.begin(),fun);
return wrap(out);
")
testReadDf(data.frame(1,2,3,4))


More information about the Rcpp-devel mailing list