[Rcpp-devel] Rcpp modules

Romain Francois romain at r-enthusiasts.com
Thu May 20 09:49:57 CEST 2010


Le 20/05/10 09:33, Dirk Eddelbuettel a écrit :
>
> On 19 May 2010 at 15:07, Romain Francois wrote:
> | One thing perhaps I'd like opinions about is the use if the name
> | "function" in :
> |
> | RCPP_MODULE(yada){
> | 	using namespace Rcpp ;
> | 	function( "hello" ,&hello ) ;
> | }
> |
> | Boost.Python uses "def" but this is too pythonic for me. OTOH, having
> | both Rcpp::Function (the class that deals with R functions) and
> | Rcpp::function (for the module code) might be confusing.
> |
> | Any suggestion ? Maybe Rcpp::fun ? Or should I use some other namespace
> | for this functionality ?
>
> Tough one. I also think that maybe 'function' is iffy. That said, it is not a
> keyword at the C++ language level (!!) so maybe even mingw will be kind to us
> (inside joke alert here).

tested. not as bad as stderr

> Maybe 'Function' just to show it is different?

We already have Rcpp::Function to handle R functions in c++ code: 
Rcpp::Function( "rnorm" ), etc ...


Given function really sets up a c++ function (as opposed to an R 
function), maybe we can emphacize this (cppfunction, cppfun, or something).

Something else I had in mind was this sort of notation:

RCPP_MODULE(yada){
   using namespace Rcpp ;
   functions[ "hello" ] = &hello ;
}


For exposing C++ classes, I think I'll follow boost.python and use "class_"

> But that is odd too.  Maybe   f(...)   in tip-of-the hat to math?
>
> Maybe start with function. The option of later wrapping it into a
> sub-namespace or its own namespace is good too.

Any idea for a good name in the marketing department ?

> Dirk
>
> | Romain
> |
> | Le 19/05/10 12:09, Romain Francois a écrit :
> |>
> |>  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)
> |
> | Done !
> |
> |>  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