[R] expression, strsplit, ...
baptiste Auguié
ba208 at exeter.ac.uk
Wed Jun 25 19:06:45 CEST 2008
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
More information about the R-help
mailing list