The ... syntax of base R allows you to:

  • Forward arguments from function to function, matching them along the way to function parameters.

  • Collect arguments inside data structures, e.g. with c() or list().

Dynamic dots offer a few additional features:

  1. You can splice arguments saved in a list with the big bang operator !!!.

  2. You can unquote names by using the glue syntax or the bang bang operator !! on the left-hand side of :=.

  3. Trailing commas are ignored, making it easier to copy and paste lines of arguments.

Add dynamic dots support in your functions

If your function takes dots, adding support for dynamic features is as easy as collecting the dots with list2() instead of list().

Other dynamic dots collectors are dots_list(), which is more configurable than list2(), vars() which doesn't force its arguments, and call2() for creating calls.

Document dynamic docs using this standard tag:

 @param ... <[`dynamic-dots`][rlang::dyn-dots]> What these dots do.

Examples

f <- function(...) {
  out <- list2(...)
  rev(out)
}

# Splice
x <- list(alpha = "first", omega = "last")
f(!!!x)
#> $omega
#> [1] "last"
#> 
#> $alpha
#> [1] "first"
#> 

# Unquote a name, showing both the `!!` bang bang and `{}` glue style
nm <- "key"
f(!!nm := "value")
#> $key
#> [1] "value"
#> 
f("{nm}" := "value")
#> $key
#> [1] "value"
#> 
f("prefix_{nm}" := "value")
#> $prefix_key
#> [1] "value"
#> 

# Tolerate a trailing comma
f(this = "that", )
#> $this
#> [1] "that"
#>