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.

env_parent(): resultados diferentes al utilizar el argumento por defecto o al pasar explícitamente el argumento por defecto.

He notado un comportamiento diferente al utilizar env_parent() del paquete rlang y al utilizar env_parent(caller_env()), aunque caller_env() es un argumento predeterminado para el primer parámetro de env_parent():

library(rlang)
env_parent

> function (env = caller_env(), n = 1)
> {
>     env_ <- get_env_retired(env, "env_parent()")
>     while (n > 0) {
>         if (is_empty_env(env_)) {
>             abort("The empty environment has no parent")
>         }
>         n <- n - 1
>         env_ <- parent.env(env_)
>     }
>     env_
> }
> <bytecode: 0x000000001d8ad000="">
> <environment: namespace:rlang="">

No estoy muy familiarizado(a) con los entornos y solo pude preparar un ejemplo mínimo y completo basado en una aplicación Shiny (noté esto al usar una aplicación Shiny). Es importante tener la aplicación en dos archivos: ui.R y server.R:

ui.R

library(shiny)
library(rlang)

parent <<- function() {
  env_parent()
}

parents_default_arg_passed <<- function() {
  env_parent(caller_env())
}

ui <- fluidPage(
  textOutput("env_parent"),
  textOutput("env_parents_default_arg_passed")
)

server.R

server <- function(input, output, session) {

output$env_parent <- renderPrint({
    names(parent())
})

output$env_parents_default_arg_passed <- renderPrint({
    names(parents_default_arg_passed())
})

}

Veo esta salida después de ejecutar la aplicación:

[1] "ui"
[1] "~" ".__tidyeval_quosure_mask__."

¿Por qué sucede eso?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La diferencia entre usar env_parent() y env_parent(caller_env()) en este caso está relacionada con el contexto de evaluación de las expresiones.

    Cuando se utiliza env_parent() directamente, la función se llama dentro del contexto del entorno global, por lo que el entorno padre devuelto es el padre del entorno global, que es el entorno base.

    Cuando se utiliza caller_env() como argumento predeterminado para env_parent(), la función se llama dentro del contexto del entorno del llamante, en este caso el entorno de la aplicación shiny. Esto significa que el entorno padre devuelto es el padre del entorno de la aplicación shiny.

    En el archivo ui.R, tanto parent() como parents_default_arg_passed() se llaman dentro del mismo entorno, que es el entorno de la aplicación shiny. Sin embargo, como env_parent() se llama con el argumento predeterminado caller_env(), se evalúa al entorno padre del entorno de la aplicación shiny.

    Por otro lado, env_parent() llamado sin argumentos evalúa al entorno padre del entorno global, que no necesariamente es el mismo que el entorno padre del entorno de la aplicación shiny.

    Por lo tanto, la salida de names(parent()) es "ui", que es el nombre del entorno de la aplicación shiny, mientras que la salida de names(parents_default_arg_passed()) es "~" . "__tidyeval_quosure_mask__.", que está relacionado con el contexto de evaluación de las expresiones utilizadas en la aplicación shiny.

Comments are closed.