2015-11-07 8 views
11

Ok, questo è un po 'strano. Stavo rispondendo a una domanda per un principiante intorno allo geom_histogram e l'OP ha pubblicato un esempio utilizzando i backtick. Ha trascurato di aggiungere dati quindi l'ho inventato e poi ho trovato una risposta, senza nemmeno notare i backtick. Ma un'altra risposta (in realtà più elegante) è stata pubblicata senza backtick. Non ha funzionato davvero, ma ha funzionato molto meglio con i backtick.Differenza tra apici inversi e virgolette nella funzione aes in ggplot

Ma ora sono perplesso. Non vedo perché avrebbe dovuto esserci una differenza. Anche la lista ggplot è quasi identica, solo l'elemento ggplot$mapping è diverso per quanto posso vedere (ok, è un biggie). Ho cercato su Google, ma non vedo cosa sta succedendo.

Quindi, ecco il codice:

Questo (virgolette Log Number in aes):

#Generate some data 
lon <- log(rnorm(1000, exp(6))) 
state <- sample(c("c", "l", "t"), 1000, replace = T) 
d <- data.frame(lon, state) 
names(d) <- c("Log Number", "state") 

# Plot it 
gpsq <- ggplot(d, aes(x = 'Log Number', fill = state)) + geom_histogram() 
print(gpsq) 

rendimenti questo:

enter image description here

Ma questo (backticks intorno Log Number in aes):

#Generate some data 
lon <- log(rnorm(1000, exp(6))) 
state <- sample(c("c", "l", "t"), 1000, replace = T) 
d <- data.frame(lon, state) 
names(d) <- c("Log Number", "state") 

# Plot it 
gpsq <- ggplot(d, aes(x = `Log Number`, fill = state)) + geom_histogram() 
print(gpsq) 

rendimenti più correttamente questo:

enter image description here

+1

Non sono sicuro, ma questo può fornire qualche intuizione. Prova a guardare l'output di 'aes (x =" lon ", fill = state)' vs 'aes (x = lon, fill = state)' vs 'aes (x = \' lon \ ', fill = state)' Con le virgolette, si finisce con un personaggio, ma senza virgolette o apici inversi, si finisce con un simbolo. – Jota

risposta

11

Torna zecche sono il modo standard di denotare un nome di variabile non standard in R. Quotes sono usati per indicare una stringa. Esempio:

`bad name` = 1 
`bad name` 
# [1] 1 

Questo non funziona con le virgolette.

"bad name" = 1 
"bad name" 
# [1] "bad name" 

In genere, non utilizzare questi nomi strani e non standard. Ma, se mai dovessi farlo, è il modo di farlo. È possibile fare praticamente qualsiasi cosa,

`really-bad^name+violating*all()/[kinds] <- of == rules&!|` = 1 
# works just fine 

, ma che non si vuol dire dovrebbe.


quando si tratta di ggplot, se avete fatto

ggplot(mtcars, aes(x = wt, y = 1)) + geom_point() 

che ci si aspetta che tutti i valori y sarebbe 1. E si sarebbe giusto!

Con una stringa tra virgolette è solo lo stesso:

ggplot(mtcars, aes(x = wt, y = "mpg")) + geom_point() 

tranne che invece di un numerico come nel y = 1 caso di cui sopra, che hai dato un carattere - che è implicitamente convertito in un fattore (solo con un livello) per una scala y discreta (con un solo valore). Non importa se c'è una colonna denominata "mpg" o meno, perché hai appena passato il valore aes().ggplot non cerca una colonna denominata mpg come se non cercasse una colonna denominata 1 nel primo esempio.

Con indietro zecche, si dà qualcosa ggplot R riconosce come un nome oggetto, non solo un valore come 1 o "some string". Quindi ggplotfa andare alla ricerca di una colonna con quel nome.

# both of these work 
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() 
ggplot(mtcars, aes(x = wt, y = `mpg`)) + geom_point() 

Mentre zecche indietro non lavorare, e le costanti di impostazione all'interno aes() di solito funziona, nessuno di questi sono molto raccomandato. Il metodo preferito per impostare le costanti è impostare le costanti di set all'esterno di aes(). Questo è l'unico modo per garantire che tutto funzioni bene in trame più complesse. Gli sfaccettature, in particolare, hanno spesso errori o non producono risultati attesi se si tenta di fare cose strane all'interno di aes() (in particolare le trasformazioni).

# better than above, set a constant outside of `aes()` 
# Here I set y as a constant which is a bit unusual 
ggplot(mtcars, aes(x = wt)) + geom_point(y = 1) 
# aesthetics that are more commonly set to constants are 
# size, color, fill, etc. 

Per i nomi delle colonne non-standard, aes_string() funziona bene, e poi si aspetta le mappature estetiche da citare i nomi delle colonne. Questo è anche un buon modo per fare cose se stai scrivendo una funzione che crea ggplot e ha bisogno di prendere i nomi delle colonne come argomenti.

ggplot(mtcars, aes_string(x = "wt", y = "mpg")) + geom_point() 
# or, in a variable 
my_y_column = "mpg" 
ggplot(mtcars, aes_string(x = "wt", y = my_y_column)) + geom_point() 

più Un bell'esempio, cominciando a guardare sotto il cofano, grazie a @TheTime:

Alla fine, ggplot necessità di valutare tutto ciò che verrà fatto con eval. Si consideri quanto segue:

a <- 1 

eval(parse(text="a")) 
# [1] 1 

eval(parse(text='"a"')) 
# [1] "a" 

eval(parse(text="`a`")) 
# [1] 1 
+1

Ottima risposta. Grazie. –

+0

Ho appena notato che è anche presente nel libro Advanced R di Hadley qui: http://adv-r.had.co.nz/Environments.html - nella sezione "Associazione dei nomi ai valori". –

Problemi correlati