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@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.

Reply via email to