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


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

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

1 78

1 ответ:

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()) чтобы обойти символ look-up -- нормально env[["x"]] посмотрел бы сначала в env, а затем в envродитель, если не найден. Аналогично,<<- ищет назначение, начиная с parent.env. Относительно новая реализация ссылочного класса в R опирается на эти идеи для определения специфичная для экземпляра среда, в которой можно найти символы (поля и методы экземпляра).