2017-12-15 40 views
1

합리적으로 복잡한 클로저에서 작동하는 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" 

나는 환경 (동봉 환경 등에서 볼 참조를 제한, 공유 변경할 상태를 만드는)하지만 여전히이 단순 해 보이는 문제에 내 머리를 긁적하고 폐쇄와 함께 작동하는 방법에 대해 많이 읽어 봤는데!

두 번째 호출에서 다이제스트가 다른 출력을 생성하는 이유는 무엇입니까?

답변

0

친구가 도와주었습니다.

이 동작은 바이트 코드 컴파일러가 foo()의 두 번째 호출에서 종료 될 때 발생합니다.

명시 적으로 첫 번째 호출하기 전에 기능을 컴파일

문제 해결 :

bar <- compiler::cmpfun(foo)