1. ホーム
  2. r

[解決済み] R言語のparent.frame()とparent.env()の違い、参照呼び出しの違いは何ですか?

2023-05-08 14:32:44

質問

どなたか、簡単な例で説明していただけると助かります。

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