values studio rotate hoverinfo examples change r function binding environment

studio - r plotly axis format



Vinculando variables externas en R (1)

Supongamos que tengo la siguiente función:

g = function(x) x+h

Ahora, si tengo en mi entorno un objeto llamado h , no tendría ningún problema:

h = 4 g(2) ## should be 6

Ahora, tengo otra función:

f = function() { h = 3 g(2) }

Yo esperaría:

rm(h) f() ## should be 5, isn''t it?

En cambio, recibo un error

## Error in g(2) : object ''h'' not found

Esperaría que g se evaluara dentro del entorno de f , de modo que h en f estará ligado a la h en g, como lo fue cuando .GlobalEnv g dentro de .GlobalEnv . Esto no sucede (obviamente). cualquier explicación por qué? ¿Cómo superar esto para que la función dentro de la función (por ejemplo, g ) se evalúe utilizando el entorno adjunto?


Hay una diferencia entre el entorno de una función y su marco de evaluación (principal).

El entorno circundante se establece cuando la función está definida. Si define su función g en el prompt R:

g = function(x) x+h

entonces el entorno circundante de g será el entorno global. Ahora si llamas g desde otra función:

f = function() { h = 3 g(2) }

el marco de evaluación principal es el entorno de f . Pero esto no cambia el entorno circundante de g , que es un atributo fijo que no depende de dónde se evalúa. Es por eso que no recogerá el valor de h que se define dentro de f .

Si quiere que g use el valor de h definido dentro de f , entonces también debe definir g dentro de f :

f = function() { h = 3 g = function(x) x+h g(2) }

Ahora el entorno circundante de g será el entorno de f (pero tenga en cuenta que este g no es el mismo que g que creó anteriormente en el prompt R).

Alternativamente, puede modificar el entorno adjunto de g siguiente manera:

f = function() { h = 3 environment(g) <- environment() g(2) }