# [R] Advice on parsing formulae

Peter Dalgaard p.dalgaard at biostat.ku.dk
Thu Dec 16 10:22:27 CET 2004

```"Claus Dethlefsen" <dethlef at math.aau.dk> writes:

> Thank you for the advice. I have now boiled my problem down to the
> following:
>
> How do I create fm2 from fm1 ?
>
> fm1 <-  Y ~ 1 + tvar(x:A) + tvar(z) + u + tvar(B) + tvar(poly(v,3))
> fm2 <-  Y ~ 1 + x:A + z + u + B + poly(v, 3)
>
> Thus, how do I simply remove tvar( * ) from a formula? Do I have to write a
> function to parse the string and then re-create the formula?

Eek, no!!

> Is there an
> easy way of doing this?

Not really. Recursively descend the parse tree and replace calls to
tvar with its argument. Probably ends with one of those 10-line
functions that take hours to get right... Something like this would go
in the middle

if (is.call(e))
if (e[[1]]==as.name("tvar"))
e[[2]]
else
for (i in 2:length(e))
e[[i]] <- myfun(e[[i]])
else
e

If you don't mind getting left with a couple of extra parentheses,
this seems to work:

> eval(substitute(substitute(fm1,list(tvar=as.name("("))),list(fm1=fm1)))
Y ~ 1 + (x:A) + (z) + u + (B) + (poly(v, 3))

(Note to self: we need a substitute() variant that takes a variable,
not a literal as the first argument.)

--
O__  ---- Peter Dalgaard             Blegdamsvej 3
c/ /'_ --- Dept. of Biostatistics     2200 Cph. N
(*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907

```