From ggrothendieck at gmail.com  Tue Jul 17 02:12:08 2007
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Mon, 16 Jul 2007 20:12:08 -0400
Subject: [Rd] substitute and expression
In-Reply-To: <eb555e660707161446s9e18352h7fbe19d76948c1a7@mail.gmail.com>
References: <eb555e660707161446s9e18352h7fbe19d76948c1a7@mail.gmail.com>
Message-ID: <971536df0707161712n7f390c30j7ec84aa07e771a02@mail.gmail.com>

On 7/16/07, Deepayan Sarkar <deepayan.sarkar at gmail.com> wrote:
> Hi,
>
> I'm trying to understand whether the use of substitute() is
> appropriate/documented for plotmath annotation. The following two
> calls give the same results:
>
> > plot(1:10, main = expression(alpha == 1))
> > do.call(plot, list(1:10, main = expression(alpha == 1)))
>
> But not these two:
>
> > plot(1:10, main = substitute(alpha == a, list(a = 2)))
> > do.call(plot, list(1:10, main = substitute(alpha == a, list(a = 2))))
> Error in as.graphicsAnnot(main) : object "alpha" not found
>
> (as a consequence, xyplot(..., main = substitute(alpha)) doesn't
> currently work.)

If your question is really about do.call then use the quote = TRUE argument.
Then both of the above work:

plot(1:10, main = substitute(alpha == a, list(a = 2)))
do.call(plot, list(1:10, main = substitute(alpha == a, list(a = 2))),
quote = TRUE)

plot(1:10, main = expression(alpha == 1))
do.call(plot, list(1:10, main = expression(alpha == 1)), quote = TRUE)

Another possibility is just to make sure you are passing an expression so
that the first one would become:

plot(1:10, main = substitute(alpha == a, list(a = 2)))
do.call(plot, list(1:10, main = as.expression(substitute(alpha == a,
list(a = 2)))))


>
> On the other hand, this works:
>
> > foo <- function(x) plot(1, main = x)
> > foo(substitute(alpha))
>
> I'm not sure how to interpret ?plotmath; it says
>
>     If the 'text' argument to one of the text-drawing functions
>     ('text', 'mtext', 'axis', 'legend') in R is an expression, the
>     argument is interpreted as a mathematical expression...
>
> and uses substitute() in its examples, but
>
> > is.expression(substitute(alpha == a, list(a = 1)))
> [1] FALSE
>

I am not sure what examples you are referring to but if you read the
Value section in ?substitute it does say that substitute typically
returns call objects but may return a name object and in principle
can return others too so they need not be expressions.



[Rd] substitute and expression
Gabor Grothendieck