web-dev-qa-db-fra.com

Quelle est la différence entre parent.frame () et parent.env () dans R; comment diffèrent-ils par appel par référence?

Il serait utile que quelqu'un puisse illustrer cela avec un exemple simple?

Aussi, où serait-il utile d'utiliser parent.frame() au lieu de parent.env() et vice versa.

80
suncoolsu

parent.env Est l'environnement dans lequel une fermeture (par exemple, une fonction) est définie. parent.frame Est l'environnement à partir duquel la fermeture a été invoquée.

f = function() 
     c(f=environment(), defined_in=parent.env(environment()),  
       called_from=parent.frame())
g = function() 
     c(g=environment(), f())

et alors

> g()
$g
<environment: 0x14060e8>

$f
<environment: 0x1405f28>

$defined_in
<environment: R_GlobalEnv>

$called_from
<environment: 0x14060e8>

Je ne sais pas quand un simple mortel voudra vraiment vraiment les utiliser, mais les concepts sont utiles pour comprendre la portée lexicale ici

> 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

ou dans l'exemple énigmatique du "compte bancaire" dans l'introduction à R. Le premier paragraphe de la section Détails de ?parent.frame pourrait clarifier les choses.

Les environnements sont omniprésents dans R, par exemple, le chemin search() est (approximativement) des environnements enchaînés dans une relation frère -> parent. On voit parfois env = new.env(parent=emptyenv()) pour contourner la recherche de symboles - normalement env[["x"]] Apparaît d'abord dans env, puis dans env parent s'il n'est pas trouvé. De même, <<- Recherche l'affectation commençant dans le parent.env. L'implémentation relativement nouvelle de la classe de référence dans R s'appuie sur ces idées pour définir un environnement spécifique à l'instance dans lequel les symboles (champs et méthodes d'instance) peuvent être trouvés.

94
Martin Morgan