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.

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

