Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing class as argument in Rcpp function

Tags:

rcpp

I was reading the awesome Rcpp vignette on exposing c++ classes and functions using Rcpp modules. In that context, is it possible to create an Rcpp function that has a class of type Uniform as one of the arguments and that is not part of the particular module being exported? Below here is just a model of what I was thinking. The example is taken from the same vignette. The answer might be already there. It would be great if someone can point to the right place.

#include <RcppArmadillo.h>
using namespace Rcpp;

class Uniform {

public:
  Uniform(double min_, double max_) :
  min(min_), max(max_) {}
  
  NumericVector draw(int n) const {
    RNGScope scope;
    return runif(n, min, max);
  }
  
  double min, max;
};


double uniformRange(Uniform* w) {
  return w->max - w->min;
}


RCPP_MODULE(unif_module) {
  
  class_<Uniform>("Uniform")
  
  .constructor<double,double>()
  .field("min", &Uniform::min)
  .field("max", &Uniform::max)
  
  .method("draw", &Uniform::draw)
  .method("range", &uniformRange)
  ;
}

/// JUST AN EXAMPLE: WON'T RUN
// [[Rcpp::export]]
double test(double z, Uniform* w) {
  return z + w->max ;
}
like image 723
Ghosh Avatar asked Jan 25 '26 10:01

Ghosh


1 Answers

Following Dirk's comment, I am posting a possible solution. The idea would be to create a new instance of a class object with a pointer on it and create an external pointer that can be further passed as an argument of a function. Below here is what I have gathered from his post:

#include <RcppArmadillo.h>
using namespace Rcpp;

class Uniform {

public:
  Uniform(double min_, double max_) :
  min(min_), max(max_) {}
  
  NumericVector draw(int n) const {
    RNGScope scope;
    return runif(n, min, max);
  }
  
  double min, max;
};

// create external pointer to a Uniform object
// [[Rcpp::export]]
XPtr<Uniform> getUniform(double min, double max) {
  // create pointer to an Uniform object and
  // wrap it as an external pointer
  Rcpp::XPtr<Uniform> ptr(new Uniform( min, max ), true);
  // return the external pointer to the R side
  return ptr;
}

/// CAN RUN IT NOW: 
// [[Rcpp::export]]
double test(double z, XPtr<Uniform> xp) {
  
  double k = z + xp ->max;
  
  return k;
  
  }
like image 176
Ghosh Avatar answered Jan 26 '26 23:01

Ghosh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!