Skip to content
Back to formatted view

Raw Message

Message-ID: <CA+RJ7GMiMfy5jAH_LHGg0_aWUq=FRseARuxLhHzqvpG5fboWUg@mail.gmail.com>
Date: 2015-02-10T12:09:10Z
From: Alessandro Mammana
Subject: [Rcpp-devel] The proper way of wrapping an R object

Dear all,
the following is not about "how to make it work", because it already
works, it is only about "what's the best, cleanest way of doing it".

I have an s4 object with three slots, and many Rcpp functions dealing with it.
My goal is to have a C struct (or class) equivalent to the s4 object,
i.e. where each field is an s4 slot.

Right now I defined the struct in this way:

struct CountSignals {
    Rcpp::IntegerVector counts;
    Rcpp::IntegerVector breaks;
    bool ss;

    CountSignals(Rcpp::RObject csig) {
        if (not csig.inherits("CountSignals")) Rcpp::stop("expecting a
CountSignals object");
        counts = Rcpp::as<Rcpp::IntegerVector>(csig.slot("counts"));
        breaks = Rcpp::as<Rcpp::IntegerVector>(csig.slot("breaks"));
        ss = Rcpp::as<bool>(csig.slot("ss"));
    }
};


And then each method starts like this, for example:

// [[Rcpp::export]]
Rcpp::List asList(Rcpp::RObject csig){
    CountSignals x(csig);
....

As said before, this is working fine, but I am skeptical about the
following things:
1. in the assignment operators in the CountSignals constructor, am I
copying the whole vector or am I copying a pointer to it? I need to
make sure that nothing is copied (as these vectors can be very long).
2. Even cleaner would be to start a method in this way:

// [[Rcpp::export]]
Rcpp::List asList(CountSignals x){
....

do you know if/how I can achieve that? (All of this code is inside an
R package).

Thanks a lot!

-- 
Alessandro Mammana, PhD Student
Max Planck Institute for Molecular Genetics
Ihnestra?e 63-73
D-14195 Berlin, Germany