IF, ELSE, ELSE IF Δήλωση στο R

⚡ Έξυπνη Σύνοψη

Οι εντολές If Else και Else If στην R επιλέγουν ποιο μπλοκ κώδικα θα εκτελεστεί με βάση μια λογική συνθήκη. Αυτή η αναλυτική παρουσίαση καλύπτει τη μορφή δύο κλάδων, τις αλυσίδες πολλαπλών κλάδων, τη διανυσματοποιημένη συνάρτηση ifelse() και τη συνάρτηση switch() για ακριβείς αντιστοιχίσεις.

  • 🔀 Βασική σύνταξη: αν (συνθήκη) { } αλλιώς { } εκτελεί έναν κλάδο όταν η δοκιμή είναι TRUE και τον άλλο όταν είναι FALSE.
  • 🔗 Πολλαπλά Υποκαταστήματα: Η R γράφει το else if ως δύο ξεχωριστές λέξεις· δεν υπάρχει λέξη-κλειδί elif όπως στο Python.
  • ⚠️ Φροντίδα Ορίων: Χρησιμοποιήστε τις εντολές "μεγαλύτερο ή ίσο" και "λιγότερο ή ίσο", ώστε να μην υπάρχει καμία τιμή που να περνάει από ένα ακούσιο κενό μεταξύ των κλαδιών.
  • ⚡ Διανυσματικοποιημένη μορφή: Η ifelse(test, ναι, όχι) αξιολογεί ένα ολόκληρο διάνυσμα ταυτόχρονα, κάτι που αν δεν μπορεί να γίνει.
  • 🗂️ Ακριβής αντιστοίχιση: Η συνάρτηση switch() αντικαθιστά μια μακρά αλυσίδα δοκιμών ισότητας με μία μόνο αναζήτηση.
  • 🧮 OperaΕπιλογή tor: Το μονό ampersand λειτουργεί ανά στοιχείο, ενώ η διπλή μορφή είναι για ένα μόνο TRUE ή FALSE μέσα στο if.

Δήλωση If Else Else If σε R

Η εντολή if else στην R

An αν αλλιώς Η εντολή εκτελεί ένα μπλοκ κώδικα όταν μια συνθήκη είναι TRUE και ένα άλλο όταν είναι FALSE. Στην R η σύνταξη είναι:

if (condition) {
    Expr1 
} else {
    Expr2
}

Αν άλλο δήλωση

Ελέγξτε αν μια μεταβλητή με όνομα ποσότητα είναι πάνω από 20. Εάν είναι, ο κώδικας εμφανίζει την τιμή "Πουλήσατε πολλά!", διαφορετικά εμφανίζει την τιμή "Δεν είναι αρκετό για σήμερα".

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

Παραγωγή:

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

ΣημείωσηΗ εσοχή δεν αλλάζει τον τρόπο με τον οποίο η R εκτελεί τον κώδικα, αλλά η συνεπής εσοχή είναι αυτό που διατηρεί μια μακρά αλυσίδα συνθηκών αναγνώσιμη. Σημειώστε επίσης ότι η αγκύλη κλεισίματος και η λέξη-κλειδί else πρέπει να βρίσκονται στην ίδια γραμμή, διαφορετικά η R αντιμετωπίζει το μπλοκ if ως ολοκληρωμένο και εμφανίζει σφάλμα.

Η εντολή else if στην R

Περαιτέρω δοκιμές αλυσίδας με αλλιώς εάνΗ R δεν έχει λέξη-κλειδί elif, δηλαδή Python; στην R γράφετε τις δύο λέξεις ξεχωριστά και μπορείτε να προσθέσετε όσες διακλαδώσεις χρειάζεστε. Η σύνταξη είναι:

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

Ας υποθέσουμε ότι θέλετε τρία αποτελέσματα: κάτω από 20 εκτυπώσεις «Δεν είναι αρκετά για σήμερα», μεταξύ 20 και 30 εκτυπώσεων «Μέση μέρα» και πάνω από 30 εκτυπώσεις «Τι υπέροχη μέρα!».

Μπορείτε να προσπαθήσετε να αλλάξετε την ποσότητα της ποσότητας.

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

Παραγωγή:

## [1] "Not enough for today"

