IF, ELSE, ELSE IF uttalande i R
โก Smart sammanfattning
If Else- och Else If-satser i R vรคljer vilket kodblock som kรถrs baserat pรฅ ett logiskt villkor. Denna genomgรฅng tรคcker tvรฅgrenade formen, flergrenade kedjor, den vektoriserade funktionen ifelse() och switch() fรถr exakta matchningar.

if else-satsen i R
An om annat En sats kรถr ett kodblock nรคr ett villkor รคr SANT och ett annat nรคr det รคr FALSKT. I R รคr syntaxen:
if (condition) { Expr1 } else { Expr2 }
Kontrollera om en variabel med namnet kvantitet รคr รถver 20. Om den รคr det skriver koden ut "Du sรฅlde mycket!", annars skriver den ut "Inte tillrรคckligt fรถr idag".
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
Produktion:
## [1] "You sold a lot!"
AnmรคrkningarIndragning รคndrar inte hur R kรถr koden, men konsekvent indentering รคr det som gรถr en lรฅng kedja av villkor lรคsbar. Observera ocksรฅ att den avslutande klammerparentesen och nyckelordet else mรฅste stรฅ pรฅ samma rad, annars behandlar R if-blocket som komplett och ger ett fel.
Else if-satsen i R
Kedja ytterligare tester med annars omR har inget elif-nyckelord, det vill sรคga Python; i R skriver man de tvรฅ orden separat, och man kan lรคgga till sรฅ mรฅnga grenar som man behรถver. Syntaxen รคr:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Anta att du vill ha tre resultat: under 20 utskrifter "Inte tillrรคckligt fรถr idag", mellan 20 och 30 utskrifter "Genomsnittlig dag", och รถver 30 utskrifter "Vilken fantastisk dag!".
Du kan fรถrsรถka รคndra 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!') }
Produktion:
## [1] "Not enough for today"
Exempel 2:
Momssatserna skiljer sig รฅt beroende pรฅ produktkategori. Tรคnk dig tre kategorier, var och en med sin egen sats:
| Kategorier | Produkter | MOMS |
|---|---|---|
| A | Bok, tidning, tidning etc. | 8% |
| B | Grรถnsaker, kรถtt, dryck etc. | 10% |
| C | T-shirt, jeans, byxor, etc. | 20% |
En annan om-kedja tillรคmpar rรคtt pris pรฅ vad kunden รคn kรถ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) }
Produktion:
## A vat rate of 8% is applied. The total price is 10.8
Den vektoriserade funktionen ifelse() i R
if-satsen hanterar exakt ett vรคrde. Ge den en vektor och R 4.2 eller senare genererar ett fel, eftersom villkoret mรฅste vara ett enda SANT eller FALSKT. ifelse() lรถser detta genom att testa varje element samtidigt och returnera en vektor av samma lรคngd.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Produktion:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
De tre argumenten รคr testet, vรคrdet som returneras dรคr testet รคr SANT och vรคrdet som returneras dรคr det รคr FALSKT. Alla tre รฅtervinns till samma lรคngd.
Att nรคstla ifelse() reproducerar en else if-kedja รถver en hel vektor:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Tvรฅ begrรคnsningar รคr vรคrda att kรคnna till. ifelse() tar bort attribut som faktornivรฅer och dateklass frรฅn resultatet, och den utvรคrderar bรฅda grenarna fรถr varje element, sรฅ det รคr slรถseri nรคr en gren รคr dyr. Alternativet till dplyr case_when() undviker kapslingen helt och behรฅller typerna intakta:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
switch()-satsen i R
Nรคr varje gren testar samma variabel fรถr likhet, blir en long else if-kedja svรฅr att lรคsa. switch() ersรคtter den med en enda sรถkning.
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 styr dess beteende:
- Med ett teckenargument matchar switch() namnet exakt. Det finns ingen partiell matchning och ingen mรถnstermatchning.
- Ett namnlรถst slutelement fungerar som standard. Utan ett sรฅdant returnerar ett omatchat vรคrde NULL osynligt, vilket รคr en vanlig kรคlla till tysta buggar.
- Med ett heltalsargument vรคljer switch() istรคllet efter position: switch(2, "a", "b", "c") returnerar "b".
Anvรคnd switch() fรถr exakta matchningar mot en fast uppsรคttning vรคrden, och behรฅll else if fรถr intervall och sammansatta villkor, vilka switch() inte kan uttrycka. Fรถr att tillรคmpa ett villkor upprepade gรฅnger รถver en sekvens, kombinera det med en fรถr slinga eller ett medan slingan.
logisk Operatorer i R-fรถrhรฅllanden
Operatorerna som bygger ett villkor beter sig olika frรฅn varandra, och skillnaden spelar roll.
| Operator | Betydelse | Anvรคnd den i |
|---|---|---|
| & | Elementmรคssigt OCH | ifelse(), filter(), hela vektorer |
| && | Envรคrdes-OCH, kortslutningar | om () och medan () |
| | | Elementvis ELLER | ifelse(), filter(), hela vektorer |
| || | Enkelvรคrdes-ELLER, kortslutningar | om () och medan () |
| ! | INTE, upphรคver testet | Var som helst |
| %i% | Ligger vรคrdet i den hรคr uppsรคttningen? | Ersรคtter lรฅnga OR-kedjor |
Varfรถr kortslutning รคr viktigt. Dubbelformen upphรถr sรฅ snart svaret รคr avgjort, sรฅ hรถger sida utvรคrderas aldrig nรคr vรคnster sida redan bestรคmmer resultatet. Det gรถr det sรคkert att skriva en skyddsklausul:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Jรคmfรถrelse mot flera vรคrden. Anvรคnd %in% istรคllet fรถr att kedja ihop likhetstester, vilket รคr bรฅde kortare och svรฅrare att felskriva:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
En sista varning: ett enda likhetstecken tilldelar ett vรคrde, det jรคmfรถr inte. Skriv alltid == inuti ett villkor.
Villkorliga satser i R: Snabbreferens
Varje konstruktion som anvรคnds i den hรคr handledningen listas nedan:
| Mรฅl | Code |
|---|---|
| Tvรฅ grenar |
if (cond) { a } else { b } |
| Flera grenar |
if (c1) { a } else if (c2) { b } else { c } |
| Vektoriserat tillstรฅnd |
ifelse(test, yes, no)
|
| Flergrenad pรฅ en vektor |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Exakt matchningssรถkning |
switch(x, "A" = 1, "B" = 2, 0) |
| Medlemskapstest |
if (x %in% c("A", "B")) { } |

