Il serait utile que quelqu'un puisse illustrer cela par un exemple simple ?
De même, où serait-il utile d'utiliser parent.frame()
au lieu de parent.env()
et vice versa.
Il serait utile que quelqu'un puisse illustrer cela par un exemple simple ?
De même, où serait-il utile d'utiliser parent.frame()
au lieu de parent.env()
et vice versa.
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 ensuite
> g()
$g
<environment: 0x14060e8>
$f
<environment: 0x1405f28>
$defined_in
<environment: R_GlobalEnv>
$called_from
<environment: 0x14060e8>
Je ne suis pas sûr qu'un simple mortel veuille vraiment les utiliser, mais ces concepts sont utiles pour comprendre la portée lexicale.
> f = function() x
> g = function() { x = 2; f() }
> x = 1
> f()
[1] 1
ou dans l'exemple énigmatique du "compte bancaire" dans l'introduction de R. Le premier paragraphe de la section "Détails" de l'ouvrage ?parent.frame
pourrait clarifier les choses.
Les environnements sont omniprésents dans R, par exemple, le search()
Le chemin est constitué (approximativement) d'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"]]
regarderait d'abord dans env
et ensuite dans env
s'il n'est pas trouvé. De même, <<-
cherche une 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.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.