web-dev-qa-db-fra.com

Comment faire référence à un nom de variable avec des espaces?

Dans ggplot2, Comment faire référence à un nom de variable avec des espaces?

Pourquoi qplot() et ggplot() se cassent lorsqu'ils sont utilisés sur des noms de variables avec des guillemets?

Par exemple, cela fonctionne:

qplot(x,y,data=a)

Mais cela ne fait pas:

qplot("x","y",data=a)

Je demande parce que j'ai souvent des matrices de données avec des espaces dans le nom. Par exemple, "Revenu de l'État". ggplot2 a besoin de trames de données; ok, je peux convertir. Je voudrais donc essayer quelque chose comme:

qplot("State Income","State Ideology",data=as.data.frame(a.matrix))

Cela échoue.

Alors que dans les graphiques de base R, je ferais:

plot(a.matrix[,"State Income"],a.matrix[,"State Ideology"])

Ce qui fonctionnerait.

Des idées?

21
bshor

Réponse: parce que "x" et "y" sont considérés comme un vecteur de caractère de longueur un, pas comme un nom de variable. Ici, vous découvrez pourquoi il n'est pas intelligent d'utiliser des noms de variables avec des espaces dans R. Ou tout autre langage de programmation d'ailleurs.

Pour faire référence à des noms de variables avec des espaces, vous pouvez utiliser l'une ou l'autre solution hadleys

a.matrix <- matrix(rep(1:10,3),ncol=3)
colnames(a.matrix) <- c("a name","another name","a third name")

qplot(`a name`, `another name`,data=as.data.frame(a.matrix)) # backticks!

ou le plus formel

qplot(get('a name'), get('another name'),data=as.data.frame(a.matrix))

Ce dernier peut être utilisé dans les constructions où vous passez le nom d'une variable sous forme de chaîne dans par exemple une construction en boucle:

for (i in c("another name","a third name")){
    print(qplot(get(i),get("a name"),
      data=as.data.frame(a.matrix),xlab=i,ylab="a name"))
    Sys.sleep(5)
}

Pourtant, la meilleure solution est de ne pas utiliser de noms de variables avec des espaces.

23
Joris Meys

Quelque chose de similaire a été demandé sur la liste de diffusion ggplot2 et Mehmet Gültaş lié à ce message. Une autre façon d'utiliser des chaînes pour construire votre appel ggplot consiste à utiliser le aes_strings fonction. Notez que vous devez toujours mettre des contre-indications entre les guillemets pour que la chose fonctionne pour les variables avec des espaces.

library(ggplot2)

names(mtcars)[1] <- "em pi dzi"

ggplot(mtcars, aes_string(x = "cyl", y = "`em pi dzi`")) +
  theme_bw() +
  geom_jitter()
3
Roman Luštrik

Utiliser get n'est pas plus "formel", en fait je dirais le contraire. Comme le dit l'aide R (help("`")), vous pouvez presque toujours utiliser un nom de variable contenant des espaces, à condition qu'il soit entre guillemets. (Normalement, avec un backtick, comme déjà suggéré.)

3
Davor Cubranic