rray (said: “r-ray”) is an array manipulation library for R. It has three main goals:

  • To provide an rray class that tries to be stricter and more consistent than base R arrays, similar in spirit to tibble.
  • To support broadcasting throughout the package, which allows for novel yet intuitive array operations that have been missing from the R ecosystem.
  • To provide a consistent, powerful toolkit for array based manipulation, usable by both the new rray objects and base R matrices/arrays.

View the vignettes for each goal on the website to learn more about how to use rray.


What can it do?

In short, rray tries to make array manipulation in R more intuitive by combining the idea of broadcasting with knowing when to not drop dimensions. This results in operations such as:

These concepts are baked into every part of rray, and show up in other functions such as rray_bind(). Using broadcasting, rray_bind() can bind arrays together in ways that base R cannot with the native cbind() and rbind() functions.


You can install from CRAN with:

You can install the development version from Github with:


rray would not be possible without the underlying C++ library, xtensor. Additionally, rray uses a large amount of the infrastructure in vctrs to be as consistent and type stable as possible.


The Matrix package implements a small subset of column-wise broadcasting operations. rray fully supports broadcasting in all operations.

The original motivation for this package, and even for xtensor, is the excellent Python library, NumPy. As far as I know, it has the original implementation of broadcasting, and is a core library that a huge number of others are built on top of.

In the past, the workhorse for flexibly binding arrays together has been the abind package. This package has been a great source of inspiration and has served as a nice benchmark for rray.


Currently, rray does not handle missing values in arithmetic operations and the reducing functions. This is coming, as the underlying library xtensor natively supports missing values, however a few upstream bugs are currently preventing rray from using those features.

rray will perform best on R 3.6.0 and above. It is able to take advantage of a few of the ALTREP features there, which result in less copies being made per function call.