उत्तर
आह, मुझे इस सरल प्रश्न का उत्तर खोजने में 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
लिनक्स निष्पादन योग्य के नाम पर है, जो स्वयं " G lobal R egular E xpression P rint" का एक परिचित है , यह इनपुट की पंक्तियों को पढ़ेगा और फिर उन्हें मुद्रित करेगा यदि वे आपके द्वारा दिए गए तर्कों से मेल खाते हैं। "ग्लोबल" का मतलब है कि इनपुट लाइन पर कहीं भी मैच हो सकता है, मैं नीचे "रेगुलर एक्सप्रेशन" बताऊंगा, लेकिन यह विचार स्ट्रिंग से मेल खाने का एक अधिक उपयुक्त तरीका है (आर इस "चरित्र", जैसे कॉल करता है class("abc")
), और "प्रिंट" "क्योंकि यह एक कमांड लाइन प्रोग्राम है, आउटपुट उत्सर्जित करने का मतलब है कि यह अपने आउटपुट स्ट्रिंग को प्रिंट करता है।
अब, grep
प्रोग्राम मूल रूप से एक फिल्टर है, इनपुट की लाइनों से, आउटपुट की लाइनों तक। और ऐसा लगता है कि आर grep
फ़ंक्शन समान रूप से इनपुट की एक सरणी ले जाएगा। उन कारणों के लिए जो मेरे लिए पूरी तरह से अज्ञात हैं (मैंने केवल एक घंटे पहले आर के साथ खेलना शुरू किया था), यह मैचों की सूची के बजाय, अनुक्रमित होने वाले वेक्टर का एक रिटर्न देता है।
लेकिन, अपने मूल प्रश्न पर वापस, हम वास्तव में क्या जानना चाहते हैं कि क्या हम सुई को धड़धड़ाते हुए, सही / गलत मान पाते हैं। उन्होंने स्पष्ट grepl
रूप से इस फ़ंक्शन को "grep" के रूप में नाम देने का फैसला किया , लेकिन " L ogical" रिटर्न वैल्यू के साथ (वे सच्चे और झूठे तार्किक मूल्यों को कहते हैं, जैसे class(TRUE)
)।
तो, अब हम जानते हैं कि नाम कहाँ से आया है और यह क्या करने वाला है। नियमित एक्सप्रेशन पर वापस जाएं। तर्क, भले ही वे तार हैं, उनका उपयोग नियमित अभिव्यक्ति बनाने के लिए किया जाता है (इसलिए: regex)। एक रेगेक्स एक स्ट्रिंग से मेल खाने का एक तरीका है (यदि यह परिभाषा आपको परेशान करती है, तो इसे जाने दें)। उदाहरण के लिए, रेगेक्स a
चरित्र से मेल खाता है "a"
, रेगेक्स a*
चरित्र से "a"
0 या अधिक बार मेल खाता है , और रेगेक्स 1 या अधिक बार a+
चरित्र से मेल खाता है "a"
। इसलिए ऊपर दिए गए उदाहरण में, हम जिस सुई की खोज कर रहे हैं 1+2
, जब रेगेक्स के रूप में माना जाता है, तो इसका अर्थ है "एक या एक से अधिक 1 के बाद 2" ... लेकिन हमारा पीछा एक प्लस द्वारा किया जाता है!
इसलिए, यदि आप grepl
सेटिंग के बिना उपयोग करते हैं, तो fixed
आपकी सुई गलती से छलनी हो जाएगी, और यह अकस्मात काफी काम करेगा, हम इसे ओपी के उदाहरण के लिए भी काम कर सकते हैं। लेकिन वह एक अव्यक्त बग है! हमें यह बताने की आवश्यकता है कि इनपुट एक स्ट्रिंग है, रेगेक्स नहीं, जो स्पष्ट रूप fixed
से इसके लिए है। क्यों तय किया? कोई सुराग नहीं, इस उत्तर को बुकमार्क करें b / c आप इसे याद रखने से पहले शायद 5 बार इसे देखने जा रहे हैं।
कुछ अंतिम विचार
आपका कोड जितना बेहतर होगा, उतना कम इतिहास आपको उसके बारे में समझाना होगा। प्रत्येक तर्क में कम से कम दो दिलचस्प मूल्य हो सकते हैं (अन्यथा उसे तर्क देने की आवश्यकता नहीं होगी), डॉक्स 9 तर्क यहां सूचीबद्ध करता है, जिसका अर्थ है कि इसे लागू करने के लिए कम से कम 2 ^ 9 = 512 तरीके हैं, यह बहुत काम है लिखना, परीक्षण करना, और याद रखना ... ऐसे कार्यों को डिकूप करना (उन्हें अलग करना, एक-दूसरे पर निर्भरता को दूर करना, स्ट्रिंग चीजें regex से भिन्न होती हैं, वेक्टर चीजों से अलग होती हैं)। कुछ विकल्प भी पारस्परिक रूप से अनन्य हैं, उपयोगकर्ताओं को कोड का उपयोग करने के लिए गलत तरीके नहीं देते हैं, यानी समस्याग्रस्त आह्वान संरचनात्मक रूप से निरर्थक होना चाहिए (जैसे कि कोई विकल्प मौजूद नहीं है), तार्किक रूप से निरर्थक नहीं है (जहां आपके पास है) इसे समझाने के लिए चेतावनी दें)। रूपक लगाएं: 10 वीं मंजिल के सामने के दरवाजे को दीवार के साथ बदलना एक संकेत को लटकाने से बेहतर है जो इसके उपयोग के खिलाफ चेतावनी देता है, लेकिन या तो न तो बेहतर है। एक इंटरफ़ेस में, फ़ंक्शन परिभाषित करता है कि तर्कों को कैसा दिखना चाहिए, न कि कॉल करने वाले (क्योंकि कॉलर फ़ंक्शन पर निर्भर करता है, सब कुछ का अनुमान लगाते हुए, जिसे हर कोई कभी भी कॉल कर सकता है, फ़ंक्शन कॉल करने वाले पर निर्भर करता है, और इस प्रकार से भी) चक्रीय निर्भरता जल्दी से एक प्रणाली को रोकना और कभी भी आपके द्वारा अपेक्षित लाभ प्रदान नहीं करेगी)। समान प्रकार से बहुत सावधान रहें, यह एक डिज़ाइन दोष है जैसे कि चीजें सब कुछ का उल्लेख करते हुए कि हर कोई इसे कभी भी कॉल करना चाहता है, जिससे फ़ंक्शन कॉलर्स पर निर्भर करता है, और इस प्रकार का चक्रीय निर्भरता जल्दी से एक सिस्टम को रोक देगा और कभी भी उन लाभों को प्रदान नहीं करेगा जो आप अपेक्षा करते हैं)। समान प्रकार से बहुत सावधान रहें, यह एक डिज़ाइन दोष है जैसे कि चीजें सब कुछ का उल्लेख करते हुए कि हर कोई इसे कभी भी कॉल करना चाहता है, जिससे फ़ंक्शन कॉलर्स पर निर्भर करता है, और इस प्रकार का चक्रीय निर्भरता जल्दी से एक सिस्टम को रोक देगा और कभी भी उन लाभों को प्रदान नहीं करेगा जो आप अपेक्षा करते हैं)। समान प्रकार से बहुत सावधान रहें, यह एक डिज़ाइन दोष है जैसे कि चीजेंTRUE
और 0
और "abc"
सब वैक्टर हैं।
fixed=TRUE
, अन्यथा आप इसे स्ट्रिंग के बजाय रीजैक्स के रूप में मान रहे हैं। मेरा जवाब अक्टूबर 2016 से देखें।