<<-
มีประโยชน์มากที่สุดเมื่อใช้ร่วมกับการปิดเพื่อรักษาสถานะ นี่คือหัวข้อจากกระดาษล่าสุดของฉัน:
การปิดเป็นฟังก์ชันที่เขียนโดยฟังก์ชันอื่น การปิดจึงถูกเรียกใช้เนื่องจากมันล้อมรอบสภาพแวดล้อมของฟังก์ชันพาเรนต์และสามารถเข้าถึงตัวแปรและพารามิเตอร์ทั้งหมดในฟังก์ชันนั้นได้ สิ่งนี้มีประโยชน์เพราะช่วยให้เรามีพารามิเตอร์สองระดับ พารามิเตอร์หนึ่งระดับ (พาเรนต์) ควบคุมการทำงานของฟังก์ชัน อีกระดับ (เด็ก) ทำงาน ตัวอย่างต่อไปนี้แสดงวิธีการใช้แนวคิดนี้เพื่อสร้างตระกูลของฟังก์ชันพลังงาน ฟังก์ชั่นหลัก ( 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