IF, ELSE, ELSE IF avaldus R-is
โก Nutikas kokkuvรตte
R-i laused If Else ja Else If valivad loogilise tingimuse pรตhjal, millist koodiplokki kรคivitada. See kรคsiraamat hรตlmab kaheharulist vormi, mitmeharulisi ahelaid, vektoriseeritud ifelse() funktsiooni ja tรคpsete vastete leidmiseks funktsiooni switch().

if else lause R-is
An kui veel Lause kรคivitab รผhe koodiploki, kui tingimus on TรENE, ja teise, kui see on VรรR. R-is on sรผntaks jรคrgmine:
if (condition) { Expr1 } else { Expr2 }
Kontrolli, kas muutuja nimega quantity on suurem kui 20. Kui on, siis kuvab kood teate โMรผรผsid palju!โ, vastasel juhul โTรคnaseks pรคevaks mitte piisavaltโ.
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
Vรคljund:
## [1] "You sold a lot!"
mรคrkusedTaandamine ei muuda seda, kuidas R koodi kรคivitab, kuid jรคrjepidev taanemine on see, mis hoiab pika tingimuste ahela loetavana. Pane tรคhele, et sulgev sulg ja mรคrksรตna โelseโ peavad asuma samal real, vastasel juhul kรคsitleb R if-plokki tรคielikuna ja annab vea.
Else if lause R-is
Keti edasised testid koos muidu kuiR-il puudub mรคrksรตna elif, st PythonR-is kirjutad need kaks sรตna eraldi ja vรตid lisada nii palju harusid kui vaja. Sรผntaks on:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Oletame, et soovite kolme tulemust: alla 20 pildi โTรคnaseks pรคevaks ei piisaโ, 20โ30 pildi โKeskmine pรคevโ ja รผle 30 pildi โMilline suurepรคrane pรคev!โ.
Vรตite proovida kogust muuta.
# 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!') }
Vรคljund:
## [1] "Not enough for today"
Nรคide 2:
Kรคibemaksumรครคrad erinevad tootekategooriate lรตikes. Kujutage ette kolme kategooriat, millel kรตigil on oma mรครคr:
| Kategooriad | Tooted | VAT |
|---|---|---|
| A | Raamat, ajakiri, ajaleht jne. | 8% |
| B | Kรถรถgiviljad, liha, joogid jne. | 10% |
| C | T-sรคrk, teksa, pรผksid jne. | 20% |
Elukorral rakendab ahel รตiget mรครคra kรตigele, mida klient ostis:
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) }
Vรคljund:
## A vat rate of 8% is applied. The total price is 10.8
Vektoriseeritud funktsioon ifelse() R-is
if-lause kรคsitleb tรคpselt รผhte vรครคrtust. Andke sellele vektor ja R 4.2 vรตi uuem versioon tekitab vea, kuna tingimus peab olema รผks TRUE vรตi FALSE. ifelse() lahendab selle, testides iga elementi korraga ja tagastades sama pikkusega vektori.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Vรคljund:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
Kolm argumenti on test, tagastatud vรครคrtus, kui test on TรENE, ja tagastatud vรครคrtus, kui see on VรรR. Kรตik kolm taaskasutatakse sama pikkusega.
Funktsiooni ifelse() pesastamine reprodutseerib else if ahela terve vektori ulatuses:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Tasub teada kahte piirangut. ifelse() jรคtab tulemusest vรคlja sellised atribuudid nagu faktori tasemed ja kuupรคevaklass ning hindab iga elemendi puhul mรตlemat haru, seega on see raiskamine, kui รผks haru on kallis. Alternatiiv on dplyr. juhtum_millal() vรคldib pesastamist tรคielikult ja hoiab tรผรผbid puutumata:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
R-i lรผliti() lause
Kui iga haru kontrollib sama muutuja vรตrdsust, muutub pikk else if ahel raskesti loetavaks. switch() asendab selle รผhe otsinguga.
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)
Selle kรคitumist reguleerivad kolm reeglit:
- Mรคrkide argumendi korral leiab switch() nime tรคpselt. Osalist vastet ega mustri vastet ei leita.
- Vaikimisi toimib nimetu viimane element. Ilma selleta tagastab vasteta vรครคrtus nรคhtamatult NULL-i, mis on vaiksete vigade levinud allikas.
- Tรคisarvulise argumendi korral valib switch() hoopis positsiooni jรคrgi: switch(2, โaโ, โbโ, โcโ) tagastab โbโ.
Tรคpsete vastete leidmiseks fikseeritud vรครคrtuste komplekti korral kasutage funktsiooni switch() ja hoidke else if alles vahemike ja liittingimuste puhul, mida switch() ei suuda vรคljendada. Tingimuse korduvaks rakendamiseks jรคrjestusele kombineerige see funktsiooniga silmuse jaoks vรตi samas silmus.
loogiline OperaR-tingimustes olevad tegurid
Tingimuse loovad operaatorid kรคituvad รผksteisest erinevalt ja see erinevus on oluline.
| Operator | Tรคhendus | Kasutage seda sisse |
|---|---|---|
| & | Elementide kaupa JA | ifelse(), filter(), tรคisvektorid |
| && | รhe vรครคrtusega JA, lรผhised | kui () ja samal ajal kui () |
| | | Elementide kaupa VรI | ifelse(), filter(), tรคisvektorid |
| || | รhe vรครคrtusega VรI, lรผhised | kui () ja samal ajal kui () |
| ! | NOT, tรผhistab testi | kuskil |
| %% ulatuses | Kas selle komplekti vรครคrtus on? | Asendab pikki OR-ahelaid |
Miks lรผhis on oluline. Topeltvorm peatub kohe, kui vastus on paigas, seega paremat poolt ei hinnata kunagi, kui vasak pool on juba tulemuse otsustanud. See teeb kaitsva lause kirjutamise ohutuks:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Vรตrdlemine mitme vรครคrtusega. Vรตrdsustestide aheldamise asemel kasutage funktsiooni %in%, mis on nii lรผhem kui ka raskem valesti sisestada:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
Veel รผks viimane hoiatus: รผks vรตrdusmรคrk mรครคrab vรครคrtuse, mitte ei vรตrdle. Kirjuta tingimuse sisse alati ==.
Tingimuslaused R-is: kiirjuhend
Kรตik selles รตpetuses kasutatud konstruktsioonid on loetletud allpool:
| Eesmรคrk | Code |
|---|---|
| Kaks haru |
if (cond) { a } else { b } |
| Mitmed harud |
if (c1) { a } else if (c2) { b } else { c } |
| Vektoriseeritud seisund |
ifelse(test, yes, no)
|
| Mitmeharuline vektor |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Tรคpse vaste otsing |
switch(x, "A" = 1, "B" = 2, 0) |
| Liikmelisuse test |
if (x %in% c("A", "B")) { } |

