當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。