programing tip

게으른 평가 특성 설명

itbloger 2020. 12. 5. 09:21
반응형

게으른 평가 특성 설명


나는 Github에 관한 Hadley Wickhams의 책, 특히 lazy evaluation 에 관한 이 부분을 읽고 있습니다. 거기에서 그는 add/adders기능 부분에서 게으른 평가의 결과에 대한 예를 제공합니다 . 그 부분을 인용하겠습니다.

이 [지연 평가]는 lapply 또는 루프로 클로저를 만들 때 중요합니다.

add <- function(x) {
  function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)

x는 가산기 함수 중 하나를 처음 호출 할 때 느리게 평가됩니다. 이 시점에서 루프가 완료되고 x의 최종 값은 10입니다. 따라서 모든 가산기 함수는 입력에 10을 더할 것입니다. 아마도 원하는 것이 아닐 것입니다! 수동으로 평가를 강제하면 문제가 해결됩니다.

add <- function(x) {
  force(x)
  function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
adders2[[10]](10)

나는 그 부분을 이해하지 못하는 것 같고 거기에 대한 설명은 최소한입니다. 누군가 특정 예를 자세히 설명하고 거기에서 일어나는 일을 설명해 주시겠습니까? 저는 "이 시점에서 루프가 완료되고 x의 최종 값이 10입니다"라는 문장에 특히 당황합니다. 무슨 루프? 최종 가치는 어디입니까? 내가 놓친 단순한 것임에도 불구하고 나는 그것을 보지 못합니다. 많은 감사드립니다.


목표 :

adders <- lapply(1:10, function(x)  add(x) )

add함수 목록을 만드는 것입니다 . 첫 번째는 입력에 1을 추가하고 두 번째는 2를 추가합니다. 지연 평가는 실제로 함수 호출을 시작할 때까지 R이 실제로 가산기 함수를 만들기를 기다리게합니다. 문제는 첫 번째 가산기 함수를 만든 후 루프에 x의해 증가 lapply하여 값이 10으로 끝납니다. 첫 번째 가산기 함수를 호출하면 이제 지연 평가가 함수를 빌드하여 값을 얻습니다 x. 문제는 원본 x이 더 이상 1이 아니라 lapply루프 의 끝에있는 값 , 즉 10이라는 것입니다.

따라서 지연 평가는 모든 가산기 함수가 lapply실제로 함수를 빌드하는 데 루프가 완료 될 때까지 기다리게 합니다. 그런 다음 동일한 값 (예 : 10)으로 기능을 구축합니다. Hadley가 제안하는 솔루션은 x직접 평가 를 강제 하고 지연 평가를 피하고 올바른 x값으로 올바른 기능을 얻는 것 입니다.


이것은 R 3.2.0에서 더 이상 사실이 아닙니다!

변경 로그 의 해당 줄은 다음 과 같습니다.

apply 함수 및 Reduce ()와 같은 고차 함수는 이제 클로저에서 지연 평가와 변수 캡처 간의 바람직하지 않은 상호 작용을 제거하기 위해 적용되는 함수에 인수를 강제합니다.

그리고 실제로 :

add <- function(x) {
  function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
# [1] 11
adders[[10]](10)
# [1] 20

참고 URL : https://stackoverflow.com/questions/16129902/explain-a-lazy-evaluation-quirk

반응형