R Academy · पाठ

Lexical Scoping के नियम

समझें कि R parent environments में खोज करके variables कैसे ढूँढता है।

पाठ 2, कुल 4 में से13 चरण

Lexical Scoping के नियम, CoddyKit पर R Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह R Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

लेक्सिकल स्कोपिंग क्या है

लेक्सिकल स्कोपिंग का अर्थ है कि कोई फलन चरों को वहाँ खोजता है जहाँ उसे परिभाषित किया गया था, न कि वहाँ जहाँ उसे बुलाया गया है। R लेक्सिकल स्कोपिंग का उपयोग करता है। यह पूर्वानुमेय है: फलन जिस परिवेश में खोज करता है, वह उसके बनने के समय निश्चित हो जाता है, बुलाए जाने के समय नहीं।

x <- 'global'
f <- function() {
  cat('x =', x, '\n')  # looks where f was defined (global)
}
local({
  x <- 'local to local block'
  f()  # still prints global x, not the local one
})

लेक्सिकल बनाम डायनेमिक स्कोपिंग

डायनेमिक स्कोपिंग में (जिसका उपयोग कुछ अन्य भाषाओं में होता है), कोई फलन चर को बुलाने वाले परिवेश में खोजता। इसके बजाय R लेक्सिकल स्कोपिंग का उपयोग करता है: परिभाषा के समय का संलग्न परिवेश हमेशा प्रभावी होता है। इससे फलन इस बात की परवाह किए बिना एकसमान व्यवहार करते हैं कि उन्हें कहाँ से बुलाया गया है।

val <- 100
make_adder <- function(n) {
  # n is captured from the definition environment
  function(x) x + n
}
add10 <- make_adder(10)
add20 <- make_adder(20)
cat(add10(5), '\n')   # 15 — n=10 from definition
cat(add20(5), '\n')   # 25 — n=20 from definition

मुक्त चर और क्लोज़र

किसी फलन के अंदर ऐसा चर जो न तो पैरामीटर हो और न ही स्थानीय असाइनमेंट में बनाया गया हो, मुक्त चर कहलाता है। R उसे संलग्न परिवेश में खोजता है। जो फलन मुक्त चरों को अपने साथ रखता है, उसे क्लोज़र कहा जाता है।

base_rate <- 0.05   # free variable captured by f
f <- function(principal, years) {
  principal * (1 + base_rate) ^ years
}
cat('5 yr return:', f(1000, 5), '\n')
# Even if we change base_rate later:
base_rate <- 0.08
cat('New rate return:', f(1000, 5), '\n')

क्लोज़र परिवेशों को अपने साथ रखते हैं

जब भी कोई फ़ैक्टरी फलन बुलाया जाता है, लौटाया गया फलन (क्लोज़र) संलग्न परिवेश की एक स्थिति अपने साथ रखता है। अलग-अलग बार बुलाने पर अलग-अलग संचित मानों वाले क्लोज़र बनते हैं — यही फलन फ़ैक्टरी का आधार है।

power_fn <- function(exp) {
  function(x) x ^ exp
}
square <- power_fn(2)
cube   <- power_fn(3)
cat('square(4) =', square(4), '\n')
cat('cube(3)   =', cube(3),   '\n')

<<- ऑपरेटर

<<- (दोहरा-तीर असाइनमेंट) किसी मौजूदा बंधन को खोजने के लिए जनक-श्रृंखला में ऊपर की ओर जाता है और उसमें उसी स्थान पर परिवर्तन करता है। यदि कोई बंधन नहीं मिलता, तो वह वैश्विक परिवेश में एक बंधन बनाता है। किसी फलन के अंदर से संलग्न दायरे के चर में परिवर्तन करने के लिए यही साधन उपयोगी है।

count <- 0
increment <- function() {
  count <<- count + 1
}
increment()
increment()
increment()
cat('count:', count, '\n')

क्लोज़र के साथ <<-

<<- का सबसे प्रचलित उपयोग ऐसे क्लोज़र के अंदर होता है जिन्हें अपने संलग्न परिवेश में स्थिति अद्यतन करनी होती है। इससे स्थिति-संपन्न फलन बनते हैं — ऐसे फलन जिनकी निजी स्मृति बुलावों के बीच बनी रहती है।

make_counter <- function() {
  n <- 0
  list(
    increment = function() n <<- n + 1,
    get       = function() n,
    reset     = function() n <<- 0
  )
}
ctr <- make_counter()
ctr$increment()
ctr$increment()
cat('Count:', ctr$get(), '\n')
ctr$reset()
cat('After reset:', ctr$get(), '\n')

नेस्टेड फलनों में स्कोपिंग

जब फलन एक-दूसरे के अंदर लिखे जाते हैं, तो भीतरी फलन बाहरी फलन में परिभाषित चरों को देख सकता है। बाहरी फलन का परिवेश भीतरी फलन का संलग्न परिवेश बन जाता है और एक श्रृंखला बनती है।

