Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

The recent release of the C++11 standard has brought a lot of attention to the new language features. Rcpp, as a CRAN package, follows CRAN policy in not (yet!!) supporting the standard for its purported non-portable status. Even as of the current g++ version, we still need to explicitly enable C++11 support which we can do here from R prior to compiling:

Sys.setenv("PKG_CXXFLAGS"="-std=c++11")


C++11 has a lot of nice features; the Wikipedia page is pretty thorough in describing them, and the recently-created ISO C++ website has a lot of additional material.

In a first example, we look at the auto keyword which allows the compiler to infer the type based on the assignment.

#include

// [[Rcpp::export]]
int useAuto() {
auto val = 42;		// val will be of type int
return val;
}


Testing it:

useAuto()

[1] 42


Another lovely feature are initialiser lists:

#include

// [[Rcpp::export]]
std::vector useInitLists() {
std::vector vec = {"larry", "curly", "moe"};
return vec;
}


Testing it:

useInitLists()

[1] "larry" "curly" "moe"


Lastly, we can appreciate the addition loops over ranges:

#include

// [[Rcpp::export]]
int simpleProd(std::vector vec) {
int prod = 1;
for (int &x : vec) {       // loop over all values of vec
prod *= x;              // access each elem., comp. product
}
return prod;
}


This third example we can also look at:

simpleProd(1:5)

[1] 120


Again, we need to remind the reader that this still requires setting the -std=c++11 option for g++, and that CRAN will not allow this in uploads. Yet. That time will come though. And in the meantime, this can of course be used for non-CRAN projects.