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チャレンジ
簡単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")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