[Rcpp-devel] Rcpp modules
Romain Francois
romain at r-enthusiasts.com
Wed May 19 12:09:53 CEST 2010
Hello,
I've been looking at Boost.Python lately and thought we might be able to
port some of the ideas to Rcpp too.
I commited (rev 1281) some code to Rcpp that introduces the notion of
Rcpp modules (wording might change later). A module is a collection of
C++ functions that :
- take 0 or more parameters of arbitrary type, not really arbitrary but
anything that Rcpp::as can deal with
- returns void or any type that Rcpp::wrap can handle
Here is an example of C++ code using the concept of Rcpp module :
std::string hello(){
return "hello" ;
}
int bar( int x){
return x*2 ;
}
double foo( int x, double y){
return x * y ;
}
void bla( ){
Rprintf( "hello\\n" ) ;
}
void bla1( int x){
Rprintf( "hello (x = %d)\\n", x ) ;
}
void bla2( int x, double y){
Rprintf( "hello (x = %d, y = %5.2f)\\n", x, y ) ;
}
RCPP_MODULE(yada){
using namespace Rcpp ;
function( "hello" , &hello ) ;
function( "bar" , &bar ) ;
function( "foo" , &foo ) ;
function( "bla" , &bla ) ;
function( "bla1" , &bla1 ) ;
function( "bla2" , &bla2 ) ;
}
All the magic happens because the compiler knows how to distinguish the
type of each function pointer and we manage to intercept this
information through C++ templates.
The only price to pay is the declarative call to the RCPP_MODULE macro.
On the R side, we just pick it up using the Module function in Rcpp :
> # inc is the code above
> fx <- cppfunction( signature(), "", include = inc )
>
> # look for the Module called "yada" in the DLL we just compiled
> yada <- Module( "yada", getDLL( fx ) )
> print( yada )
Rcpp module 'yada'
6 functions:
bar : 1 arguments
bla : 0 arguments
bla1 : 1 arguments
bla2 : 2 arguments
foo : 2 arguments
hello : 0 arguments
>
> print( yada$hello() )
[1] "hello"
> print( yada$bar( 2L ) )
[1] 4
> print( yada$foo( 2L, 4.0 ) )
[1] 8
> yada$bla()
hello
> yada$bla1( 2L )
hello (x = 2)
> yada$bla2( 2L, 5 )
hello (x = 2, y = 5.00)
Right now, this is limited to a maximum of 2 parameters because I wrote
this manually, but once I make some R code to generate the template
code, we should be able to get up to 65 parameters (same as .Call)
functions are only the tip of boost.python iceberg, obviously we also
want to expose C++ classes the way boost.python does, but this might be
slightly more involved.
Romain
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/bklUXt : RcppArmadillo 0.2.1
|- http://bit.ly/936ck2 : Rcpp 0.8.0
`- http://bit.ly/9aKDM9 : embed images in Rd documents
More information about the Rcpp-devel
mailing list