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

Gabor Grothendieck ggrothendieck at gmail.com
Thu Aug 27 13:32:42 CEST 2009


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.



More information about the R-devel mailing list