[Rcpp-devel] Fwd: Extending as-wrap question
---------- Forwarded message ---------- From: Finlay Scott <drfinlayscott at gmail.com> Date: Mon, Apr 29, 2013 at 1:28 PM Subject: Re: [Rcpp-devel] Extending as-wrap question To: Dirk Eddelbuettel <edd at debian.org> Great. Thanks for the reply. I based my example on the non-intrusive example in the Rcpp gallery which I was why I was still calling it non-intrusive when it isn't really. I really just wanted to check that I hadn't laid some potential landmine in my code that would then blow up as development progressed. But as it seems to work for me, I'll continue... Thanks again for all your work in developing Rcpp. Finlay
On Mon, Apr 29, 2013 at 1:19 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
On 29 April 2013 at 09:28, Finlay Scott wrote:
| Hi,
| I have some questions regarding extending 'as' and 'wrap' for custom
classes.
|
| In my simple example I have declared a new class which has a single
member.
| This member is of type NumericVector, i.e. it is an Rcpp class. I have
written
| simple 'as' and 'wrap' extensions using non-intrusive extension. My
simple
| example compiles and appears to work as expected.
|
| My question is about the placement of #include <Rcpp.h>. In the
Rcpp-extending
| vignette, it says that for non-intrusive extension, the #include
<Rcpp.h> must
| appear after the specialisation otherwise the specialisation will not be
seen
| by Rcpp types. However, if I do this compilation fails because the
| NumericVector member is not recognised by the compiler in the class
definition.
|
| As an experiment, I moved the #include <Rcpp.h> to before the class
definition.
| My example then compiles and appears to run correctly. I was surprised
because
| what I did appears to contradict the advice given the vignette.
Headers got moved / Rcpp.h got reorganized after the vignette was written.
So
there is a chance something in there is outdated.
I am not sure if your example below qualifies for our
intrusive/non-intrusive
schema: you are having your class in the same file, I think we consider
that
'intrusive' as you can modify your source.
Main story: It works for you so ...
Dirk
| So my questions are:
| Should I be surprised that this example works even though it appears I
have
| contradicted the advice in the vignette?
| Although my example appears to work, because I have contradicted the
advice in
| the vignette, is there now something bad lurking in the application. i.e.
| things appear fine with my simple example but will something blow up if I
| continue to develop my class?
|
| My example cpp code is as follows:
|
| // File: DummyClass_with_Rcpp_member_example.cpp
| #include <RcppCommon.h>
| // If #include <Rcpp.h> not placed here then compilation fails
| #include <Rcpp.h>
|
| class DummyClass {
| public:
| Rcpp::NumericVector data;
| };
|
| namespace Rcpp {
| // non-intrusive extension via template specialisation
| template <> DummyClass as(SEXP dc_sexp);
| // non-intrusive extension via template specialisation
| template <> SEXP wrap(const DummyClass &flq);
| }
|
| // Compilation fails if #include<Rcpp.h> placed here
| //#include <Rcpp.h>
|
| // define template specialisations for as and wrap
| namespace Rcpp {
| template <> DummyClass as(SEXP dc_sexp) {
| S4 dc_s4 = Rcpp::as<S4>(dc_sexp);
| DummyClass dc;
| dc.data = dc_s4.slot(".Data");
| return dc;
| }
|
| template <> SEXP wrap(const DummyClass &dc) {
| Rcpp::S4 dc_s4("DummyClass");
| dc_s4.slot(".Data") = dc.data;
| return Rcpp::wrap(dc_s4);
| }
| }
|
| // [[Rcpp::export]]
| DummyClass test_DC_as_wrap(DummyClass dc, double multiplier){
| DummyClass new_dc;
| new_dc.data = dc.data;
| new_dc.data(0) = new_dc.data(0) * multiplier;
| return new_dc;
| }
|
| The R code that runs the example is:
|
| library(Rcpp)
| sourceCpp("DummyClass_with_Rcpp_member_example.cpp")
| setClass("DummyClass", representation(.Data = "numeric"))
| dc <- new("DummyClass")
| dc at .Data <- 1:10
| test_DC_as_wrap(dc, 4)
|
| Yours
|
| Finlay
|
| ----------------------------------------------------------------------
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
--
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20130430/bfcbc2fa/attachment.html>