IF, ELSE, ELSE IF erklæring i R
⚡ Smart opsummering
If Else- og Else If-sætninger i R vælger, hvilken kodeblok der kører baseret på en logisk betingelse. Denne gennemgang dækker to-grenet form, flergrenede kæder, den vektoriserede ifelse()-funktion og switch() for nøjagtige matches.

if else-sætningen i R
An hvis ellers En sætning kører én kodeblok, når en betingelse er SAND, og en anden, når den er FALSK. I R er syntaksen:
if (condition) { Expr1 } else { Expr2 }
Tjek om en variabel med navnet mængde er over 20. Hvis den er det, skriver koden "Du solgte meget!", ellers skriver den "Ikke nok til 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') }
Output:
## [1] "You sold a lot!"
BemærkIndrykning ændrer ikke, hvordan R kører koden, men ensartet indrykning er det, der holder en lang kæde af betingelser læsbar. Bemærk også, at den afsluttende parentes og nøgleordet else skal være på samme linje, ellers behandler R if-blokken som komplet og giver en fejl.
Else if-sætningen i R
Kæd yderligere tests med ellers hvisR har intet elif-nøgleord, dvs. Python; i R skriver du de to ord separat, og du kan tilføje så mange grene, som du har brug for. Syntaksen er:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Antag, at du ønsker tre resultater: under 20 udskrifter "Ikke nok til i dag", mellem 20 og 30 udskrifter "Gennemsnitlig dag", og over 30 udskrifter "Sikke en fantastisk dag!".
Du kan prøve at ændre mængden.
# 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!') }
Output:
## [1] "Not enough for today"
Eksempel 2:
Momssatserne varierer afhængigt af produktkategorien. Forestil dig tre kategorier, hver med sin egen sats:
| Kategorier | Produkter | Moms |
|---|---|---|
| A | Bog, magasin, avis osv. | 8% |
| B | Grøntsager, kød, drikkevarer osv. | 10% |
| C | T-shirt, jeans, bukser osv.. | 20% |
En ellers hvis-kæde anvender den korrekte pris på det, kunden har købt:
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) }
Output:
## A vat rate of 8% is applied. The total price is 10.8
Den vektoriserede funktion ifelse() i R
if-sætningen håndterer præcis én værdi. Giv den en vektor, og R 4.2 eller nyere genererer en fejl, fordi betingelsen skal være en enkelt SAND eller FALSK. ifelse() løser dette ved at teste hvert element på én gang og returnere en vektor af samme længde.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Output:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
De tre argumenter er testen, den værdi, der returneres, hvor testen er SAND, og den værdi, der returneres, hvor den er FALSK. Alle tre genbruges til samme længde.
Indlejring af ifelse() reproducerer en else if-kæde på tværs af en hel vektor:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
To begrænsninger er værd at kende. ifelse() fjerner attributter som faktorniveauer og datoklasse fra resultatet, og den evaluerer begge grene for hvert element, så det er spild af værdi, når én gren er dyr. dplyr-alternativet case_when() undgår indlejring helt og holder typerne intakte:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
Switch()-sætningen i R
Når hver branch tester den samme variabel for lighed, bliver en long else if chain svær at læse. switch() erstatter den med et enkelt opslag.
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 adfærd:
- Med et tegnargument matcher switch() navnet præcist. Der er ingen delvis matchning og ingen mønstermatchning.
- Et unavngivet final-element fungerer som standard. Uden et sådant element returnerer en uovertruffen værdi NULL usynligt, hvilket er en almindelig kilde til tavse fejl.
- Med et heltalsargument vælger switch() i stedet efter position: switch(2, “a”, “b”, “c”) returnerer “b”.
Brug switch() til præcise matches mod et fast sæt værdier, og hold else if for intervaller og sammensatte betingelser, som switch() ikke kan udtrykke. For at anvende en betingelse gentagne gange over en sekvens, kombiner den med en til løkke eller mens løkke.
Logisk Operatorer i R-betingelser
De operatorer, der opbygger en betingelse, opfører sig forskelligt fra hinanden, og forskellen er vigtig.
| OperaTor | Betydning | Brug den i |
|---|---|---|
| & | Elementmæssigt OG | ifelse(), filter(), hele vektorer |
| && | Enkeltværdi OG, kortslutninger | hvis () og mens () |
| | | Elementvis ELLER | ifelse(), filter(), hele vektorer |
| || | Enkeltværdi ELLER, kortslutninger | hvis () og mens () |
| ! | IKKE, ophæver testen | Overalt |
| %i% | Er værdien i dette sæt? | Erstatter lange OR-kæder |
Hvorfor kortslutning er vigtig. Dobbeltformen stopper, så snart svaret er afgjort, så højre side evalueres aldrig, når venstre side allerede har bestemt resultatet. Det gør det sikkert at skrive en guard-klausul:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Sammenligning med flere værdier. Brug %in% i stedet for at kæde lighedstests sammen, hvilket både er kortere og sværere at skrive forkert:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
En sidste advarsel: et enkelt lighedstegn tildeler en værdi, det sammenligner ikke. Skriv altid == i en betingelse.
Betingelsessætninger i R: Hurtig reference
Hver konstruktion, der bruges i denne vejledning, er anført nedenfor:
| Objektiv | Code |
|---|---|
| To grene |
if (cond) { a } else { b } |
| Flere grene |
if (c1) { a } else if (c2) { b } else { c } |
| Vektoriseret tilstand |
ifelse(test, yes, no)
|
| Flergrenet på en vektor |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Opslag af præcist match |
switch(x, "A" = 1, "B" = 2, 0) |
| Medlemskabstest |
if (x %in% c("A", "B")) { } |

