R Language
Alcance de variables
Buscar..
Observaciones
El escollo más común con alcance surge en la paralelización. Todas las variables y funciones deben pasarse a un nuevo entorno que se ejecute en cada hilo.
Entornos y funciones
Las variables declaradas dentro de una función solo existen (a menos que se pasen) dentro de esa función.
x <- 1
foo <- function(x) {
y <- 3
z <- x + y
return(z)
}
y
Error: objeto 'y' no encontrado
Las variables pasadas a una función y luego reasignadas se sobrescriben, pero solo dentro de la función .
foo <- function(x) {
x <- 2
y <- 3
z <- x + y
return(z)
}
foo(1)
x
5
1
Las variables asignadas en un entorno más alto que una función existen dentro de esa función, sin ser pasadas.
foo <- function() {
y <- 3
z <- x + y
return(z)
}
foo()
4
Sub funciones
Las funciones llamadas dentro de una función (es decir, subfunciones) deben definirse dentro de esa función para acceder a las variables definidas en el entorno local sin pasarlas.
Esto falla:
bar <- function() {
z <- x + y
return(z)
}
foo <- function() {
y <- 3
z <- bar()
return(z)
}
foo()
Error en la barra (): objeto 'y' no encontrado
Esto funciona:
foo <- function() {
bar <- function() {
z <- x + y
return(z)
}
y <- 3
z <- bar()
return(z)
}
foo()
4
Asignación global
Las variables se pueden asignar globalmente desde cualquier entorno utilizando <<-
. bar()
ahora puede acceder a y
.
bar <- function() {
z <- x + y
return(z)
}
foo <- function() {
y <<- 3
z <- bar()
return(z)
}
foo()
4
La tarea global es altamente desalentada. Se prefiere mucho el uso de una función de envoltorio o la llamada explícita de variables desde otro entorno local.
Asignación explícita de entornos y variables
Los entornos en R se pueden llamar y nombrar explícitamente. Las variables se pueden asignar explícitamente y llamar ao desde esos entornos.
Un entorno creado comúnmente es uno que incluye package:base
o un subentorno dentro de package:base
.
e1 <- new.env(parent = baseenv())
e2 <- new.env(parent = e1)
Las variables se pueden asignar explícitamente y llamar ao desde esos entornos.
assign("a", 3, envir = e1)
get("a", envir = e1)
get("a", envir = e2)
3
3
Como e2
hereda de e1
, a
es 3
tanto en e1
como en e2
. Sin embargo, la asignación de a
dentro de e2
no cambia el valor de a
en e1
.
assign("a", 2, envir = e2)
get("a", envir = e2)
get("a", envir = e1)
3
2
Función de salida
La función on.exit()
es útil para la limpieza de variables si se deben asignar variables globales.
Algunos parámetros, especialmente aquellos para gráficos, solo se pueden configurar globalmente. Esta pequeña función es común cuando se crean parcelas más especializadas.
new_plot <- function(...) {
old_pars <- par(mar = c(5,4,4,2) + .1, mfrow = c(1,1))
on.exit(par(old_pars))
plot(...)
}
Paquetes y enmascaramiento
Las funciones y los objetos en diferentes paquetes pueden tener el mismo nombre. El paquete cargado más tarde "enmascara" el paquete anterior y se imprimirá un mensaje de advertencia. Al llamar a la función por su nombre, se ejecutará la función del paquete cargado más recientemente. Se puede acceder explícitamente a la función anterior.
library(plyr)
library(dplyr)
Adjuntar paquete: 'dplyr'
Los siguientes objetos están enmascarados desde 'package: plyr':
organizar, contar, desc, fallar con, id, mutar, renombrar, resumir, resumir
Los siguientes objetos están enmascarados de 'package: stats':
filtro, retraso
Los siguientes objetos están enmascarados desde 'paquete: base':
intersectar, setdiff, setequal, union
Al escribir código, siempre es una buena práctica llamar a funciones explícitamente usando package::function()
específicamente para evitar este problema.