Παράδειγμα 2:

Οι συντελεστές ΦΠΑ διαφέρουν ανά κατηγορία προϊόντος. Φανταστείτε τρεις κατηγορίες, καθεμία με τον δικό της συντελεστή:

Κατηγορίες Προϊόντα ΦΠΑ
A Βιβλίο, περιοδικό, εφημερίδα κ.λπ. 8%
B Λαχανικά, κρέατα, ποτά κ.λπ.. 10%
C Μπλουζάκι, τζιν, παντελόνι κ.λπ.. 20%

Ένα άλλο αν η αλυσίδα εφαρμόζει τη σωστή τιμή σε ό,τι αγόρασε ο πελάτης:

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

Παραγωγή:

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

Η διανυσματική συνάρτηση ifelse() στην R

Η εντολή if χειρίζεται ακριβώς μία τιμή. Δώστε της ένα διάνυσμα και η έκδοση R 4.2 ή νεότερη έκδοση εμφανίζει σφάλμα, επειδή η συνθήκη πρέπει να είναι μία μόνο TRUE ή FALSE. Η ifelse() λύνει αυτό το πρόβλημα δοκιμάζοντας κάθε στοιχείο ταυτόχρονα και επιστρέφοντας ένα διάνυσμα ίδιου μήκους.

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

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

Παραγωγή:

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

Τα τρία ορίσματα είναι το test, η τιμή που επιστρέφεται όπου το test είναι TRUE και η τιμή που επιστρέφεται όπου είναι FALSE. Και τα τρία ανακυκλώνονται στο ίδιο μήκος.

Η ένθεση της ifelse() αναπαράγει μια αλυσίδα else if σε ένα ολόκληρο διάνυσμα:

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

Αξίζει να γνωρίζουμε δύο όρια. Η συνάρτηση ifelse() αφαιρεί χαρακτηριστικά όπως τα επίπεδα παραγόντων και την κλάση Date από το αποτέλεσμα και αξιολογεί και τους δύο κλάδους για κάθε στοιχείο, επομένως είναι σπάταλη όταν ο ένας κλάδος είναι ακριβός. Η εναλλακτική λύση dplyr περίπτωση_όταν() αποφεύγει εντελώς την ένθεση και διατηρεί τους τύπους ανέπαφους:

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

Η εντολή switch() στην R

Όταν κάθε κλάδος ελέγχει την ίδια μεταβλητή για ισότητα, μια long else αλυσίδα γίνεται δυσανάγνωστη. Η switch() την αντικαθιστά με μία μόνο αναζήτηση.

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)

Τρεις κανόνες διέπουν τη συμπεριφορά του:

  • Με ένα όρισμα χαρακτήρα, η συνάρτηση switch() ταιριάζει ακριβώς με το όνομα. Δεν υπάρχει μερική αντιστοίχιση και καμία αντιστοίχιση μοτίβου.
  • Ένα ανώνυμο τελικό στοιχείο λειτουργεί ως προεπιλογή. Χωρίς αυτό, μια μη αντιστοιχισμένη τιμή επιστρέφει NULL αόρατα, κάτι που αποτελεί συνηθισμένη πηγή σιωπηλών σφαλμάτων.
  • Με ένα ακέραιο όρισμα, η switch() επιλέγει κατά θέση: η switch(2, “a”, “b”, “c”) επιστρέφει “b”.

Χρησιμοποιήστε το switch() για ακριβείς αντιστοιχίσεις με ένα σταθερό σύνολο τιμών και κρατήστε το else if για εύρη και σύνθετες συνθήκες, τις οποίες το switch() δεν μπορεί να εκφράσει. Για να εφαρμόσετε μια συνθήκη επανειλημμένα σε μια ακολουθία, συνδυάστε την με ένα για βρόχο είτε για ενώ βρόχος.

λογικός Operaπαράγοντες σε συνθήκες R

Οι τελεστές που δημιουργούν μια συνθήκη συμπεριφέρονται διαφορετικά ο ένας από τον άλλον και η διαφορά έχει σημασία.

