[Rd] c(<symbol>, <symbol) |-> expression instead of list
Martin Maechler
maechler at stat.math.ethz.ch
Thu Aug 27 12:18:28 CEST 2009
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 ...
## but
plot(1, type="n")
legend("top", legend= c(e1,e2)) ## is ugly (no super/sub scripts ...)
legend("center", legend=
c(as.expression(e1),
as.expression(e2)))# works but is a bit cumbersome
-------------
So now, my proposition is to make the "as.expression()"
implicit in c(),
since the help file for c() does mention that
> The output type is determined from the highest type of the
> components in the hierarchy NULL < raw < logical < integer < real
> < complex < character < list < expression. .....
and implicitly, "symbol" and "language" are treated by as.list()
rather than as expression-like.
I would like to change this, i.e., c() should result in
"expression" rather than "list" when it's applied to symbola
and language types.
Note that S-plus 8.0.4, and 3.4 does this very differently
anyway.
Martin Maechler, ETH Zurich
More information about the R-devel
mailing list