誰かが簡単な例でこれを説明できれば役に立ちますか?
また、parent.frame()
代わりに使用すると便利な場所、parent.env()
またはその逆。
回答:
parent.env
クロージャ(関数など)が定義されている環境です。parent.frame
クロージャが呼び出された環境です。
f = function()
c(f=environment(), defined_in=parent.env(environment()),
called_from=parent.frame())
g = function()
c(g=environment(), f())
その後
> g()
$g
<environment: 0x14060e8>
$f
<environment: 0x1405f28>
$defined_in
<environment: R_GlobalEnv>
$called_from
<environment: 0x14060e8>
単なる人間がいつ本当にそれらを使いたいのかはわかりませんが、概念はここで字句スコープを理解するのに役立ちます
> f = function() x
> g = function() { x = 2; f() }
> h = function() { x = 3; function() x }
> x = 1
> f()
[1] 1
> g()
[1] 1
> h()()
[1] 3
または、Rの概要の謎めいた「銀行口座」の例で。の詳細セクションの最初の段落で、?parent.frame
物事が明確になる場合があります。
環境はRに広く行き渡っていsearch()
ます。たとえば、パスは(おおよそ)環境が兄弟->親の関係で連鎖しています。env = new.env(parent=emptyenv())
シンボルルックアップを回避することもあります。通常env[["x"]]
はenv
、最初にを検索し、env
見つからない場合はの親を検索します。同様に、で<<-
始まる割り当てを探しparent.env
ます。Rでの比較的新しい参照クラスの実装は、これらのアイデアに依存して、シンボル(インスタンスフィールドとメソッド)を見つけることができるインスタンス固有の環境を定義します。