One word - performance
Low level compiled language ( vs. R is interpreted)
Static type system ( vs. R is dynamic)
Rigorous language definition / standard (vs. R is ad hoc)
Extensive ecosystem of code / libraries
Standard Template Library (STL)
SEXP convolve2(SEXP a, SEXP b)
{
SEXP ab;
PROTECT(a = AS_NUMERIC(a));
PROTECT(b = AS_NUMERIC(b));
int na = LENGTH(a);
int nb = LENGTH(b);
int nab = na + nb - 1;
PROTECT(ab = NEW_NUMERIC(nab));
double *xa = NUMERIC_POINTER(a);
double *xb = NUMERIC_POINTER(b);
double *xab = NUMERIC_POINTER(ab);
for(int i = 0; i < nab; i++)
xab[i] = 0.0;
for(int i = 0; i < na; i++)
for(int j = 0; j < nb; j++)
xab[i + j] += xa[i] * xb[j];
UNPROTECT(3);
return(ab);
}
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector convolveCpp(NumericVector a, NumericVector b)
{
int na = a.size(), nb = b.size();
int nab = na + nb - 1;
NumericVector xab(nab);
for (int i = 0; i < na; i++)
for (int j = 0; j < nb; j++)
xab[i + j] += a[i] * b[j];
return xab;
}
Provides a much more elegant (less painful) interface between R and C++ replacing .C
and .Call
Native C++ representations of all R objects (vectors, matrices, lists, S4, etc.)
Straight forward access to object attributes
Simple translation from and to R (as
and wrap
)
High level support for compiling / linking / wrapper creation
evalCpp
, cppFunction
, sourceCpp
Rcpp Sugar brings some of R’s functional tools into C++
One of the reasons to use Rcpp is to have easier access to the C++ library ecosystem.
One example that is relevant to our discussion from last time is RcppArmadillo, which provides access to the Armadillo C++ library for linear algebra (a more expressive / higher level / R-like way of using BLAS / LAPACK in C++).
rmvnorm