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))
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel