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


回答:


99

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.