R একটি ডাইনামিক্যালি টাইপড ভাষা, তাই সাধারণভাবে কোনো ভ্যারিয়েবলের টাইপ উল্লেখ করার প্রয়োজন হয় না। ডিফল্ট টাইপ হলো numeric, যা সাধারণত ডাবল-প্রিসিশন ফ্লোট হিসেবে বাস্তবায়িত হয়। ৩২-বিট ইন্টিজার ব্যবহার করতে বাধ্য করতে L প্রত্যয় ব্যবহার করুন (Long-এর সংক্ষিপ্ত রূপ)।
কোনো অবজেক্টের "টাইপ" জানা (ঐতিহাসিক কারণে) বিভ্রান্তিকর হতে পারে।
typeof() আর class() ফাংশন দুটি একই রকম, তবে সামান্য ভিন্ন ফলাফল রিটার্ন করতে পারে:
typeof(50)
#> [1] "double" # more specific: an implementation detail
typeof(50L)
##> [1] "integer"
class(50)
#> [1] "numeric" # less specific: ignores implementation details
class(50L)
#> [1] "integer"
আপনি typeof()-এর মতোই এমন mode()-এর উল্লেখও দেখতে পারেন।
mode() আর storage.mode() উপেক্ষা করুন।
এগুলো শুধু ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য রাখা হয়েছে।
পছন্দের অ্যাসাইনমেন্ট অপারেটর হলো <-।
RStudio-তে কাজ করলে কীবোর্ড শর্টকাট Alt-minus দিয়ে এটি লেখা যায়।
x <- 42
avogadro <- 6.02e23
mystr <- "Hello, World!"
<--এর বদলে = ব্যবহার করলে অনেক সময় কাজ করবে, তবে সব সময় নয়, আর স্টাইলের দিক থেকে এটি খারাপ অভ্যাস হিসেবে নিরুৎসাহিত করা হয়।
অপারেটরগুলো বেশিরভাগ ক্ষেত্রেই অন্য অনেক ভাষার মতোই, তবে %% আর %/% একটু আলাদা।
এই % সিনট্যাক্স হলো ম্যাক্রো হিসেবে বাস্তবায়িত ইনফিক্স অপারেটর কল করার একটি উপায়।
2 + 3 # 5
2 - 3 # -1
2 * 3 # 6
2 / 3 # 0.6666667
8 %/% 3 # 2 (integer division)
8 %% 3 # 2 (remainder)
2 ^ 3 # 8 (exponential)
R-এ # দিয়ে এক-লাইনের কমেন্ট শুরু হয়।
একাধিক লাইনের কমেন্টের জন্য আলাদা কোনো সিনট্যাক্স নেই।
একটি ফাংশন ডিফাইন করতে:
squareit <- function(x) {
x * x
}
ফাংশনে শূন্য বা তার বেশি আর্গুমেন্ট থাকতে পারে, যা কমা দিয়ে আলাদা করা হয়।
প্যারামিটার না থাকলেও function()-এর সাথে প্রথম বন্ধনী () লাগবে।
ফাংশনের আর্গুমেন্টের জন্য ডিফল্ট মান নির্দিষ্ট করা যায়, তবে এগুলো ডিফল্টহীন সব আর্গুমেন্টের পরে থাকতে হবে, এবং ডিফল্ট মান অ্যাসাইন করতে <- নয়, = ব্যবহার করতে হবে।
বেশ অর্থহীন একটি উদাহরণ:
squareit <- function(x = 42) {
x * x
}
squareit()
#> [1] 1764
এক-লাইনের ফাংশন বডির জন্য দ্বিতীয় বন্ধনী { } কঠোরভাবে প্রয়োজন হয় না, তবে এগুলো ব্যবহার করা ভালো স্টাইল হিসেবে ধরা হয়।
উপরের উদাহরণগুলোর মতো R স্বয়ংক্রিয়ভাবে ফাংশনের শেষ মানটি রিটার্ন করে।
রিটার্ন ভ্যালু স্পষ্ট করতে return() ফাংশন বডির যেকোনো জায়গায় ব্যবহার করা যায়।
এটি সাথে সাথে নির্দিষ্ট মানটি রিটার্ন করে এবং ফাংশন বডির বাকি এক্সপ্রেশনগুলো এক্সিকিউট না করেই ফাংশনটি শেষ করে দেয়।
কোনো কারণে ফাংশন থেকে আগেভাগে বেরিয়ে গিয়ে একটি নির্দিষ্ট মান রিটার্ন করতে চাইলে সাধারণত তখনই return()-এর একটি স্পষ্ট কল প্রয়োজন হয়।
এর একটি উদাহরণ হতে পারে কোনো if-else ক্লজ-এর ভেতরে।
তবে কিছু ডেভেলপার কোড স্টাইলের কারণে স্পষ্ট রিটার্ন পছন্দ করেন।
ফাংশন কল করা অন্য অনেক ভাষার মতোই:
squareit(3)
#> [1] 9
আগামী কনসেপ্টগুলোতে দেখবেন, ফলাফল 9 আসলে একটি স্কেলার সংখ্যা নয়, বরং দৈর্ঘ্য ১-এর একটি ভেক্টর।
তাই [1] যোগ করা হয়েছে, যাতে বোঝা যায় এটি ভেক্টরের শুরু।
is.vector(9)
#> [1] TRUE
R-এর বেশিরভাগ জিনিসই একধরনের ভেক্টর!
R কনসোল উপরের উদাহরণটি এভাবে দেখাবে:
> squareit(3)
[1] 9
এই সিলেবাসের ডকুমেন্টগুলো বেশিরভাগ ক্ষেত্রেই কয়েকটি R পাঠ্যবইয়ের রীতি অনুসরণ করে: প্রম্পট বাদ দেওয়া হয় এবং ফলাফলটি কমেন্ট আকারে লেখা হয়। এতে কোডের নমুনা কনসোলে কপি-পেস্ট করে রান করা সহজ হয়।