합리적으로 복잡한 클로저에서 작동하는 R 함수를 메모하려는 경우 계산 된 함수를 반복 호출하면 계산 된 결과 대신 캐시 된 결과를 검색하기 전에 결과가 두 번 계산됩니다. 첫 번째 호출에서.반복 호출 후 R 다이제스트 변경 호출
나는 그것이 몇가지 원인이 있다고 생각하는데,이 질문은 제가 이해하려고하는 첫 번째 문제에 초점을 맞추고 있습니다. 다이제스트
foo <- function() {
bar <- function() NULL
list(bar = bar)
}
foo는의 인스턴스를 생성, 실행 :
내 폐쇄는 본질적 기능의 목록입니다
f <- foo()
digest::digest(f)
[1] "5a54945202730e8c997aa41a27d23dd5"
인스턴스화 f를 다시 다이제스트 다른 출력 결과 :
f <- foo()
digest::digest(f) # different hash
[1] "180471cb687f12271c8ba7800d02695c"
그러나 세 번째로 수행하면 결과가 안정화되었음을 알 수 있습니다.
f <- foo()
digest::digest(f) # no change in hash
[1] "180471cb687f12271c8ba7800d02695c"
나는 환경 (동봉 환경 등에서 볼 참조를 제한, 공유 변경할 상태를 만드는)하지만 여전히이 단순 해 보이는 문제에 내 머리를 긁적하고 폐쇄와 함께 작동하는 방법에 대해 많이 읽어 봤는데!
두 번째 호출에서 다이제스트가 다른 출력을 생성하는 이유는 무엇입니까?