ডাটা ইনপুট এবং আউটপুট
এমন একটা প্রোগ্রাম লিখার কথা চিন্তা করতেছেন যেখানে আপনি একজনের নাম জানতে চান? দেখা যাক কিভাবে এই কাজটা করা যায়,
> name <- readline()
Hasmot Ali
> print(name)
[1] "Hasmot Ali"
এখানে আপনি readline() এর দ্বারা ব্যবহারকারীর কাছ থেকে তথ্য নিলেন। তো আমি টাইপ করলাম Hasmot Ali তারপর কি টাইপ করলাম সেটা আমি আউটপুটে দেখিয়ে দিলাম। বাহ কত সুন্দর তাই না! এখানে আমাকে সবাই হাবলু বলবো, কারণ আমি readline() দিয়ে ইনপুট ঠিকই নিলাম। কিন্তু ব্যবহারকারীকে বলে দিলাম না যে এইখানে আপনি আপনার নাম টাইপ করুন। সে তো নাম ছাড়া অন্য কিছুও টাইপ করতে পারতো। অন্য কিছু যাতে সে টাইপ না করে সেক্ষেত্রে আমরা কি তাকে সঠিক পথ দেখাতে পারি না?
> print('Enter your Name: ')
[1] "Enter your Name: "
> name <- readline()
Hasmot Ali
> print(name)
[1] "Hasmot Ali"
ব্যাপারটা খুবই হাস্যকর প্রথমে print() এর দ্বারা লিখলাম Enter your Name: তারপর name ভ্যারিয়বলের দ্বারা ইনপুট নিলাম তারপরে আমরা ইনপুট নেওয়া ভ্যালুটা আউটপুটে দেখালাম। এত প্যারা দেওয়ার মানে কি? আরেকটু সহজ করলে কেমন হয়!
> name <- readline(prompt="Enter your name: ")
Enter your name: Hasmot Ali
> print(name)
[1] "Hasmot Ali"
এতক্ষণে অনেকেই হয়তো বুঝে গেছি prompt এর কাজ কি। প্রকৃতপক্ষে prompt আর্গুমেন্টের ভিতরে আমরা আমাদের কাঙ্ক্ষিত কথাগুলো লিখে দিলাম যাতে ব্যবহারকারী সহজেই বুঝতে পারে, আমরা তার কাছ থেকে কি চাই। অনেকেই হয়তো পাণ্ডিত্য করে দেখতে চাইবে এইখানে name এর টাইপটা আসলে কি। তো সেটা কিভাবে দেখা যায় যদিও আগেই আলোচনা করেছি তারপরেও এইখানে আরেকবার দেখবো। কেন দেখবো সেটা এই অধ্যায় শেষ করলে হয়তো বুঝবেন।
> typeof(name)
[1] "character"
ক্যারেক্টার টাইপ। name তো আসলেই ক্যারেক্টার তাই নয় কি? এইবার আমরা ব্যবহারকারীর কাছ থেকে তার বয়স জানতে চাইবো। তো লিখে ফেলি ঝটপট।
> age <- readline(prompt="Enter your age: ")
Enter your age: 16
> print(age)
[1] "16"
> typeof(age)
[1] "character"
সবই ঠিক আছে কিন্তু age এর টাইপ ক্যারেক্টার কেন? আসলে আপনি আর প্রোগ্রামিং এ যাই ইনপুট হিসাবে নেন না কেন সবই ক্যারেক্টারে হিসাবে ইনপুট নিবে যতক্ষণ না আপনি তার টাইপ পরিবর্তন করেন। age টা তো আসলে ক্যারেক্ট না। age হল ইন্টিজার টাইপ তাই না? তাহলে আমরা age টা ইন্টিজার হিসাবেই নিবো,
> age <- readline(prompt="Enter your age: ")
Enter your age: 25
> age <- as.integer(age)
> print(age)
[1] 25
> typeof(age)
[1] "integer"
ছোট একটা কাজ যা আমরা টাইপ কাস্টিং অধ্যায়ে দেখে ফেলেছি। age এর টাইপটা পরিবর্তন করে ইন্টিজারে নিয়ে আসলাম। এখানে আমরা age টাকে ক্যারেক্টার হিসাবে রেখে দিয়েই আলোচনা শেষ করে দিতে পারতাম। কিন্তু অনেক সময় আমরা ব্যবহারকারীর কাছ থেকে ভ্যালু নিয়ে যোগ, বিয়োগ, গুন বা ভাগ করতে চাইলে কিভাবে করতাম। সেই জন্যে এইখানে টাইপের ব্যাপারটা আনলাম। দুইটা ক্যারেক্টার তো কখনো যোগ, বিয়োগ, গুন বা ভাগ করতে পারবেন না। করতে চাইলে এরর খাবেন,
> '1' + '1'
Error in "1" + "1" : non-numeric argument to binary operator
> '1' - '1'
Error in "1" - "1" : non-numeric argument to binary operator
> '1' * '1'
Error in "1" * "1" : non-numeric argument to binary operator
> '1' / '1'
Error in "1"/"1" : non-numeric argument to binary operator
এবার আসি তার ওজনের কাছে। ওজন বাদ যাবে কেন খুবই মূল্যবান ডায়োটের জন্য।
> weight <- readline(prompt="Enter your weight: ")
Enter your weight: 52.5
> print(weight)
[1] "52.5"
> typeof(weight)
[1] "character"
এখানেও একই অবস্থা 52.5 এইটা তো ডাবল। তো আবারো কাস্টিং করতে হবে আর কি করা।
> weight <- readline(prompt="Enter your weight: ")
Enter your weight: 65.75
> weight <- as.double(weight)
> print(weight)
[1] 65.75
> typeof(weight)
[1] "double"
এইভাবে অত্যাচার করার মানে কি? একবারে টাইপ সহকারে ইনপুট নেওয়া যায় না আজব তো! সেটাও করা যায় আস্তে আস্তে খাইলে হজম করতে সমস্যা কম হয়, তাই নয় কি?
> weight <- as.double(readline(prompt ="Enter your weight: "))
Enter your weight: 77.85
> print(weight)
[1] 77.85
> typeof(weight)
[1] "double"
একইভাবে আমরা age টাকেও করতে পারি। নিজে চেষ্টা করি। পারবেন আমার বিশ্বাস আছে। বিশ্বাসে মিলায় বস্তু, তর্কে বহুদূর।
কাজঃ আমরা name, age এবং weight ইনপুট হিসাবে নিলাম। এখন আমরা একটা প্রিন্ট ফাংশন ব্যবহার করে যাতে একেবারে তার name, age এবং weight দেখাতে পারি।