Alcance léxico en la programación R

El alcance léxico en la programación R significa que los valores de las variables libres se buscan en el entorno en el que se definió la función. Un entorno es una colección de símbolos, valores y pares, cada entorno tiene un entorno principal. Es posible que un entorno tenga varios elementos secundarios, pero el único entorno sin el elemento principal es el entorno vacío. Si el valor del símbolo no se encuentra en el entorno en el que se definió la función, la búsqueda continúa en el entorno principal. En R, los enlaces de variables libres se resuelven mirando primero en el entorno en el que se creó la función. Esto se llama alcance léxico .

¿Por qué alcance léxico?

El alcance léxico es un conjunto de reglas que ayuda a determinar cómo R representa el valor de un símbolo. Es una regla incorporada en R que funciona automáticamente a nivel de idioma. Se utiliza principalmente para especificar cálculos estadísticos. El alcance léxico busca el símbolo en función de cómo se anidaron las funciones inicialmente cuando se crearon y no de cómo se anidaron cuando se invocaron. Cuando usamos el alcance léxico, no tenemos que saber cómo se llama la función y averiguar dónde se buscará el valor de la variable. Solo tenemos que mirar la definición de la función.

El significado léxico en el alcance léxico es completamente diferente de la definición habitual en inglés, que significa que se relaciona con las palabras o el vocabulario de un idioma que se distingue de la gramática y la construcción; más bien, proviene del significado de lexing del término informático mediante el proceso que convierte el código representado como texto en piezas significativas. que es comprensible por el lenguaje de programación. Considere el siguiente ejemplo:

f <- function(x, y)
{
  x * y * z
}

En esto:

  • x e y son argumentos formales
  • z como la variable libre

Por lo tanto, las reglas de alcance del lenguaje determinan cómo se asignan los valores a las variables libres. Las variables libres no son argumentos formales ni variables locales que se asignan dentro del cuerpo de la función.

Principios del alcance léxico

Hay cuatro principios básicos detrás de la implementación del alcance léxico de R:

  1. Enmascaramiento de nombres
  2. Funciones vs variables
  3. Un nuevo comienzo
  4. Búsqueda dinámica

Analicemos cada principio uno por uno.

Enmascaramiento de nombres

El siguiente ejemplo ilustra el principio más básico del alcance léxico y no debería tener problemas para predecir la salida.

  • Si la variable no está definida dentro de la función:
    Ejemplo:

    c <- 10
    f <- function(a, b)
    {
      a + b + c
    }
    f(8, 5

    Producción:

    [1] 23
    

    Toma el valor de c como 10 y luego agrega estos números y finalmente tenemos 23 como salida.

  • Si el nombre no está definido dentro de la función:
    si un nombre no está definido dentro de una función, R buscará un nivel superior.
    Ejemplo:

    a <- 10
    b <- function()
    {
      c <- 11
      c(a, c)
    }
    b() 

    Producción:

    [1] 10 11
    
  • Cuando una función se define dentro de otra función:
    se aplican las mismas reglas si una función se define dentro de otra función: mire dentro de la función actual, luego dónde se definió esa función, y así sucesivamente, hasta el entorno global, y luego a otros paquetes cargados.
    Ejemplo:

    a <- 10
    g <- function(){
      b <- 20
      h <- function(){
        c <- 30
        c(a, b, c) 
      }
      h()
    }
    g()

    Producción:

    [1] 10 20 30
    
  • Cuando las funciones son creadas por otra función:
    Las mismas reglas se aplican a los cierres, funciones creadas por otras funciones.
    Ejemplo:

    a <- function(z){
      b <- 10
      function(){
        z + 4 * b
      }
    }
    x <- a(10)
    x() 

    Producción:

    [1] 50
    

    R devuelve el valor exacto de b después de llamar a la función porque x conserva el entorno en el que se definió. El medio ambiente incluye el valor de b.

Funciones vs Variables

Se aplican los mismos principios independientemente del tipo de valor asociado: la búsqueda de funciones funciona exactamente de la misma manera que la búsqueda de variables:
Ejemplo:

a <- function(x) 10 * x
b <- function(){
  a <- function(x) x + 10
  a(12)
}
b() 

Producción:

[1] 22

Un nuevo comienzo

Cuando se llama a una función, se crea un nuevo entorno cada vez. Cada reconocimiento es completamente independiente porque una función no puede decir qué sucedió cuando se ejecutó la última vez.
Ejemplo:

a <- function(){
  if(!exists("z"))
  {
    z <- 10
  }
  else
  {
    z <- z+10
  }
  z
}
a()

Producción:

[1] 10

Búsqueda dinámica

El alcance léxico controla dónde buscar valores, no cuándo buscarlos. R busca los valores cuando se ejecuta la función, no cuando se crea. La salida de la función puede ser diferente dependiendo de los objetos fuera de su entorno.
Ejemplo:

g <- function() x^3
x <- 10
g() 

Producción:

[1] 1000

Hay una función en R que es findGlobals()de codetoolsy nos ayuda a encontrar todas las variables globales que se utilizan en una función y enumera todas las dependencias externas de una función. findGlobals()encuentre las variables y funciones globales que utiliza el cierre.
Ejemplo:

aGlobal <- rnorm(10)
bGlobal <- rnorm(10)
  
f <- function()
{ 
  a <- aGlobal
  b <- bGlobal
  plot(b ~ a)
}
codetools::findGlobals(f) 

Producción:

[1] "{"       "~"       "<-"      "aGlobal" "bGlobal" "plot"

Podemos cambiar manualmente el entorno al entorno vacío emptyenv(). emptyenv()es un ambiente totalmente vacío.

Publicación traducida automáticamente

Artículo escrito por snigdha_yambadwar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *