Florian Burkart
2014-May-02 12:14 UTC
[Rd] Questions on extending Rcpp wrap and as with templates
Hi everyone, I have been trying to extend Rcpp with my own wrap and as templates. Two issues: 1) I need to explicitly call wrap. Is that expected? So for example I wrote this specialization: template<> SEXP Rcpp::wrap(std::vector<TimedOptDouble> const& entries) { std::vector<double> sec_times; std::vector<double> doubles; for(auto const& entry : entries) { sec_times.push_back(entry.GetTime().Seconds()); TimedOptDouble::OptDouble opt_double(entry.GetOptDouble()); if(opt_double) doubles.push_back(*opt_double); else doubles.push_back(R_NaReal); } return List::create( Named( "Time" ) = sec_times, Named( "Value" ) = doubles); } First of all, this returns what I believe to be a Rcpp::List object, which seems to be converted implicitly to a SEXP. This is the typical behaviour I know. Unfortunately, when making use of this template, it doesn't work implicitly, but I need to explicitly call it. So for example SEXP GetSunPositions(SEXP a) { std::vector<TimedOptDouble> sun_positions; ... return wrap(sun_positions); } works, where as return sun_positions; as last line doesn't. Am I doing something wrong here? I did do the declaration before including <Rcpp.h>. 2) How to make as work for own types in containers The other way around, one can return a std::vector<double> implicitly, but how do I return std::vector<MyType>? I tried to define template<> MyType as(SEXP); But that didn't help, e.g. I had to write my own template<> std::vector<MyType> as(SEXP); Thanks for help Florian [[alternative HTML version deleted]]
Dirk Eddelbuettel
2014-May-02 12:31 UTC
[Rd] Questions on extending Rcpp wrap and as with templates
On 2 May 2014 at 14:14, Florian Burkart wrote: | Hi everyone, | | I have been trying to extend Rcpp with my own wrap and as templates. Good post, wrong list. Can you please try again on rcpp-devel? You may need to subscribe first in order to post (ie pay the "trying to stop spammers tax"). Dirk | | Two issues: | | 1) I need to explicitly call wrap. Is that expected? | | So for example I wrote this specialization: | | template<> SEXP Rcpp::wrap(std::vector<TimedOptDouble> const& entries) { | std::vector<double> sec_times; | std::vector<double> doubles; | for(auto const& entry : entries) | { | sec_times.push_back(entry.GetTime().Seconds()); | TimedOptDouble::OptDouble opt_double(entry.GetOptDouble()); | if(opt_double) | doubles.push_back(*opt_double); | else | doubles.push_back(R_NaReal); | } | return List::create( | Named( "Time" ) = sec_times, | Named( "Value" ) = doubles); | } | | First of all, this returns what I believe to be a Rcpp::List object, which | seems to be converted implicitly to a SEXP. This is the typical behaviour I | know. | | Unfortunately, when making use of this template, it doesn't work | implicitly, but I need to explicitly call it. | | So for example | | SEXP GetSunPositions(SEXP a) { | std::vector<TimedOptDouble> sun_positions; | ... | return wrap(sun_positions); | } | | works, where as | | return sun_positions; | | as last line doesn't. Am I doing something wrong here? I did do the | declaration before including <Rcpp.h>. | | 2) How to make as work for own types in containers | | The other way around, one can return a std::vector<double> implicitly, but | how do I return std::vector<MyType>? I tried to define | | template<> MyType as(SEXP); | | But that didn't help, e.g. I had to write my own | | template<> std::vector<MyType> as(SEXP); | | Thanks for help | Florian | | [[alternative HTML version deleted]] | | ______________________________________________ | R-devel at r-project.org mailing list | https://stat.ethz.ch/mailman/listinfo/r-devel -- Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com