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


84

Було б корисно, якщо хтось зможе проілюструвати це на простому прикладі?

Крім того, де було б корисно використовувати 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

або в загадковому прикладі „банківського рахунку” у Вступі до Р. Перший абзац розділу „Деталі” ?parent.frameможе пояснити речі.

Середовища поширені в R, наприклад, search()шлях - це (приблизно) середовища, зв’язані між собою у відносинах між братами та батьками. Іноді бачиться, env = new.env(parent=emptyenv())щоб обійти пошук символів - зазвичай він env[["x"]]буде шукати спочатку в env, а потім у envбатьків, якщо його не знайти. Так само <<-шукає призначення, починаючи з parent.env. Порівняно нова реалізація довідкового класу в R спирається на ці ідеї для визначення середовища, специфічного для екземпляра, в якому можна знайти символи (поля екземпляра та методи).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.