Okay, very glad to hear you've got things working! J.J.
On Fri, Apr 26, 2013 at 3:35 AM, Finlay Scott <[email protected]>wrote: > Fixed it. > It was me making a stupid mistake. I had: > > PKG_CXXFLAGS=-I../inst/include > > in the Makevars when I should have had > > PKG_CPPFLAGS=-I../inst/include > > After using J.J.'s suggestion of renaming the header files, the package > now compiles and my minimal test now works. > > Thanks to everyone for responding quickly. > > Finlay > > > > On Thu, Apr 25, 2013 at 12:28 PM, Dirk Eddelbuettel <[email protected]>wrote: > >> >> On 25 April 2013 at 10:47, Finlay Scott wrote: >> | Thanks for the reply. I followed your suggestion and changed the name >> of the >> | header file in /inst/include to 'asWrapExample.h' (the name of the >> package). I >> | then changed the #include in the 'DummyClass_example.cpp' file to >> reflect that >> | change. I also added: >> | >> | PKG_CXXFLAGS=-I../inst/include >> | >> | To the top of the Makevars file. However, I still get the same error. I >> have >> | the feeling I'm missing something obvious. Thanks for the help so far. >> >> Seems you are "just" having issues with package mechanics. >> >> You could try to look at an existing package as eg out RcppGSL which has >> had >> this working for several years. Try comparing all the relevant files >> mentioned in the corresponding vignette Rcpp-extending. >> >> Dirk >> >> | Yours >> | >> | Finlay >> | >> | >> | >> | On Wed, Apr 24, 2013 at 5:41 PM, JJ Allaire <[email protected]> >> wrote: >> | >> | 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 >> -- >> Dirk Eddelbuettel | [email protected] | http://dirk.eddelbuettel.com >> > > > _______________________________________________ > 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
