IF, ELSE, ELSE R में IF कथन
⚡ स्मार्ट सारांश
R में if Else और Else If स्टेटमेंट एक तार्किक स्थिति के आधार पर यह तय करते हैं कि कोड का कौन सा ब्लॉक चलेगा। यह विस्तृत विवरण दो-शाखाओं वाले प्रारूप, बहु-शाखा श्रृंखलाओं, वेक्टरयुक्त ifelse() फ़ंक्शन और सटीक मिलान के लिए switch() फ़ंक्शन को कवर करता है।

R में if else स्टेटमेंट
An यदि नहीं तो यह कथन एक शर्त के सत्य होने पर कोड का एक ब्लॉक और असत्य होने पर दूसरा ब्लॉक चलाता है। R में इसका सिंटैक्स इस प्रकार है:
if (condition) { Expr1 } else { Expr2 }
जांचें कि quantity नामक वेरिएबल 20 से अधिक है या नहीं। यदि यह 20 से अधिक है, तो कोड "आपने बहुत कुछ बेचा!" प्रिंट करेगा, अन्यथा यह "आज के लिए पर्याप्त नहीं है" प्रिंट करेगा।
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
आउटपुट:
## [1] "You sold a lot!"
नोटइंडेंटेशन से R द्वारा कोड चलाने के तरीके में कोई बदलाव नहीं होता, लेकिन लगातार इंडेंटेशन से ही शर्तों की लंबी श्रृंखला पठनीय बनी रहती है। यह भी ध्यान रखें कि क्लोजिंग ब्रैकेट और एल्स कीवर्ड एक ही पंक्ति में होने चाहिए, अन्यथा R इफ ब्लॉक को पूर्ण मानकर त्रुटि उत्पन्न कर देता है।
R में else if स्टेटमेंट
श्रृंखला के साथ आगे के परीक्षण और अगरR में elif कीवर्ड नहीं है। PythonR में आप दोनों शब्दों को अलग-अलग लिखते हैं, और आप जितनी चाहें उतनी शाखाएँ जोड़ सकते हैं। इसका सिंटैक्स इस प्रकार है:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
मान लीजिए कि आप तीन परिणाम चाहते हैं: 20 से कम होने पर "आज के लिए पर्याप्त नहीं", 20 और 30 के बीच होने पर "औसत दिन", और 30 से अधिक होने पर "कितना शानदार दिन!" प्रिंट होता है।
आप मात्रा की मात्रा बदलने की कोशिश कर सकते हैं।
# Create the variable quantity quantity <- 10 # Create multiple condition statement if (quantity < 20) { print('Not enough for today') } else if (quantity >= 20 & quantity <= 30) { print('Average day') } else { print('What a great day!') }
आउटपुट:
## [1] "Not enough for today"
उदाहरण 2:
उत्पाद की श्रेणी के अनुसार वैट दरें भिन्न होती हैं। मान लीजिए तीन श्रेणियां हैं, जिनमें से प्रत्येक की अपनी दर है:
| श्रेणियाँ | उत्पाद | वैट |
|---|---|---|
| A | पुस्तक, पत्रिका, समाचार पत्र, आदि. | 8% |
| B | सब्जी, मांस, पेय, आदि. | 10% तक |
| C | टी-शर्ट, जीन्स, पैंट, आदि. | 20% तक |
एक एल्स इफ चेन ग्राहक द्वारा खरीदी गई वस्तु पर सही दर लागू करती है:
category <- 'A' price <- 10 if (category =='A'){ cat('A vat rate of 8% is applied.','The total price is',price *1.08) } else if (category =='B'){ cat('A vat rate of 10% is applied.','The total price is',price *1.10) } else { cat('A vat rate of 20% is applied.','The total price is',price *1.20) }
आउटपुट:
## A vat rate of 8% is applied. The total price is 10.8
R में ifelse() वेक्टरयुक्त फ़ंक्शन
if स्टेटमेंट केवल एक ही मान को संभालता है। यदि इसे एक वेक्टर दिया जाए, तो R 4.2 या उसके बाद के संस्करण में त्रुटि उत्पन्न होती है, क्योंकि शर्त केवल TRUE या FALSE होनी चाहिए। ifelse() इस समस्या को हल करता है, क्योंकि यह प्रत्येक तत्व का एक साथ परीक्षण करता है और समान लंबाई का एक वेक्टर लौटाता है।
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
आउटपुट:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
तीन तर्क हैं: परीक्षण, परीक्षण के सही होने पर लौटाया गया मान, और परीक्षण के गलत होने पर लौटाया गया मान। तीनों को समान लंबाई तक पुन: प्रस्तुत किया जाता है।
नेस्टिंग ifelse() पूरे वेक्टर में एक else if श्रृंखला को पुन: उत्पन्न करता है:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
दो सीमाएँ जानना ज़रूरी हैं। ifelse() फैक्टर लेवल और डेट क्लास जैसे एट्रिब्यूट्स को परिणाम से हटा देता है, और यह प्रत्येक एलिमेंट के लिए दोनों शाखाओं का मूल्यांकन करता है, इसलिए जब एक शाखा अधिक खर्चीली हो तो यह व्यर्थ है। dplyr का विकल्प जब_जब() यह नेस्टिंग से पूरी तरह बचता है और प्रकारों को बरकरार रखता है:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
R में switch() स्टेटमेंट
जब हर शाखा एक ही चर की समानता की जाँच करती है, तो एक लंबी 'एल्स इफ' श्रृंखला को पढ़ना मुश्किल हो जाता है। 'स्विच()' इसे एक ही लुकअप से बदल देता है।
category <- 'A' price <- 10 vat <- switch(category, 'A' = 1.08, 'B' = 1.10, 'C' = 1.20, 1.20) # the unnamed last value is the default cat('The total price is', price * vat)
इसके व्यवहार को तीन नियम नियंत्रित करते हैं:
- कैरेक्टर आर्गुमेंट के साथ, switch() नाम का सटीक मिलान करता है। इसमें आंशिक मिलान या पैटर्न मिलान संभव नहीं है।
- एक अनाम अंतिम तत्व डिफ़ॉल्ट के रूप में कार्य करता है। इसके बिना, एक बेमेल मान अदृश्य रूप से NULL लौटाता है, जो कि साइलेंट बग का एक सामान्य स्रोत है।
- पूर्णांक तर्क के साथ, स्विच() स्थिति के आधार पर चयन करता है: स्विच(2, “a”, “b”, “c”) “b” लौटाता है।
निश्चित मानों के समूह के विरुद्ध सटीक मिलान के लिए switch() का उपयोग करें, और श्रेणियों और मिश्रित स्थितियों के लिए else if का उपयोग करें, जिन्हें switch() व्यक्त नहीं कर सकता। किसी अनुक्रम पर बार-बार एक शर्त लागू करने के लिए, इसे एक के साथ संयोजित करें। पाश के लिए या एक घुमाव के दौरान.
तार्किक Operaआर स्थितियों में टॉर्स
किसी शर्त को बनाने वाले ऑपरेटर एक दूसरे से अलग तरह से व्यवहार करते हैं, और यह अंतर मायने रखता है।
| Operaटो | अर्थ | इसका प्रयोग करें |
|---|---|---|
| & | तत्व-वार और | ifelse(), filter(), संपूर्ण सदिश |
| && | सिंगल-वैल्यू AND, शॉर्ट-सर्किट | यदि () और जबकि () |
| | | तत्व-वार OR | ifelse(), filter(), संपूर्ण सदिश |
| || | एकल-मान OR, शॉर्ट-सर्किट | यदि () और जबकि () |
| ! | नहीं, परीक्षण को नकारता है | कहीं भी |
| %में% | क्या यह मान इस सेट में शामिल है? | लंबी OR श्रृंखलाओं को प्रतिस्थापित करता है |
शॉर्ट-सर्किट क्यों महत्वपूर्ण है। उत्तर तय होते ही दोहरा रूप रुक जाता है, इसलिए जब बायां पक्ष पहले ही परिणाम तय कर चुका होता है तो दाएं पक्ष का मूल्यांकन कभी नहीं किया जाता। इससे सुरक्षा खंड लिखना सुरक्षित हो जाता है:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
कई मूल्यों से तुलना करना। समानता परीक्षणों की श्रृंखला बनाने के बजाय %in% का उपयोग करें, जो छोटा भी है और टाइप करने में गलती होने की संभावना भी कम है:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
एक आखिरी चेतावनी: केवल बराबर का चिह्न मान निर्दिष्ट करता है, तुलना नहीं करता। शर्त के अंदर हमेशा == लिखें।
R में सशर्त कथन: त्वरित संदर्भ
इस ट्यूटोरियल में उपयोग किए गए प्रत्येक संरचना को नीचे सूचीबद्ध किया गया है:
| उद्देश्य | Code |
|---|---|
| दो शाखाएँ |
if (cond) { a } else { b } |
| अनेक शाखाएँ |
if (c1) { a } else if (c2) { b } else { c } |
| वेक्टरयुक्त स्थिति |
ifelse(test, yes, no)
|
| एक सदिश पर बहु-शाखा |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| सटीक मिलान खोज |
switch(x, "A" = 1, "B" = 2, 0) |
| सदस्यता परीक्षण |
if (x %in% c("A", "B")) { } |

