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?
davy.ai
La diferencia entre usar
env_parent()
yenv_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 paraenv_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
, tantoparent()
comoparents_default_arg_passed()
se llaman dentro del mismo entorno, que es el entorno de la aplicación shiny. Sin embargo, comoenv_parent()
se llama con el argumento predeterminadocaller_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 denames(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.