IF, ELSE, ELSE IF Lauseke R:ssä
⚡ Älykäs yhteenveto
R:n If Else- ja Else If -lausekkeet valitsevat suoritettavan koodilohkon loogisen ehdon perusteella. Tämä ohje kattaa kaksihaaraisen muodon, monihaaraiset ketjut, vektorioidun ifelse()-funktion ja switch()-funktion täsmällisten osumien löytämiseksi.

if else -lauseke R:ssä
An tai muuten lauseke suorittaa yhden koodilohkon, kun ehto on TOSI, ja toisen, kun se on EPÄTOSI. R:ssä syntaksi on:
if (condition) { Expr1 } else { Expr2 }
Tarkista, onko quantity-nimisen muuttujan arvo suurempi kuin 20. Jos on, koodi tulostaa ”Myit paljon!”, muuten se tulostaa ”Ei tarpeeksi tälle päivälle”.
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
lähtö:
## [1] "You sold a lot!"
HuomautuksiaSisennys ei muuta tapaa, jolla R suorittaa koodia, mutta yhdenmukainen sisennys pitää pitkän ehtoketjun luettavana. Huomaa myös, että sulkevan aaltosulun ja else-avainsanan on oltava samalla rivillä, muuten R käsittelee if-lohkoa täydellisenä ja heittää virheen.
Else if -lauseke R:ssä
Ketjua lisätesteillä muuten josR:ssä ei ole elif-avainsanaa, eli Python; R:ssä kirjoitat kaksi sanaa erikseen ja voit lisätä niin monta haaraa kuin tarvitset. Syntaksi on:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Oletetaan, että haluat kolme tulosta: alle 20 tulostetta ”Ei tarpeeksi tälle päivälle”, 20–30 tulostetta ”Keskiverto päivä” ja yli 30 tulostetta ”Mikä mahtava päivä!”.
Voit yrittää muuttaa määrän määrää.
# 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!') }
lähtö:
## [1] "Not enough for today"
Esimerkki 2:
ALV-kannat vaihtelevat tuoteryhmittäin. Kuvittele kolme luokkaa, joilla kullakin on oma verokantansa:
| Kategoriat | Tuotteemme | arvonlisävero |
|---|---|---|
| A | Kirja, aikakauslehti, sanomalehti jne. | 8% |
| B | Kasvikset, liha, juomat jne. | 10% |
| C | T-paita, farkku, housut jne. | 20% |
Muussa tapauksessa ketju soveltaa oikeaa hintaa asiakkaan ostamaan tuotteeseen:
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) }
lähtö:
## A vat rate of 8% is applied. The total price is 10.8
ifelse()-vektorisoitu funktio R:ssä
if-lauseke käsittelee täsmälleen yhden arvon. Jos sille annetaan vektori, R 4.2 tai uudempi aiheuttaa virheen, koska ehdon on oltava yksittäinen TRUE tai FALSE. ifelse() ratkaisee tämän testaamalla jokaista elementtiä kerralla ja palauttamalla samanpituisen vektorin.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
lähtö:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
Kolme argumenttia ovat testi, palautettu arvo, jos testi on TOSI, ja palautettu arvo, jos se on EPÄTOSI. Kaikki kolme kierrätetään samanpituisiksi.
Sisäkkäinen ifelse()-funktio toistaa else if -ketjun koko vektorin yli:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Kaksi rajoitusta on syytä tietää. ifelse() poistaa tuloksesta attribuutit, kuten tekijätasot ja päivämääräluokan, ja se arvioi molemmat haarat jokaiselle elementille, joten se on tuhlausta, kun yksi haara on kallis. Vaihtoehto on dplyr tapaus_kun() välttää sisäkkäisyyden kokonaan ja pitää tyypit ennallaan:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
switch()-lauseke R:ssä
Kun jokainen haara testaa samaa muuttujaa yhtäsuuruuden varalta, pitkästä else if -ketjusta tulee vaikeasti luettavissa. switch() korvaa sen yhdellä haulla.
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)
Sen toimintaa ohjaa kolme sääntöä:
- Merkkiargumentilla switch() löytää nimen täsmälleen. Osittaista täsmäystä tai hahmon täsmäystä ei tapahdu.
- Nimeämätön viimeinen elementti toimii oletusarvona. Ilman sitä vastaamaton arvo palauttaa näkymättömästi NULL-arvon, mikä on yleinen hiljaisten virheiden lähde.
- Kokonaislukuargumentilla switch() valitsee sijainnin perusteella: switch(2, “a”, “b”, “c”) palauttaa arvon “b”.
Käytä switch()-funktiota täsmällisiin osumiin kiinteää arvojoukkoa vasten ja pidä else if -funktiota arvoalueille ja yhdistetyille ehdoille, joita switch() ei voi ilmaista. Jos haluat käyttää ehtoa toistuvasti sekvenssissä, yhdistä se silmukalle tai samalla silmukka.
looginen Operatekijät R-olosuhteissa
Ehdon muodostavat operaattorit käyttäytyvät eri tavalla toisistaan, ja tällä erolla on merkitystä.
| OperaTor | Merkitys | Käytä sitä sisään |
|---|---|---|
| & | Elementtikohtainen JA | ifelse(), filter(), kokonaisvektorit |
| && | Yksiarvoinen JA, oikosulku | jos () ja kun () |
| | | Elementtikohtainen TAI | ifelse(), filter(), kokonaisvektorit |
| || | Yksittäisarvoinen TAI, oikosulku | jos () ja kun () |
| ! | EI, mitätöi testin | Missä tahansa |
| %%:ssa | Onko arvo tässä setissä? | Korvaa pitkät OR-ketjut |
Miksi oikosulku on tärkeä. Tuplamuoto loppuu heti, kun vastaus on ratkaistu, joten oikeaa puolta ei koskaan lasketa, kun vasen puoli on jo päättänyt lopputuloksen. Tämä tekee suojalauseen kirjoittamisen turvalliseksi:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Vertailu useisiin arvoihin. Käytä %in% -funktiota yhtälötestien ketjuttamisen sijaan, mikä on sekä lyhyempi että vaikeampi kirjoittaa väärin:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
Vielä yksi varoitus: yksi yhtäsuuruusmerkki määrittää arvon, ei vertaa. Kirjoita aina == ehdon sisään.
Ehdolliset lausekkeet R:ssä: Pikaopas
Jokainen tässä opetusohjelmassa käytetty rakenne on lueteltu alla:
| Tavoite | Code |
|---|---|
| Kaksi haaraa |
if (cond) { a } else { b } |
| Useita oksia |
if (c1) { a } else if (c2) { b } else { c } |
| Vektorisoitu ehto |
ifelse(test, yes, no)
|
| Monihaarainen vektori |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Tarkan osuman haku |
switch(x, "A" = 1, "B" = 2, 0) |
| Jäsenyystesti |
if (x %in% c("A", "B")) { } |

