IF, ELSE, ELSE R में IF कथन

⚡ स्मार्ट सारांश

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

  • 🔀 मूल वाक्य संरचना: if (condition) { } else { } परीक्षण TRUE होने पर एक शाखा और FALSE होने पर दूसरी शाखा चलाता है।
  • 🔗 एकाधिक शाखाएँ: R में else if को दो अलग-अलग शब्दों के रूप में लिखा जाता है; इसमें elif कीवर्ड नहीं है जैसा कि इसमें है। Python.
  • ⚠️ सीमा देखभाल: ग्रेटर-ऑर-इक्वल और लेस-ऑर-इक्वल का उपयोग करें ताकि शाखाओं के बीच अनजाने में किसी भी अंतर के कारण कोई मान छूट न जाए।
  • सदिश रूप: ifelse(test, yes, no) एक पूरे वेक्टर का एक साथ मूल्यांकन करता है, जो if नहीं कर सकता।
  • सटीक मिलान: switch() एक लंबी समानता परीक्षण श्रृंखला को एक ही खोज से बदल देता है।
  • 🧮 Operaविकल्प के लिए: सिंगल एम्परसैंड एलिमेंट-वाइज काम करता है जबकि डबल एम्परसैंड का उपयोग if स्टेटमेंट के अंदर सिंगल TRUE या FALSE के लिए किया जाता है।

R में If Else Else If स्टेटमेंट

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")) { }

अक्सर पूछे जाने वाले प्रश्न

if() एक TRUE या FALSE मान को संभालता है और यह नियंत्रित करता है कि कोड का कौन सा ब्लॉक चलेगा। ifelse() एक वेक्टरयुक्त फ़ंक्शन है जो एक वेक्टर के प्रत्येक तत्व का परीक्षण करता है और परिणामों का एक वेक्टर लौटाता है।

if और while लूप के अंदर डबल फॉर्म का प्रयोग करें, जहाँ शर्त का मान एक होना चाहिए और शॉर्ट-सर्किट करने से दाहिनी ओर की स्थिति सुरक्षित रहती है। पूरे वेक्टर पर एलिमेंट-वाइज़ परीक्षण के लिए सिंगल फॉर्म का प्रयोग करें।

R 4.2 के बाद से, if कंडीशन में केवल एक ही TRUE या FALSE होना चाहिए; लंबे वैक्टर अब चेतावनी के बजाय त्रुटि उत्पन्न करते हैं। आप जो कहना चाहते हैं उसके आधार पर ifelse(), any() या all() का उपयोग करें।

परिस्थितियाँ फीचर इंजीनियरिंग नियमों को निर्धारित करती हैं, प्रारंभिक-रोकping प्रशिक्षण के दौरान जाँच और मॉडल आउटपुट पर थ्रेशोल्ड निर्णय। केस_व्हेन() जैसे वेक्टराइज्ड रूपों को प्राथमिकता दी जाती है क्योंकि वे संपूर्ण डेटासेट पर लागू होते हैं।

जी हां। एआई सहायक ऐसी कमियों को पहचान सकते हैं, जैसे कि सीमा मान का हर शाखा से होकर गुजरना, या तुलना के लिए केवल एक बराबर चिह्न का उपयोग होना। सीमा मानों पर संशोधित श्रृंखला का स्वयं परीक्षण करें।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: