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

Reply via email to