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
|
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 an 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 provided, 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)