<<-
राज्य को बनाए रखने के बंद होने के साथ संयोजन में सबसे उपयोगी है। यहां मेरे हाल के एक पेपर से एक अनुभाग दिया गया है:
एक बंद करना किसी अन्य फ़ंक्शन द्वारा लिखित एक फ़ंक्शन है।क्लोजर को इसलिए कहा जाता है क्योंकि पैरेंट फ़ंक्शन का वातावरण संलग्न करता है, और उस फ़ंक्शन में सभी चर और पैरामीटर तक पहुंच सकता है। यह उपयोगी है क्योंकि यह हमें पैरामीटर के दो स्तरों की अनुमति देता है। पैरामीटर का एक स्तर (अभिभावक) यह नियंत्रित करता है कि फ़ंक्शन कैसे काम करता है। दूसरा स्तर (बच्चा) काम करता है। निम्नलिखित उदाहरण दिखाता है कि इस विचार का उपयोग बिजली कार्यों के परिवार को उत्पन्न करने के लिए कैसे किया जा सकता है। अभिभावक फ़ंक्शन (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
अरे यह Rosettacode (http://rosettacode.org/wiki/Accumulator_factory#R) पर एक अनसुलझा आर कार्य है, ठीक है, यह था ... –
क्या कोई आवश्यकता होगी एक पैरेंट फ़ंक्शन में 1 से अधिक बंद संलग्न करें? मैंने अभी एक स्निपेट की कोशिश की, ऐसा लगता है कि केवल अंतिम बंद करने का निष्पादन किया गया था ... –