IF, ELSE, ELSE IF-uttalelse i R

⚡ Smart oppsummering

If Else- og Else If-setninger i R velger hvilken kodeblokk som kjøres basert på en logisk betingelse. Denne gjennomgangen dekker togrenede former, flergrenede kjeder, den vektoriserte ifelse()-funksjonen og switch() for eksakte samsvar.

  • 🔀 Kjernesyntaks: hvis (betingelse) { } ellers kjører { } én gren når testen er SANN og den andre når den er USANN.
  • 🔗 Flere grener: R skriver else if som to separate ord; det finnes ikke noe elif-nøkkelord som i Python.
  • ⚠️ Grensepleie: Bruk større eller lik og mindre eller lik, slik at ingen verdi faller gjennom et utilsiktet mellomrom mellom grenene.
  • Vektorisert form: hvis(test, ja, nei) evaluerer en hel vektor samtidig, noe hvis ikke kan gjøre.
  • 🗂️ Nøyaktig samsvar: switch() erstatter en lang kjede med likhetstester med et enkelt oppslag.
  • 🧮 OperaTor-valg: Enkelt og-tegn fungerer elementmessig, mens dobbelformen er for et enkelt SANN eller USANN i «if».

Hvis ellers Hvis-setning i R

if else-setningen i R

An hvis ellers En setning kjører én blokk med kode når en betingelse er SANN og en annen når den er USANN. I R er syntaksen:

if (condition) {
    Expr1 
} else {
    Expr2
}

Hvis annet uttalelse

Sjekk om en variabel kalt kvantitet er over 20. Hvis den er det, skriver koden ut «Du solgte mye!», ellers skriver den ut «Ikke nok for i dag».

# Create vector quantity
quantity <-  25
# Set the if-else statement
if (quantity > 20) {
    print('You sold a lot!')
} else {
    print('Not enough for today')  
}

Utgang:

## [1] "You sold a lot!"

MerknaderInnrykk endrer ikke hvordan R kjører koden, men konsistent innrykk er det som holder en lang kjede med betingelser lesbare. Merk også at den avsluttende klammeparentesen og else-nøkkelordet må stå på samme linje, ellers behandler R if-blokken som fullført og kaster en feil.

Else if-setningen i R

Kjede ytterligere tester med eller hvisR har ikke noe elif-nøkkelord, det vil si Python; i R skriver du de to ordene separat, og du kan legge til så mange grener du trenger. Syntaksen er:

if (condition1) { 
    expr1
    } else if (condition2) {
    expr2
    } else if  (condition3) {
    expr3
    } else {
    expr4
}

Anta at du ønsker tre utfall: under 20 utskrifter «Ikke nok for i dag», mellom 20 og 30 utskrifter «Gjennomsnittlig dag», og over 30 utskrifter «For en flott dag!».

Du kan prøve å endre mengden.

# 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!')
}

Utgang:

## [1] "Not enough for today"

Eksempel 2:

Mva-satsene varierer etter produktkategori. Tenk deg tre kategorier, hver med sin egen sats:

Kategorier Produkter MVA
A Bok, magasin, avis osv. 8%
B Grønnsaker, kjøtt, drikke osv. 10%
C T-skjorte, jeans, bukser, etc.. 20%

En annen if-kjede bruker riktig pris på det kunden kjøpte:

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

Utgang:

## A vat rate of 8% is applied. The total price is 10.8

Den vektoriserte funksjonen ifelse() i R

`if`-setningen håndterer nøyaktig én verdi. Gi den en vektor, og R 4.2 eller nyere genererer en feil, fordi betingelsen må være én SANN eller USANN. `ifelse()` løser dette ved å teste hvert element samtidig og returnere en vektor med samme lengde.

quantities <- c(10, 25, 40, 18)

# if cannot do this
result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today')
result

Utgang:

## [1] "Not enough for today" "You sold a lot!"      "You sold a lot!"      
## [4] "Not enough for today"

De tre argumentene er testen, verdien som returneres der testen er SANN, og verdien som returneres der den er USANN. Alle tre resirkuleres til samme lengde.

Nesting av ifelse() reproduserer en else if-kjede over en hel vektor:

ifelse(quantities < 20, 'Not enough for today',
    ifelse(quantities <= 30, 'Average day', 'What a great day!'))

