সু

সুইচ মধ্যে R

১টি অনুশীলনী

সুইচ সম্পর্কে

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-এর ফাংশন

বেস R-এর switch বেশ সীমিত: এটি কেবল একটি ইনপুটের সাথে হুবহু মিল করতে পারে। R প্রথম ১৯৯৩ সালে প্রকাশের সময় এটি যুক্তিসঙ্গতই মনে হয়েছিল, তবে আধুনিক ব্যবহারের জন্য এতে উন্নতি দরকার।

Note

যেমন Conditionals কনসেপ্টে বলা হয়েছে, tidyverse প্যাকেজ-সংগ্রহটি বেস R-এর কার্যকারিতার পরিপূরক (এবং মাঝে মাঝে বিকল্প) হিসেবে তৈরি, যা ব্যাকওয়ার্ড কম্প্যাটিবিলিটিতে কোনো প্রভাব ফেলে না।

tidyverse প্যাকেজগুলোর আধুনিক ও দুর্দান্ত ডকুমেন্টেশনও আছে, তাই নিচের লিংকগুলো অনুসরণ করলে আরও বিস্তারিত পাওয়া যাবে।

আপনার কোডের শুরুতে library(dplyr) (শুধু ওই একটি প্যাকেজের জন্য) অথবা library(tidyverse) (পুরো সংগ্ৰহের জন্য) যোগ করে dplyr প্যাকেজটি স্কোপে আনা যায়।

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

ভেক্টরাইজড switch হিসেবে case_match() ফাংশন ব্যবহারের পরামর্শ হয়তো আপনি অনলাইনে দেখতে পাবেন।

এই ফাংশনটি dplyr 1.2.0 সংস্করণে (ফেব্রুয়ারি ২০২৬) ডেপ্রিকেটেড করা হয়েছে। এখন এটি ব্যবহারের চেষ্টা করলে একটি সতর্কবার্তা আসবে, যেখানে বদলে 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-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

সুইচ শিখুন