# Re: [R] creating a formula on-the-fly inside a function

From: Marc Schwartz <MSchwartz_at_medanalytics.com>
Date: Fri 04 Mar 2005 - 02:52:26 EST

On Thu, 2005-03-03 at 10:28 -0500, Dr Carbon wrote:
> I have a function that, among other things, runs a linear model and
> returns r2. But, the number of predictor variables passed to the
> function changes from 1 to 3. How can I change the formula inside the
> function depending on the number of variables passed in?
>
> An example:
>
> get.model.fit <- function(response.dat, pred1.dat, pred2.dat = NULL,
> pred3.dat = NULL)
> {
> res <- lm(response.dat ~ pred1.dat + pred2.dat + pred3.dat)
> summary(res)\$r.squared
> # other stuff happens here...
> }
>
> y <- rnorm(10)
> x1 <- y + runif(10)
> x2 <- y + runif(10)
> x3 <- y + runif(10)
> get.model.fit(y, x1, x2, x3)
> get.model.fit(y, x1, x2)
> get.model.fit(y, x1)

Consider using as.formula() to take a character vector that you pass as an argument instead of specifying each IV separately:

get.model.fit <- function(my.form)
{

res <- lm(as.formula(my.form))
summary(res)\$r.squared
# other stuff happens here...
}

Then call it with:

get.model.fit("y ~ x1 + x2 + x3")

Internally, the vector will be converted to:

> as.formula("y ~ x1 + x2 + x3")

y ~ x1 + x2 + x3

Doing it this way provides for greater flexibility if you want to use a more complicated formula construct.

See ?as.formula for more information and further examples, including the use of paste() if you want to separate the DV from the IVs for an additional approach for a long set of similarly named IV's (ie x1:x25).

HTH, Marc Schwartz

R-help@stat.math.ethz.ch mailing list