Функция switch()
Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 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 или unknown operation для любого другого значения op. Деление на ноль возвращает 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")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки углублённо
Подстроки с substr()Форматирование с sprintf()Разделение и объединениеПоиск в строкахЗамена текстаПовторение — создание имени пользователя4Матрицы
Создание матрицИндексация матрицСводные данные по строкам и столбцамАрифметика матрицПовторение — схема рассадки7Семейство Apply
lapply и sapplyMap и mapplyFilter и FindReduceПовторение — конвейер обработки данных10Продвинутые конструкции управления
Функция switch()Векторизованный ifelse()repeat и breakРекурсивные функцииПовторение — классификатор оценок2Поиск по ключам и значениям
Поиск в именованных векторахПроверка ключейДобавление и удаление ключейПеребор имёнПовторение — биржа акций5Проект — Журнал оценок
Добавление учениковВыставление оценок3Множества и подсчёт
Уникальные значенияОперации с множествамиПроверка принадлежностиПодсчёт с помощью table()Повторение — гости мероприятия6Функции как значения
Анонимные функцииПередача функцийВозврат функцийЗамыкания с состояниемПовторение — правила скидок9Таблицы данных
Создание таблиц данныхСтолбцы и строкиФильтрация строкДобавление и сортировкаПовторение — отчёт о продажах12Проект — Трекер расходов
Запись расходовОбщие расходыПотренируйтесь самостоятельно: Онлайн-компилятор R