[Rcpp-devel] using Rcpp modules to expose class

Anwar Ludin anwar.ludin at riskcetera.com
Mon May 13 16:11:35 CEST 2013


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
>




More information about the Rcpp-devel mailing list