Tokyo.Lang.R #0 で「Rのスコープとフレームと環境と」を発表してきました

本日、@tyatsuta さん主催の Tokyo.Lang.R #0 に参加してきました。
Tokyo.Lang.R #0 : ATND

どんな勉強会か一言で説明すると「Rをソースコードレベルで理解して、あわよくばポストRを作っちゃおうぜ」って勉強会かと思います。

っで、先日のエントリー「Rが使えるフリをするための1冊の本「R言語逆引きハンドブック」を読んだ - あらびき日記」で
「個人的に一番感動したのは parent.env と parent.frame の違いをたった3ページ読んだだけで理解したことですかね」
とか書いちゃったもんだから、tyatsuta さんから parent.env と parent.frame の違いについて発表してほしいと依頼があって発表してきました。

parent.frame って紛らわしい!

parent.frame が混乱を招く原因は R Language Definition の 2.1.10 Environments に “A frame, consisting of a set of symbol-value pairs” とか R Internals の 1.2 Environments and variable lookup に “the frame of an ENVSXP (a pairlist of symbol-value pairs)” とかあって、関数名から「親のフレーム、つまり親環境のシンボルと値のセット」と連想してしまうことかと思います。

help(environment) の Details には次のような内容が書かれています。

The enclosing environment is distinguished from the parent frame: the latter (returned by ‘parent.frame’) refers to the environment of the caller of a function. Since confusion is so easy, it is best never to use ‘parent’ in connection with an environment (despite the presence of the function ‘parent.env’).

enclosing environment と parent frame(parent.frame 関数で取得可能) は異なるもので、後者は呼び出し元の関数の環境を意味するものと書いてあります。そして、紛らわしいから ‘parent’ という表現は使うべきじゃないとも書いてあります。

また、help(parent.frame) には次のように書いてあります。

Functions to Access the Function Call Stack

Description:

     These functions provide access to ‘environment’s (‘frames’ in S terminology)
     associated with functions further up the calling stack.

parent.frame を含めた sys.*系の関数はコールスタックに積み上げられた関数に結び付けられた環境にアクセスするための関数と説明されています。
このことから、parent.frame の「フレーム」とは「スタックフレーム」のことなのかなぁと思います。

以上を踏まえて私の資料では parent.frame のことを caller’s environment と表現させていただきました。

最後に

R言語逆引きハンドブックを読んで、parent.frame は呼び出し元の環境を、parent.env は定義元pの環境を返すってことはすぐ理解できたんですが、じゃあ frame って何?とか、frame の定義的に parent frame はどういう意味?とか考えだすと答えを導き出すまでにけっこう苦労しました。
まったく、parent.frame は随分困った関数ですね!名前的に。