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.

  • ๐Ÿ”€ Kรคrnsyntax: if (condition) { } else { } kรถr en gren nรคr testet รคr SANT och den andra nรคr det รคr FALSKT.
  • ๐Ÿ”— Flera grenar: R skriver else if som tvรฅ separata ord; det finns inget elif-nyckelord som i Python.
  • โš ๏ธ Grรคnsvรฅrd: Anvรคnd stรถrre eller lika med och mindre eller lika med sรฅ att inget vรคrde faller genom ett oavsiktligt mellanrum mellan grenar.
  • โšก Vektoriserad form: ifelse(test, yes, no) utvรคrderar en hel vektor samtidigt, vilket if inte kan gรถra.
  • ๐Ÿ—‚๏ธ Exakt matchning: switch() ersรคtter en lรฅng kedja av likhetstester med en enda sรถkning.
  • ๐Ÿงฎ OperaTor-val: Enkelt et-tecken fungerar elementvis medan den dubbla formen รคr fรถr ett enda SANT eller FALSKT inuti if.

If Else Else If-sats i R

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
}

Om annat uttalande

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

Vanliga frรฅgor

if hanterar ett enda SANT eller FALSKT och styr vilket kodblock som kรถrs. ifelse() รคr en vektoriserad funktion som testar varje element i en vektor och returnerar en vektor med resultat.

Anvรคnd dubbelformen inuti if och while, dรคr villkoret mรฅste vara ett vรคrde och kortslutning skyddar hรถgersidan. Anvรคnd enkelformen fรถr elementvisa tester pรฅ hela vektorer.

Sedan R 4.2 mรฅste ett if-villkor vara exakt ett av fรถljande: SANT eller FALSKT; lรคngre vektorer genererar nu ett fel snarare รคn en varning. Anvรคnd ifelse(), any() eller all() beroende pรฅ vad du menade.

Villkor styr funktionstekniska regler, tidigt stoppping kontroller under trรคning och trรถskelbeslut om modellutdata. Vektoriserade former som case_when() รคr att fรถredra eftersom de skalar till hela datamรคngder.

Ja. AI-assistenter kan upptรคcka luckor, till exempel ett grรคnsvรคrde som faller igenom varje gren, eller ett enda likhetstecken som anvรคnds fรถr jรคmfรถrelse. Testa den korrigerade kedjan pรฅ grรคnsvรคrdena sjรคlv.

Sammanfatta detta inlรคgg med: