[Rcpp-devel] Rcpp sugar
Romain Francois
romain at r-enthusiasts.com
Mon Jun 14 19:47:35 CEST 2010
Hello,
Initially motivated by Doug's question:
http://article.gmane.org/gmane.comp.lang.r.rcpp/412
and drafted quickly in : http://article.gmane.org/gmane.comp.lang.r.rcpp/422
I've added some code in Rcpp that I call "Rcpp sugar" (another name I
had in mind was "Rcpp plasma". I like sugar because what this does is to
add some syntactic sugar so that Rcpp code looks more like R code.
So now we can use "any" and "all" with binary operators <,>,<=,>=,!=,==
on Rcpp vectors.
Here is one random example from the unit test suite:
test.sugar.all.less.or.equal <- function( ){
fx <- cxxfunction( signature( x = "numeric", y = "numeric" ), '
NumericVector xx(x) ;
NumericVector yy(y) ;
return all( xx <= yy ) ;
', plugin = "Rcpp" )
checkTrue( fx( 1, 1 ) )
checkTrue( ! fx( 1:2, c(1,1) ) )
checkTrue( fx( 0, 1 ) )
checkTrue( ! fx( 1, 0 ) )
checkTrue( is.na( fx( NA, 1 ) ) )
}
The difference between the Rcpp code:
all( xx <= yy )
and the R code
all( xx <= yy )
is that R would first allocate the logical vector resulting from the
expression "xx <= yy" and then call all.
Rcpp::all does not need to allocate the logical vector, so will be more
efficient.
This is the tip of the iceberg of what Rcpp::sugar could be, and uses a
version of expression templates (e.g. see armadillo or Blitz).
Much more could be done, but this will get complicated to code at some
point. So I'm not sure yet if I will or if I will wait for contributions
or sponsorship, etc ...
See other examples in the test files that contain the word "sugar" :
> list.files( system.file( "unitTests", package = "Rcpp" ), full = T,
pattern = "sugar" )
Romain
--
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/98Uf7u : Rcpp 0.8.1
|- http://bit.ly/c6YnCi : graph gallery collage
`- http://bit.ly/bZ7ltC : inline 0.3.5
More information about the Rcpp-devel
mailing list