La raison pour laquelle la dernière échoue est que les arguments de expression
sont soumis à l'analyseur syntaxique de R et une erreur est renvoyée s'ils ne satisfont pas au test visant à déterminer s'ils peuvent être une syntaxe R correcte. La chaîne ou le jeton 1d
n'est pas un jeton (ou symbole) R valide. Il serait possible de le décomposer en jetons R valides et de le "connecter" avec des opérateurs non spatiaux, de le mettre en retrait ou d'utiliser des guillemets ordinaires. Je pense que l'une ou l'autre de ces solutions est meilleure que l'utilisation de paste
:
ggplot(dat, aes(x=x,y=y)) +
geom_point() +
labs(y=expression(Blah[1*d]))
ggplot(dat, aes(x=x,y=y)) +
geom_point() +
labs(y=expression(Blah["1d"]))
Dans R, les jetons (ou "noms" ou "symboles") ne sont pas censés commencer par des chiffres. Vous pouvez donc contourner cette limitation en mettant des guillemets ou en séparant les éléments suivants 1
y d
par un séparateur non spatial, le *
de l'opérateur. Il "joint" ou "lie" un littéral numérique pur avec un symbole R ou un jeton légal.
Pour obtenir un pourcentage, il suffit de signer sans être inscrit :
ggplot(dat, aes(x=x,y=y)) +
geom_point() +
labs(y=expression(Blah[1*d]*"%"))
Pour mettre des parens autour du signe pct :
expression(Blah[1*d]*"(%)")
Le %
a une signification particulière dans l'analyse syntaxique R, puisqu'il signifie le début d'un opérateur infixe défini par l'utilisateur. Son utilisation en tant que littéral nécessite donc qu'il soit mis entre guillemets. Le même raisonnement exige que "for" et "in" soient mis entre guillemets, car ils font partie du groupe des "mots réservés" pour R. Il existe d'autres mots réservés, (mais for
y in
sont ceux qui me font le plus souvent trébucher). Type :
?Reserved
Un autre "truc" consiste à utiliser des guillemets pour les chiffres à l'intérieur d'une même ligne. italic()
si vous souhaitez les mettre en italique. Les chiffres non cités ne sont pas mis en italique dans cette fonction.
Mises en garde : paste
est une fonction plotmath sauf il a une sémantique différente de celle du base::paste function
. En particulier, il n'a pas d'argument "sep". Vous ne pouvez donc jamais obtenir d'espace entre les arguments imprimés et si vous essayez d'insérer un élément sans espace, une seule instance apparaîtra après tous les autres arguments étiquetés en tant que sep=" "
.
paste0
n'est pas une fonction plotmath et ne sera donc pas interprétée, mais apparaîtra "non traitée" avec ses arguments non traités entre parenthèses.