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 স্টেটমেন্ট যোগ করার দরকার নেই।
character টাইপের উপর switch করার সময় শেষ মানটি একটি ডিফল্ট, যেমন এখানে।
ইন্টিজার টাইপের ক্ষেত্রে কোনো ডিফল্ট দেওয়া যায় না।
dplyr-এর ফাংশনবেস R-এর switch বেশ সীমিত: এটি কেবল একটি ইনপুটের সাথে হুবহু মিল করতে পারে।
R প্রথম ১৯৯৩ সালে প্রকাশিত হওয়ার সময় এটি যুক্তিসঙ্গত মনে হয়েছিল, তবে আধুনিক ব্যবহারের জন্য এর উন্নতি দরকার।
যেমন Conditionals কনসেপ্টে উল্লেখ করা হয়েছে, tidyverse প্যাকেজ-সংগ্রহটি বেস R-এর কার্যকারিতার পরিপূরক (এবং মাঝে মাঝে প্রতিস্থাপক) হিসেবে তৈরি, যা পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্য নষ্ট করে না।
আপনার কোডের শুরুতে হয় library(dplyr) (একক প্যাকেজটির জন্য), নয়তো library(tidyverse) (সম্পূর্ণ সংগ্রহের জন্য) যোগ করে dplyr প্যাকেজটি কাজের আওতায় আনা যায়।
dplyr লাইব্রেরি switch-এর সাথে সম্পর্কিত দুটি অতিরিক্ত ফাংশন দেয়।
recode_values ও replace_values ফাংশনএই দুটি সম্পর্কিত ফাংশন পুরোনো মান থেকে নতুন মানে ভেক্টরাইজড, switch-এর মতো ম্যাপিং করতে দেয়।
এদের মধ্যে মূল পার্থক্য হলো recode_values() সম্পূর্ণ নতুন একটি ভেক্টর তৈরি করে, আর replace_values() একটি বিদ্যমান ভেক্টরের আংশিক পরিবর্তন করতে দেয়।
মিল এখনও হুবহু, তবে:
=-এর বদলে টিল্ডা ~ দিয়ে যুক্ত করা হয়।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_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-এর অংশ।
এই অনুশীলনীতে আমরা একটি Blackjack গেমের প্রথম পালা সিমুলেট করব।
আপনি দুটি কার্ড পাবেন এবং ডিলারের খোলা কার্ডটি দেখতে পাবেন। সব কার্ডই একটি স্ট্রিং দিয়ে প্রকাশ করা হয়, যেমন "ace", "king", "three", "two" ইত্যাদি। প্রতিটি কার্ডের মান হলো:
| কার্ড | মান | কার্ড | মান |
|---|---|---|---|
| ace | ১১ | eight | ৮ |
| two | ২ | nine | ৯ |
| three | ৩ | ten | ১০ |
| four | ৪ | jack | ১০ |
| five | ৫ | queen | ১০ |
| six | ৬ | king | ১০ |
| seven | ৭ | other | ০ |
নোট: সাধারণত ace-এর মান ১ বা ১১ হতে পারে, কিন্তু সরলতার জন্য আমরা ধরে নেব এর মান কেবল ১১-ই হতে পারে।
আপনার দুইটি কার্ড আর ডিলারের কার্ডের উপর নির্ভর করে খেলার প্রথম পালার জন্য একটি কৌশল আছে, যেখানে আপনার হাতে নিচের অপশনগুলো থাকে:
যদিও এটি এখনো সেরা কৌশল নয়, তবুও আপনি আপনার বন্ধু Alex-এর তৈরি করা কৌশলটি অনুসরণ করবেন, যা নিচে দেওয়া হলো:
একটি কার্ডের সংখ্যাগত মান নির্ণয়ের জন্য parse_card নামের একটি ফাংশন তৈরি করুন:
parse_card("ace")
# => 11
উপরে বর্ণিত সিদ্ধান্তের লজিকটি বাস্তবায়ন করে এমন একটি first_turn ফাংশন লিখুন:
first_turn(card1, card2, dealer_card)
প্রত্যাশিত ফলাফলের কিছু উদাহরণ এখানে দেওয়া হলো:
first_turn("ace", "ace", "jack") == "P"
first_turn("ace", "king", "ace") == "S"
first_turn("five", "queen", "ace") == "H"
Exercism-এ সাইন আপ করুন, R ট্র্যাকের 21টি কনসেপ্ট111টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।