Menu
CoddyTech

switch() 函数

本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 47 课,共 64 课。

switch(x, name = value, ...) 会将文本 x 与各个名称进行比较,并返回匹配名称对应的值。它可以替代针对同一个变量进行的一长串 else if 比较:

size <- "m"
price <- switch(size, s = 2.5, m = 3, l = 3.5)
print(price)

输出:

[1] 3

最后一个没有名称的值是默认值,在没有任何匹配项时使用。如果没有默认值,不匹配的 switch() 会悄无声息地返回 NULL:

day <- "fri"
print(switch(day, sat = "rest", sun = "rest", "work"))
print(is.null(switch("x", a = 1)))

输出:

[1] "work"
[1] TRUE

空值会继续匹配下一个值,因此多个名称可以对应同一个结果:

kind <- function(day) switch(day, sat = , sun = "weekend", "weekday")
print(kind("sun"))
print(kind("tue"))

输出:

[1] "weekend"
[1] "weekday"

这些值可以是用花括号括起来的完整代码块,结果是代码块中最后运行的表达式:

area <- function(shape, a, b = a) {
  switch(shape,
    square = a^2,
    rect = a * b,
    circle = {
      r <- a / 2
      round(pi * r^2, 2)
    },
    NA)
}
print(area("rect", 3, 4))
print(area("circle", 10))

输出:

[1] 12
[1] 78.54
challenge icon

挑战

简单

完成 calculate(a, op, b)。op 是 plus、minus、times 和 over 之一。返回将它应用于 a 和 b 的结果;对于任何其他 op,返回 unknown operation。除以零时返回 cannot divide by zero。

提供的代码会读取 a、op 和 b(每行一个),并打印返回的值。

亲手试试

calculate <- function(a, op, b) {
  # 在这里编写你的代码
  "unknown operation"
}

# 提供的输入/输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
cat(calculate(as.numeric(input[1]), input[2], as.numeric(input[3])), sep = "\n")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: R 在线编译器