Menu
Coddy logo textTech

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を(1行に1つずつ)読み取り、返された値を出力します。

自分で試してみよう

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オンラインコンパイラ