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

From: Berton Gunter <gunter.berton_at_gene.com>
Date: Fri 04 Mar 2005 - 03:41:07 EST

If these are nested models, see ?drop.terms.

• Bert Gunter Genentech Non-Clinical Statistics South San Francisco, CA

"The business of the statistician is to catalyze the scientific learning process." - George E. P. Box

> -----Original Message-----
> From: r-help-bounces@stat.math.ethz.ch
> [mailto:r-help-bounces@stat.math.ethz.ch] On Behalf Of Marc Schwartz
> Sent: Thursday, March 03, 2005 7:52 AM
> To: Dr Carbon
> Cc: r-help@r-project.org
> Subject: Re: [R] creating a formula on-the-fly inside a function
>
> 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.
>
> 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
> https://stat.ethz.ch/mailman/listinfo/r-help