# Ignoring case

## base

The base function match.arg() is good, but it doesn’t offer the possiblity to ignore case during argument matching. Sometimes it’s good to ignore case; for example, if you’re matching the arguments c("yes", "no"), there’s no need to worry about case.

base::match.arg("Y", c("yes", "no"))
#> Error in base::match.arg("Y", c("yes", "no")): 'arg' should be one of "yes", "no"

## strex

The default behaviour of strex::match_arg() is to observe case, but case ignorance can be turned on with ignore_case = TRUE.

strex::match_arg("Y", c("yes", "no"))
#> arg must be a prefix of exactly one element of choices.
#>     * Your choices are "yes" and "no".
#>     * Your arg "Y" is not a prefix of any of your choices.
strex::match_arg("Y", c("yes", "no"), ignore_case = TRUE)
#> [1] "yes"

# Error Messages

You can begin to see above that the error message from strex::match_arg() are more informative and nicely formatted. Here are a few more examples.

## No matches

choices <- c("Apples", "Pears", "Bananas", "Oranges", "Avocados", "Apricots")
match.arg("Q", choices)
#> Error in match.arg("Q", choices): 'arg' should be one of "Apples", "Pears", "Bananas", "Oranges", "Avocados", "Apricots"
strex::match_arg("Q", choices)
#> arg must be a prefix of exactly one element of choices.
#>     * Your choices are "Apples", "Pears", "Bananas", "Oranges", "Avocados" and "Apricots".
#>     * Your arg "Q" is not a prefix of any of your choices.

## Multiple matches

match.arg("A", choices)
#> Error in match.arg("A", choices): 'arg' should be one of "Apples", "Pears", "Bananas", "Oranges", "Avocados", "Apricots"
strex::match_arg("A", choices)
#> arg must be a prefix of exactly one element of choices.
#>     * Your arg "A" is a prefix of two or more elements of choices.
#>     * The first two of these are "Apples" and "Avocados".

## Wrong arg length

match.arg(c("A", "a"), choices)
#> Error in match.arg(c("A", "a"), choices): 'arg' must be of length 1
strex::match_arg(c("A", "a"), choices)
#> arg must have length 1.
#>     * Your arg has length 2.
#>     * To use an arg with length greater than one, use several_ok = TRUE.

## Duplicate elements in choices

choices <- c(choices, "Pears")
match.arg("P", choices)
#> Error in match.arg("P", choices): 'arg' should be one of "Apples", "Pears", "Bananas", "Oranges", "Avocados", "Apricots", "Pears"
strex::match_arg("P", choices)
#> choices must not have duplicate elements.
#>     * Element 7, of your choices ("Pears") is a duplicate.

## Not specifying choices

It’s OK not to specify choices in one circumstance: when arg is passed as a default argument of another function.

myword <- function(w = c("abacus", "baseball", "candy")) {
w <- strex::match_arg(w)
w
}
myword()
#> [1] "abacus"
myword("b")
#> [1] "baseball"
myword("c")
#> [1] "candy"

This is very strict though, only the symbol for the default argument can be passed, not any variant of it, not even something which evaluates to the same thing.

myword <- function(w = c("abacus", "baseball", "candy")) {
w <- strex::match_arg(identity(w))
w
}
myword("b")
#> You have used strex::match_arg() without specifying a choices argument.
#>     * The only way to do this is from another function where arg has a default setting. This is the same as base::match.arg().
#>     * See the man page for strex::match_arg(), particularly the examples: enter help("strex::match_arg", package = "strex") at the R console.
#>     * See also the vignette on argument matching: enter vignette("argument-matching", package = "strex") at the R console.
myword <- function(w = c("abacus", "baseball", "candy")) {
w <- strex::match_arg(as.character(w))
w
}
myword("b")
#> You have used strex::match_arg() without specifying a choices argument.
#>     * The only way to do this is from another function where arg has a default setting. This is the same as base::match.arg().
#>     * See the man page for strex::match_arg(), particularly the examples: enter help("strex::match_arg", package = "strex") at the R console.
#>     * See also the vignette on argument matching: enter vignette("argument-matching", package = "strex") at the R console.