В чем разница между родителями.кадр () и родитель.env () в R; как они отличаются по вызову по ссылке?
было бы полезно, если кто-то может проиллюстрировать это на простом примере?
кроме того, где было бы полезно использовать parent.frame()
вместо parent.env()
и наоборот.
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 опирается на эти идеи для определения специфичная для экземпляра среда, в которой можно найти символы (поля и методы экземпляра).