knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.path = "man/figures/README-",
  out.width = "100%"
)

rray

Lifecycle: experimental Travis build status Codecov test coverage

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

A set of slides, presented by Davis Vaughan at useR! 2019, introducing the package and showing its utility can be found on speakerdeck.

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

library(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:

x <- rray(1:6, dim = c(3, 2))

# Compute proportions along the 1st dimension
x / rray_sum(x, axes = 1)

# Equivalent base R syntax
sweep(x, 2, apply(x, 2, sum), "/")

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.

a <- array(c(1, 2), dim = c(2, 1))
b <- array(c(3, 4), dim = c(1, 2))

a

b

# Error
cbind(a, b)

# `a` is first broadcast to have dimensions: (2, 2)
rray_bind(a, b, .axis = 1)

# Error
rbind(a, b)

# `b` is first broadcast to have dimensions: (2, 2)
rray_bind(a, b, .axis = 2)

Installation

You can install from CRAN with:

install.packages("rray")

You can install the development version from Github with:

remotes::install_github("r-lib/rray")

Acknowledgements

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.

Alternatives

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.

Notes

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.



DavisVaughan/rray documentation built on Feb. 5, 2020, 10:06 p.m.