R में ऑपरेटरों का एक ऐसा समूह है जो कई अन्य भाषाओं जैसा ही है:
1 == 2 # FALSE
1 != 2 # TRUE
1 < 2 # TRUE
1 > 2 # FALSE
1 <= 2 # TRUE
1 >= 2 # FALSE
if-then-else का मूल रूप यह है:
if (x > 10) {
y <- "big"
} else if (x > 2) {
y <- "medium"
} else {
y <- "tiny"
}
इस स्थिति में बूलियन के चारों ओर गोल ब्रैकेट ( ) और बॉडी के चारों ओर ब्रेसिज़ { }, दोनों ज़रूरी हैं।
एक सरल if स्टेटमेंट को छोटा भी किया जा सकता है:
if (x == 0) return("success")
आगे आने वाले vector-filtering कॉन्सेप्ट की ओर देखें: कोष्ठक () में लिखी शर्त का मान एक ही TRUE/FALSE होना चाहिए।
तुलना में वेक्टर शामिल करने पर आम तौर पर बूलियन का वेक्टर मिलता है, इसलिए इन्हें किसी एकत्र करने वाले फंक्शन में लपेटना पड़ता है, जैसे all() (क्या सारी वैल्यू TRUE हैं?) या any() (क्या कम से कम एक वैल्यू TRUE है?)।
numbers <- c(4,5,7,9,10,11)
numbers %% 3 == 0 # gives vector of booleans
#> [1] FALSE FALSE FALSE TRUE FALSE FALSE
# use any() to get a single TRUE/FALSE
if (any(numbers %% 3 == 0)) print("1 or more numbers are divisible by 3")
#> [1] "1 or more numbers are divisible by 3"
ifelse फंक्शनएक वैकल्पिक if-else रूप काम आ सकता है, बशर्ते परिणाम केवल सही/गलत हो।
y <- ifelse(x > 8, "big", "small")
# Don't mix result types:
z <- ifelse(x > 100, 100, "small") # numeric or string result? Expect problems!
ifelse() ठीक तीन पैरामीटर लेता है:
TRUE होने पर वैल्यूFALSE होने पर वैल्यू।वेक्टर इनपुट भी चलते हैं, और तब आउटपुट भी वेक्टर ही मिलता है।
इस स्थिति में ध्यान रखिए कि दोनों शाखाओं से एक ही तरह का डेटा मिले: संख्यात्मक, कैरेक्टर, लॉजिकल, इत्यादि।
इस पर vector-functions कॉन्सेप्ट में चर्चा की जाएगी।
दोनों परिणाम (ऊपर के उदाहरण में "big", "small") एक-एक वैल्यू होने चाहिए।
दुर्भाग्य से, यहाँ लंबा वेक्टर देने पर R शायद कुछ उलझाने वाला और अप्रत्याशित कर देगा, और कोई चेतावनी संदेश भी नहीं देगा।
if_else फंक्शनR भाषा के मेंटेनरों की नीति यह है कि जहाँ तक संभव हो ब्रेकिंग बदलावों से बचा जाए। इससे CRAN में उपलब्ध थर्ड-पार्टी पैकेज बड़ी संख्या में बने रहते हैं, लेकिन आधुनिक प्रोग्रामिंग कॉन्सेप्ट के साथ बेस R को अपडेट करने की क्षमता सीमित हो जाती है।
हाल के वर्षों में कई पैकेज जारी हुए हैं जो R की कार्यक्षमता को बढ़ाते हैं और कभी-कभी उसकी जगह ले भी लेते हैं। ये मूल R डिज़ाइन की खूबियों और कमज़ोरियों के कई दशकों के अनुभव पर आधारित हैं।
ये पैकेज मिलकर tidyverse संग्रह बनाते हैं।
इन्हें 2023 में Exercism टेस्ट रनर में जोड़ा गया था, और अभ्यासों में इस्तेमाल करने के लिए ये आपके लिए उपलब्ध हैं।
हमारा R ट्रैक tidyverse के जुड़ने से कई साल पहले का है, इसलिए आप देख सकते हैं कि समुदाय के कई हल बेस भाषा तक ही सीमित रहते हैं।
dplyr पैकेजdplyr मुख्य रूप से डेटाफ्रेम संभालने के काम आता है (इस पर कोर्स में आगे चर्चा होगी)।
इसे अपने कोड के ऊपर library(dplyr) लिखकर जोड़िए, या पूरा संग्रह जोड़ने के लिए library(tidyverse) लिखिए।
आपको मास्क हुए नामों के बारे में चेतावनी संदेश दिख सकते हैं, लेकिन यह शायद ही कभी समस्या बनता है।
इस कॉन्सेप्ट के लिए if_else फंक्शन का ज़िक्र करना ज़रूरी है।
यह बेस R के ifelse जैसा ही है।
library(dplyr) # warnings not shown
x <- 10
if_else(x > 8, "big", "small")
#> [1] "big"
मुख्य अंतर यह है कि if_else एक वैकल्पिक चौथा आर्गुमेंट ले सकता है, उन अनुपस्थित वैल्यू के लिए जिन्हें R में NA से दर्शाया जाता है।
xs <- c(3, NA, 10, NA, 4) # a 5-element vector
xs
#> [1] 3 NA 10 NA 4
if_else(xs > 8, "big", "small", "missing")
#> [1] "small" "missing" "big" "missing" "small"
# contrast:
ifelse(xs > 8, "big", "small")
#> [1] "small" NA "big" NA "small"
आप यह भी पाएँगे कि if_else के एरर संदेश पुराने ifelse से कहीं बेहतर हैं।
dplyr लाइब्रेरी लोड करने के बाद आपके पास between() फंक्शन भी उपलब्ध होगा।
R तुलनाओं को एक साथ जोड़कर लिखने की अनुमति नहीं देता, इसलिए 1 <= x <= 5 एक एरर संदेश देगा।
dplyr लोड होने पर between(x, 1, 5) और x >= 1 & x <= 5 एक ही बात हैं, और शायद ज़्यादा पढ़ने लायक भी।
निचली और ऊपरी, दोनों सीमाएँ शामिल हैं।