Re: [R] expression, strsplit, ...

From: Prof Brian Ripley <ripley_at_stats.ox.ac.uk>
Date: Thu, 26 Jun 2008 12:07:29 +0100 (BST)

On Thu, 26 Jun 2008, baptiste Auguié wrote:

>
> On 25 Jun 2008, at 19:45, Gabor Grothendieck wrote:
>
>> Try this:
>>
>> plot(1, xlab = ~ alpha / V * m^-3 * kg ^-2 * l^4)
>>
>
>
> Thanks, I would never have expected this code to work, this is a mystery to
> me! Actually, I thought xlab wanted an expression, but it seems to be happy
> with a formula.

>From ?plotmath

      In most cases other language objects (names and calls) are coerced
      to expressions and so can also be used.

A formula is a call:

> mode(~ alpha / V * m^-3 * kg ^-2 * l^4)
[1] "call"

That was just GG saving himself a few key strokes at the expense of clarity:

plot(1, xlab = expression(alpha / V * m^-3 * kg ^-2 * l^4))

is what this is coerced to.

> Also, the handling of exponents is cleverer than I naively assumed.

It is exactly as documented.

> I think an example like the one above would make a nice addition to
> the plotmath documentation.

I don't see what it adds to those already there.

>
> One small thing bothers me: can one use a similar syntax and use something
> like bquote to substitute a variable?

You use substitute() to do that:

> substitute(alpha * aaa / V * m^-3 * kg ^-2 * l^4, list(aaa=a))
alpha * " some text "/V * m^-3 * kg^-2 * l^4

> say,
>
> a <- " some text "
>
>> plot(1, xlab = ~ alpha * `a` / V * m^-3 * kg ^-2 * l^4)
>
> to produce,
>
>
>> plot(1, xlab = ~ alpha * " some text " / V * m^-3 * kg ^-2 * l^4)
>
> but I can't get either bquote, deparse, substitute, "``" to produce the
> desired substitution in this formula.

You can't 'substitute' in a formula, but you can in the RHS of a formula, form[[2]] in your case.

> Many thanks,
>
> baptiste
>
>
>
>
>>
>> On Wed, Jun 25, 2008 at 1:06 PM, baptiste Auguié <ba208_at_exeter.ac.uk>
>> wrote:
>>> DeaR list,
>>>
>>> I'm a bit lost in the behavior of substitute and co.
>>> I often use fairly long axis labels in my graphs (long to write, that is).
>>> Typically, they would contain some greek letters and units with exponents,
>>> as in:
>>>
>>>> xlab=expression(paste("text ", alpha, " / ", V,".", m^{-3}, ".",
>>>> kg^{-2}, ".", l^{4}))
>>>
>>>
>>> To make this a bit prettier, I've attempted to mimic the behavior of the
>>> SIstyle latex package which defines a macro that cleverly parses an
>>> expression for units, exponents, etc. My code fails in putting together
>>> the
>>> unit, as seen in the example below:
>>>
>>>>
>>>> makeUnits <- function(expr){ # formats the units
>>>>
>>>> units.list <- strsplit(expr, "[[:blank:]]", perl=F)
>>>> expr.list <- strsplit(unlist(units.list), "\\^", perl=T)
>>>>
>>>> units <- unlist(lapply(expr.list, function(unit) {
>>>> if (length(unit) == 2)
>>>> paste(unit[1],"^{",unit[2],"}",sep="")
>>>> else paste(unit,sep="")
>>>> }))
>>>> cat(units, sep=".")
>>>> }
>>>>
>>>> expr <- "V m^-3 kg^-2 l^4"
>>>> makeUnits(expr) # this works, and produces:
>>>
>>> # V.m^{-3}.kg^{-2}.l^{4}
>>>>
>>>> silab <- function(..., units=NULL){ # creates a valid expression for xlab
>>>> and co.
>>>> dotCalls <- substitute(list(...))
>>>> nArgs <- length(dotCalls)
>>>> if (!is.null(units)) myUnits <- makeUnits(units)
>>>> if (!is.null(units)) return(substitute(paste(..., " / ", myUnits)))
>>>> if (is.null(units)) return(substitute(paste(...)))
>>>> }
>>>>
>>>> silab("text", alpha, units = "V m^-3 kg^-2 l^4") # the result is
>>>> obviously not what I want
>>>>
>>>> par(mfrow=c(2, 1)) # comparison of the desired output and the current one
>>>> plot(1:10, 1:10,
>>>> xlab=silab("text ", alpha, units = "V m^-3 kg^-2 l^4"),
>>>> ylab=silab("simple text"))
>>>>
>>>> plot(1:10, 1:10,
>>>> xlab=expression(paste("text ", alpha, " / ", V,".", m^{-3}, ".",
>>>> kg^{-2}, ".", l^{4})),
>>>> ylab="simple text")
>>>
>>>
>>>
>>>
>>> Any thoughts welcome!
>>>
>>> Sincerely,
>>>
>>> baptiste
>>>
>>> _____________________________
>>>
>>> Baptiste Auguié
>>>
>>> Physics Department
>>> University of Exeter
>>> Stocker Road,
>>> Exeter, Devon,
>>> EX4 4QL, UK
>>>
>>> Phone: +44 1392 264187
>>>
>>> http://newton.ex.ac.uk/research/emag
>>> http://projects.ex.ac.uk/atto
>>>
>>> ______________________________________________
>>> R-help_at_r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>
> _____________________________
>
> Baptiste Auguié
>
> Physics Department
> University of Exeter
> Stocker Road,
> Exeter, Devon,
> EX4 4QL, UK
>
> Phone: +44 1392 264187
>
> http://newton.ex.ac.uk/research/emag
> http://projects.ex.ac.uk/atto
>
> ______________________________________________
> R-help_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

-- 
Brian D. Ripley,                  ripley_at_stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595


______________________________________________ R-help_at_r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.

Received on Thu 26 Jun 2008 - 11:10:50 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 26 Jun 2008 - 13:31:17 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive