[Rcpp-commits] r1126 - in pkg/Rcpp/inst: . announce

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Wed Apr 28 10:56:58 CEST 2010


Author: romain
Date: 2010-04-28 10:56:58 +0200 (Wed, 28 Apr 2010)
New Revision: 1126

Added:
   pkg/Rcpp/inst/announce/
   pkg/Rcpp/inst/announce/ANNOUNCE-0.7.0.txt
Log:
added announce dir and ANNOUNCE-0.7.0.txt

Added: pkg/Rcpp/inst/announce/ANNOUNCE-0.7.0.txt
===================================================================
--- pkg/Rcpp/inst/announce/ANNOUNCE-0.7.0.txt	                        (rev 0)
+++ pkg/Rcpp/inst/announce/ANNOUNCE-0.7.0.txt	2010-04-28 08:56:58 UTC (rev 1126)
@@ -0,0 +1,74 @@
+cpp version 0.7.0 went onto CRAN this weekend. The key new features are
+
+  o inline support, taken from Oleg Sklyar's neat inline package and 
+    adapted/extented to support Rcpp as well as external libraries
+    (see below for an example); this even works on Windows (provided you 
+    have Rtools installed and configured); 
+
+  o addition of a new simple type RcppSexp for importing or exporting
+    simple types directly between R and C++
+
+  o addition of a number of new examples for both these features
+
+  o code reorganisation: every class has in its own header and source file 
+
+  o last but not least relicensed from LGPL (>=2.1) to GPL (>= 2)
+
+My blog (http://dirk.eddelbuettel.com/blog/) has two recent posts with a bit
+more details (and colour highlighting of the code below) but let's just look
+at one example of using GNU GSL functions for illustrative purposes (as you
+wouldn't need this to access random-number generators as R has its own).
+
+Consider this R code snippet:
+
+    ## use Rcpp to pass down a parameter for the seed, and a vector size
+    gslrng <- '
+       int seed = RcppSexp(s).asInt();
+       int len = RcppSexp(n).asInt();
+
+       gsl_rng *r;
+       gsl_rng_env_setup();
+       std::vector<double> v(len);
+
+       r = gsl_rng_alloc (gsl_rng_default);
+
+       gsl_rng_set (r, (unsigned long) seed);
+       for (int i=0; i<len; i++) {
+           v[i] = gsl_rng_get (r);
+       }
+       gsl_rng_free(r);
+
+       return RcppSexp(v).asSexp();
+       '
+
+    ## turn into a function that R can call
+    ## compileargs redundant on Debian/Ubuntu as gsl headers are found anyway
+    funx <- cfunction(signature(s="numeric", n="numeric"),
+                      gslrng,
+                      includes="#include <gsl/gsl_rng.h>",
+                      Rcpp=TRUE,
+                      cppargs="-I/usr/include",
+                      libargs="-lgsl -lgslcblas")
+    print(funx(0, 5))
+
+
+Brief notes on this:
+
+  1)  The character variable gslrng contains valid C++ code.
+
+  2)  The call to cfunction converts this C++ code into a function that
+      calls it -- and this function is compiled, linked and loaded
+      automagically simply using hints about GSL header files and libraries.
+
+  3)  The interface is explit: cfunction() is told about a function signature
+      with numeric variables 's' and 'n'; this is what the C++ code convert
+      to (C++ local) variables 'seed' and 'len' using the RcppSexp class.
+
+  4)  We return a single SEXP to R which is based on the std::vector<double>
+      v which is also converted on the fly.
+
+  5)  The resulting vector is returned and simply printed at the R level.
+
+
+More examples are in the source tarball and in the R-Forge SVN archive.
+



More information about the Rcpp-commits mailing list