অপারেটর
গণিতের দিকে ফিরে যাই। আমরা অঙ্ক করলে যোগ, বিয়োগ, গুন এবং ভাগ ব্যবহার করতাম। যোগ করার জন্য + এবং বিয়োগের জন্যে - এই চিহ্ন ব্যবহার করতাম। এই চিহ্নগুলো আসলে অপারেটর এবং যাদের সাপেক্ষে যোগ, বিয়োগ, গুন বা ভাগ যাই করি না কেন তাদেরকে বলে অপারেন্ড। যেমন a + b এখানে a, b হল অপারেন্ড এবং + হল অপারেটর। আর প্রোগ্রামিং এ অনেক ধরনের অপারেটর আছে। সেগুলা নিয়ে বিস্তারিত জানার জন্য পুরোটা বুঝে বুঝে হজম করতে হবে।
অ্যারিথমেটিক অপারেটর(Arithmetic operator)
অপারেটর | অপারেটর নাম | কাজ |
---|---|---|
+ | এডিশন অপারেটর | অপারেন্ড যোগ করার জন্য |
- | সাবট্রাকশন অপারেটর | অপারেন্ড বিয়োগ করার জন্য |
* | মাল্টিপ্লিকেশন অপারেটর | অপারেন্ড গুন করার জন্য |
/ | ডিভিশন অপারেটর | অপারেন্ড ভাগ করার জন্য |
^ অথবা ** | এক্সপনেন্ট অপারেটর | অপারেন্ড এর পাওয়ার এর কাজ করার জন্য |
%% | মডুলাস অপারেটর | অপারেন্ডের ভাগশেষ পাওয়ার জন্য |
%/% | ইন্টিজার ডিভিশন অপারেটর | অপারেন্ডের ভাগফল পূর্নসংখ্যায় পাওয়ার জন্য |
হাতে কলমে কিছু ব্যবহার দেখি হজমে ঘাটতি দেখা দিবে না।
> 2 + 2
[1] 4
> 5 -
+ 5 -3
[1] -3
>
> 2 + 2
[1] 4
> 5 - 3
[1] 2
> 5 * 3
[1] 15
> 6 / 5
[1] 1.2
> 5 ^ 2
[1] 25
> 5 ** 2
[1] 25
> 5 %% 2
[1] 1
> 6 %/% 5
[1] 1
এখানে 6 / 5 এবং 6 %/% 5 এর মধ্যে পার্থক্য হল 6 / 5 পুরো ভাগফলের রেজাল্ট আপনাকে প্রর্দশন করলো আর অপরদিকে 6 %/% 5 এর কাজ হল ভাগফলের দশমিকের পরের মানগুলাকে সে স্কিপ করে নেয়। ^ এবং ** এদের মধ্যে কোন পার্থক্য নেই। দুই আপন ভাইয়ের কাজ হইলো পাওয়ার এর কাজ করা।
রিলেশনাল অপারেটর (Relational Operator)
অপারেটর | অপারেটর নাম | কাজ |
---|---|---|
< | Less than | যদি ডান পাশের চেয়ে বাম পাশের অপারেন্ড ছোট হয় তাহলে কন্ডিশন বা শর্ত সত্যি হবে। |
> | Greater than | যদি ডান পাশের চেয়ে বাম পাশের অপারেন্ড বড় হয় তাহলে কন্ডিশন বা শর্ত সত্যি হবে। |
<= | Less than or equal to | যদি ডান পাশের চেয়ে বাম পাশে অপারেন্ড ছোটবা সমান হয় তাহলে কন্ডিশন বা শর্ত সত্যি হবে। |
>= | Greater than or equal to | যদি ডান পাশের চেয়ে বাম পাশের অপারেন্ড বড়বা সমান হয় তাহলে কন্ডিশন বা শর্ত সত্যি হবে। |
== | Equal to | যদি দুই পাশের অপারেন্ড দুইটি একই বা সমান হয় তবে কন্ডিশন বা শর্ত সত্যি হবে। |
!= | Not equal to | যদি দুই পাশের অপারেন্ড দুইটি একে অপরের সমান না হয় তবে কন্ডিশন বা শর্ত সত্যি হবে। |
পানি অনেক ঘোলা হইয়া গেছে নিচে দেখি নেই পরিষ্কার পানি।
> 5 < 6
[1] TRUE
> 6 < 5
[1] FALSE
> 6 > 5
[1] TRUE
> 5 > 6
[1] FALSE
> 5 <= 6
[1] TRUE
> 6 <= 5
[1] FALSE
> 6 <= 6
[1] TRUE
> 6 >= 5
[1] TRUE
> 5 >= 6
[1] FALSE
> 6 >= 6
[1] TRUE
> 5 == 5
[1] TRUE
> a == a
[1] TRUE
> 5 == 6
[1] FALSE
> a == b
[1] FALSE
> 6 != 5
[1] TRUE
> 6 != 6
[1] FALSE
> a != a
[1] FALSE
> a != b
[1] TRUE
লজিক্যাল অপারেটর (Logical Operator)
অপারেটর | অপারেটর নাম | কাজ | ||
---|---|---|---|---|
! | Logical NOT | বাংলা সিনেমার মতন সত্যকে মিথ্যা আর মিথ্যাকে সত্য বানানো এর কাজ। | ||
& | Element Wise Logical AND | যদি দুই পাশের অপারেন্ড দুইটি সমান হয় তবে কন্ডিশন বা শর্ত সত্যি হবে। | ||
\ | Element Wise Logical OR | যদি দুই পাশের অপারেন্ড এর মধ্যে যেকোন একটি সত্য হয় তবে কন্ডিশন বা শর্ত সত্যি হবে। | ||
&& | Logical AND | যদি দুই পাশের অপারেন্ড দুইটি সমান হয় তবে কন্ডিশন বা শর্ত সত্যি হবে। তবে রেজাল্ট হিসাবে প্রথম উপাদান দেখাবে। | ||
\ | \ | Logical OR | যদি দুই পাশের অপারেন্ড এর মধ্যে যেকোন একটি সত্য হয় তবে কন্ডিশন বা শর্ত সত্যি হবে।তবে রেজাল্ট হিসাবে প্রথম উপাদান দেখাবে। |
কিছু উদাহরন দেখলে পরিষ্কার হয়ে যাবে ধারনা,
> 'a' == 'a' & 'b' == 'b'
[1] TRUE
> 'a' == 'a' & 'b' == 'c'
[1] FALSE
> 'a' == 'a' | 'b' == 'c'
[1] TRUE
> 'a' == 'c' | 'b' == 'b'
[1] TRUE
> A <- 'a' == 'a' & 'b' == 'b'
> print(A)
[1] TRUE
> print(!A)
[1] FALSE
Logical AND এবং Logical OR নিয়ে আমরা ভেক্টর অধ্যায়ে দেখবো। এখন আমরা & এবং && এর মধ্যে কিংবা | এবং || এর মধ্যে কোন পার্থক্য পাবো না। আপনি উপরের কোড গুলায় ব্যবহার করে দেখতে পারেন। দেখবেন কোন পার্থক্য নাই। কিন্তু পার্থক্য আছে তাই ভেক্টর অধ্যায় পর্যন্ত অপেক্ষা করতে হবে।
এসাইনমেন্ট অপারেটর (Assignment Operators)
অপারেটর | অপারেটর নাম | কাজ |
---|---|---|
<-, <<-, = | Leftwards Assignment | ডান পাশের ভ্যালু বা মান কে বাম পাশের অপারেন্ডে এসাইন করার জন্য। |
->, ->> | Rightwards Assignment | বাম পাশের ভ্যালু বা মান কে ডান পাশের অপারেন্ডে এসাইন করার জন্য। |
যদিও Rightwards Assignment অপারেটর ব্যবহার নাই বললেই চলে। তবে এইখানে হালকা ধারনা দিয়ে রাখি যাতে অন্য কেউ তার কোডে যদি এই অপারেটর ব্যবহার করে তাহলে যাতে সহজেই বুঝতে পারি।
প্রথমে আসি Leftwards Assignment অপারেটরে। এইখানে পবিত্র দৃষ্টি দিয়ে দেখলে তিনটার কাজই প্রায়ই একই মনে হবে দৃষ্টি যদি গভীর করি তাহলে পার্থক্য বুঝতে পারবো। আপাতত মাথায় গেথে নিতে হবে <- এবং <<- এইটার কাজ প্রায় একই। আমি আগে একবার বলেছি <- এবং = দুইটা দিয়ে ভ্যালু এসাইন করা যায়। তাদের দুইজনের মধ্যকার কিছু পার্থক্য আছে।
ধরুন আমরা ১ থেকে ৫ এর গড় বাহির করবো তাহলে প্রথমে আমরা কি করবো ১ থেকে ৫ এর প্রতিটা সংখ্যা যোগ করবো। তারপর ১ থেকে ৫ এর মোট সংখ্যা হল পাঁচটা তাই না ১, ২, ৩ , ৪, ৫। এখন ১ থেকে ৫ এর ১ + ২ + ৩ + ৪ + ৫ = ১৫ যোগফলটাকে আমরা ৫ দিয়ে ভাগ করলেই গড় পাবো।
তাহলে ১৫ ÷ ৫ = ৩ এই ৩ হল আমাদের গড়। আর এই গড়কে আমরা ইংরেজীরে mean বলি। এত কথা বললাম এই গড় আমরা খুব সহজেই আর দিয়ে করতে পারি।
> rm(a)
> mean(a=1:5)
[1] 3
> a
Error: object 'a' not found
এখানে কি করলাম একটু বলে নেই। rm(a) দিয়ে রিমুভ করলাম কি রিমুভ করলাম কেন করলাম? যদি আপনি আগে a ডিক্লেয়ার করে কোন কাজ করে থাকেন তাই আমরা ক্লিয়ার করে নিলাম যাতে a নামে আর কোণ ডাটা না থাকে। কেন করলাম সেটা একটু পর বলছি। এখানে mean এর ভিতরে আমরা a এর ভ্যালু ১ থেকে ৫ ( 1:5 ) চালাইয়া দিলাম। আপাতত ':' এই সিম্বল থেকে হিসাবে কাজ করে মনে রাখেন। সুন্দর আউটপুট ৩ চলে আসছে। কিন্তু নিচে যখন আমরা a এর মান দেখতে গেলাম তখন আমাদের এরর দিলো অবজেক্ট পায় নাই। কিন্তু আমাদের তো ১ থেকে ৫ আসার কথা কিন্তু আসলো না। আগে যদি আমরা a দিয়া কোন ভ্যালু এসাইন করার কাজ করে থাকি পরবর্তিতে এই কাজের শুরুতে rm(a) যদি না দিতাম, তাহলে কি হত দেখে নেই।
`
a <- 10
`
> mean(a=1:5)
Error in mean.default(a = 1:5) : argument "x" is missing, with no default
> a = 9
> mean(a=1:5)
Error in mean.default(a = 1:5) : argument "x" is missing, with no default
আগে a ডিক্লেয়ার করে mean এর কাজ করতে যেয়ে এরর খেলাম আর্গুমেন্ট মিসিং এবং mean কে ডিফল্ট করি নাই এই জন্য। এর কারন আমরা যে a এর মান প্রথমে ডিক্লেয়ার করেছি এবং mean এর ভিতরে করতে গেলাম সে আসলে বুঝতে পারলো না আসলে a এর মান কোনটা। পুরাই হযবড়ল। এই হযবড়ল অবস্থার জন্য দায়ী স্কোপ। এখানে mean() একটা ফাংশন আর mean(এই হল স্কোপ)। আসলে দায়ী = অপারেটর এই ভেজাল থেকে নিস্তারের জন্য আমরা <- এর কাছে দৌড়াইতে দৌড়াইতে যাবো। আগে যদি a এর মান ডিক্লেয়ারও করি সমস্যা নাই রিমুভ করা লাগবে না। কথা কম কোড দেখি,
> a <- 10
> mean(a<-1:5)
[1] 3
> a
[1] 1 2 3 4 5
> print(a)
[1] 1 2 3 4 5
বাহ কোন এরর দেয় নাই কত ভালো <- বন্ধু। আগেই বলেছিলাম <- এইটা লিখে অভ্যাস করার জন্য রাজনীতি কি জিনিস দেখলেন তো। আরো কিছু কিছু জায়গায় পার্থক্য আছে আস্তে আস্তে নিজেই দেখবেন। এইবার <<- এইটার কাজও প্রায় একই।
> a <<- 10
> a
[1] 10
> mean(a<<-1:5)
[1] 3
> a
[1] 1 2 3 4 5
> print(a)
[1] 1 2 3 4 5
এইবার আসি Rightwards এর দিকে। যদিও এই অপারেটর খুব একটা ব্যবহার হয় না। অন্য কেউ যদি ব্যবহার করে যাতে সহজেই বুঝতে পারি এইজন্য কিছু ধারনা দিবো। তবে অনেক ক্ষেত্রে এর ব্যবহার আছে আমরাও ব্যবহার করবো বইয়ের বিভিন্ন জায়গায়। তাই শিখাটা দরকার। আমরা আগে Rightwards এর ক্ষেত্রে কিভাবে ডিক্লেয়ার করতাম a <- 10 অথবা a <<- 10 তাই নয় কি! এক্ষেত্রে আমরা আগে ভ্যালু দিবো তারপর অপারেন্ড লিখবো চলুন দেখি।
> 10 <- a
Error in 10 <- a : invalid (do_set) left-hand side to assignment
> 10 <<- a
Error in 10 <<- a : invalid (do_set) left-hand side to assignment
কোথায় কোড তো এরর দিলো। আসলে আমাদের অপারেটরেরও দিক পরিবর্তন করতে হবে।
> 10 -> a
> a
[1] 10
> 20 ->> b
> b
[1] 20
> 10
[1] 10
> 20
[1] 20
এইবার কাজ হয়েছে। একটা ব্যাপার মাথায় রাখতে 10 -> a দেওয়ার পড়ে অনেকের মনে প্রশ্ন আসবে 10 লিখে প্রেস করলে তো a আসবে মোটেও এই লজিক চলবে না। ১০ টাইপ করলে ইন্টিজার 10 আসবে। সর্তক থাকতে হবে। খটমটে বিধায় অনেকে এই অপারেটর ব্যবহার করে না।
এই অপারেটর গুলা বুঝলে এবং মন দিয়ে করলে আমাদের কাজ অনেকটাই শেষ অপারেটর নিয়ে। তবে কিছু বাদ রেখেছি কারন নিজেরেও আগ্রহ থাকা লাগবে শিখার জন্য। তবে মানসিক চাপ নিয়ে লাভ নাই সব শেষ হয়ে যাবে যদি পুরো বই ধৈর্য্য ধরে পড়েন। মুখস্থ করে লাভ হবে না বুঝে বুঝে পড়তে হবে।