Select One of a List of Alternatives

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

switch(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.

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.


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.


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.


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

  • switch
library(base) 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)
Documentation reproduced from package base, version 3.0.3, License: Part of R 3.0.3

Community examples

Looks like there are no examples yet.