R: Select One of a List of Alternatives

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. If this 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 returned. Before R 2.13.0 the first one would have been used.)

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

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

Before R 2.11.0 it was necessary to avoid partial matching: an alternative `E = foo` matched the first argument `EXPR` unless that was named.

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")

    ## 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 2.15.1 Index]