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

Marc Schwartz MSchwartz at MedAnalytics.com
Thu Mar 3 16:52:26 CET 2005


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




More information about the R-help mailing list