R Peculiarities

R supports only a subset of types available in C++. The types which are natively supported with xtensor-R are int (32 bit), double, complex, byte. Using other types (such as a C++ float) in a rarray or rtensor will fail to compile.

Below is a mapping from R to xtensor:

R type

xtensor type

Integer Vector

rarray<int> or rarray<int32_t>

Real Vector

rarray<double>

Complex Vector

rarray<std::complex<double>>

Raw Vector

rarray<Rbyte> or rarray<uint8_t>

Logical Vector

Not supported at the moment

Note that, for illustration purposes, rarray was used above. The rtensor container works just as well.

R’s NA and NaN values

R encodes missing values (NAs) as special values of the underlying type.

Xtensor-r supports R’s missing values with the rarray_optional and rtensor_optional counterparts to rarray and rtensor which enable operations with missing values with the xoptional API.

R defining PI as macro

Ancient versions of S used to define a PI macro. This macro collides with xtensor, as xtensor is using PI as a variable name in the numeric constants.

If you’re encountering this issue, either reorder your headers so that the xmath header of xtensor is included before Rcpp / xtensor-r or use the following define before including xtensor-r and Rcpp:

#define STRICT_R_HEADERS

This prevents the PI macro definition.