[Rcpp-devel] using Rcpp modules to expose class

Dirk Eddelbuettel edd at debian.org
Mon May 13 16:29:50 CEST 2013


On 13 May 2013 at 16:11, Anwar Ludin wrote:
| Hi Dirk,
| 
| Thanks for your answer!
| 
| So if I understand correctly, the fact that I exposed previously 
| Portfolio is not enough?

What do you mean by "exposed"?    

You defined it, so the compiler will no
comlain about 'unknown type'.  But that alone doesn't get it over to R.

| I still need to provide wrap the template specialization:
| 
|      template <> SEXP wrap( const Portfolio& ) ;

I think so, yes.

Dirk

 
| 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
| >
| 
| 

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


More information about the Rcpp-devel mailing list