IF, ELSE, ELSE IF Оператор у R

⚡ Розумний підсумок

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

  • 🔀 Основний синтаксис: if (condition) { } else { } запускає одну гілку, коли перевірка має значення TRUE, а іншу — коли вона має значення FALSE.
  • 🔗 Кілька гілок: R записує else if як два окремих слова; ключового слова elif немає, як у Python.
  • ⚠️ Догляд за межами: Використовуйте оператори «більше або дорівнює» та «менше або дорівнює», щоб жодне значення не потрапляло через ненавмисний проміжок між гілками.
  • Векторизована форма: ifelse(test, yes, no) обчислює весь вектор одразу, чого if неможливо зробити.
  • 🗂️ Точна відповідність: switch() замінює довгий ланцюжок перевірок на рівність одним пошуком.
  • 🧮 OperaВибір тор: Одинарний амперсанд працює поелементно, тоді як форма double призначена для одинарного значення TRUE або FALSE всередині if.

Оператор If Else Else If в R

Оператор if else в R

An if else Оператор виконує один блок коду, коли умова має значення TRUE, та інший, коли вона має значення FALSE. Синтаксис у R такий:

if (condition) {
    Expr1 
} else {
    Expr2
}

Інструкція If Else

Перевірте, чи значення змінної з назвою 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")) { }

Поширені запитання

Функція if обробляє одне значення TRUE або FALSE та контролює, який блок коду виконується. ifelse() — це векторизована функція, яка перевіряє кожен елемент вектора та повертає вектор результатів.

Використовуйте форму double всередині операторів if та while, де умова має бути одним значенням, а коротке замикання захищає праву частину. Використовуйте форму single для поелементних перевірок цілих векторів.

Починаючи з R 4.2, умова if повинна бути рівно одним значенням TRUE або FALSE; довші вектори тепер викликають помилку, а не попередження. Використовуйте ifelse(), any() або all() залежно від того, що ви мали на увазі.

Умови впливають на особливості інженерних правил, ранньої зупинкиping перевірки під час навчання та рішення щодо порогових значень на виході моделі. Векторизовані форми, такі як case_when(), є кращими, оскільки вони масштабуються до цілих наборів даних.

Так. Помічники ШІ можуть виявляти прогалини, такі як граничне значення, що проходить через кожну гілку, або один знак рівності, який використовується для порівняння. Перевірте виправлений ланцюг на граничних значеннях самостійно.

Підсумуйте цей пост за допомогою: