Hi Finlay, If you name your include file the same name as your package then it will be included automatically in RcppExports.cpp. The convention at work here is that any custom as/wrap handlers should be accumulated (or referenced from) that single file. This mirrors the existing convention used by Rcpp, RcppArmadillo, RcppEigen, etc. to have a single global header file for their C++ API.
J.J. On Wed, Apr 24, 2013 at 8:22 AM, Finlay Scott <[email protected]>wrote: > Hi > First of all I want to say how impressed I am with Rcpp. I think it is > going to be very useful for some of the packages I am developing. Thank you > very much for developing it. > > I have a question regarding writing custom as and wrap functions for my > own classes. Following the example in: > > http://gallery.rcpp.org/articles/custom-as-and-wrap-example/ > > I can get my own minimal example to work with a very simple class, and > using the sourceCpp() function. > > The cpp code saved as a *.cpp file: > > #include <RcppCommon.h> > > class DummyClass { > public: > double value; > }; > > namespace Rcpp { > // non-intrusive extension via template specialisation > template <> DummyClass as(SEXP dt); > // non-intrusive extension via template specialisation > template <> SEXP wrap(const DummyClass &d); > } > > #include <Rcpp.h> > > // define template specialisations for as and wrap > namespace Rcpp { > template <> DummyClass as(SEXP dtsexp) { > S4 dc_s4 = Rcpp::as<S4>(dtsexp); > DummyClass dc; > dc.value = dc_s4.slot("value"); > return dc; > } > > template <> SEXP wrap(const DummyClass &d) { > Rcpp::S4 dc_s4("DummyClass"); > dc_s4.slot("value") = d.value; > return Rcpp::wrap(dc_s4); > } > } > > // [[Rcpp::export]] > DummyClass test_as_wrap(DummyClass dc, double multiplier){ > DummyClass dc_out; > dc_out.value = dc.value * multiplier; > return dc_out; > } > > > And the following R code compiles and calls the function: > > library(Rcpp) > sourceCpp("DummyClass_example.cpp") > setClass("DummyClass", representation(value = "numeric")) > dc <- new("DummyClass") > dc@value <- 23 > test_as_wrap(dc, 4) > > This works just fine (like magic!) and the test_as_wrap() function is > happily called from R and returns an object of type DummyClass. I want to > use a similar approach in a package, so I made a minimal package using: > > Rcpp.package.skeleton("asWrapExample",attributes=TRUE) > > I then split my original cpp file above into header and source code files. > In the /inst/include directory I placed a file 'DummyClass_example.h' which > has: > > #include <RcppCommon.h> > > class DummyClass { > public: > double value; > }; > > namespace Rcpp { > // non-intrusive extension via template specialisation > template <> DummyClass as(SEXP dt); > // non-intrusive extension via template specialisation > template <> SEXP wrap(const DummyClass &d); > } > > In the /src directory I placed a file 'DummyClass_example.cpp' which has: > > #include "../inst/include/DummyClass_example.h" > #include <Rcpp.h> > > // define template specialisations for as and wrap > namespace Rcpp { > template <> DummyClass as(SEXP dtsexp) { > S4 dc_s4 = Rcpp::as<S4>(dtsexp); > DummyClass dc; > dc.value = dc_s4.slot("value"); > return dc; > } > > template <> SEXP wrap(const DummyClass &d) { > Rcpp::S4 dc_s4("DummyClass"); > dc_s4.slot("value") = d.value; > return Rcpp::wrap(dc_s4); > } > } > > // [[Rcpp::export]] > DummyClass test_as_wrap(DummyClass dc, double multiplier){ > DummyClass dc_out; > dc_out.value = dc.value * multiplier; > return dc_out; > } > > When I try to compile the package I get this error message: > > RcppExports.cpp:9:1: error: 'DummyClass' does not name a type > > This is probably caused by the RcppExports.cpp not having an #include for > my DummyClass_example.h. > I understand the RcppExports.cpp file is automatically generated by the > magic of Rcpp so there is no point in adding it there by hand. > I've looked at the documentation but it is not clear to me how I can tell > RcppExports to also include my header file (if this is the source of the > problem). > Have I missed something in the documentation, or is there an example I can > follow? > Any help is appreciated. > > Yours > > Finlay > > > > > > _______________________________________________ > Rcpp-devel mailing list > [email protected] > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >
_______________________________________________ Rcpp-devel mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
