IF, ELSE, ELSE IF izjava u R
โก Pametni saลพetak
Naredbe If Else i Else If u R-u biraju koji ฤe se blok koda izvrลกavati na temelju logiฤkog uvjeta. Ovaj vodiฤ pokriva oblik s dvije grane, lance s viลกe grana, vektoriziranu funkciju ifelse() i switch() za toฤna podudaranja.

Naredba if else u R-u
An ako drugo Naredba izvrลกava jedan blok koda kada je uvjet TRUE, a drugi kada je FALSE. U R-u sintaksa je:
if (condition) { Expr1 } else { Expr2 }
Provjerite je li varijabla pod nazivom koliฤina veฤa od 20. Ako jest, kod ispisuje โProdali ste puno!โ, inaฤe ispisuje โNedovoljno za danasโ.
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
Izlaz:
## [1] "You sold a lot!"
biljeลกkeUvlaฤenje ne mijenja naฤin na koji R izvrลกava kod, ali dosljedno uvlaฤenje odrลพava dugi lanac uvjeta ฤitljivim. Takoฤer imajte na umu da zatvarajuฤa zagrada i kljuฤna rijeฤ else moraju biti u istom retku, inaฤe R tretira if blok kao dovrลกen i izbacuje greลกku.
Naredba else if u R-u
Lanฤajte daljnje testove s inaฤe akoR nema kljuฤnu rijeฤ elif, tj. Python; u R-u piลกete dvije rijeฤi odvojeno i moลพete dodati onoliko grana koliko vam je potrebno. Sintaksa je:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Pretpostavimo da ลพelite tri ishoda: ispod 20 otisaka โNedovoljno za danasโ, izmeฤu 20 i 30 otisaka โProsjeฤan danโ i iznad 30 otisaka โKakav sjajan dan!โ.
Moลพete pokuลกati promijeniti koliฤinu koliฤine.
# 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!') }
Izlaz:
## [1] "Not enough for today"
Primjer 2:
Stope PDV-a razlikuju se ovisno o kategoriji proizvoda. Zamislite tri kategorije, svaka sa svojom stopom:
| Kategorije | Proizvodi | PDV |
|---|---|---|
| A | Knjiga, ฤasopis, novine itd. | 8% |
| B | Povrฤe, meso, piฤe itd. | 10% |
| C | Majica, traperice, hlaฤe itd. | 20% |
Inaฤe, lanac primjenjuje ispravnu stopu na sve ลกto je kupac kupio:
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) }
Izlaz:
## A vat rate of 8% is applied. The total price is 10.8
Vektorizirana funkcija ifelse() u R-u
Naredba if obraฤuje toฤno jednu vrijednost. Ako joj date vektor, R 4.2 ili noviji ฤe izazvati greลกku jer uvjet mora biti jedan TRUE ili FALSE. ifelse() rjeลกava ovaj problem testiranjem svakog elementa odjednom i vraฤanjem vektora iste duljine.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Izlaz:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
Tri argumenta su test, vrijednost vraฤena kada je test TRUE i vrijednost vraฤena kada je FALSE. Sva tri se recikliraju na istu duljinu.
Ugnijeลพฤivanjem funkcije ifelse() reproducira se lanac else if preko cijelog vektora:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Vrijedi znati dva ograniฤenja. ifelse() iz rezultata izbacuje atribute poput razina faktora i klase datuma te procjenjuje obje grane za svaki element, pa je rasipno kada je jedna grana skupa. Alternativa dplyr-u sluฤaj_kada() u potpunosti izbjegava ugnijeลพฤivanje i ฤuva tipove netaknutima:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
Naredba switch() u R-u
Kada svaka grana testira istu varijablu na jednakost, dugi else if lanac postaje teลกko ฤitljiv. switch() ga zamjenjuje jednom pretragom.
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)
Tri pravila reguliraju njegovo ponaลกanje:
- S argumentom znaka, switch() toฤno odgovara nazivu. Nema djelomiฤnog podudaranja niti podudaranja uzoraka.
- Neimenovani zavrลกni element djeluje kao zadani. Bez njega, neusklaฤena vrijednost nevidljivo vraฤa NULL, ลกto je ฤest izvor tihih greลกaka.
- S cijelim brojem argumenta, switch() umjesto toga odabire po poziciji: switch(2, โaโ, โbโ, โcโ) vraฤa โbโ.
Koristite switch() za toฤna podudaranja s fiksnim skupom vrijednosti, a else if zadrลพite za raspone i sloลพene uvjete koje switch() ne moลพe izraziti. Da biste uvjet viลกe puta primijenili na niz, kombinirajte ga s za petlju ili dok petlje.
logiฤan Operatori u R uvjetima
Operatori koji izgraฤuju uvjet ponaลกaju se razliฤito jedan od drugoga, a ta razlika je vaลพna.
| Operahumka | Znaฤenje | Koristite ga u |
|---|---|---|
| & | I po elementima | ifelse(), filter(), cijeli vektori |
| && | Jednovrijednost I, kratki spojevi | ako () i dok () |
| | | ILI po elementima | ifelse(), filter(), cijeli vektori |
| || | Jednovrijednost ILI, kratki spojevi | ako () i dok () |
| ! | NE, negira test | bilo kuda |
| %u% | Je li vrijednost u ovom skupu? | Zamjenjuje duge OR lance |
Zaลกto je kratki spoj vaลพan. Dvostruki oblik se zaustavlja ฤim je odgovor odreฤen, tako da se desna strana nikada ne procjenjuje kada lijeva veฤ odreฤuje ishod. To omoguฤuje sigurno pisanje zaลกtitne klauzule:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Usporeฤivanje s nekoliko vrijednosti. Posegnite za %in% umjesto ulanฤavanja testova jednakosti, ลกto je i kraฤe i teลพe ih je pogreลกno napisati:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
Joลก jedno upozorenje: jedan znak jednakosti dodjeljuje vrijednost, ne usporeฤuje. Uvijek piลกite == unutar uvjeta.
Uvjetne naredbe u R-u: Kratki vodiฤ
Svaka konstrukcija koriลกtena u ovom tutorijalu navedena je u nastavku:
| Cilj | Code |
|---|---|
| Dvije grane |
if (cond) { a } else { b } |
| Viลกe grana |
if (c1) { a } else if (c2) { b } else { c } |
| Vektorizirano stanje |
ifelse(test, yes, no)
|
| Viลกestruka grana na vektoru |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Pretraลพivanje toฤnog podudaranja |
switch(x, "A" = 1, "B" = 2, 0) |
| Test ฤlanstva |
if (x %in% c("A", "B")) { } |

