The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

super

super is a fork / reimplementation of the glue package with a focus on efficiency and simplicity at a cost of flexibility.

As of the 0.0.1 release it should be considered ‘experimental’.

Differences from glue

Examples

library(super)

Simple concatenation

bar <- "baz"
glue("foo{bar}")
#> [1] "foobaz"

list-like input

dat <- head(cbind(car = rownames(mtcars), mtcars))
glue("{car} does {mpg} mpg.", dat)
#> [1] "Mazda RX4 does 21 mpg."           "Mazda RX4 Wag does 21 mpg."      
#> [3] "Datsun 710 does 22.8 mpg."        "Hornet 4 Drive does 21.4 mpg."   
#> [5] "Hornet Sportabout does 18.7 mpg." "Valiant does 18.1 mpg."          

Trimmed output

name <- "Fred"
age <- 50
anniversary <- as.Date("1991-10-12")
out <- glut("
    My name is {name},
    my age next year is {age},
    my anniversary is {anniversary}.
")
cat(out)
#> My name is Fred,
#> my age next year is 50,
#> my anniversary is 1991-10-12.

Partially vectorised

Over embraced arguments

head(glue("Item {LETTERS}"))
#> [1] "Item A" "Item B" "Item C" "Item D" "Item E" "Item F"

But not over input strings (yet)

tryCatch(
    glue(letters),
    error = function(e) conditionMessage(e)
)
#> [1] "`x` must be a character vector of length <= 1."

Relative timing benchmarks

library(microbenchmark)

Simple concatenation

bar <- "baz"
bob <- 20

microbenchmark(
    sprintf    = sprintf("foo%s %d", bar, bob),
    paste0     = paste0("foo", bar, " ", bob),
    super   = super::glue("foo{bar} {bob}"),
    glue    = as.character(glue::glue_safe("foo{bar} {bob}", .trim = FALSE)),
    unit    = "relative",
    check   = "identical"
)
#> Unit: relative
#>     expr       min        lq      mean    median        uq        max neval
#>  sprintf  1.000000  1.000000  1.000000  1.000000  1.000000  1.0000000   100
#>   paste0  2.923077  2.548387  2.215917  2.443609  2.233766  0.7641278   100
#>    super  9.519231  8.387097  7.745902  8.045113  7.370130  8.4990172   100
#>     glue 76.211538 65.153226 56.984004 61.654887 54.987013 23.1769042   100

Data frame input

dat <- head(cbind(car = rownames(mtcars), mtcars))

microbenchmark(
    sprintf = with(dat, sprintf("%s does %.3g mpg.", car, mpg)),
    paste0  = with(dat, paste(car, "does", mpg, "mpg.")),
    super   = super::glue("{car} does {mpg} mpg.", dat),
    glue    = as.character(glue::glue_data(dat, "{car} does {mpg} mpg.")),
    unit    = "relative",
    check   = "identical"
)
#> Unit: relative
#>     expr       min        lq      mean    median        uq       max neval
#>  sprintf  1.000000  1.000000  1.000000  1.000000  1.000000 1.0000000   100
#>   paste0  1.592920  1.579750  1.506970  1.530799  1.456287 0.6868255   100
#>    super  2.699115  2.662968  2.591546  2.652687  2.520958 2.0497547   100
#>     glue 16.899705 16.435645 15.493271 15.842726 14.906826 7.7548003   100

Trimmed output

microbenchmark(
    super   = super::glut("
                  My name is {name},
                  my age next year is {age},
                  my anniversary is {anniversary}.
              "),
    glue    = as.character(glue::glue("
                  My name is {name},
                  my age next year is {age},
                  my anniversary is {anniversary}.
              ")),
    unit    = "relative",
    check   = "identical"
)
#> Unit: relative
#>   expr     min       lq     mean   median      uq      max neval
#>  super 1.00000 1.000000 1.000000 1.000000 1.00000 1.000000   100
#>   glue 3.98756 3.887826 3.774621 3.770443 3.74342 4.368112   100

Vectorized performance

For larger input with both glue::glue() and super::glue(), the performance becomes dominated by the internally constructed call to paste0(), hence the convergence observed below.

bar <- rep("baz", 1e5)
microbenchmark(
    sprintf    = sprintf("foo%s %d", bar, bob),
    paste0     = paste0("foo", bar, " ", bob),
    super   = super::glue("foo{bar} {bob}"),
    glue    = as.character(glue::glue_safe("foo{bar} {bob}", .trim = FALSE)),
    unit    = "relative",
    check   = "identical"
)
#> Unit: relative
#>     expr      min        lq      mean   median       uq       max neval
#>  sprintf 1.316364 1.2463718 1.2202212 1.229948 1.188425 1.1623451   100
#>   paste0 1.000000 1.0000000 1.0000000 1.000000 1.000000 1.0000000   100
#>    super 1.000987 0.9996379 0.9978373 1.005749 0.999861 0.9359781   100
#>     glue 1.126058 1.1136983 1.1040777 1.104940 1.088775 1.1196975   100

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.