IF, ELSE, ELSE IF оператор в R
⚡ Умно обобщение
Операторите If Else и Else If в R избират кой блок от код ще се изпълни въз основа на логическо условие. Това ръководство обхваща формата с две разклонения, веригите с много разклонения, векторизираната функция ifelse() и switch() за точни съвпадения.

Операторът if else в R
An ако е друго Изразът изпълнява един блок код, когато условието е TRUE, и друг, когато е FALSE. В R синтаксисът е:
if (condition) { Expr1 } else { Expr2 }
Проверява се дали променлива с име „количество“ е над 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. И трите се рециклират с еднаква дължина.
Влагането на ifelse() възпроизвежда веригата 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() за точни съвпадения с фиксиран набор от стойности и запазете else if за диапазони и съставни условия, които switch() не може да изрази. За да приложите условие многократно върху последователност, комбинирайте го с за цикъл или докато цикъл.
логичен Operaтори в R условия
Операторите, които изграждат условие, се държат различно един от друг и разликата е от значение.
| OperaTor | Значение | Използвайте го в |
|---|---|---|
| & | Елементно И | 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")) { } |