To begrensninger er verdt å kjenne til. ifelse() fjerner attributter som faktornivåer og datoklasse fra resultatet, og den evaluerer begge grenene for hvert element, så det er sløsing når én gren er dyr. dplyr-alternativet tilfelle_når() unngår hekkingen helt og beholder typene intakte:

library(dplyr)
case_when(
    quantities < 20  ~ 'Not enough for today',
    quantities <= 30 ~ 'Average day',
    TRUE             ~ 'What a great day!'
)

switch()-setningen i R

Når hver gren tester den samme variabelen for likhet, blir en long else if-kjede vanskelig å lese. switch() erstatter den med et enkelt oppslag.

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)

Tre regler styrer dens oppførsel:

  • Med et tegnargument samsvarer switch() nøyaktig med navnet. Det er ingen delvis samsvar og ingen mønstersamsvar.
  • Et navnløst sluttelement fungerer som standard. Uten et slikt element returnerer en uovertruffen verdi NULL usynlig, noe som er en vanlig kilde til stille feil.
  • Med et heltallsargument velger switch() etter posisjon i stedet: switch(2, "a", "b", "c") returnerer "b".

Bruk switch() for eksakte treff mot et fast sett med verdier, og behold else if for områder og sammensatte betingelser, som switch() ikke kan uttrykke. For å bruke en betingelse gjentatte ganger over en sekvens, kombiner den med en for sløyfe eller mens løkken.

logisk Operatorer i R-forhold

Operatorene som bygger en betingelse oppfører seg forskjellig fra hverandre, og forskjellen har betydning.

Operator Betydning Bruk den inn
& Elementmessig OG ifelse(), filter(), hele vektorer
&& Enkeltverdi OG, kortslutninger hvis () og mens ()
| Elementvis ELLER ifelse(), filter(), hele vektorer
|| Enkeltverdi ELLER, kortslutninger hvis () og mens ()
! IKKE, opphever testen Hvor som helst
%i% Er verdien i dette settet? Erstatter lange OR-kjeder

Hvorfor kortslutning er viktig. Dobbeltformen stopper så snart svaret er avgjort, så høyre side blir aldri evaluert når venstre side allerede bestemmer utfallet. Det gjør det trygt å skrive en vaktklausul:

# Safe: length() is checked before x[1] is touched
if (length(x) > 0 && x[1] > 10) print('ok')

Sammenligning mot flere verdier. Bruk %in% i stedet for å kjede likhetstester, som er både kortere og vanskeligere å skrive feil:

if (category %in% c('A', 'B')) {
    print('Reduced VAT rate applies')
}

En siste advarsel: et enkelt likhetstegn tildeler en verdi, det sammenligner ikke. Skriv alltid == i en betingelse.

Betingelsessetninger i R: Hurtigreferanse

Hver konstruksjon som brukes i denne veiledningen er listet opp nedenfor:

Målet Code
To grener
if (cond) { a } else { b }
Flere grener
if (c1) { a } else if (c2) { b } else { c }
Vektorisert tilstand
ifelse(test, yes, no)
Flergren på en vektor
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Oppslag av eksakt treff
switch(x, "A" = 1, "B" = 2, 0)
Medlemskapstest
if (x %in% c("A", "B")) { }

Spørsmål og svar

if håndterer én SANN eller USANN og kontrollerer hvilken kodeblokk som kjører. ifelse() er en vektorisert funksjon som tester hvert element i en vektor og returnerer en vektor med resultater.

Bruk dobbelformen i if og while, der betingelsen må være én verdi og kortslutning beskytter høyre side. Bruk enkeltformen for elementvise tester på hele vektorer.

Siden R 4.2 må en if-betingelse være nøyaktig én SANN eller USANN; lengre vektorer genererer nå en feil i stedet for en advarsel. Bruk ifelse(), any() eller all() avhengig av hva du mente.

Forhold styrer funksjonstekniske regler, tidlig stoppping sjekker under trening, og terskelbeslutninger på modellutdata. Vektoriserte former som case_when() foretrekkes fordi de skalerer til hele datasett.

Ja. AI-assistenter kan oppdage hull, som for eksempel en grenseverdi som faller gjennom hver gren, eller et enkelt likhetstegn som brukes til sammenligning. Test den korrigerte kjeden på grenseverdiene selv.

Oppsummer dette innlegget med: