exec() [Making your own …]

What if your function doesn’t have tidy dots?

Can’t use !! or := if doesn’t support rlang or dynamic dots

my_mean <- function(x, arg_name, arg_val) {
  mean(x, !!arg_name := arg_val)
}

my_mean(c(NA, 1:10), arg_name = "na.rm", arg_val = TRUE)     
#> Error in `my_mean()`:
#> ! `:=` can only be used within dynamic dots.

Let’s use the … from exec()

exec(.fn, ..., .env = caller_env())
my_mean <- function(x, arg_name, arg_val) {
  exec("mean", x, !!arg_name := arg_val)
}

my_mean(c(NA, 1:10), arg_name = "na.rm", arg_val = TRUE)     
#> [1] 5.5

Note that you do not unquote arg_val.

Also exec is useful for mapping over a list of functions:

x <- c(runif(10), NA)
funs <- c("mean", "median", "sd")
purrr::map_dbl(funs, exec, x, na.rm = TRUE)
#> [1] 0.4226386 0.4059957 0.2926618