[R] convert text to exprission good for lm arguments

Gabor Grothendieck ggrothendieck at gmail.com
Thu May 3 15:47:22 CEST 2007


On 5/3/07, Vladimir Eremeev <wl2776 at gmail.com> wrote:
>
>
> Vadim Ogranovich wrote:
> >
> > Hi,
> >
> > I ran into a problem of converting a text representation of an expression
> > into parsed expression to be further evaluated inside lm ().
> >
> >> n <- 100
> >> data <- data.frame(x= rnorm (n), y= rnorm (n))
> >> data. lm <- lm (y ~ x, data=data)
> >>
> >> ## this works
> >> update(data. lm , subset=x<0)
> >
> > Call:
> > lm (formula = y ~ x, data = data, subset = x < 0)
> >
> > Coefficients:
> > (Intercept) x
> > -0.07864094193322170023 -0.14596982635007796358
> >
> >>
> >> ## this doesn't work
> >> ## text representation of subset
> >> subset <- "x<0"
> >> update(data. lm , subset=parse(text=subset))
> > Error in `[.data.frame`(list(y = c(-0.601925958140825, -0.111931189071517,
> > :
> > invalid subscript type
> >
> > What is the correct way to convert "x<0" into a valid subset argument?
> >
>
> update(data.lm,subset=eval(parse(text=subset)))

Just wanted to point out one difference.  Using eval
is not quite the same as using do.call since the
Call: part does not come out as desired if you use eval but if you
use do.call it comes out good enough that you can tell what was
intended to be subset from the output:

> update(data.lm,subset=eval(parse(text=subset)))

Call:
lm(formula = y ~ x, data = data, subset = eval(parse(text = subset)))

Coefficients:
(Intercept)            x
    -0.1335      -0.1248


> do.call("update", list(data.lm, subset = parse(text = subset)))

Call:
lm(formula = y ~ x, data = data, subset = expression(x < 0))

Coefficients:
(Intercept)            x
    -0.1335      -0.1248



More information about the R-help mailing list