-----Original Message-----
From: r-help-bounces at stat.math.ethz.ch
[mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Marc Schwartz
Sent: Thursday, March 03, 2005 7:52 AM
To: Dr Carbon
Cc: r-help at 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
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