[Rcpp-devel] using Rcpp modules to expose class

Robin Girard robin.girard at mines-paristech.fr
Mon May 13 21:25:07 CEST 2013


http://romainfrancois.blog.free.fr/index.php?post/2012/10/25/Rcpp-modules-more-flexible
sorry about that
R.

----- Mail original -----
De: "Dirk Eddelbuettel" <edd at debian.org>
À: "Robin Girard" <robin.girard at mines-paristech.fr>
Cc: "Anwar Ludin" <anwar.ludin at riskcetera.com>, rcpp-devel at lists.r-forge.r-project.org, "Dirk Eddelbuettel" <edd at debian.org>
Envoyé: Lundi 13 Mai 2013 19:25:09
Objet: Re: [Rcpp-devel] using Rcpp modules to expose class


On 13 May 2013 at 19:05, Robin Girard wrote:
| As suggested in the example of Romain's Blog 
| here http://romainfrancois.blog.free.fr/

There are dozens of posts regarding Rcpp on his blog.  If you refer to one
such post, could you show us the relevant (and presumably still valid) URL?  

Otherwise we just don't know what you refer to.

| you need to define the class before "exposing" it and then implement it (I think it is also important that using namespace Rcpp  comes after the exposed stuff). 
| 
| class Foo ;
| RCPP_EXPOSED_CLASS(Foo)
| 
| using namespace Rcpp ;
| 
| class Foo{
|     public:
|         enum Bla{ FOO, BAR } ;
| ... 
| 
| 
| is it what you did ? 
| I made it work in some cases and I did not have to implement the wrap
| (which is the whole purpose of module I think). 

Modules help you with setters/getters of _components of a class you expose_
in such a declaration.

What Anwar wants here is different: he wants to pass the whole class as is.
For which conversion code has to come from somewhere: hence the need for wrap().

I could of course be misunderstanding the issue too..

Dirk


| R.
| 
| ----- Mail original -----
| De: "Anwar Ludin" <anwar.ludin at riskcetera.com>
| À: "Dirk Eddelbuettel" <edd at debian.org>
| Cc: rcpp-devel at lists.r-forge.r-project.org
| Envoyé: Lundi 13 Mai 2013 16:11:35
| Objet: Re: [Rcpp-devel] using Rcpp modules to expose class
| 
| Hi Dirk,
| 
| Thanks for your answer!
| 
| So if I understand correctly, the fact that I exposed previously 
| Portfolio is not enough?
| I still need to provide wrap the template specialization:
| 
|      template <> SEXP wrap( const Portfolio& ) ;
| 
| Thanks,
| 
| Anwar
| 
| On 05/13/2013 03:28 PM, Dirk Eddelbuettel wrote:
| > On 13 May 2013 at 14:59, Anwar Ludin wrote:
| > | Hello,
| > |
| > | I'm trying to expose 2 classes from a Rcpp module:
| > |
| > | class Portfolio{
| > |   private:
| > |      std::string portfolioId, description;
| > |   public:
| > |       Portfolio(std::string portfolioId, std::string description)
| > |       : portfolioId(portfolioId), description(description) {}
| > |
| > |       std::string getPortfolioId() {return portfolioId;} const
| > |       void setPortfolioId(const std::string&) {this->portfolioId =
| > | portfolioId;}
| > |
| > |       std::string getDescription() {return description;} const
| > |       void setDescription(const std::string& description){this->description =
| > | description;}
| > | };
| > |
| > | class PortfolioDataAccess{
| > |     private:
| > |     mongo::DBClientConnection c;
| > |
| > |     public:
| > |     PortfolioDataAccess();
| > |     virtual Portfolio read(std::string portfolioId);
| > |     virtual void create(std::string portfolioId, std::string description);
| > |
| > |   };
| > |
| > |
| > |
| > |
| > | RCPP_MODULE(riskceteraPortfolio) {
| > |   class_<riskcetera::Portfolio>( "Portfolio" )
| > |   .constructor<std::string, std::string>()
| >
| > That works because we can convert "in" from SEXP to std::strings.
| >
| > |   .method("id", &riskcetera::Portfolio::getPortfolioId)
| > |   .method("description", &riskcetera::Portfolio::getDescription)
| > |   ;
| > |
| > | class_<riskcetera::PortfolioDataAccess>("PortfolioAccess")
| > |   .constructor()
| > |   .method("read", &riskcetera::PortfolioDataAccess::read)
| > |   ;
| > | }
| > |
| > | When trying to compile the module I get the following error:
| > |
| > |
| > | /riskcetera/home/aludin/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include/Rcpp/internal/wrap.h:474:7: error: no viable conversion from 'const riskcetera::Portfolio' to 'SEXP' (aka 'SEXPREC *')
| > |         SEXP x = object ;
| >
| > That is pretty plain:  You need to supply a wrap() converter that tells the
| > compiler how to turn one of your objects ("Portfolio") into R's standard
| > type, the SEXP.
| >
| > The currently-on-CRAN version of RcpBDT may help you.  It does something
| > pretty simply with Boost Date_Time, converting dates between the Boost
| > representation and the Rcpp / R representation.  It uses custom as<>() and
| > wrap(), and exposes a handful of useful functions too.   [ And do look at the
| > CRAN version, the R-Forge version is in heavier development which I started
| > last fall and hope to get back to by the summer. ]
| >   
| > Dirk
| >
| 
| 
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list