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

From: baptiste Auguié <ba208_at_exeter.ac.uk>
Date: Thu, 26 Jun 2008 09:21:14 +0100

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. Also, the handling of exponents is cleverer than I naively assumed. I think an example like the one above would make a nice addition to the plotmath documentation.

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

say,

a <- " some text "

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.

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
>> 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
>> guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>

Baptiste Auguié

Physics Department
University of Exeter
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

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 - 08:26:23 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 - 12:31:15 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.