উত্তর
দীর্ঘশ্বাস ফেলুন, এই সাধারণ প্রশ্নের উত্তর খুঁজতে আমার 45 মিনিট সময় লেগেছে। উত্তরটা হচ্ছে:grepl(needle, haystack, fixed=TRUE)
# Correct
> grepl("1+2", "1+2", fixed=TRUE)
[1] TRUE
> grepl("1+2", "123+456", fixed=TRUE)
[1] FALSE
# Incorrect
> grepl("1+2", "1+2")
[1] FALSE
> grepl("1+2", "123+456")
[1] TRUE
ব্যাখ্যা
grep
লিনাক্স এক্সিকিউটেবলের নামানুসারে নামকরণ করা হয়েছে, যা নিজেই " জি লোবলাল আর এলুলার ই এক্সপ্রেশন পি রিন্ট " এর একটি সংক্ষিপ্ত বিবরণ , এটি ইনপুটটির লাইনগুলি পড়তে পারে এবং আপনার প্রদত্ত যুক্তিগুলির সাথে মিলে যদি সেগুলি মুদ্রণ করে। "গ্লোবাল" মানে ম্যাচটি ইনপুট লাইনে যে কোনও জায়গায় ঘটতে পারে, আমি নীচে "নিয়মিত এক্সপ্রেশন" ব্যাখ্যা করব, তবে ধারণাটি স্ট্রিংয়ের সাথে মিলানোর জন্য এটি একটি চতুর উপায় (আর এইটিকে "চরিত্র", যেমন class("abc")
) বলে এবং "মুদ্রণ" "কারণ এটি একটি কমান্ড লাইন প্রোগ্রাম, আউটপুট নির্গমন করার অর্থ এটি তার আউটপুট স্ট্রিংয়ে মুদ্রণ করে।
এখন, grep
প্রোগ্রামটি মূলত একটি ফিল্টার, ইনপুট লাইন থেকে আউটপুট লাইনে। এবং দেখে মনে হয় যে আর এর grep
ফাংশন একইভাবে ইনপুটগুলির অ্যারে নেবে। যে কারণে আমার কাছে একেবারে অজানা (আমি কেবল এক ঘন্টা আগে আর এর সাথে খেলতে শুরু করেছি), এটি ম্যাচগুলির তালিকার পরিবর্তে সূচকগুলির একটি ভেক্টরকে ফিরিয়ে দেয় match
তবে, আপনার আসল প্রশ্নে ফিরে আমরা যা চাই তা হ'ল আমরা খড়ের খড়ের মধ্যে একটি সত্য / মিথ্যা মান পেয়েছি কিনা তা জেনে রাখা উচিত। তারা স্পষ্টতই এই ফাংশনটির নামকরণ করার সিদ্ধান্ত নিয়েছিল grepl
, যেমন " গ্রেপ" এর মতো তবে " এল ওজিকাল" রিটার্ন মান সহ (তারা সত্য এবং মিথ্যা যৌক্তিক মান বলে, যেমন class(TRUE)
)।
সুতরাং, এখন আমরা জানি নামটি কোথা থেকে এসেছে এবং এটি করার কথা কি। নিয়মিত এক্সপ্রেশন ফিরে পেতে দেয়। আর্গুমেন্টগুলি, যদিও তারা স্ট্রিং হয়, তারা নিয়মিত অভিব্যক্তি তৈরি করার জন্য ব্যবহৃত হয় (এখন থেকে: রেজেক্স)। একটি রেজেক্স একটি স্ট্রিংয়ের সাথে ম্যাচ করার একটি উপায় (যদি এই সংজ্ঞা আপনাকে বিরক্ত করে তবে তা ছেড়ে দিন)। উদাহরণ হিসেবে বলা যায়, Regex a
সাথে মেলে চরিত্র "a"
, Regex a*
চরিত্র মিলে যায় "a"
0 বা আরো কয়েকবার, এবং Regex a+
চরিত্র মেলে দিবে "a"
1 বা বেশি বার। সুতরাং উপরের উদাহরণে, আমরা যে 1+2
সূচটি অনুসন্ধান করছি , যখন তাকে রেইজেক্স হিসাবে ধরা হয়, তার অর্থ "এক বা একাধিক 1 এর পরে একটি 2" ... তবে আমাদের পরে একটি প্লাস হয়!
সুতরাং, যদি আপনি grepl
বিনা সেটিং ব্যতীত ব্যবহার করেন তবে fixed
আপনার সূঁচগুলি দুর্ঘটনাক্রমে খড়ের খালি হয়ে যাবে এবং এটি ঘটনাক্রমে বেশিরভাগ ক্ষেত্রে কাজ করবে, আমরা দেখতে পাচ্ছি এটি এমনকি ওপি'র উদাহরণের জন্যও কাজ করে। তবে এটি একটি সুপ্ত বাগ! আমাদের এটি জানাতে হবে ইনপুটটি একটি স্ট্রিং, কোনও রেজেক্স নয়, যা আপাতদৃষ্টিতে যা প্রয়োজন fixed
তা। কেন স্থির? কোনও ক্লু নেই, বুকমার্ক করুন এই উত্তরটি খ / সি আপনি মুখস্থ করার আগে আপনাকে সম্ভবত এটি আরও 5 বার সন্ধান করতে হবে।
কয়েকটি চূড়ান্ত চিন্তা
আপনার কোডটি যত ভাল হবে তা বোঝার জন্য আপনাকে যত কম ইতিহাস জানতে হবে। প্রতিটি যুক্তির কমপক্ষে দুটি আকর্ষণীয় মান থাকতে পারে (অন্যথায় এটি একটি যুক্তি হওয়ার প্রয়োজন হবে না), ডক্স এখানে 9 টি যুক্তি তালিকাভুক্ত করে যার অর্থ এটি কমপক্ষে কমপক্ষে 2 ^ 9 = 512 উপায় রয়েছে, এটি অনেক কাজ লিখুন, পরীক্ষা করুন এবং মনে রাখবেন ... এই জাতীয় ক্রিয়াকলাপগুলি দ্বিগুণ করুন (এগুলিকে বিভক্ত করুন, একে অপরের উপর নির্ভরশীলতা সরিয়ে দিন, স্ট্রিং জিনিসগুলি ভেক্টর জিনিসের চেয়ে আলাদা) ge কিছু অপশনও পারস্পরিক একচেটিয়া, ব্যবহারকারীদের কোড ব্যবহারের ভুল উপায়গুলি দেবেন না, যেমন সমস্যাযুক্ত প্রার্থনাটি কাঠামোগত অযৌক্তিক হওয়া উচিত (যেমন কোনও বিকল্প নেই যা অস্তিত্বহীন নয়) যুক্তিযুক্তভাবে অযৌক্তিক নয় (যেখানে আপনাকে করতে হবে এটি ব্যাখ্যা করতে একটি সতর্কতা প্রেরণ করুন)। রূপকভাবে রাখুন: দশম তলার পাশের সামনের দরজাটি একটি প্রাচীরের সাথে প্রতিস্থাপন করা এমন একটি চিহ্নকে ঝুলিয়ে দেওয়ার চেয়ে ভাল যা এর ব্যবহারের বিরুদ্ধে সতর্ক করে, তবে হয় উভয়ের চেয়ে ভাল। একটি ইন্টারফেসে, ফাংশনটি সংজ্ঞায়িত করে যে আর্গুমেন্টগুলি দেখতে কেমন হবে, কলার নয় (কারণ কলার ফাংশনের উপর নির্ভর করে, যার দ্বারা কল করা যেতে পারে এমন সমস্ত কিছুর উপর নির্ভর করে ফাংশনটি কলকারীদের উপরও নির্ভর করে এবং এই ধরণের চক্রীয় নির্ভরতা দ্রুত কোনও সিস্টেমকে আটকে দেবে এবং আপনি যে সুবিধাটি প্রত্যাশা করছেন তা কখনই সরবরাহ করবে না)। দ্বিখণ্ডিত প্রকার সম্পর্কে খুব সতর্ক থাকুন, এটি এমন একটি ডিজাইনের ত্রুটি যা পছন্দ করে প্রত্যেকে এটির সাথে কল করতে চাইলে এমন সমস্ত কিছু অনুমান করা ফাংশনটি কলকারীদের উপরও নির্ভর করে এবং এই ধরণের চক্রীয় নির্ভরতা দ্রুত কোনও সিস্টেমকে আটকে রাখবে এবং আপনার প্রত্যাশাগুলি কখনই সরবরাহ করবে না)। দ্বিখণ্ডিত প্রকার সম্পর্কে খুব সতর্ক থাকুন, এটি এমন একটি ডিজাইনের ত্রুটি যা পছন্দ করে প্রত্যেকে যার সাথে এটি কল করতে চাইতে পারে তার সমস্ত কিছু অনুমান করা ফাংশনটি কলকারীদের উপরও নির্ভর করে এবং এই ধরণের চক্রীয় নির্ভরতা দ্রুত কোনও সিস্টেমকে আটকে রাখবে এবং আপনার প্রত্যাশাগুলি কখনই সরবরাহ করবে না)। দ্বিখণ্ডিত প্রকার সম্পর্কে খুব সতর্ক থাকুন, এটি এমন একটি ডিজাইনের ত্রুটি যা পছন্দ করেTRUE
এবং 0
এবং "abc"
সমস্ত ভেক্টর হয়।
fixed=TRUE
, অন্যথায় আপনি স্ট্রিংয়ের পরিবর্তে এটিকে একটি রেজেক্স হিসাবে বিবেচনা করছেন। অক্টোবর 2016 থেকে আমার উত্তর দেখুন