R-এ এটি একটি বড় ধারণা। সম্ভাবনাগুলো বুঝতে সাহায্য করার জন্য বিভিন্ন ফাংশনের ইনপুট ও আউটপুটের মাত্রিকতা বিবেচনা করা কাজে দিতে পারে।
আমরা আগেই এমন ফাংশন দেখেছি যেগুলো একটি ভেক্টর নেয় এবং একটি একক, স্কেলারের মতো মান রিটার্ন করে:
v <- 1:5
length(v)
#> [1] 5
sum(v)
#> [1] 15
অনেক পরিসংখ্যানমূলক ফাংশনও এই শ্রেণিতে পড়ে, যেমন mean()।
লজিক্যাল ভেক্টরের জন্য আছে all() ও any(), যেগুলো একটি একক TRUE বা FALSE রিটার্ন করে।
R-এর অনেক ফাংশনই পুরো ভেক্টরের ওপর কাজ করে, এবং প্রায়ই আউটপুট হিসেবে ভেক্টর দেয়। এতে বেশিরভাগ গাণিতিক ফাংশনই পড়ে:
sq <- c(4, 9, 16, 25)
sqrt(sq) # square root
#> [1] 2 3 4 5
এটি কেবল সংক্ষিপ্ত ও সুবিধাজনক তাই নয়; অন্য ভাষায় প্রচলিত লুপ, লিস্ট কম্প্রিহেনশন বা রিকার্সন ব্যবহার করার প্রয়োজনও এড়ানো যায়। R-এ ভেক্টর ফাংশনগুলো প্রায়ই ওই কৌশলগুলোর চেয়ে অনেক দ্রুত চলে।
আপনি সম্ভবত যতটা বুঝেছেন তার চেয়ে অনেক বেশি ভেক্টরাইজড ফাংশন আগেই ব্যবহার করেছেন। এগুলো তুলনা করুন:
v <- c(2, 7, 9)
w <- c(3, 1, 5)
v + w
#> [1] 5 8 14
"+"(v, w)
#> [1] 5 8 14
পরিচিত ইনফিক্স অপারেটরগুলো আসলে ভেতরে থাকা ভেক্টরাইজড ফাংশনেরই সিনট্যাকটিক শুগার! এখানে সেটি "+"()।
ভেক্টর সাজানোর জন্য আছে 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() ও cumprod()-এর মতো ফাংশন, যেগুলো ইনপুট ভেক্টরের ওপর বাঁ থেকে ডানে কাজ করে ক্রমপুঞ্জিত ভেক্টর আউটপুট তৈরি করে:
cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
উপরের উদাহরণগুলো অনেক ফাংশনাল ভাষার foldl অপারেশনের মতো, তবে পার্থক্য হলো এখানে আউটপুট একটি ভেক্টর, যাতে সব মধ্যবর্তী মান থাকে।
এই ধারণার একটি বর্ধিত রূপ ভেক্টর তুলনা করতেও ব্যবহার করা যায়।
উদাহরণস্বরূপ, জোড়ায় জোড়ায় সর্বাধিক নির্ণয়কারী ফাংশন pmax() দেখুন:
v
#> [1] 2 7 9
w
#> [1] 3 1 5
pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
এই ফাংশন এবং এর মতো অন্য ফাংশনগুলো শুধু দুটি নয়, ইচ্ছেমতো সংখ্যক ইনপুট ভেক্টরও নিতে পারে।
উপরের উদাহরণে সমান দৈর্ঘ্যের ভেক্টর ব্যবহার করা হয়েছে। ভেক্টর ফিল্টারিং ধারণায় আলোচনা করা হয়েছে, R রিসাইক্লিং ব্যবহার করে এমন ভেক্টরকে বাড়িয়ে দেয় যেগুলো কোনোভাবে "খুব ছোট"। আবার বলছি: এটি সাবধানে ব্যবহার করুন, এবং সম্ভব হলে কেবল দৈর্ঘ্য-১ ভেক্টরের সাথে।
pmax(v, 5)
#> [1] 5 7 9
এটি কম দেখা যায়, তবে আপাতদৃষ্টিতে স্কেলার-ইন, ভেক্টর-আউট এমন ফাংশন লেখা বেশ সহজ।
ভেক্টর ইনপুটে প্রয়োগ করলে আউটপুট হয় একটি দ্বিমাত্রিক matrix (পরের একটি ধারণায় আলোচনা করা হয়েছে)।