2017-12-15 27 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" 

しかし、これを3回実行すると、結果は「安定化」されていることがわかります。

f <- foo() 
digest::digest(f) # no change in hash 
[1] "180471cb687f12271c8ba7800d02695c" 

私は環境が(囲まれた環境などで目に見える参照を制限し、共有可変状態を作る)、クロージャでどのように機能するかについて多くのことを読んでいるが、それでも、この一見単純な問題で頭を悩まています!

2回目の呼び出しでダイジェストが異なる出力を生成するのはなぜですか?

答えて

0

友人がこれを解決するのを手伝ってくれました。

この動作は、foo()の2番目の呼び出しでクロージャで動作するバイトコードコンパイラの結果です。

bar <- compiler::cmpfun(foo) 
:最初の呼び出しは、問題を解決する前に、明示的に機能をコンパイル

関連する問題