IF, ELSE, ELSE IF Оператор у R
⚡ Розумний підсумок
Оператори If Else та Else If в R вибирають, який блок коду виконуватиметься на основі логічної умови. У цьому покроковому посібнику розглядається двогілкальна форма, багатогілкальні ланцюжки, векторизована функція ifelse() та switch() для точних збігів.

Оператор if else в R
An if else Оператор виконує один блок коду, коли умова має значення TRUE, та інший, коли вона має значення FALSE. Синтаксис у 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% |
Інший випадок, якщо ланцюг застосовує правильну ставку до будь-якої покупки клієнта:
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"
Три аргументи – це перевірка, значення, що повертається, якщо перевірка має значення TRUE, та значення, що повертається, якщо воно має значення FALSE. Усі три аргументи повторюються до однакової довжини.
Вкладення ifel() відтворює ланцюжок else if по всьому вектору:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Варто знати два обмеження. ifelse() видаляє з результату такі атрибути, як рівні факторів та клас дати, і оцінює обидві гілки для кожного елемента, тому це марнотратно, коли одна гілка є дорогою. Альтернатива dplyr випадок_коли() повністю уникає вкладеності та зберігає типи недоторканими:
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() для точних збігів з фіксованим набором значень, а для діапазонів та складених умов, які switch() не може виразити, використовуйте else if. Щоб застосувати умову багаторазово до послідовності, поєднайте її з для петлі або поки петля.
логічний Operaтори в умовах R
Оператори, що створюють умову, поводяться по-різному один від одного, і ця різниця має значення.
| Operaтор | Сенс | Використовуйте його в |
|---|---|---|
| & | Поелементне І | ifelse(), filter(), цілі вектори |
| && | Однозначне І, короткі замикання | якщо () та поки () |
| | | Поелементне АБО | ifelse(), filter(), цілі вектори |
| || | Однозначне АБО, короткі замикання | якщо () та поки () |
| ! | НІ, заперечує тест | де-небудь |
| % у% | Чи є значення в цьому наборі? | Замінює довгі ланцюжки OR |
Чому коротке замикання має значення. Подвійна форма зупиняється, щойно відповідь визначена, тому права частина ніколи не обчислюється, якщо ліва вже визначила результат. Це дозволяє безпечно написати захисний речення:
# 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")) { } |

