# [R] Advice on parsing formulae

Thomas Lumley tlumley at u.washington.edu
Thu Dec 16 22:47:16 CET 2004

```On Thu, 16 Dec 2004, Claus Dethlefsen wrote:

> 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? Is there an
> easy way of doing this?

One way is to process the formula recursively:

no.tvar<-function(formula){
process<-function(expr){
if (length(expr)==1)
return(expr)
if(length(expr)==2)
if ( expr[]==as.name("tvar"))
return(expr[])
else return(expr)
expr[]<-process(expr[])
expr[]<-process(expr[])
return(expr)
}
formula[]<-process(formula[])
formula
}

> no.tvar(fm1)
Y ~ 1 + x:A + z + u + B + poly(v, 3)

This is not the more common sort of problem where you actually want to
remove terms from a formula (eg Error() in aov, cluster() and strata() in
coxph).  You want to modify them in place.

-thomas

```