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

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

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

1 Ответ

93 голосов
/ 16 сентября 2011

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 может прояснить ситуацию.1013 *

Среды распространены в R, например, путь search() - это (приблизительно) среды, объединенные в одноуровневое -> родительское отношение.Иногда можно увидеть env = new.env(parent=emptyenv()), чтобы обойти поиск символа - обычно env[["x"]] будет выглядеть сначала в env, а затем в родительском env, если не найден.Аналогично, <<- ищет назначение, начинающееся с parent.env.Относительно новая реализация ссылочного класса в R опирается на эти идеи для определения среды, специфичной для экземпляра, в которой можно найти символы (поля и методы экземпляра).

...