[Rcpp-devel] Exposing constructors with same number of arguments with different types using Rcpp Modules
Jelmer Ypma
jelmerypma at gmail.com
Fri May 13 16:35:38 CEST 2011
Dear Rcpp-list,
I'm trying to expose multiple constructors of a C++ class to R using
modules. Here is an example of what I want to do based on the Uniform
example
===Begin: example
library('inline')
library('Rcpp')
test_code <-'
using namespace Rcpp;
class Uniform {
public:
Uniform(double min_, double max_) : min(min_), max(max_) {}
Uniform(double max_, std::string dummy_) : min(0.0), max(max_)
{ Rprintf("%s\\n", dummy_.c_str()); }
Uniform(double max_ ) : min(0.0), max(max_) {}
NumericVector draw(int n) const {
RNGScope scope;
return runif( n, min, max );
}
double min, max;
};
double range( Uniform* w) {
return w->max - w->min;
}
RCPP_MODULE(unif_module) {
class_<Uniform>( "Uniform" )
.constructor<double,double>()
.constructor<double,std::string>()
.constructor<double>()
.field( "min", &Uniform::min )
.field( "max", &Uniform::max )
.method( "draw", &Uniform::draw )
.method( "range", &range )
;
}
'
fx <- cxxfunction( signature(), "" , include = test_code, plugin = "Rcpp" )
unif_module <- Module( "unif_module", getDynLib(fx) )
show( Uniform )
u1 <- new( Uniform, 0, 10 )
u1$min
u1$max
u1$range()
u1$draw( 10L )
u2 <- new( Uniform, 10, "test" )
u2$min
u2$max
u2$range()
u2$draw( 10L )
u3 <- new( Uniform, 10 )
u3$min
u3$max
u3$range()
u3$draw( 10L )
===End: example
Compilation works fine (on Windows using RTools, Rcpp_0.9.4.1,
inline_0.3.8), but the R code cannot distinguish between two
constructors with the same number of arguments, but with different
types for the arguments and always calls Uniform(double, double). The
output I get is as follows:
> unif_module <- Module( "unif_module", getDynLib(fx) )
> show( Uniform )
C++ class 'Uniform' <02748CF0>
Constructors:
Uniform(double, double)
Uniform(double, std::string)
Uniform(double)
Fields:
double max
double min
Methods:
Rcpp::NumericVector draw(int) const
double range()
> u1 <- new( Uniform, 0, 10 )
> u1$min
[1] 0
> u1$max
[1] 10
> u1$range()
[1] 10
> u1$draw( 10L )
[1] 6.330045 4.637002 6.507183 4.192280 9.560602 3.927548 4.399107
2.332956 8.810553 3.864929
> u2 <- new( Uniform, 10, "test" )
Error in new_CppObject_xp(fields$.module, fields$.pointer, ...) :
not compatible with REALSXP
Does anyone know of a workaround for this?
Many thanks in advance!
Jelmer
More information about the Rcpp-devel
mailing list