R でのスコーピングを理解しているかどうかわからない、正しいことをしているとは思わない例があります。この例は、J. Fox による「R および S-PLUS Companion to Applied Regression」から変更されています。
> make.power = function(p) function(x) x^p
> powers = lapply(1:3, make.power)
> lapply(powers, function(p) p(2))
私がリストで予想したことは、恒等関数、平方関数、および立方関数をそれぞれ計算する 3 つの関数が、それらの引数をすべて 3 乗した場所にあることです。ラップリーを使用しない場合、期待どおりに機能します。
> id = make.power(1)
> square = make.power(2)
> cube = make.power(3)
> id(2)
[1] 2
> square(2)
[1] 4
> cube(2)
[1] 8
これを驚くべき、または不安に思うのは私だけでしょうか? それには深い満足のいく理由がありますか。ありがとう
PS: Google と SO で検索を実行しましたが、おそらくこの問題に関連するキーワードが一般的であるため、手ぶらで出てきました。
PPS: この例は、純粋な好奇心ではなく、パッケージのクイックチェックの実際のバグによって動機付けられています。バグの回避策があります。ご心配ありがとうございます。これは何かを学ぶということです。
もちろん、質問を投稿した後、問題を明確にする別の例のアイデアが得られます。
> p = 1
> id = make.power(p)
> p = 2
> square = make.power(p)
> id(2)
[1] 4
p は、lapply に隠されているループ変数と同じ役割を果たします。p は、この場合は make.power への参照のように見えるメソッドによって渡されます。Make.power はそれを評価せず、ポインターを保持するだけです。私は正しい軌道に乗っていますか?