On Thu, Aug 27, 2009 at 6:18 AM, Martin
Maechler<maech...@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.

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to