outer <- function() {
  greeting <- 'Hello'
  inner <- function(name) {
    # greeting comes from outer's environment
    paste(greeting, name)
  }
  inner('World')
}
cat(outer(), '\n')

दायरे की श्रृंखला में खोज

जब R किसी चर को खोजता है, तो वह परिवेशों में इस क्रम से खोज करता है: फलन का अपना → संलग्न → संलग्न का संलग्न → ... → वैश्विक → खोज पथ → आधार → रिक्त। पहली मिली संगति प्रभावी होती है।

x <- 'global'
f <- function() {
  x <- 'local to f'
  g <- function() {
    # g has no x, so looks in f's env
    cat('g sees x =', x, '\n')
  }
  g()
}
f()

किसी फलन का environment()

आप environment(f) से किसी भी फलन के संलग्न परिवेश की जाँच कर सकते हैं। आप उसे environment(f) <- e से बदल भी सकते हैं। इससे यह बदल जाता है कि फलन मुक्त चरों को कहाँ खोजेगा — यह शक्तिशाली, लेकिन उन्नत तकनीक है।

x <- 'global_x'
f <- function() x
cat('f sees:', f(), '\n')

# Change f's enclosing environment
my_env <- new.env(parent = emptyenv())
my_env$x <- 'env_x'
environment(f) <- my_env
cat('f now sees:', f(), '\n')

व्यावहारिक क्लोज़र: मेमोइज़ेशन

लेक्सिकल स्कोपिंग + <<- से मेमोइज़ेशन संभव होता है: महँगे फलन-परिणामों को क्लोज़र के परिवेश में कैश करें। यह कैश क्लोज़र तक निजी रहता है और बुलावों के बीच बना रहता है।

make_memoized_fib <- function() {
  cache <- c()
  function(n) {
    if (!is.null(cache[n])) return(cache[n])
    if (n <= 1) { cache[n] <<- n; return(n) }
    result <- Recall(n-1) + Recall(n-2)
    cache[n] <<- result
    result
  }
}
fib <- make_memoized_fib()
cat(sapply(0:8, fib), '\n')

लेक्सिकल स्कोपिंग की समस्या: लूप चर

एक सामान्य समस्या है: लूप के अंदर क्लोज़र बनाना। सभी क्लोज़र मान की स्थिति अपने साथ रखने के बजाय उसी परिवेश को अपने साथ रखते हैं। जब तक उन्हें बुलाया जाता है, लूप चर अपना अंतिम मान रखता है।

fns <- vector('list', 3)
for (i in 1:3) {
  local({
    captured_i <- i
    fns[[captured_i]] <<- function() captured_i
  })
}
cat(fns[[1]](), fns[[2]](), fns[[3]](), '\n')

त्वरित जाँच

R की लेक्सिकल स्कोपिंग में कोई फलन मुक्त चर (जो स्वयं फलन में परिभाषित न हो) कहाँ खोजता है?

लेक्सिकल स्कोपिंग: मुख्य बातें

लेक्सिकल स्कोपिंग के लिए मुख्य बातें:

  • R लेक्सिकल स्कोपिंग का उपयोग करता है — फलन चरों को वहाँ खोजते हैं जहाँ वे परिभाषित किए गए थे
  • फलन अपने संलग्न परिवेश को क्लोज़र के रूप में अपने साथ रखता है
  • मुक्त चरों का निर्धारण बुलाए जाने के समय नहीं, बल्कि परिभाषित किए जाने के समय होता है
  • <<- जनक-श्रृंखला में किसी बंधन को बदलता है (और न मिलने पर वैश्विक परिवेश में)
  • क्लोज़र + <<- = स्थायी निजी स्थिति वाले स्थिति-संपन्न फलन
  • लूप-क्लोज़र समस्या: हर पुनरावृत्ति के लिए नया परिवेश बनाने हेतु local() का उपयोग करें
make_multiplier <- function(factor) {
  function(x) x * factor
}
double <- make_multiplier(2)
triple <- make_multiplier(3)
cat('double(7):', double(7), '\n')
cat('triple(7):', triple(7), '\n')
cat('double env factor:', get('factor', envir = environment(double)), '\n')
शुरुआत निःशुल्क

एआई शिक्षक के साथ R सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
43
पाठ
159

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

क्या “Lexical Scoping के नियम” पाठ निःशुल्क है?

हाँ — R Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Lexical Scoping के नियम” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Lexical Scoping के नियम” में मैं क्या सीखूँगा?

समझें कि R parent environments में खोज करके variables कैसे ढूँढता है। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ R Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या R Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर R Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“Lexical Scoping के नियम” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस R Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर R Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. R में Environment क्या है?
  2. Lexical Scoping के नियम
  3. Global बनाम Local Scope
  4. Environments बनाना और निरीक्षण करना
← R Academy पर वापस जाएँ