Sw

Switch σε R

1 άσκηση

Σχετικά με την έννοια Switch

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

star <- function(type) {
  switch(type,
    M = , # will "fall through" if no value given
    K = "red dwarf",
    G = "Earth-like",
    "bigger star" # only correct for O,B,A,F
  )
}

> star("M")
[1] "red dwarf"

Σημείωσε ότι οι επιλογές περνούν στην επόμενη μόνο όταν η τιμή αφεθεί κενή, όπως συμβαίνει με το M στο παραπάνω παράδειγμα. Δεν χρειάζεται να συμπεριλάβεις εντολές break, όπως σε κάποιες άλλες γλώσσες.

Η τελική τιμή μπορεί να είναι μια προεπιλογή, όπως εδώ, ή μια stop() για να πετάξει ένα σφάλμα, αν θέλεις οι συνθήκες να καλύπτουν όλες τις περιπτώσεις. Η επιλογή με βάση έναν ακέραιο είναι ελαφρώς διαφορετική: σε αυτή την περίπτωση η προεπιλογή είναι πάντα NULL (κάτι που θα συζητηθεί στην Έννοια του Τίποτα).

Συναρτήσεις στο dplyr

Το switch στη βασική R είναι αρκετά περιορισμένο: κάνει μόνο ακριβή αντιστοίχιση με μία μόνο είσοδο. Αυτό φαινόταν λογικό όταν η R κυκλοφόρησε για πρώτη φορά το 1993, αλλά χρειάζεται βελτίωση για τη σύγχρονη χρήση.

Note

Όπως αναφέρθηκε στην έννοια Conditionals, η συλλογή πακέτων tidyverse είναι σχεδιασμένη να συμπληρώνει (και μερικές φορές να αντικαθιστά) τη λειτουργικότητα της βασικής R, χωρίς να επηρεάζει τη συμβατότητα προς τα πίσω.

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

Μπορείς να φέρεις το πακέτο dplyr στο πεδίο εφαρμογής σου προσθέτοντας είτε library(dplyr) (για το συγκεκριμένο πακέτο) είτε library(tidyverse) (για ολόκληρη τη συλλογή) στην αρχή του κώδικα σου.

Η βιβλιοθήκη dplyr παρέχει δύο επιπλέον συναρτήσεις που σχετίζονται με το switch.

Οι συναρτήσεις recode_values και replace_values

Αυτές οι δύο σχετικές συναρτήσεις επιτρέπουν μια διανυσματοποιημένη αντιστοίχιση παλιών τιμών σε νέες τιμές, παρόμοια με το switch.

Η κύρια διαφορά μεταξύ τους είναι ότι η recode_values() δημιουργεί ένα εντελώς νέο διάνυσμα, ενώ η replace_values() επιτρέπει μερικές ενημερώσεις ενός υπάρχοντος διανύσματος.

Η αντιστοίχιση εξακολουθεί να είναι ακριβής, αλλά:

  • Οι επιλογές στα αριστερά μπορούν να είναι διανύσματα, και η είσοδος ταιριάζει αν ταιριάζει οποιοδήποτε στοιχείο.
  • Οι επιλογές στα αριστερά και τα αποτελέσματα στα δεξιά συνδέονται με το σύμβολο ~ αντί για =.
  • Οι ελλιπείς τιμές NA μπορούν να αντιστοιχιστούν ρητά (αυτό θα συζητηθεί στην Έννοια του Τίποτα).
  • Μπορεί να οριστεί προεπιλογή σε όλες τις περιπτώσεις.
library(dplyr)

x <- c("a", "b", "a", "d", "b", NA, "c", "e", "z")
recode_values(
  x,
  "a" ~ 1,
  "b" ~ 2,
  "c" ~ 3,
  c("d", "e") ~ 4, # either "d' or "e" will match
  NA ~ 0,          # matches missing values
  default = 100   # note the different syntax for the default
)
#> [1]   1   2   1   4   2   0   3   4 100
Note

Μπορεί να δεις συμβουλές στο διαδίκτυο για τη χρήση της συνάρτησης case_match() ως διανυσματικό switch.

Αυτή η συνάρτηση έχει χαρακτηριστεί ως παρωχημένη στην έκδοση 1.2.0 του dplyr (Φεβρουάριος 2026). Οι προσπάθειες χρήσης της θα παράγουν πλέον ένα προειδοποιητικό μήνυμα, που θα προτείνει να χρησιμοποιήσεις αντ' αυτής τη recode_values().

Η συνάρτηση case_when

Η case_when πηγαίνει τη σύνταξη της case_match ένα βήμα πιο πέρα, επιτρέποντας οποιαδήποτε λογική έκφραση στα αριστερά του ~.

Το διάνυσμα εισόδου (το x στο παρακάτω παράδειγμα) δεν παρέχεται ως όρισμα, απλώς πρέπει να έχει ήδη οριστεί.

x <- 1:10
case_when(
  x < 3 ~ "low",
  between(x, 3, 5) ~ "mid",
  between(x, 6, 8) ~ "high",
  .default = "what?"
)
#>  [1] "low"   "low"   "mid"   "mid"   "mid"   "high"  "high"  "high"  "what?" "what?"

Η συνάρτηση between() είναι επίσης μέρος του dplyr.

Οι συναρτήσεις συμβολοσειρών έχουν ήδη συζητηθεί και οι Κανονικές Εκφράσεις θα αποτελέσουν το θέμα μιας επόμενης έννοιας. Συνδυάζονται πολύ καλά με την case_when.

library(stringr)

tracks <- "R C Python C# Elixir C++ Odin" |> str_split_1(" ")
tracks
#> [1] "R"      "C"      "Python" "C#"     "Elixir" "C++"    "Odin"  

case_when(
  str_starts(tracks, "C") ~ "C-like",
  str_starts(tracks, "[AEIOU]") ~ "vowel",
  .default = "other"
)
#> [1] "other"  "C-like" "other"  "C-like" "vowel"  "C-like" "vowel"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Switch