This is equivalent to base::match.arg()
with a few differences:
Partial matches trigger an error.
Error messages are a bit more informative and obey the tidyverse standards.
arg_match()
derives the possible values from the
caller frame.
arg_match0()
is a bare-bones version if performance is at a premium.
It requires a string as arg
and explicit values
.
For convenience, arg
may also be a character vector containing
every element of values
, possibly permuted.
In this case, the first element of arg
is used.
arg_match(arg, values = NULL) arg_match0(arg, values, arg_nm = as_label(substitute(arg)))
arg | A symbol referring to an argument accepting strings. |
---|---|
values | The possible values that |
arg_nm | The label to be used for |
The string supplied to arg
.
fn <- function(x = c("foo", "bar")) arg_match(x) fn("bar") #> [1] "bar" # Throws an informative error for mismatches: try(fn("b")) #> Error : `x` must be one of "foo" or "bar". #> Did you mean "bar"? try(fn("baz")) #> Error : `x` must be one of "foo" or "bar". #> Did you mean "bar"? # Use the bare-bones version with explicit values for speed: arg_match0("bar", c("foo", "bar", "baz")) #> [1] "bar" # For convenience: fn1 <- function(x = c("bar", "baz", "foo")) fn3(x) fn2 <- function(x = c("baz", "bar", "foo")) fn3(x) fn3 <- function(x) arg_match0(x, c("foo", "bar", "baz")) fn1() #> [1] "bar" fn2("bar") #> [1] "bar" try(fn3("zoo")) #> Error : `x` must be one of "foo", "bar", or "baz". #> Did you mean "foo"?