В чем разница между parent.frame () и parent.env () в R; чем они отличаются по вызову по ссылке?

84

Было бы полезно, если бы кто-нибудь мог проиллюстрировать это на простом примере?

Кроме того, где было бы полезно использовать parent.frame()вместо parent.env()и наоборот.

Suncoolsu
источник

Ответы:

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 основывается на этих идеях для определения среды, зависящей от экземпляра, в которой можно найти символы (поля и методы экземпляра).

Мартин Морган
источник