From ggrothendieck at gmail.com  Thu Aug 27 13:32:42 2009
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Thu, 27 Aug 2009 07:32:42 -0400
Subject: [Rd] c(<symbol>, <symbol) |-> expression instead of list
In-Reply-To: <19094.23924.888966.900424@lynne.math.ethz.ch>
References: <1251232240.5919.5.camel@ubuntu.une.net.co>
	<0366B624-A934-4949-98FF-3EAE569C95EC@comcast.net> 
	<6F4FD737-25F9-4DE6-98AA-F4185BC34650@comcast.net>
	<1251239164.5919.7.camel@ubuntu.une.net.co> 
	<19094.17411.805111.923613@lynne.math.ethz.ch>
	<19094.23924.888966.900424@lynne.math.ethz.ch>
Message-ID: <971536df0908270432x69c0daa5oa52d1ee3426c0655@mail.gmail.com>

On Thu, Aug 27, 2009 at 6:18 AM, Martin
Maechler<maechler at stat.math.ethz.ch> wrote:
> Dear programmeRs,
>
> I'm proposing and looking into implementing a small change in
> R's ?c() handling of 'symbol's aka 'name's, and potentially also
> 'language' parts.
>
> The main motivation is transparent programmatic construction of
> expression()s; ?and important use cases are expressions used for
> "plot math", typically in
> ? ? ? ?axis(.., labels = *)
> or ? ?legend(.., legend = *)
>
> [BTW, Paul, ?in ?grid.legend(*, labels = *), ?labels is *not*
> ?allowed to be an expression]
>
> Look at this code snippet {where the comments include the
> results you see} :
>
> e <- expression(a, gamma, nu == 50, x^2 == 3.14, y <- 17, { x[i] <- sin(y^2 + exp(u[i])) })
> length(e)
> ## 6
> ## Ok, what are the components like ?
> ##
> sapply(e, is.language)
> ## [1] TRUE TRUE TRUE TRUE TRUE TRUE
> ## aha, all are ?"language",
> ##
> ## and specifically :
> sapply(e, typeof)
> ##[1] "symbol" ? "symbol" ? "language" "language" ? "language" "language"
> ## or in ``S - compatible'' language ?{but S+ slightly differs here}:
> sapply(e, mode)
> ##[1] "name" "name" "call" "call" "call" "call"
> sapply(e, class)
> ##[1] "name" "name" "call" "call" "<-" ? "{"
>
> Now, in "plotmath" situations,
> you'd often want the '50' , '3.14' or '17' ?be the content of
> other R variables, and so we need ?substitute() ?or ?bquote(),
> and these directly result in "name" or "language" objects :
>
> However, you cannot very easily concatenate them to an
> expression:
>
> z <- c(88, 143)
> (e1 <- substitute(x[1]^2 == v, list(v = z[1])))
> (e2 <- bquote(pi / r[i]^2 == .(z[2])))
>
> ## However,
> c(e1, e2) ?## is a list, not an expression ...

although as.expression(c(e1, e2)) is an expression.

plot(0)
legend("top", as.expression(c(e1, e2)))

in light of which the savings is just one as.expression().

Another possibility would be to add support for
multiple arguments to bquote:

plot(0)
legend("top", bquote(x[1]^2 == .(z[1]), pi / r[i]^2 == .(z[2])))

Then we would not need to use c() in the first place.



[Rd] c(<symbol>, <symbol) |-> expression instead of list
Gabor Grothendieck