Η συνάρτηση 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, αλλά χρειάζεται βελτίωση για τη σύγχρονη χρήση.
Όπως αναφέρθηκε στην έννοια 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
Μπορεί να δεις συμβουλές στο διαδίκτυο για τη χρήση της συνάρτησης 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"