[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