Проверка ключей
Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 8 из 64.
Перед поиском ключа, который может отсутствовать, проверь его с помощью %in% среди имён:
stock <- c(apples = 12, pears = 0)
print("pears" %in% names(stock))
print("plums" %in% names(stock))Вывод:
[1] TRUE
[1] FALSEУсловие if вокруг поиска задаёт значение по умолчанию для отсутствующего ключа, вместо NA или ошибки:
stock <- c(apples = 12, pears = 0)
item <- "plums"
qty <- if (item %in% names(stock)) stock[[item]] else 0
print(qty)Вывод:
[1] 0Ключ, существующий со значением 0, отличается от отсутствующего ключа: pears известен и out of stock, а plums совсем не продаются.
Для списков используется та же проверка %in% names(). Отсутствующее имя в списке возвращает NULL, а не ошибку, поэтому подходит и is.null():
user <- list(name = "Ada", city = "London")
print(is.null(user[["email"]]))
print("city" %in% names(user))Вывод:
[1] TRUE
[1] TRUEНебольшая вспомогательная функция позволяет выполнять проверку в одном месте, когда программа ищет множество ключей:
get_or <- function(x, key, default) {
if (key %in% names(x)) x[[key]] else default
}
stock <- c(apples = 12)
print(get_or(stock, "apples", 0))
print(get_or(stock, "kiwis", 0))Результат:
[1] 12
[1] 0Задание
ЛегкоДополните stock_status(stock, item). Верните unknown, если item не является ключом в stock, out of stock, если его значение равно 0, и в противном случае in stock: , за которым следует количество.
Предоставленный код считывает запасы в виде пар name=quantity, разделённых запятыми, затем считывает товар и выводит возвращённое значение.
Попробуйте сами
stock_status <- function(stock, item) {
# Напишите здесь свой код
""
}
# Предоставленный код ввода/вывода: оставьте его без изменений
input <- suppressWarnings(readLines(file("stdin")))
stock <- c()
for (pair in strsplit(input[1], ",")[[1]]) {
kv <- strsplit(pair, "=")[[1]]
stock[kv[1]] <- as.numeric(kv[2])
}
cat(stock_status(stock, input[2]), 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