2013-02-07 9 views
8

Interaktywnie, ten przykład działa dobrze:ggplot2 + aes_string wewnątrz funkcji poprzez interfejs wzorze

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point() 
p + facet_grid(. ~ vs) 

Teraz dokonać funkcji z interfejsem formuły i używać aes_string zrobić to samo, i to nie działa (błąd jest: Error in layout_base(data, cols, drop = drop) : At least one layer must contain all variables used for facetting):

tf <- function(formula, data) { 
res <- as.character(formula[[2]]) 
fac2 <- as.character(formula[[3]][3]) 
fac1 <- as.character(formula[[3]][2]) 

# p <- ggplot(aes_string(x = fac1, y = res), data = data) 
# p <- p + geom_point() # original attempt 
p <- ggplot() # This is Joran's trick, but it doesn't work here 
p <- p + geom_point(aes_string(x = fac1, y = res), data = data) 
p <- p + facet_grid(.~fac2) # comment this out, and it works but 
# of course is not faceted 
} 

p <- tf(formula = wt ~ am*vs, data = mtcars) 

Przez podstęp Jøran za odsyłam do here, które jest podobne pytanie napisałem niedawno. W tym przypadku ggplot2 nie widzi mojej prośby facetingowej. Dokonanie tego facet_grid(".~fac2") nie przyniosło efektu. Propozycje? Ciągle jestem pod wpływem tych rzeczy. Dzięki!

+0

Co jest wartością przykład z 'fac2'? (Czy to tylko wektor, czy bardziej skomplikowana formuła?) –

+0

'fac2' będzie jak' fac1', łańcuch znaków podający nazwę kolumny ramki danych, która jest współczynnikiem lub wymodelowaniem do jednej. Jest odtwarzalny, spójrz na ostatnią linię, używając 'mtcars'. –

+0

Myślę, że o wiele łatwiej będzie mieć formułę facylitacji jako drugi argument, w przeciwnym razie będziesz musiał zbudować nowy parser, ale chcesz odróżnić zmienne faced i współrzędne – mnel

Odpowiedz

5

Można użyć as.formula i paste:

p <- p + facet_grid(as.formula(paste(". ~", fac2))) 

W przykładzie daje to:

enter image description here

+0

Dang, połączenie, którego nigdy nie miałem okazji! Dziękuję Ci. –

+2

i nawet nie trzeba konwertować na formułę, 'p <- p + facet_grid (paste (". ~ ", Fac2))' będzie działać dobrze! – mnel

6

Użyłem formula.tools do manipulowania formuł.

Myślę, że powinieneś mieć osobny argument dla wzoru facetingu, w przeciwnym razie trzeba będzie stworzyć własny parser wypracować co wt ~ am*vs oznacza w kategoriach szlifowaniem

coś ideą grupowania kratownica może być przydatna

wt~am | vs

ale trzeba by zagłębić się w siatce, aby zobaczyć, w jaki sposób analizować swoje formuły (zobacz latticeParseFormula - skomplikowane)

Łatwiejsze oddzielenie dwóch formuł. można przekazać listę zmiennych znakowych jak RHS i LHS do facet argument facet_grid

Ja również używane environment = parent.frame() który działa w moim małym testów

library(formula.tools) 

tf <- function(formula, faceting = NULL, data, print = TRUE) { 
    y <- rhs(formula) 
    x <- lhs(formula) 

    p <- ggplot(environment = parent.frame()) 

    p <- p + geom_point(aes_string(x = x, y = y), data = data) 
    if (! is.null(faceting)){ 
    rhsfacet <- all.vars(rhs(faceting)) 
    lhsfacet <- all.vars(lhs(faceting)) 
    if(length(lhsfacet)==1 & any(lhsfacet %in% '.')) {lhsfacet <- NULL} 
    if(length(rhsfacet)==1 & any(rhsfacet %in% '.')) {rhsfacet <- NULL} 
    p <- p+ facet_grid(facet = list(lhsfacet, rhsfacet))} 
    if(print) {print(p)} 
    p 

} 
tf(wt~mpg, faceting = ~am, data = mtcars, print = TRUE) 

enter image description here

+0

Widzę, co masz teraz na myśli. Używasz kilku interesujących narzędzi, które muszę sprawdzić. Interesuje mnie również pomysł przekazania listy do "aspektu", którego wcześniej nie widziałem. Po prostu zaznaczone, nie jest to udokumentowane na aktualnych stronach 0.9.3. –

+0

Tak. Dostałem się tam od spojrzenia na źródło. Przypuszczałem, że będzie sposób, w jaki sposób '.' i' as .quoted' działa w 'plyr'.Zmontowałem także, by być bardziej odpornym na złożoną formułę faceting (bez fasetowania) – mnel

Powiązane problemy