Get started

Installation

First install ir. Then install rush as an ir tool, which puts a rush launcher on your PATH:

ir tool install github::jeroenjanssens/rush

That’s it; there’s no separate R package to load. The first time a command needs a package (say, ggplot2 for a plot), ir fetches and caches it for you.

Quick tour

Evaluate an expression. The value of the last expression is printed:

rush run '6 * 7'
#> 42

Read from standard input with -. Input is read into a data frame called df, so seq 6 becomes a one-column table you can compute on:

seq 6 | rush run -H '2 * sum(df$x1)' -
#> 42

Give rush run a file and it is read into df before your expression runs. With no expression, the data frame is simply printed back out, a handy way to peek at a file:

rush run 'head(df, 5)' penguins.csv
#> species,island,bill_length_mm,bill_depth_mm,flipper_length_mm,body_mass_g,sex,year
#> Adelie,Torgersen,39.1,18.7,181,3750,male,2007
#> Adelie,Torgersen,39.5,17.4,186,3800,female,2007
#> Adelie,Torgersen,40.3,18,195,3250,female,2007
#> Adelie,Torgersen,36.7,19.3,193,3450,female,2007
#> Adelie,Torgersen,39.3,20.6,190,3650,male,2007

Because rush writes plain CSV to standard output, you can keep piping into the next command, including another rush:

rush run 'head(df, 100)' penguins.csv | rush run 'df |> dplyr::select(species, bill_length_mm, body_mass_g)' -
#> species,bill_length_mm,body_mass_g
#> Adelie,39.1,3750
#> Adelie,39.5,3800
#> Adelie,40.3,3250
#> Adelie,36.7,3450
#> Adelie,39.3,3650
#> Adelie,38.9,3625
#> Adelie,39.2,4675
#> Adelie,41.1,3200
#> Adelie,38.6,3800
#> Adelie,34.6,4400
#> Adelie,36.6,3700
#> Adelie,38.7,3450
#> Adelie,42.5,4500
#> Adelie,34.4,3325
#> Adelie,46,4200
#> Adelie,37.8,3400
#> Adelie,37.7,3600
#> Adelie,35.9,3800
#> Adelie,38.2,3950
#> Adelie,38.8,3800
#> Adelie,35.3,3800
#> Adelie,40.6,3550
#> Adelie,40.5,3200
#> Adelie,37.9,3150
#> Adelie,40.5,3950
#> Adelie,39.5,3250
#> Adelie,37.2,3900
#> Adelie,39.5,3300
#> Adelie,40.9,3900
#> Adelie,36.4,3325
#> Adelie,39.2,4150
#> Adelie,38.8,3950
#> Adelie,42.2,3550
#> Adelie,37.6,3300
#> Adelie,39.8,4650
#> Adelie,36.5,3150
#> Adelie,40.8,3900
#> Adelie,36,3100
#> Adelie,44.1,4400
#> Adelie,37,3000
#> Adelie,39.6,4600
#> Adelie,41.1,3425
#> Adelie,36,3450
#> Adelie,42.3,4150
#> Adelie,39.6,3500
#> Adelie,40.1,4300
#> Adelie,35,3450
#> Adelie,42,4050
#> Adelie,34.5,2900
#> Adelie,41.4,3700
#> Adelie,39,3550
#> Adelie,40.6,3800
#> Adelie,36.5,2850
#> Adelie,37.6,3750
#> Adelie,35.7,3150
#> Adelie,41.3,4400
#> Adelie,37.6,3600
#> Adelie,41.1,4050
#> Adelie,36.4,2850
#> Adelie,41.6,3950
#> Adelie,35.5,3350
#> Adelie,41.1,4100
#> Adelie,35.9,3050
#> Adelie,41.8,4450
#> Adelie,33.5,3600
#> Adelie,39.7,3900
#> Adelie,39.6,3550
#> Adelie,45.8,4150
#> Adelie,35.5,3700
#> Adelie,42.8,4250
#> Adelie,40.9,3700
#> Adelie,37.2,3900
#> Adelie,36.2,3550
#> Adelie,42.1,4000
#> Adelie,34.6,3200
#> Adelie,42.9,4700
#> Adelie,36.7,3800
#> Adelie,35.1,4200
#> Adelie,37.3,3350
#> Adelie,41.3,3550
#> Adelie,36.3,3800
#> Adelie,36.9,3500
#> Adelie,38.3,3950
#> Adelie,38.9,3600
#> Adelie,35.7,3550
#> Adelie,41.1,4300
#> Adelie,34,3400
#> Adelie,39.6,4450
#> Adelie,36.2,3300
#> Adelie,40.8,4300
#> Adelie,38.1,3700
#> Adelie,40.3,4350
#> Adelie,33.1,2900
#> Adelie,43.2,4100
#> Adelie,35,3725
#> Adelie,41,4725
#> Adelie,37.7,3075
#> Adelie,37.8,4250
#> Adelie,37.9,2925
#> Adelie,39.7,3550

Load extra packages with -l, or enter the whole Tidyverse with -t:

rush run -t 'penguins |> count(species, sort = TRUE)' penguins.csv
#> species,n
#> Adelie,152
#> Gentoo,124
#> Chinstrap,68

Query files directly with SQL:

rush sql "SELECT species, ROUND(AVG(body_mass_g)) AS avg_mass, COUNT(*) AS n
          FROM penguins GROUP BY species ORDER BY avg_mass DESC" penguins.csv
#> species,avg_mass,n
#> Gentoo,5092,119
#> Chinstrap,3733,68
#> Adelie,3706,146

Convert between formats in one step:

rush convert -o penguins.parquet penguins.csv
rush run 'nrow(df)' penguins.parquet
#> 333

What’s next?