<<-
상태를 유지하기 위해 클로저와 함께 가장 유용합니다. 최근 논문에서 발췌 한 내용은 다음과 같습니다.
클로저는 다른 함수로 작성된 함수입니다. 클로저는 부모 함수의 환경을 둘러싸 기 때문에 소위 호출 되며 해당 함수의 모든 변수와 매개 변수에 액세스 할 수 있습니다. 이것은 두 가지 수준의 매개 변수를 가질 수 있기 때문에 유용합니다. 한 수준의 매개 변수 (부모)가 함수 작동 방식을 제어합니다. 다른 레벨 (자식)이 작업을 수행합니다. 다음 예제는이 아이디어를 사용하여 전력 함수 패밀리를 생성하는 방법을 보여줍니다. 부모 함수 ( 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