[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