R-এ এটি একটি বড় ধারণা। সম্ভাবনাগুলো বোঝার সুবিধার জন্য বিভিন্ন ফাংশনের ইনপুট ও আউটপুটের ডাইমেনশনালিটি বিবেচনা করা কাজে লাগতে পারে।
আমরা ইতিমধ্যে এমন ফাংশন দেখেছি যেগুলো একটি ভেক্টর নেয় আর একটি একক, স্কেলারের মতো মান রিটার্ন করে:
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
অনেক পরিসংখ্যানগত ফাংশনও এই শ্রেণিতে পড়ে, যেমন mean().
লজিক্যাল ভেক্টরের জন্য আছে all() আর any().
R-এর অনেক ফাংশন পুরো ভেক্টরের উপর কাজ করে এবং প্রায়শই ভেক্টর আউটপুট দেয়। এর মধ্যে রয়েছে বেশিরভাগ গাণিতিক ফাংশন:
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
এটি কেবল সংক্ষিপ্ত ও সুবিধাজনকই নয়, বরং অন্য ভাষায় কমন লুপ, লিস্ট কম্প্রিহেনশন বা রিকার্শনের প্রয়োজনটুকুও এড়িয়ে যায়। R-এ ভেক্টর ফাংশনগুলো প্রায়শই ওই কৌশলগুলোর চেয়ে অনেক দ্রুত রান করে।
একটি ভেক্টর সাজানোর জন্য আছে sort(), যা মান রিটার্ন করে, আর order(), যা ইনডেক্স রিটার্ন করে:
> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am" "I" "in" "not" "order"
> order(v)
#> [1] 2 1 4 3 5
ডিফল্ট হলো ঊর্ধ্বক্রমে সাজানো।
প্রয়োজনে decreasing = TRUE দিন, অথবা বিদ্যমান কোনো ভেক্টর উল্টে দিতে rev() ব্যবহার করুন।
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
ইনপুট ভেক্টরের উপর বাম থেকে ডানে কাজ করে কিউমুলেটিভ ভেক্টর আউটপুট তৈরি করার ফাংশনও আছে:
> cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
> cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
এই ধারণার একটি সম্প্রসারণ ভেক্টর তুলনা করতেও ব্যবহার করা যায়।
উদাহরণস্বরূপ, পেয়ারওয়াইজ-ম্যাক্স ফাংশন pmax() দেখুন:
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
আপনি একজন উৎসাহী পাখি-পর্যবেক্ষক, যিনি গত সাত দিনে আপনার বাগানে কত পাখি এসেছে তার হিসাব রাখেন।
আপনার সামনে ছয়টি কাজ, সবগুলোই আপনার বাগানে আসা পাখির সংখ্যা নিয়ে।
today() ফাংশনটি ইমপ্লিমেন্ট করুন, যাতে এটি রিটার্ন করে আজ আপনার বাগানে কত পাখি এসেছে। পাখির সংখ্যাগুলো দিন অনুযায়ী সাজানো, যেখানে প্রথম এলিমেন্টটি সবচেয়ে পুরোনো দিনের সংখ্যা আর শেষ এলিমেন্টটি আজকের সংখ্যা।
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
increment_todays_count() ফাংশনটি ইমপ্লিমেন্ট করুন, যাতে আজকের সংখ্যা এক বাড়ে:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
has_day_without_birds() ফাংশনটি ইমপ্লিমেন্ট করুন, যা TRUE রিটার্ন করে যদি এমন কোনো দিন থাকে যেদিন বাগানে শূন্য পাখি এসেছে; অন্যথায় FALSE রিটার্ন করে:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
count_for_first_days() ফাংশনটি ইমপ্লিমেন্ট করুন, যা সপ্তাহের শুরু থেকে আপনার বাগানে আসা পাখির সংখ্যা রিটার্ন করে, তবে হিসাবটি সপ্তাহের শুরু থেকে নির্দিষ্ট সংখ্যক দিনের মধ্যে সীমাবদ্ধ রাখে।
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
কিছু দিন অন্য দিনের চেয়ে বেশি ব্যস্ত। ব্যস্ত দিন হলো সেই দিন, যেদিন পাঁচটি বা তার বেশি পাখি আপনার বাগানে এসেছে।
busy_days() ফাংশনটি ইমপ্লিমেন্ট করুন, যা ব্যস্ত দিনের সংখ্যা রিটার্ন করে:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
এই সপ্তাহে এতক্ষণে মোট কত পাখি এসেছে, তা নিয়ে আপনার কৌতূহল আছে। প্রতিটি দিনের জন্য ক্রমপুঞ্জিত যোগফল হিসাব করুন।
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
আপনার সন্দেহ, পাখি আসা কাছাকাছি সড়ক যানবাহনের ধরণ দ্বারা প্রভাবিত হয়, তাই ছুটির দিন আর কর্মদিবসে তা আলাদা।
কত পাখি এসেছে তার অবরোহী ক্রমে দিনের সংক্ষিপ্ত রূপগুলো সাজান।
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
Exercism-এ সাইন আপ করুন, R ট্র্যাকের 21টি কনসেপ্ট111টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।