Expressions and such

Peter Dalgaard BSA
21 Apr 1998 20:11:45 +0200

Douglas Bates <> writes:

> For R it is still not clear to me how to manipulate the expressions
> and functions.  I saw some of the discussion about function closures
> and why it is not easy to coerce to a function but that is still black 
> magic to me.  I regret that I am not likely to be able to take the
> time to understand it better in the near future.

You could always take Bill V's approach of blatantly claiming "this
can't be done in R" and watching the reaction... ;)

<tutorial audience=anyone>

Expressions are fairly easy: Just mentally convert them to LISP to
access the parse tree. Convert everything to function calls and
represent each as a list with the first element being the function
name and the others being it's arguments. (This is not particularly
useful to people who don't know Lisp, I know.)

This little function gets you some of the way, although it won't do
things like tagged arguments (it can certainly be improved in other
ways too):

> dissect                                           
function (e) 
        level <<- level + 1
        cat(substring("||||||||||||||||", 1, level))
        cat(deparse(e), "\n")
        if ( || is.expression(e)) 
                for (i in 1:length(e)) dissect(e[[i]])
        level <<- level - 1
> level<- -1
> dissect(expression(1+2+3*4))
1 + 2 + 3 * 4 
|1 + 2 + 3 * 4 
||1 + 2 
||3 * 4 

e.g. like LISP's (+(+ 1 2)(* 3 4)). 

This is all pretty much like S. What was the problem in the first place?


Regarding function coercion, I'm still unconvinced why this shouldn't
be possible. I'd kind of like to keep the "everything is a list"
paradigm. Obviously, one cannot keep perfect S compatibility (because
of the environment/closure issue), but some way of constructing a
function from it's arguments, body, and environment would be useful.

Many things are in fact possible if you are sneaky enough, e.g. here's
a conversion:


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

r-devel mailing list -- Read
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: