`s

`switch` में R

1 अभ्यास

`switch` के बारे में

switch() फंक्शन if ... else if की लंबी कतार की जगह एक छोटा विकल्प हो सकता है। जिस वेरिएबल पर switch() लगाया जाता है वह आमतौर पर एक स्ट्रिंग है, और ऐसी स्थिति में सेलेक्टर से उद्धरण चिह्न हटाए जा सकते हैं।

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(), जिससे तब एरर मिलती है जब शर्तों से सारी संभावनाएँ कवर करनी हों। पूर्णांक पर switch() करना थोड़ा अलग होता है: इनमें डिफॉल्ट हमेशा NULL होता है (इस पर शून्यता कॉन्सेप्ट में बात की जाएगी)।

dplyr में फंक्शन

बेस R में switch काफी सीमित है: यह सिर्फ एक इनपुट से सटीक मेल ही कर सकता है। 1993 में जब R पहली बार आया था तब यह ठीक लगता था, लेकिन आज के इस्तेमाल के लिए इसमें सुधार की ज़रूरत है।

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 की तरह इस्तेमाल कीजिए।

यह फंक्शन dplyr के 1.2.0 संस्करण (फरवरी 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` सीखिए