How can I customize an object of the class "expression"? I need to write a function for which the parameters change

0

Issue

I am trying to write an expression for which I need to find the parameters, but once I define the parameters to come from another variable, the expression does not recognize them. For example:

This works fine:

expression(2*x*exp(-3*t))

I get:

expression(2 * x * exp(-3 * t))

But the issue is that I don’t know if 2 and 3 are the right values (I’m trying to find them). So I tried to put this into a function like this:

 exp.fx <- function(params){
   u         <- params[1]
   D         <- params[2]
   expr1     <- expression(u*x*exp(-D*t))
   
   return(expr1)
}

And this is what I get:

> exp.fx(c(2,3))
u * x * exp(-D * t)

I need to get instead

2 * x * exp(-3 * t)

Bottom line, I need to put these two parameters into an optim so I can try to find them and that’s why I need a function that changes the expression each time accordingly.

Solution

What you are looking for is interpolation or injection. There are lots of different ways of achieving it. My favourite way is to use bquote instead of quote/expression:

exp_fx <- function (params) {
    u <- params[1L]
    D <- params[2L]
    bquote(.(u) * x * exp(-.(D) * t))
}

(Note that there’s no need for the expr variable, or for the return() function call; I’ve also replaced the . in the function name by _ since . can lead to confusion with S3 methods, and is therefore potentially problematic.)

An alternative is to use substitute:

exp_fx <- function (params) {
    substitute(
        u * x * exp(-D * t),
        list(u = params[1L], D = params[2L])
    )
}

Answered By – Konrad Rudolph

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave A Reply

Your email address will not be published.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More