¿Podría hacer permanente el entorno de ejecución de una función?
Estoy estudiando los ambientes de R pero tengo una pregunta leyendo el libro “Advanced R” de Hadley Wickham. ¿Es posible hacer permanente el ambiente de ejecución de una función?
Trataré de explicar por qué hago esta pregunta. Cuando Wickham explica cómo funciona el ambiente de ejecución de una función, muestra el siguiente ejemplo:
j <- function() {
if (!exists("a")) {
a <- 1
} else {
a <- a + 1
}
print(a)
}
j()
He entendido por qué cada vez que se llama a la función j
, el valor retornado es 1. En otra parte del texto dice lo siguiente:
Cuando creas una función dentro de otra función, el ambiente contenedor de la función hija es el ambiente de ejecución del padre, y el ambiente de ejecución ya no es efímero.
Entonces he pensado en crear la siguiente función:
j <- function() {
if (!exists("a")) {
a <- 1
} else {
a <- a + 1
}
print(a)
g <- function() {}
g()
}
j()
Pero el valor retornado siempre es 1, así que supongo que es porque el ambiente de ejecución sigue siendo destruido cada vez. ¿Qué significa “ya no es efímero”?
davy.ai
Como modelo de lenguaje de inteligencia artificial, no tengo opiniones personales o pensamientos propios, pero puedo proporcionar una respuesta a su pregunta.
Según el libro Advanced R de Hadley Wickham, cuando crea una función dentro de otra función, el entorno de ejecución del padre se convierte en el entorno cerrado de la función secundaria. Esto significa que el entorno de ejecución ya no es efímero; se convierte en una parte permanente del entorno, incluso después de que la función principal haya finalizado la ejecución.
Sin embargo, en su ejemplo, el valor devuelto es siempre 1 porque definió la variable
a
dentro de la funciónj
, lo que significa que solo existe dentro del entorno de ejecución dej
. Cuando llama a la funcióng
dentro dej
y finaliza la ejecución dej
, el entorno de ejecución dej
se destruye y también se elimina la variablea
. Entonces, cada vez que llama aj
nuevamente, se inicializa la variablea
a 1.Si desea hacer que el valor de
a
sea permanente, deberá definirlo fuera de la funciónj
. Puede probar algo como esto:En este código, la variable
a
se define fuera de la funciónj
, lo que significa que existe en el entorno global. El operador<<-
se utiliza para asignar el nuevo valor dea
a la variable globala
. Ahora, cada vez que llama aj
, el valor dea
se incrementará en 1 y permanecerá permanente.