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.

¿Es posible que `dput` devuelva código fuente que se ejecute fuera del entorno que lo contiene?

Supongamos que tengo un cierre add_y(y) que devuelve una función que suma y a su entrada.

add_y <- function(y) {
  function(x) {
    x + y
  }
}
add_4 <- add_y(4)

Entonces, el valor de add_4 es una función que suma 4 a su entrada. Esto funciona. Me gustaría poder usar dput para mostrar la definición de add_4 como

function(x) {
  x + 4
}

pero esto no es lo que retorna dput.

add_y <- function(y) {
  function(x) {
    x + y
  }
}
add_4 <- add_y(4)
dput(add_4)
#> function (x) 
#> {
#>     x + y
#> }

¿Existe alguna manera de obtener el código fuente que se ejecutaría fuera del entorno de cierre?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de obtener el código fuente que se ejecutaría fuera del entorno de cierre. Podemos usar la función body() para extraer el cuerpo de la función y reemplazar la referencia a y con el valor de y usando substitute().

    Aquí tienes un ejemplo de cómo obtener el código fuente de add_4:

    add_y <- function(y) {
      function(x) {
        x + y
      }
    }
    add_4 <- add_y(4)
    
    # obtener el cuerpo de la función add_4
    body_add_4 <- body(add_4)
    
    # reemplazar la referencia a y con el valor de y
    body_add_4_sub <- substitute(body_add_4, list(y = 4))
    
    dput(body_add_4_sub)
    #> quote({
    #>     x + 4
    #> })
    

    Esto mostrará el código fuente de add_4 como:

    {
      x + 4
    }
    

Comments are closed.