[Rd] c(<symbol>, <symbol) |-> expression instead of list
Martin Maechler
maechler at stat.math.ethz.ch
Thu Aug 27 14:19:50 CEST 2009
>>>>> "GaGr" == Gabor Grothendieck <ggrothendieck at gmail.com>
>>>>> on Thu, 27 Aug 2009 07:32:42 -0400 writes:
GaGr> On Thu, Aug 27, 2009 at 6:18 AM, Martin
GaGr> 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 ...
GaGr> although as.expression(c(e1, e2)) is an expression.
GaGr> plot(0)
GaGr> legend("top", as.expression(c(e1, e2)))
GaGr> in light of which the savings is just one as.expression().
That's correct.
But my main point is that it's unnatural that
an expression is "list-like" with components "language"
and when I use c() on these language-parts I don't get back the
expression.
GaGr> Another possibility would be to add support for
GaGr> multiple arguments to bquote:
GaGr> plot(0)
GaGr> legend("top", bquote(x[1]^2 == .(z[1]), pi / r[i]^2 == .(z[2])))
well, that would solve the use case I gave,
but would actually result in making bquote() return
*either* a 'language'/'symbol' *or* an 'expression';
which is called polymorphic behavior and often can be slightly
confusing/complicating.
GaGr> Then we would not need to use c() in the first place.
(in that use case, yes)
More information about the R-devel
mailing list