[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
    
    
More information about the R-help
mailing list