es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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”?

Tags:  , ,

Answer

  1. Avatar for 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ón j, lo que significa que solo existe dentro del entorno de ejecución de j. Cuando llama a la función g dentro de j y finaliza la ejecución de j, el entorno de ejecución de j se destruye y también se elimina la variable a. Entonces, cada vez que llama a j nuevamente, se inicializa la variable a a 1.

    Si desea hacer que el valor de a sea permanente, deberá definirlo fuera de la función j. Puede probar algo como esto:

    a <- 1
    j <- function() {
      a <<- a + 1
      print(a)
      g <- function(){}
      g()
    }
    j()
    

    En este código, la variable a se define fuera de la función j, lo que significa que existe en el entorno global. El operador <<- se utiliza para asignar el nuevo valor de a a la variable global a. Ahora, cada vez que llama a j, el valor de a se incrementará en 1 y permanecerá permanente.

Comments are closed.