[R] sub question

Peter Dalgaard p.dalgaard at biostat.ku.dk
Tue Feb 3 16:38:59 CET 2009

Wacek Kusnierczyk wrote:

>> (a) do not descend recursively into the function part (first element)
>> of a call
>> (b) do descend, unless it is a name
> if it is a name, how would you descend?  

By calling a recursive function which has it as the argument. It's not a 
problem unless you want it to be (first you descend into the first 
element on a call, then realize that it is a name). There are 
essentially three possibilities (cutting some red tape):

 > f <- function(e) if (is.name(e))
   print(e) else if(is.call(e)) invisible(lapply(e,f))
 > f(~ fo(o)())

 > f <- function(e) if (is.name(e))
  print(e) else if(is.call(e)) invisible(lapply(e[-1],f))
 > f(~ fo(o)())

 > f <- function(e) if (is.name(e)) print(e) else
         if(is.call(e)) invisible( if(is.name(e[[1]]))
              lapply(e[-1],f) else lapply(e,f))
 > f(~ fo(o)())

The first two are essentially the current all.names and all.vars. The 
third is the one that you seem to expect. Notice that it gets rather 
more complicated than the others.

  > one legitimate reason is to keep the syntax/semantics clean (worship the
> god of boring pedantry). 
> be this not enough, a practical example could certainly be found, though
> admittedly the above were made up for the discussion. 

But can you be sure that there is no legitimate reason for expecting the 
current behaviour?

    O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
   c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
  (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907

More information about the R-help mailing list