誰かがこれを簡単な例で説明できると助かりますか?
また、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の比較的新しい参照クラスの実装は、これらのアイデアに基づいて、シンボル(インスタンスフィールドとメソッド)を見つけることができるインスタンス固有の環境を定義します。