JEŚLI, ELSE, ELSE JEŻELI Instrukcja w R
⚡ Inteligentne podsumowanie
Instrukcje If Else i Else If w R wybierają blok kodu do uruchomienia na podstawie warunku logicznego. Ten przewodnik obejmuje formę dwugałęziową, łańcuchy wielogałęziowe, wektoryzowaną funkcję ifelse() oraz funkcję switch() dla dokładnych dopasowań.

Instrukcja if else w R
An Jeśli inaczej Instrukcja uruchamia jeden blok kodu, gdy warunek jest PRAWDĄ, i inny, gdy jest FAŁSZEM. W R składnia jest następująca:
if (condition) { Expr1 } else { Expr2 }
Sprawdź, czy zmienna o nazwie „quantity” jest większa niż 20. Jeśli tak, kod wyświetli komunikat „Sprzedałeś dużo!”, w przeciwnym razie wyświetli komunikat „Za mało na dziś”.
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
Wyjście:
## [1] "You sold a lot!"
Note: wcięcie nie zmienia sposobu, w jaki R uruchamia kod, ale spójne wcięcie sprawia, że długi ciąg warunków jest czytelny. Należy również pamiętać, że nawias zamykający i słowo kluczowe else muszą znajdować się w tym samym wierszu, w przeciwnym razie R potraktuje blok if jako zakończony i zgłosi błąd.
Instrukcja else if w R
Dalsze testy łańcuchowe z inaczej jeśli. R nie ma słowa kluczowego elif, czyli Python; w R piszesz te dwa słowa osobno i możesz dodać tyle gałęzi, ile potrzebujesz. Składnia jest następująca:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Załóżmy, że chcesz uzyskać trzy wyniki: poniżej 20 wydruków – „Za mało na dziś”, od 20 do 30 wydruków – „Przeciętny dzień”, a powyżej 30 wydruków – „Jaki wspaniały dzień!”.
Możesz spróbować zmienić ilość.
# 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!') }
Wyjście:
## [1] "Not enough for today"
2 przykład:
Stawki VAT różnią się w zależności od kategorii produktu. Wyobraź sobie trzy kategorie, z których każda ma swoją własną stawkę:
| Kategorie | Produkty | VAT |
|---|---|---|
| A | Książka, czasopismo, gazeta itp. | 8% |
| B | Warzywa, mięso, napoje itp. | 10% |
| C | T-shirt, dżinsy, spodnie itp. | 20% |
Łańcuch else if stosuje właściwą stawkę do tego, co kupił klient:
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) }
Wyjście:
## A vat rate of 8% is applied. The total price is 10.8
Funkcja wektorowa ifelse() w R
Instrukcja if obsługuje dokładnie jedną wartość. Podanie wektora spowoduje błąd w wersji R 4.2 lub nowszej, ponieważ warunek musi być pojedynczą wartością PRAWDA lub FAŁSZ. Funkcja ifelse() rozwiązuje ten problem, testując każdy element jednocześnie i zwracając wektor o tej samej długości.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Wyjście:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
Trzy argumenty to test, wartość zwracana, gdy test jest PRAWDĄ, oraz wartość zwracana, gdy jest FAŁSZEM. Wszystkie trzy są przetwarzane do tej samej długości.
Zagnieżdżenie ifelse() odtwarza łańcuch else if w całym wektorze:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Warto znać dwa ograniczenia. Funkcja ifelse() usuwa z wyniku atrybuty takie jak poziomy czynników i klasę Date, a także ocenia obie gałęzie dla każdego elementu, co jest marnotrawstwem, gdy jedna z nich jest kosztowna. Alternatywa dla dplyr case_when() całkowicie unika zagnieżdżania i zachowuje typy nienaruszone:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
Instrukcja switch() w R
Gdy każda gałąź testuje tę samą zmienną pod kątem równości, długi łańcuch else if staje się trudny do odczytania. Funkcja switch() zastępuje go pojedynczym wyszukiwaniem.
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)
Jego zachowaniem kierują trzy zasady:
- Z argumentem znakowym funkcja switch() dopasowuje nazwę dokładnie. Nie występuje dopasowanie częściowe ani dopasowanie wzorca.
- Nienazwany element końcowy działa jako domyślny. Bez niego niedopasowana wartość zwraca niewidocznie NULL, co jest częstym źródłem ukrytych błędów.
- Jeśli argumentem jest liczba całkowita, switch() wybiera według pozycji: switch(2, „a”, „b”, „c”) zwraca „b”.
Użyj switch() do dokładnego dopasowania do ustalonego zestawu wartości, a keep else if do zakresów i warunków złożonych, których switch() nie jest w stanie wyrazić. Aby wielokrotnie zastosować warunek w sekwencji, połącz go z… dla pętli lub pętla while.
logiczny Operatory w warunkach R
Operatorzy tworzący warunek zachowują się inaczej niż pozostali, a ta różnica ma znaczenie.
| OperaTor | Znaczenie | Użyj go w |
|---|---|---|
| & | Elementarnie AND | ifelse(), filter(), całe wektory |
| && | Jednowartościowe AND, zwarcia | jeśli () i podczas gdy () |
| | | LUB elementarnie | ifelse(), filter(), całe wektory |
| || | OR jednowartościowy, zwarcia | jeśli () i podczas gdy () |
| ! | NIE, neguje test | Gdziekolwiek |
| %W% | Czy wartość znajduje się w tym zestawie? | Zastępuje długie łańcuchy OR |
Dlaczego zwarcie jest ważne. Forma podwójna kończy się, gdy tylko odpowiedź zostanie ustalona, więc prawa strona nigdy nie jest oceniana, gdy lewa już ustaliła wynik. Dzięki temu można bezpiecznie napisać klauzulę ochronną:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Porównanie kilku wartości. Zamiast testów równości łańcuchowej wybierz %in%, ponieważ jest ona krótsza i trudniej ją pomylić:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
Ostatnie ostrzeżenie: pojedynczy znak równości przypisuje wartość, a nie porównuje. Zawsze zapisuj == wewnątrz warunku.
Instrukcje warunkowe w R: Krótki przewodnik
Poniżej wymieniono wszystkie konstrukcje użyte w tym samouczku:
| Cel | Code |
|---|---|
| Dwie gałęzie |
if (cond) { a } else { b } |
| Wiele oddziałów |
if (c1) { a } else if (c2) { b } else { c } |
| Warunek wektorowy |
ifelse(test, yes, no)
|
| Wielogałęziowość na wektorze |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Dokładne wyszukiwanie dopasowania |
switch(x, "A" = 1, "B" = 2, 0) |
| Test członkostwa |
if (x %in% c("A", "B")) { } |

