[R] substitute in a named expression

2005-06-22 Thread Søren Højsgaard
I have a 'named expression' like
  expr - expression(rep(1,d))
and would like to replace the argument d with say 5 without actually evaluating 
the expression. So I try  substitute(expr, list(d=5)) in which case R simply 
returns expr which when I 'evaluate' it gives
 eval(expr)
 Error in rep.default(1, d) : invalid number of copies in rep()

I've looked at ?substitute and ?expression (and other places) for ideas, but - 
well I guess there are some details which I haven't quite understood. Can 
anyone point me in the right direction?
Thanks
Søren

__
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html


Re: [R] substitute in a named expression

2005-06-22 Thread Gabor Grothendieck
On 6/22/05, Søren Højsgaard [EMAIL PROTECTED] wrote:
 I have a 'named expression' like
  expr - expression(rep(1,d))
 and would like to replace the argument d with say 5 without actually 
 evaluating the expression. So I try  substitute(expr, list(d=5)) in which 
 case R simply returns expr which when I 'evaluate' it gives
  eval(expr)
  Error in rep.default(1, d) : invalid number of copies in rep()
 
 I've looked at ?substitute and ?expression (and other places) for ideas, but 
 - well I guess there are some details which I haven't quite understood. Can 
 anyone point me in the right direction?

Try this:

eval(substitute(substitute(qq, list(d=5)), list(qq = expr[[1]])))

This aspect of R drove me crazy some time ago but Tony Plate finally figured 
it out and discussed it some time back:
   http://tolstoy.newcastle.edu.au/R/help/04/03/1247.html
There is also a handy utility routine, esub, defined there.

The key points are:

- substitute won't go inside expressions but it will go inside call objects.
  In this case your expr is an expression but expr[[1]] is a call object with
  the desired contents.  Note that quote will return a call
  object so you can avoid the [[1]] if you define expr as cl - quote(rep(1,d))
  i.e.  
   cl - quote(rep(1,d))
   eval(substitute(substitute(cl, list(d=5)), list(cl = cl)))

- substitute autoquotes anything inside it so one must substitute in 
  the first argument to the inner substitute using a second outer substitute.  
  That is, the outer substitute substitutes expr[[1]] (which is evaluated) into 
  the first argument of the inner substitute.

- the outer substitute wraps the result of the inner one in a call so we must 
  perform an eval to get what is within the call.  This part is explained in
  ?substitute

Sorry if this is complicated but that seems to be how it works.  Using
the esub function defined in the link above you can simplify it substantially
like this:

esub(cl, list(d=5))

# or

esub(expr[[1]], list(d=5))

__
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html


Re: [R] substitute in a named expression

2005-06-22 Thread Peter Dalgaard
Gabor Grothendieck [EMAIL PROTECTED] writes:

 On 6/22/05, Søren Højsgaard [EMAIL PROTECTED] wrote:
  I have a 'named expression' like
   expr - expression(rep(1,d))
  and would like to replace the argument d with say 5 without actually 
  evaluating the expression. So I try  substitute(expr, list(d=5)) in which 
  case R simply returns expr which when I 'evaluate' it gives
   eval(expr)
   Error in rep.default(1, d) : invalid number of copies in rep()
  
  I've looked at ?substitute and ?expression (and other places) for ideas, 
  but - well I guess there are some details which I haven't quite understood. 
  Can anyone point me in the right direction?
 
 Try this:
 
 eval(substitute(substitute(qq, list(d=5)), list(qq = expr[[1]])))
 
 This aspect of R drove me crazy some time ago but Tony Plate finally figured 
 it out and discussed it some time back:
http://tolstoy.newcastle.edu.au/R/help/04/03/1247.html
 There is also a handy utility routine, esub, defined there.
 
 The key points are:
 
 - substitute won't go inside expressions but it will go inside call objects.
   In this case your expr is an expression but expr[[1]] is a call object with
   the desired contents.  Note that quote will return a call
   object so you can avoid the [[1]] if you define expr as cl - 
 quote(rep(1,d))
   i.e.  
cl - quote(rep(1,d))
eval(substitute(substitute(cl, list(d=5)), list(cl = cl)))
 
 - substitute autoquotes anything inside it so one must substitute in 
   the first argument to the inner substitute using a second outer substitute. 
  
   That is, the outer substitute substitutes expr[[1]] (which is evaluated) 
 into 
   the first argument of the inner substitute.
 
 - the outer substitute wraps the result of the inner one in a call so we must 
   perform an eval to get what is within the call.  This part is explained in
   ?substitute
 
 Sorry if this is complicated but that seems to be how it works.  Using
 the esub function defined in the link above you can simplify it substantially
 like this:
 
 esub(cl, list(d=5))
 
 # or
 
 esub(expr[[1]], list(d=5))

Yes, substitute() is a bass-ackward design and the automatic quoting
of the first arg is a pain. It would have been much cleaner if
standard semantics were used and you'd just quote() the argument when
needed.

Your explanation of 

 eval(substitute(substitute(qq, list(d=5)), list(qq = expr[[1]])))
 
is a tad long-winded though.

What happens is that the inner unevaluated 

substitute(qq, list(d=5))

gets the qq replaced by the value of expr[[1]]. In casu it becomes

substitute(rep(1,d),list(d=5))

this then needs to be evaluated, yielding

rep(1,5)

-- 
   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
~~ - ([EMAIL PROTECTED])  FAX: (+45) 35327907

__
R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html