2013-06-21 12 views
29

sto usando ggplot2 fare un confronto grafico a scatole di due specie diverse, come indicato dalla terza colonna mostrato di seguito:R: "unario errore dell'operatore" da multilinea ggplot2 comando

> 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 

Tuttavia, quando corro il seguente codice:

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")) 

ottengo questo errore:

> 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 

questo avviene anche quando corro con il variabile melt.data, per quello che vale. Qualcuno può aiutarmi a risolvere questo problema? Ho eseguito questo codice con successo prima con un set di dati diverso che è stato formattato in modo identico, e non riesco a capire cosa sta andando storto qui.

+9

sembra che tu abbia troppi '+' s nelle linee ... In particolare, rilascia tutto il '+' all'inizio delle linee; sono presumibilmente i resti dell'output stampato in una console R. – baptiste

+1

baptiste è corretto. Se si incolla l'output dalla console, si otterrà questo problema. Puoi usare la cronologia di Rstudio o lavorare da un file e ti permetterà di aggirare questo problema. –

+1

Proprio come te! Haha, è sempre qualcosa di stupido come quello. Grazie! Funziona bene ora. – soosus

risposta

60

Sembra che sia stato inserito un ulteriore + all'inizio di ogni riga, che R sta interpretando come operatore unario (come - interpretato come negazione, piuttosto che sottrazione). Penso che quello che funzionerà è

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")) 

Forse copia e incolla dall'output di una console R? La console utilizza + all'inizio della riga quando l'input è incompleto.

3

È l'operatore '+' all'inizio della linea che fa scattare le cose (non solo che si stanno utilizzando due operatori '+' consecutivamente). L'operatore '+' può essere usato alla fine delle linee, ma non all'inizio.

Questo funziona:

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

Il non:

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

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

Non è inoltre possibile utilizzare due operatori '+', che in questo caso che hai fatto. Ma per risolvere questo problema, dovrai rimuovere selettivamente quelli all'inizio delle linee.

18

Questo è un fastidio noto quando posting multiline commands in R. (È possibile ottenere un comportamento diverso quando si source() uno script per quando si copia-e-incolla le linee, entrambe con più righe e commenti)

Regola: mettere il penzoloni '+' sempre al fine di un linea in modo R conosce il comando è incompiuta:

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

non mettere il penzoloni '+' all'inizio della linea, dal momento che solletica questo Error in "+ geom_whatever2(...) invalid argument to unary operator"

E ovviamente non mettere penzoloni ' + 'a b oth end e start poiché si tratta di un errore di sintassi. Quindi, apprendi l'abitudine di essere coerente: metti sempre '+' alla fine della riga.

cf. answer to "Split code over multiple lines in an R script"