当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R switch 选择替代方案列表之一


R语言 switch 位于 base 包(package)。

说明

switch 评估 EXPR 并相应地选择其他参数之一(在 ... 中)。

用法

switch(EXPR, ...)

参数

EXPR

计算结果为数字或字符串的表达式。

...

替代方案列表。如果 EXPR 有一个字符串值,这些值将被命名,也许除了用作 ‘default’ 值的一种替代方案之外。

细节

switch 以两种不同的方式工作,具体取决于第一个参数的计算结果是字符串还是数字。

如果 EXPR 的值不是字符串,则它会被强制转换为整数。请注意,factor 也会发生这种情况,并带有警告,因为通常是字符级别的意思。如果整数介于 1 和 nargs()-1 之间,则计算 ... 的相应元素并返回结果:因此,如果第一个参数是 3,则计算并返回第四个参数。

如果 EXPR 计算结果为字符串,则该字符串与 ... 中的元素名称(完全)匹配。如果存在匹配,则评估该元素,除非该元素缺失,在这种情况下,评估下一个非缺失元素,例如 switch("cc", a = 1, cc =, cd =, d = 2) 评估为 2 。如果存在多个匹配项,则使用第一个匹配元素。在不匹配的情况下,如果 ... 存在未命名元素,则返回其值。 (如果有多个这样的参数,则会发出错误信号。)

第一个参数始终被视为EXPR:如果命名它的名称必须(部分)匹配。

如果未提供替代方案,则会发出警告信号,因为这通常是编码错误。

这是作为 primitive 函数实现的,该函数仅计算其第一个参数,如果选择了一个参数,则计算另一个参数。

...NULL 的元素之一的值,不可见(只要未选择任何元素)。

结果具有所评估元素的可见性(请参阅invisible)。

警告

可以编写调用switch这可能会令人困惑,并且在早期版本中可能无法以相同的方式工作R。为了兼容性(和清晰度),始终有EXPR作为第一个参数,如果可能部分匹配,则命名它。对于字符串形式,在命名值之后有一个未命名参数作为默认值。

例子

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)

参考

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

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Select One of a List of Alternatives。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。