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

⚡ Умное резюме

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

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

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

Оператор 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")) { }

Часто задаваемые вопросы (FAQ)

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

Внутри операторов if и while используйте двойную форму, где условие должно принимать одно значение, а механизм короткого замыкания защищает правую часть. Для поэлементных проверок целых векторов используйте одинарную форму.

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

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

Да. Искусственный интеллект может выявлять пробелы, например, когда граничное значение проходит через все ветви, или когда для сравнения используется один и тот же знак равенства. Проверьте исправленную цепочку на граничных значениях самостоятельно.

Подведем итог этой публикации следующим образом: