Reputation: 59970
When supplying a plotmath
expression to a plot title I thought that paste
worked just like paste
, but now I am not sure. Is it a special argument to plotmath
functions? In plotmath paste()
behaves like paste0()
and paste0
is quoted directly, whilst the sep
argument of paste()
is ignored, but not quoted in the expression. How is paste()
interpreted? See the four examples below:
# Data to plot
x <- seq( 55 , 70 , length = 2001 )
probs <- dexp( x , rate = 5 / 60 )
s <- sample( x , 10000 , prob = probs , repl = TRUE )
# Some plots
par(mfrow = c(2,2) )
#1) paste() behaves like paste0() here
hist( s , breaks = 30 ,
main = expression( paste( "1: Sampling of" , Phi , "Distribution" ) ) ,
xlab = "No spaces in title using paste()" , axes = F )
#2) add spaces in the expression where they are needed
hist( s , breaks = 30 ,
main = expression( paste( "2: Sampling of " , Phi , " Distribution" ) ) ,
xlab = "Single spaces in titles: paste() behaves like paste0()" , axes = F )
#3) Don't put spaces, use a sep argument - ignored
hist( s , breaks = 30 ,
main = expression( paste( "3: Sampling of" , Phi , "Distribution" , sep = " " ) ) ,
xlab = "No spaces using paste(), `sep` argument is ignored but not quoted in expression" , axes = F )
#4) paste0 is not recognised
hist( s , breaks = 30 ,
main = expression( paste0( "4: Sampling of " , Phi , " Distribution" ) ) ,
xlab = "paste0() not recognised" , axes = F )
Upvotes: 9
Views: 883
Reputation: 18749
Indeed paste
in plotmath is not the classic paste
. See ?plotmath
:
paste(x, y, z) juxtapose x, y, and z
paste
in the context of plotmath
doesn't have a sep
argument.
And in the source code plotmath.c
you can see that paste
is redefined:
/*----------------------------------------------------------------------
*
* Code for Concatenate Expressions
*
*/
static int ConcatenateAtom(SEXP expr)
{
return NameAtom(expr) && NameMatch(expr, "paste");
}
static BBOX RenderConcatenate(SEXP expr, int draw, mathContext *mc,
pGEcontext gc, pGEDevDesc dd)
{
BBOX bbox = NullBBox();
int i, n;
expr = CDR(expr);
n = length(expr);
for (i = 0; i < n; i++) {
bbox = CombineBBoxes(bbox, RenderElement(CAR(expr), draw, mc, gc, dd));
if (i != n - 1)
bbox = RenderItalicCorr(bbox, draw, mc, gc, dd);
expr = CDR(expr);
}
return bbox;
}
It is dispatched later in the file:
static BBOX RenderFormula(SEXP expr, int draw, mathContext *mc,
pGEcontext gc, pGEDevDesc dd)
{
SEXP head = CAR(expr);
....
else if (ConcatenateAtom(head))
return RenderConcatenate(expr, draw, mc, gc, dd);
....
(That being said I know nothing about C so I may be wrong on that one)
Upvotes: 6