IF, ELSE, ELSE IF Оператор в R
⚡ Умное резюме
Операторы if Else и else If в R определяют, какой блок кода будет выполняться в зависимости от логического условия. В этом пошаговом руководстве рассматриваются двухветвевая форма, многоветвевые цепочки, векторизованная функция ifelse() и функция switch() для точного совпадения.

Оператор if-else в R
An если еще В операторе `include` выполняется один блок кода, когда условие истинно, и другой, когда оно ложно. В R синтаксис выглядит так:
if (condition) { Expr1 } else { Expr2 }
Проверяет, превышает ли значение переменной с именем quantity значение 20. Если да, то код выводит сообщение «Вы продали много!», в противном случае — «Недостаточно на сегодня».
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
Выход:
## [1] "You sold a lot!"
ВниманиеОтступы не влияют на выполнение кода в R, но именно согласованные отступы обеспечивают читаемость длинной цепочки условий. Обратите также внимание, что закрывающая фигурная скобка и ключевое слово else должны находиться на одной строке, иначе R будет считать блок if завершенным и выдаст ошибку.
Оператор else if в R
Проведите дальнейшие испытания с помощью Иначе, еслиВ языке R отсутствует ключевое слово elif, то есть PythonВ R эти два слова пишутся отдельно, и вы можете добавить столько ветвей, сколько вам нужно. Синтаксис следующий:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Предположим, вы хотите получить три результата: менее 20 отпечатков — «Недостаточно на сегодня», от 20 до 30 — «Средний день», и более 30 — «Какой замечательный день!».
Вы можете попробовать изменить количество количества.
# Create the variable quantity quantity <- 10 # Create multiple condition statement if (quantity < 20) { print('Not enough for today') } else if (quantity >= 20 & quantity <= 30) { print('Average day') } else { print('What a great day!') }
Выход:
## [1] "Not enough for today"
Пример 2:
Ставки НДС различаются в зависимости от категории товара. Представьте три категории, каждая со своей ставкой:
| Категории | Продукты | НДС |
|---|---|---|
| A | Книга, журнал, газета и т. д. | 8% |
| B | Овощи, мясо, напитки и т. д. | 10% |
| C | Футболка, джинсы, брюки и т. д. | 20% |
В цепочке условий else if применяется правильная ставка к тому, что купил клиент:
category <- 'A' price <- 10 if (category =='A'){ cat('A vat rate of 8% is applied.','The total price is',price *1.08) } else if (category =='B'){ cat('A vat rate of 10% is applied.','The total price is',price *1.10) } else { cat('A vat rate of 20% is applied.','The total price is',price *1.20) }
Выход:
## A vat rate of 8% is applied. The total price is 10.8
Векторизованная функция ifelse() в R
Оператор if обрабатывает ровно одно значение. Если передать ему вектор, R 4.2 или более поздние версии выдадут ошибку, поскольку условие должно быть только одним значением TRUE или FALSE. Функция ifelse() решает эту проблему, проверяя каждый элемент сразу и возвращая вектор той же длины.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Выход:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
Три аргумента — это тест, возвращаемое значение, если тест истинен, и возвращаемое значение, если он ложен. Все три аргумента используются повторно до одинаковой длины.
Вложенность ifelse() воспроизводит цепочку else if по всему вектору:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Стоит знать о двух ограничениях. Функция ifelse() удаляет из результата такие атрибуты, как уровни факторов и класс даты, и выполняет обе ветви вычисления для каждого элемента, поэтому она неэффективна, когда одна из ветвей является ресурсоемкой. Альтернатива dplyr. case_when() Это позволяет полностью избежать вложенности и сохранить целостность типов:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
Оператор switch() в R
Когда каждая ветвь проверяет на равенство одну и ту же переменную, длинная цепочка else if становится трудночитаемой. Функция switch() заменяет её одним простым поиском.
category <- 'A' price <- 10 vat <- switch(category, 'A' = 1.08, 'B' = 1.10, 'C' = 1.20, 1.20) # the unnamed last value is the default cat('The total price is', price * vat)
Его поведение регулируется тремя правилами:
- При использовании символьного аргумента функция switch() точно сопоставляет имя. Частичное сопоставление и сопоставление с образцом отсутствуют.
- В качестве значения по умолчанию используется безымянный финальный элемент. Без него несовпадающее значение незаметно возвращает NULL, что является распространенной причиной скрытых ошибок.
- При использовании целочисленного аргумента функция switch() выбирает позицию: switch(2, “a”, “b”, “c”) возвращает “b”.
Используйте switch() для точного совпадения с фиксированным набором значений, а else if — для диапазонов и составных условий, которые switch() не может выразить. Чтобы многократно применять условие к последовательности, объедините его с для цикла или в то время как цикл.
логический Operaторс в условиях R
Операторы, формирующие условие, ведут себя по-разному, и это различие имеет значение.
| оператор | Смысл | Используйте это в |
|---|---|---|
| & | Поэлементное И | ifelse(), filter(), целые векторы |
| && | Однозначное И, короткие замыкания | если () и пока () |
| | | Поэлементное ИЛИ | ifelse(), filter(), целые векторы |
| || | Однозначное ИЛИ, короткие замыкания | если () и пока () |
| ! | НЕТ, это опровергает тест. | Где угодно |
| %в% | Присутствует ли это значение в данном наборе? | Заменяет длинные цепочки операторов ИЛИ. |
Почему важно использовать короткое замыкание. Двойная форма прекращается, как только ответ определен, поэтому правая часть никогда не вычисляется, если левая уже определяет результат. Это позволяет безопасно написать защитное условие:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Сравнение с несколькими значениями. Вместо цепочек проверок на равенство используйте %in%, это короче и в этом случае сложнее допустить опечатку:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
И последнее предупреждение: один знак равенства присваивает значение, а не выполняет сравнение. Всегда пишите == внутри условия.
Условные операторы в R: краткий справочник
Все конструкции, использованные в этом руководстве, перечислены ниже:
| Цель | Code |
|---|---|
| Две ветви |
if (cond) { a } else { b } |
| Несколько филиалов |
if (c1) { a } else if (c2) { b } else { c } |
| Векторизованное условие |
ifelse(test, yes, no)
|
| Многоветвевой вектор |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Поиск точного совпадения |
switch(x, "A" = 1, "B" = 2, 0) |
| Тест на членство |
if (x %in% c("A", "B")) { } |

