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.

Transforme un objeto “call” en una función en R.

A partir de una derivación, obtengo un objeto “llamada” como se muestra en el fragmento de código. Quiero transformarlo en una función con argumentos, pero no puedo encontrar la forma correcta de hacerlo. Solo devuelve el objeto de llamada.

someDeriv <- D(expression(a * x^2 + x), "x")
someDeriv

retorna: a * (2 * x) + 1

class(someDeriv)

retorna: “call”

Aquí viene la parte importante.

fn <- as.function(alist(a=,x=,someDeriv))
fn(a=1, x=2)

retorna: a * (2 * x) + 1

debería retornar: 5

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para transformar el objeto de llamada en una función con argumentos, se puede utilizar la función as.function() con alist() para especificar los argumentos. En el código de ejemplo proporcionado, someDeriv es un objeto de llamada obtenido al derivar una expresión.

    someDeriv <- D(expression(a * x^2 + x), "x")
    someDeriv
    # devuelve: a * (2 * x) + 1
    

    Podemos verificar la clase de someDeriv para verificar que es efectivamente un objeto de llamada.

    class(someDeriv)
    # devuelve: "call"
    

    Para crear una función con argumentos a partir del objeto de llamada, podemos utilizar as.function() y alist() como se muestra a continuación:

    fn <- as.function(alist(a= , x= , someDeriv))
    

    Esto crea una función fn con argumentos a y x, utilizando el objeto de llamada someDeriv.

    Ahora podemos llamar a la función fn() con valores para a y x.

    fn(a=1, x=2)
    # devuelve: a * (2 * x) + 1
    

    Sin embargo, esto no nos da el resultado correcto ya que necesitamos evaluar la expresión. someDeriv es una expresión no evaluada almacenada en un objeto de llamada. Para obtener el resultado esperado de 5, necesitamos convertir someDeriv en una expresión y luego evaluarla con los valores dados de a y x.

    expr <- as.expression(someDeriv)
    eval(expr, list(a = 1, x = 2))
    # devuelve: 5
    

    Por lo tanto, para obtener el resultado correcto, podemos crear una función fn con argumentos a y x, y utilizar as.expression() y eval() para evaluar la expresión someDeriv con los valores dados de a y x.

    fn <- as.function(alist(a= , x= , someDeriv))
    eval(as.expression(fn(a = 1, x = 2)))
    # devuelve: 5
    

    Esto devolverá el resultado esperado de 5.

Comments are closed.