Rの環境操作とクロージャ


折を見て、Common Lisp関連の書籍を読んでいます。なかなか進まないのですが。。。
何を調べていた時か忘れてしまいましたが、こちらで次のようなコードを見つけました。

Javascriptとかでもよく見かけるクロージャのサンプルですね。
で、はたと気になりました。Lispの影響を強く受けているRではどのように書けるのかと。
ちょっと書いてみました。

Rでは、CLのletにあたる関数がありません(多分)。なのですが、そもそもRには環境自体を作成、操作できる関数があるので、そちらを使うこととします。

…期待どおりの動作をしてくれません。環境とクロージャ環境中のオブジェクトを表示してみます。


関数が呼ばれる度に新しい環境が作成されていて、counterは新しい環境内の変数となっているようです。

ということで、Rでは関数内で定義された変数の扱いがCLと違うようで、CLでは親環境にまで派生しますが、Rでは親環境にまで派生しないようです。
Rのスコーピング規則は、Ross先生がSとの互換性を捨ててまでこだわったところらしいので、このような仕様にしているのは何か理由があるのでしょう。破壊的な代入が親環境にまで影響するのが嫌だったとかなのかなー
詳しくはわからないんですが、Pythonのジェネレータっぽいことしたい時はどうすれば良いんだろう。クラス作れとかってことなんでしょうかね。

ちなみに、Rのレキシカルスコープについては、以下の書籍が詳しいです。

Rの基礎とプログラミング技法

著者/訳者:U.リゲス

出版社:シュプリンガー・ジャパン(株)( 2006-10-22 )

定価:

単行本 ( 258 ページ )

ISBN-10 : 4431712186

ISBN-13 : 9784431712183