[This article was first published on Romain Francois, Professional R Enthusiast, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Dirk released Rcpp 0.7.5 yesterday
The main thing is the smarter wrap function that now uses techniques of type traits and template meta-programming to have a compile time guess at whether an object is wrappable, and how to do it. Currently wrappable types are :
- primitive types : int, double, Rbyte, Rcomplex
- std::string
- STL containers such as std::vector<T> as long as T is wrappable. This is not strictly tied to the STL, actually any type that has a nested type called iterator and member functions begin() and end() will do
- STL maps keyed by strings such as std::map<std::string,T> as long as T is wrappable
- any class that can be implicitely converted to
SEXP - any class for which the
wraptemplate is partly or fully specialized. (The next version of RInside has an example of that)
Here comes an example (from our unit tests) :
funx <- cfunction(signature(),
'
std::map< std::string,std::vector<int> > m ;
std::vector<int> b ; b.push_back(1) ; b.push_back(2) ; m["b"] = b ;
std::vector<int> a ; a.push_back(1) ; a.push_back(2) ; a.push_back(2) ; m["a"] = a ;
std::vector<int> c ; c.push_back(1) ; c.push_back(2) ; c.push_back(2) ; c.push_back(2) ; m["c"] = c ;
return wrap(m) ;
',
Rcpp=TRUE, verbose=FALSE, includes = "using namespace Rcpp;" )
R> funx()
$a
[1] 1 2 2
$b
[1] 1 2
$c
[1] 1 2 2 2
Apart from that, other things have changed, here is the relevant section of the NEWS for this release
o wrap has been much improved. wrappable types now are :
- primitive types : int, double, Rbyte, Rcomplex, float, bool
- std::string
- STL containers which have iterators over wrappable types:
(e.g. std::vector, std::deque, std::list, etc ...).
- STL maps keyed by std::string, e.g std::map
- classes that have implicit conversion to SEXP
- classes for which the wrap template if fully or partly specialized
This allows composition, so for example this class is wrappable:
std::vector< std::map > (if T is wrappable)
o The range based version of wrap is now exposed at the Rcpp::
level with the following interface :
Rcpp::wrap( InputIterator first, InputIterator last )
This is dispatched internally to the most appropriate implementation
using traits
o a new namespace Rcpp::traits has been added to host the various
type traits used by wrap
o The doxygen documentation now shows the examples
o A new file inst/THANKS acknowledges the kind help we got from others
o The RcppSexp has been removed from the library.
o The methods RObject::asFoo are deprecated and will be removed
in the next version. The alternative is to use as.
o The method RObject::slot can now be used to get or set the
associated slot. This is one more example of the proxy pattern
o Rcpp::VectorBase gains a names() method that allows getting/setting
the names of a vector. This is yet another example of the
proxy pattern.
o Rcpp::DottedPair gains templated operator> that
allow wrap and push_back or wrap and push_front of an object
o Rcpp::DottedPair, Rcpp::Language, Rcpp::Pairlist are less
dependent on C++0x features. They gain constructors with up
to 5 templated arguments. 5 was choosed arbitrarily and might
be updated upon request.
o function calls by the Rcpp::Function class is less dependent
on C++0x. It is now possible to call a function with up to
5 templated arguments (candidate for implicit wrap)
o added support for 64-bit Windows (thanks to Brian Ripley and Uwe Ligges)
To leave a comment for the author, please follow the link and comment on their blog: Romain Francois, Professional R Enthusiast.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
