<<-রাষ্ট্র বজায় রাখতে ক্লোজারগুলির সাথে একত্রে সবচেয়ে কার্যকর। এখানে আমার একটি সাম্প্রতিক কাগজ থেকে একটি বিভাগ:
ক্লোজার হ'ল অন্য ফাংশন দ্বারা লিখিত একটি ফাংশন। বন্ধগুলি তাই বলা হয় কারণ তারা পিতামাতার ফাংশনের পরিবেশকে আবদ্ধ করে এবং সেই ফাংশনে সমস্ত ভেরিয়েবল এবং প্যারামিটার অ্যাক্সেস করতে পারে। এটি দরকারী কারণ এটি আমাদের দুটি স্তরের পরামিতি রাখতে দেয়। প্যারামিটারগুলির একটি স্তর (পিতামাতারা) কীভাবে ফাংশনটি কাজ করে তা নিয়ন্ত্রণ করে। অন্য স্তরের (শিশু) কাজটি করে। নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে এই ধারণাটি শক্তি কার্যকারিতার পরিবার তৈরি করতে পারে। প্যারেন্ট ফাংশন ( 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