web-dev-qa-db-fra.com

R: "Erreur d'opérateur unaire" de la commande multiline ggplot2

J'utilise ggplot2 pour comparer deux espèces différentes, comme l'indique la troisième colonne ci-dessous:

> library(reshape2)
> library(ggplot2)
> melt.data = melt(actb.raw.data)

> head(actb.raw.data)
  region  expression species
1     CG -0.17686667   human
2     CG -0.06506667   human
3     DG  1.04590000   human
4    CA1  1.94093333   human
5    CA2  1.55023333   human
6    CA3  1.75800000   human

> head(melt.data)
  region species   variable       value
1     CG   human expression -0.17686667
2     CG   human expression -0.06506667
3     DG   human expression  1.04590000
4    CA1   human expression  1.94093333
5    CA2   human expression  1.55023333
6    CA3   human expression  1.75800000

Cependant, quand je lance le code suivant:

ggplot(combined.data, aes(x = region, y = expression, fill = species)) +
+     geom_boxplot() +
+     scale_fill_manual(values = c("yellow", "orange"))
+     ggtitle("Expression comparisons for ACTB")
+     theme(axis.text.x = element_text(angle=90, face="bold", colour="black"))

Je reçois cette erreur:

> ggplot(actb.raw.data, aes(x = region, y = expression, fill = species)) +
+     + geom_boxplot() +
+     + scale_fill_manual(values = c("yellow", "orange"))
Error in +geom_boxplot() : invalid argument to unary operator
> + ggtitle("ACTB expression in human vs. macaque")
Error in +ggtitle("ACTB expression in human vs. macaque") : 
 invalid argument to unary operator
> + theme(axis.text.x = element_text(angle=90, face="bold", colour="black"))
Error in inherits(x, "theme") : argument "e2" is missing, with no default

Cela se produit également lorsque je cours en utilisant la variable melt.data, quelle que soit la valeur de celle-ci. Quelqu'un peut-il m'aider à résoudre ce problème? J'ai déjà exécuté ce code avec un autre jeu de données dont le formatage était identique, et je ne peux pas comprendre ce qui ne va pas ici.

35
soosus

Il semble que vous ayez inséré un + Supplémentaire au début de chaque ligne, que R interprète comme un opérateur unaire (comme - Interprété comme une négation plutôt qu'une soustraction). Je pense que ce qui fonctionnera est

ggplot(combined.data, aes(x = region, y = expression, fill = species)) +
    geom_boxplot() +
    scale_fill_manual(values = c("yellow", "orange")) + 
    ggtitle("Expression comparisons for ACTB") + 
    theme(axis.text.x = element_text(angle=90, face="bold", colour="black"))

Peut-être que vous copiez et collez à partir de la sortie d'une console R? La console utilise + Au début de la ligne lorsque la saisie est incomplète.

70
Dave Kleinschmidt

Ceci est une nuisance bien connue quand affichage de commandes multilignes dans R . (Vous pouvez obtenir un comportement différent lorsque vous source() un script lorsque vous copiez et collez les lignes, à la fois avec plusieurs lignes et avec des commentaires)

Règle: placez toujours le '+' pendant à la fin d'un ligne pour que R sache que la commande est inachevée:

ggplot(...) + geom_whatever1(...) +
  geom_whatever2(...) +
  stat_whatever3(...) +
  geom_title(...) + scale_y_log10(...)

Ne mettez pas le '+' pendant au début de la ligne, car cela chatouille cette Error in "+ geom_whatever2(...) invalid argument to unary operator"

Et, évidemment, ne mettez pas le signe '+' aux deux bouts, car c'est une erreur de syntaxe. Alors, prenez l’habitude d’être cohérent: mettez toujours "+" en fin de ligne.

cf. réponse à "Scinder le code sur plusieurs lignes dans un script R"

20
smci

C'est l'opérateur "+" au début de la ligne qui fait bouger les choses (pas seulement que vous utilisez deux opérateurs "+" consécutivement). L'opérateur '+' peut être utilisé à la fin des lignes, mais pas au début.

Cela marche:

ggplot(combined.data, aes(x = region, y = expression, fill = species)) +
geom_boxplot() 

Le ne pas:

ggplot(combined.data, aes(x = region, y = expression, fill = species))
+ geom_boxplot() 

*Error in + geom_boxplot():
invalid argument to unary operator*

Vous ne pouvez pas non plus utiliser deux opérateurs '+', ce que vous avez fait dans ce cas. Mais pour résoudre ce problème, vous devrez les supprimer au début des lignes.

4
jidulberger