<<-राज्य बनाए रखने के लिए क्लोजर के साथ संयोजन के रूप में सबसे उपयोगी है। यहाँ मेरा हाल के एक पेपर से एक सेक्शन है:
एक क्लोजर एक फ़ंक्शन है जिसे दूसरे फ़ंक्शन द्वारा लिखा जाता है। क्लोज़र इसलिए कहा जाता है क्योंकि वे मूल फ़ंक्शन के वातावरण को संलग्न करते हैं, और उस फ़ंक्शन के सभी चर और मापदंडों तक पहुंच सकते हैं। यह उपयोगी है क्योंकि यह हमें दो स्तरों के मापदंडों की अनुमति देता है। मापदंडों का एक स्तर (माता-पिता) नियंत्रित करता है कि फ़ंक्शन कैसे काम करता है। दूसरे स्तर (बच्चा) काम करता है। निम्न उदाहरण से पता चलता है कि इस विचार का उपयोग बिजली के कार्यों के परिवार को कैसे उत्पन्न किया जा सकता है। मूल कार्य ( power) बाल कार्यों ( squareऔर ) को बनाता है cubeजो वास्तव में कड़ी मेहनत करते हैं।
power <- function(exponent) {
function(x) x ^ exponent
}
square <- power(2)
square(2) # -> [1] 4
square(4) # -> [1] 16
cube <- power(3)
cube(2) # -> [1] 8
cube(4) # -> [1] 64
दो स्तरों पर चर का प्रबंधन करने की क्षमता भी अपने माता-पिता के वातावरण में चर को संशोधित करने के लिए एक फ़ंक्शन की अनुमति देकर राज्य को फ़ंक्शन इनवॉइस में बनाए रखना संभव बनाती है। विभिन्न स्तरों पर चर के प्रबंधन की कुंजी डबल एरो असाइनमेंट ऑपरेटर है <<-। सामान्य एकल तीर असाइनमेंट ( <-) के विपरीत जो हमेशा वर्तमान स्तर पर काम करता है, डबल तीर ऑपरेटर पैरेंट स्तरों में चर को संशोधित कर सकता है।
यह एक काउंटर को बनाए रखना संभव बनाता है जो रिकॉर्ड करता है कि किसी फ़ंक्शन को कितनी बार बुलाया गया है, जैसा कि निम्नलिखित उदाहरण दिखाता है। प्रत्येक बार new_counterचलाया जाता है, यह एक वातावरण बनाता है, iइस वातावरण में काउंटर को इनिशियलाइज़ करता है, और फिर एक नया फ़ंक्शन बनाता है।
new_counter <- function() {
i <- 0
function() {
# do something useful, then ...
i <<- i + 1
i
}
}
नया कार्य एक समापन है, और इसका वातावरण संलग्न वातावरण है। जब बंद हो जाता है counter_oneऔर counter_twoचलाया जाता है, तो प्रत्येक अपने संलग्न वातावरण में काउंटर को संशोधित करता है और फिर वर्तमान गणना को वापस करता है।
counter_one <- new_counter()
counter_two <- new_counter()
counter_one() # -> [1] 1
counter_one() # -> [1] 2
counter_two() # -> [1] 1