Hàm switch()
Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 47 trên 64.
switch(x, name = value, ...) so sánh chuỗi văn bản x với các tên rồi trả về giá trị tương ứng với tên khớp. Câu lệnh này thay thế một chuỗi dài các phép so sánh else if với cùng một biến:
size <- "m"
price <- switch(size, s = 2.5, m = 3, l = 3.5)
print(price)Đầu ra:
[1] 3Giá trị cuối cùng không có tên là giá trị mặc định, được dùng khi không có giá trị nào khớp. Nếu không có giá trị mặc định, switch() không khớp sẽ trả về NULL mà bạn không thấy:
day <- "fri"
print(switch(day, sat = "rest", sun = "rest", "work"))
print(is.null(switch("x", a = 1)))Đầu ra:
[1] "work"
[1] TRUEGiá trị rỗng sẽ chuyển sang giá trị tiếp theo, nên nhiều tên có thể dùng chung một kết quả:
kind <- function(day) switch(day, sat = , sun = "weekend", "weekday")
print(kind("sun"))
print(kind("tue"))Đầu ra:
[1] "weekend"
[1] "weekday"Giá trị có thể là toàn bộ khối code nằm trong dấu ngoặc nhọn, và kết quả là biểu thức cuối cùng được chạy trong khối:
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))Đầu ra:
[1] 12
[1] 78.54Thử thách
DễHoàn thiện calculate(a, op, b). op là một trong các giá trị plus, minus, times và over. Trả về kết quả áp dụng op cho a và b, hoặc unknown operation nếu op có giá trị khác. Chia cho 0 sẽ trả về cannot divide by zero.
Code được cung cấp đọc a, op và b (mỗi giá trị trên một dòng), rồi in ra giá trị được trả về.
Tự làm thử
calculate <- function(a, op, b) {
# Viết code của bạn ở đây
"unknown operation"
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(calculate(as.numeric(input[1]), input[2], as.numeric(input[3])), sep = "\n")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểmTự luyện tập: Trình biên dịch R online