<<-
은 상태를 유지하기위한 폐쇄와 함께 가장 유용합니다. 최근 광산에서 가져온 부분은 다음과 같습니다.
클로저는 다른 기능에 의해 작성된 기능입니다.클로저는 이 부모 함수의 환경 인을 포함하고 있으며 해당 함수의 모든 변수와 매개 변수에 액세스 할 수 있으므로 호출됩니다. 이는 두 가지 수준의 매개 변수를 가질 수 있기 때문에 유용합니다. 한 수준의 매개 변수 (부모)가 함수 작동 방법을 제어합니다. 다른 수준 (어린이)이 작업을 수행합니다. 다음 예는이 아이디어를 사용하여 어떻게 전력 함수 계열을 생성 할 수 있는지 보여줍니다. 부모 함수 (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)의 미해결 된 R 작업입니다. –
하나의 부모 함수에 두 개 이상의 클로저를 넣으시겠습니까? 난 그냥 한 조각을 시도, 그것은 마지막 폐쇄가 실행 된 것 같습니다 ... –