web-dev-qa-db-ja.com

Rのparent.frame()とparent.env()の違いは何ですか。参照による呼び出しの違いは何ですか?

誰かがこれを簡単な例で説明できると助かりますか?

また、parent.frame()の代わりにparent.env()を使用すると便利です。

80
suncoolsu

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

94
Martin Morgan