switch {base} | R Documentation

## Select One of a List of Alternatives

### Description

`switch` evaluates `EXPR` and accordingly chooses one of the further arguments (in `...`).

### Usage

    switch(EXPR, ...)

### Arguments

`EXPR` | an expression evaluating to a number or a character string.
`...` | the list of alternatives. If it is intended that `EXPR` has a character-string value these will be named, perhaps except for one alternative to be used as a ‘default’ value.

### Details

`switch` works in two distinct ways depending whether the first argument evaluates to a character string or a number.

If the value of `EXPR` is not a character string it is coerced to integer. Note that this also happens for `factor`s, with a warning, as typically the character level is meant. If the integer is between 1 and `nargs()-1` then the corresponding element of `...` is evaluated and the result returned: thus if the first argument is `3` then the fourth argument is evaluated and returned.

If `EXPR` evaluates to a character string then that string is matched (exactly) to the names of the elements in `...`. If there is a match then that element is evaluated unless it is missing, in which case the next non-missing element is evaluated, so for example `switch("cc", a = 1, cc =, cd =, d = 2)` evaluates to `2`. If there is more than one match, the first matching element is used. In the case of no match, if there is a unnamed element of `...` its value is returned. (If there is more than one such argument an error is signaled.)

The first argument is always taken to be `EXPR`: if it is named its name must (partially) match.

A warning is signaled if no alternatives are provides, as this is usually a coding error.

This is implemented as a primitive function that only evaluates its first argument and one other if one is selected.

### Value

The value of one of the elements of `...`, or `NULL`, invisibly (whenever no element is selected).

The result has the visibility (see `invisible`) of the element evaluated.

### Warning

It is possible to write calls to `switch` that can be confusing and may not work in the same way in earlier versions of R. For compatibility (and clarity), always have `EXPR` as the first argument, naming it if partial matching is a possibility. For the character-string form, have a single unnamed argument as the default after the named values.

### References

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

### Examples

    require(stats)
    centre <- function(x, type) {
      switch(type,
             mean = mean(x),
             median = median(x),
             trimmed = mean(x, trim = .1))
    }
    x <- rcauchy(10)
    centre(x, "mean")
    centre(x, "median")
    centre(x, "trimmed")

    ccc <- c("b","QQ","a","A","bb")
    # note: cat() produces no output for NULL
    for(ch in ccc)
        cat(ch,":", switch(EXPR = ch, a = 1, b = 2:3), "\n")
    for(ch in ccc)
        cat(ch,":", switch(EXPR = ch, a =, A = 1, b = 2:3, "Otherwise: last"),"\n")

    ## switch(f, *) with a factor f
    ff <- gl(3,1, labels=LETTERS[3:1])
    ff[1] # C
    ## so one might expect " is C" here, but
    switch(ff[1], A = "I am A", B="Bb..", C=" is C")# -> "I am A"
    ## so we give a warning

    ## Numeric EXPR does not allow a default value to be specified
    ## -- it is always NULL
    for(i in c(-1:3, 9))  print(switch(i, 1, 2 , 3, 4))

    ## visibility
    switch(1, invisible(pi), pi)
    switch(2, invisible(pi), pi)

[Package base version 3.4.3 Index]