2010-12-29 18 views
16

W jaki sposób odwołać się do nazwy zmiennej ze spacjami?Jak odnieść się do nazwy zmiennej ze spacjami?

Dlaczego qplot() i ggplot() pękają, gdy są używane w nazwach zmiennych z cytatami?

Na przykład to działa:

qplot(x,y,data=a) 

Ale tego nie robi:

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

Pytam, bo często mają matryce danych ze spacjami w nazwie. Np. "Dochód państwa". ggplot2 potrzebuje ramek danych; ok, mogę się przekonwertować. Więc chciałbym spróbować coś takiego:

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

To nie działa.

Natomiast w grafice zasady R, zrobiłbym:

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

Który będzie działać.

Wszelkie pomysły?

+9

Spróbuj 'income'' państwo - to backticks – hadley

+0

w celach informacyjnych, ja przeformułować pytanie do wskazania rzeczywistego problemu. –

+6

Wydaje mi się, że komentarz Hadleya pękł z powodu zmian cen w komentarzach StackOverflow. Powinno to wyglądać tak: \ "przychód państwowy \". –

Odpowiedz

21

Odpowiedź: ponieważ "x" i "y" są traktowane jako jeden znakowy wektor, a nie nazwa zmiennej. Tutaj odkryjesz, dlaczego nie jest mądrze używać nazw zmiennych ze spacjami w R. Lub w jakimkolwiek innym języku programowania.

Aby odwołać się do nazw zmiennych z przestrzeni, można użyć Hadleys rozwiązanie

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! 

lub bardziej formalny

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

Te ostatnie mogą być stosowane w konstrukcjach, gdzie przechodzą nazwa Zmienna jako ciąg w np. konstrukcji pętli:

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

Mimo to najlepszym rozwiązaniem nie jest używać nazw zmiennych ze spacjami.

+0

Dzięki; działa to świetnie, a wskazówka na temat "get" i pętli jest zgrabna. Moją jedyną kwestią jest to, że nazwy ze spacjami, choć są bardziej kłopotliwe w obsłudze, są często bardziej czytelne i często mogą być przekazywane do kodu LaTeX bez zmiany nazwy. – bshor

3

Używanie get nie jest bardziej "formalne", tak naprawdę twierdzę, że jest odwrotnie. Jak mówi pomoc R (help("`")), prawie zawsze można użyć nazwy zmiennej zawierającej spacje, pod warunkiem, że jest ona cytowana pod numerem. (Zwykle z backtick, jak już sugerowano.)

2

Coś podobnego zostało zadane na liście dyskusyjnej ggplot2 i Mehmet Gültaş powiązane z tym postem. Innym sposobem użycia łańcuchów do skonstruowania połączenia ggplot jest użycie funkcji aes_strings. Zauważ, że wciąż musisz wstawiać cudzysłowy wewnątrz cudzysłowów, aby rzecz zadziałała dla zmiennych ze spacjami.

library(ggplot2) 

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

ggplot(mtcars, aes_string(x = "cyl", y = "`em pi dzi`")) + 
    theme_bw() + 
    geom_jitter() 
Powiązane problemy