OperaTor Νόημα Χρησιμοποιήστε το σε
& Κατά στοιχεία ΚΑΙ ifelse(), filter(), ολόκληρα διανύσματα
&& Μονοτιμή ΚΑΙ, βραχυκυκλώματα αν () και ενώ ()
| Ανά στοιχείο Ή ifelse(), filter(), ολόκληρα διανύσματα
|| Μονοτιμή Ή, βραχυκυκλώματα αν () και ενώ ()
! ΟΧΙ, ακυρώνει τη δοκιμή Οπουδήποτε
%σε% Είναι η τιμή σε αυτό το σύνολο; Αντικαθιστά τις μακριές αλυσίδες OR

Γιατί έχει σημασία το βραχυκύκλωμα. Η διπλή μορφή σταματά μόλις η απάντηση διευθετηθεί, επομένως η δεξιά πλευρά δεν αξιολογείται ποτέ όταν η αριστερή πλευρά ήδη αποφασίζει το αποτέλεσμα. Αυτό καθιστά ασφαλή τη σύνταξη μιας ρήτρας φύλαξης:

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

Σύγκριση με διάφορες τιμές. Επιλέξτε %in% αντί να αλυσιδώνετε τις δοκιμές ισότητας, οι οποίες είναι και πιο σύντομες και πιο δύσκολο να πληκτρολογήσετε λάθος:

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

Μια τελευταία προειδοποίηση: ένα μοναδικό σύμβολο ίσον αντιστοιχίζει μια τιμή, δεν συγκρίνεται. Να γράφετε πάντα == μέσα σε μια συνθήκη.

Δηλώσεις υπό όρους στην R: Γρήγορη αναφορά

Κάθε κατασκευή που χρησιμοποιείται σε αυτό το σεμινάριο παρατίθεται παρακάτω:

Σκοπός Code
Δύο κλάδοι
if (cond) { a } else { b }
Πολλαπλά κλαδιά
if (c1) { a } else if (c2) { b } else { c }
διανυσματική συνθήκη
ifelse(test, yes, no)
Πολλαπλά κλαδιά σε ένα διάνυσμα
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Αναζήτηση ακριβούς αντιστοίχισης
switch(x, "A" = 1, "B" = 2, 0)
Δοκιμή μέλους
if (x %in% c("A", "B")) { }

Συχνές Ερωτήσεις

Η συνάρτηση if χειρίζεται μία μόνο συνάρτηση TRUE ή FALSE και ελέγχει ποιο μπλοκ κώδικα εκτελείται. Η συνάρτηση ifelse() είναι μια διανυσματικοποιημένη συνάρτηση που ελέγχει κάθε στοιχείο ενός διανύσματος και επιστρέφει ένα διάνυσμα αποτελεσμάτων.

Χρησιμοποιήστε τη διπλή μορφή μέσα στις μεταβλητές if και while, όπου η συνθήκη πρέπει να είναι μία τιμή και το βραχυκύκλωμα προστατεύει τη δεξιά πλευρά. Χρησιμοποιήστε τη μονή μορφή για δοκιμές ανά στοιχείο σε ολόκληρα διανύσματα.

Δεδομένου ότι η συνθήκη if στο R 4.2 πρέπει να είναι ακριβώς μία TRUE ή FALSE, τα μεγαλύτερα διανύσματα πλέον εμφανίζουν σφάλμα αντί για προειδοποίηση. Χρησιμοποιήστε ifelse(), any() ή all() ανάλογα με το τι εννοείτε.

Οι συνθήκες καθορίζουν τους κανόνες μηχανικής χαρακτηριστικών, πρόωρη διακοπήping έλεγχοι κατά την εκπαίδευση και αποφάσεις κατωφλίου στην έξοδο του μοντέλου. Προτιμώνται οι διανυσματικές μορφές όπως η case_when() επειδή κλιμακώνονται σε ολόκληρα σύνολα δεδομένων.

Ναι. Οι βοηθοί τεχνητής νοημοσύνης μπορούν να εντοπίσουν κενά, όπως μια οριακή τιμή που διαπερνά κάθε κλάδο ή ένα μόνο σύμβολο ισότητας που χρησιμοποιείται για σύγκριση. Δοκιμάστε μόνοι σας τη διορθωμένη αλυσίδα στις οριακές τιμές.

Συνοψίστε αυτήν την ανάρτηση με: