0Pricing
R Academy · Lección

Reglas del ámbito léxico

Comprenda cómo R encuentra variables buscando en los entornos principales.

Reglas del ámbito léxico es una lección gratuita de R Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

¿Qué es el ámbito léxico?

El ámbito léxico significa que una función busca las variables en el lugar donde fue definida, no donde es llamada. R utiliza el ámbito léxico. Esto resulta predecible: el entorno que busca una función queda fijado al crearla, no al llamarla.

x <- 'global'
f <- function() {
  cat('x =', x, '\n')  # looks where f was defined (global)
}
local({
  x <- 'local to local block'
  f()  # still prints global x, not the local one
})

Ámbito léxico frente a ámbito dinámico

En el ámbito dinámico (que utilizan algunos otros lenguajes), una función encontraría la variable en el entorno desde el que se la llama. R utiliza el ámbito léxico: siempre prevalece el entorno envolvente en el momento de la definición. Esto hace que las funciones se comporten de forma coherente independientemente del lugar desde el que se las llame.

val <- 100
make_adder <- function(n) {
  # n is captured from the definition environment
  function(x) x + n
}
add10 <- make_adder(10)
add20 <- make_adder(20)
cat(add10(5), '\n')   # 15 — n=10 from definition
cat(add20(5), '\n')   # 25 — n=20 from definition

Variables libres y cierres

Una variable dentro de una función que no es un parámetro ni una asignación local es una variable libre. R la busca en el entorno envolvente. Una función que captura variables libres se denomina cierre.

base_rate <- 0.05   # free variable captured by f
f <- function(principal, years) {
  principal * (1 + base_rate) ^ years
}
cat('5 yr return:', f(1000, 5), '\n')
# Even if we change base_rate later:
base_rate <- 0.08
cat('New rate return:', f(1000, 5), '\n')

Los cierres capturan entornos

Cada vez que se llama a una función fábrica, la función devuelta (el cierre) captura una instantánea del entorno envolvente. Distintas llamadas producen cierres con valores capturados diferentes; esta es la base de las fábricas de funciones.

power_fn <- function(exp) {
  function(x) x ^ exp
}
square <- power_fn(2)
cube   <- power_fn(3)
cat('square(4) =', square(4), '\n')
cat('cube(3)   =', cube(3),   '\n')

El operador <<-

<<- (asignación con doble flecha) busca en la cadena de padres una vinculación existente y la modifica en el mismo lugar. Si no encuentra ninguna, crea una en el entorno global. Es la herramienta para modificar desde una función una variable de un ámbito envolvente.

count <- 0
increment <- function() {
  count <<- count + 1
}
increment()
increment()
increment()
cat('count:', count, '\n')

<<- con cierres

El uso más idiomático de <<- es dentro de cierres que necesitan actualizar el estado de su entorno envolvente. Esto crea funciones con estado: funciones con memoria persistente entre llamadas.

make_counter <- function() {
  n <- 0
  list(
    increment = function() n <<- n + 1,
    get       = function() n,
    reset     = function() n <<- 0
  )
}
ctr <- make_counter()
ctr$increment()
ctr$increment()
cat('Count:', ctr$get(), '\n')
ctr$reset()
cat('After reset:', ctr$get(), '\n')

Ámbito en funciones anidadas

Cuando las funciones están anidadas, la función interna puede ver las variables definidas en la función externa. El entorno de la función externa se convierte en el entorno envolvente de la función interna, formando una cadena.

outer <- function() {
  greeting <- 'Hello'
  inner <- function(name) {
    # greeting comes from outer's environment
    paste(greeting, name)
  }
  inner('World')
}
cat(outer(), '\n')

Búsqueda en la cadena de ámbitos

Cuando R busca una variable, examina los entornos en este orden: propio de la función → envolvente → envolvente del envolvente → ... → global → ruta de búsqueda → base → vacío. Gana la primera coincidencia.

x <- 'global'
f <- function() {
  x <- 'local to f'
  g <- function() {
    # g has no x, so looks in f's env
    cat('g sees x =', x, '\n')
  }
  g()
}
f()

environment() de una función

Puede inspeccionar el entorno envolvente de cualquier función con environment(f). Incluso puede establecerlo con environment(f) <- e, lo que cambia dónde buscará la función las variables libres; es una técnica potente, pero avanzada.

x <- 'global_x'
f <- function() x
cat('f sees:', f(), '\n')

# Change f's enclosing environment
my_env <- new.env(parent = emptyenv())
my_env$x <- 'env_x'
environment(f) <- my_env
cat('f now sees:', f(), '\n')

Cierre práctico: memoización

El ámbito léxico y <<- permiten aplicar memoización: almacenar en la caché del entorno del cierre los resultados costosos de una función. La caché es privada al cierre y persiste entre llamadas.

make_memoized_fib <- function() {
  cache <- c()
  function(n) {
    if (!is.null(cache[n])) return(cache[n])
    if (n <= 1) { cache[n] <<- n; return(n) }
    result <- Recall(n-1) + Recall(n-2)
    cache[n] <<- result
    result
  }
}
fib <- make_memoized_fib()
cat(sapply(0:8, fib), '\n')

Trampa del ámbito léxico: variables de bucle

Una trampa clásica consiste en crear cierres dentro de un bucle. Todos los cierres capturan el mismo entorno, no una instantánea del valor. Cuando se llaman, la variable del bucle ya contiene su valor final.

fns <- vector('list', 3)
for (i in 1:3) {
  local({
    captured_i <- i
    fns[[captured_i]] <<- function() captured_i
  })
}
cat(fns[[1]](), fns[[2]](), fns[[3]](), '\n')

Comprobación rápida

En el ámbito léxico de R, ¿dónde busca una función una variable libre (una que no está definida en la propia función)?

Ámbito léxico: ideas clave

Ideas clave sobre el ámbito léxico:

  • R utiliza el ámbito léxico: las funciones buscan las variables donde fueron definidas
  • Una función captura su entorno envolvente como cierre
  • Las variables libres se resuelven al definir la función, no al llamarla
  • <<- modifica una vinculación en la cadena de padres (o en el entorno global si no la encuentra)
  • Los cierres y <<- forman funciones con estado privado persistente
  • Trampa de los cierres en bucles: use local() para forzar un entorno nuevo en cada iteración
make_multiplier <- function(factor) {
  function(x) x * factor
}
double <- make_multiplier(2)
triple <- make_multiplier(3)
cat('double(7):', double(7), '\n')
cat('triple(7):', triple(7), '\n')
cat('double env factor:', get('factor', envir = environment(double)), '\n')

Preguntas frecuentes

¿La lección «Reglas del ámbito léxico» es gratis?

Sí — el texto completo de «Reglas del ámbito léxico» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Reglas del ámbito léxico»?

Comprenda cómo R encuentra variables buscando en los entornos principales. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Reglas del ámbito léxico»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. ¿Qué es un entorno en R?
  2. Reglas del ámbito léxico
  3. Ámbito global frente a local
  4. Creación e inspección de entornos
← Volver a R Academy