Date: 2018-11-30

# Argument Matching

#### 2018-11-30

# 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"))
    #> Error: `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)
    #> Error: `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)
    #> Error: `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)
    #> Error: `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)
    #> Error: `choices` must not have duplicate elements.
    #>     * Element 7, of your `choices` ("Pears") is a duplicate.