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.

  • 🔀 Ydinsyntaksi: if (condition) { } else { } suorittaa toisen haaran, kun testi on TOSI, ja toisen, kun se on EPÄTOSI.
  • 🔗 Useita haaroja: R kirjoittaa else if -merkinnän kahtena eri sanana; elif-avainsanaa ei ole, kuten Python.
  • ⚠️ Rajojen hoito: Käytä suuruus-tai-yhtä suuri- ja vähäisyys-tai-yhtä suuri -operaattoreita, jotta mikään arvo ei putoa tahattomasta aukosta haarojen välillä.
  • Vektorisoitu muoto: ifelse(testi, kyllä, ei) laskee koko vektorin kerralla, mitä ellei funktio voi tehdä.
  • 🗂️ Tarkka vastaavuus: switch() korvaa pitkän yhtäsuuruustestien ketjun yhdellä haulla.
  • 🧮 OperaTorin valinta: Yksinkertainen et-merkki toimii elementtikohtaisesti, kun taas kaksinkertainen muoto on yhdelle TRUE- tai FALSE-merkille if-lauseen sisällä.

Jos muuten jos -lauseke R:ssä

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
}

Jos muuten lausunto

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")) { }

UKK

if käsittelee yksittäisen TRUE- tai FALSE-arvon ja määrittää, mikä koodilohko suoritetaan. ifelse() on vektorisoitu funktio, joka testaa vektorin jokaisen elementin ja palauttaa tulosvektorin.

Käytä if- ja while-operaattorien sisällä double-muotoa, jossa ehdon on oltava yksi arvo ja oikosulku suojaa oikeaa puolta. Käytä single-muotoa elementtikohtaisiin testeihin kokonaisvektoreilla.

Koska R 4.2:n mukaan if-ehdon on oltava täsmälleen yksi TOSI tai EPÄTOSI; pidemmät vektorit aiheuttavat nyt virheen varoituksen sijaan. Käytä ifelse()-, any()- tai all()-funktioita riippuen siitä, mitä tarkoitit.

Olosuhteet ohjaavat ominaisuussuunnittelun sääntöjä, varhainen pysäytysping tarkistuksia harjoittelun aikana ja kynnysarvopäätöksiä mallin tulosteesta. Vektorisoituja muotoja, kuten case_when(), suositaan, koska ne skaalautuvat koko datajoukkoihin.

Kyllä. Tekoälyavustajat voivat havaita aukkoja, kuten jokaisen haaran läpi menevän reuna-arvon tai yhden vertailuun käytettävän yhtäsuuruusmerkin. Testaa korjattua ketjua reuna-arvoilla itse.

Tiivistä tämä viesti seuraavasti: