2013-08-04 9 views
10

Co powstrzymuje moją małą błyszczącą aplikację od wyświetlania mojego ggplota? Kiedy zamieniam kod w renderPlot() na przykład przy użyciu funkcji wykresu podstawowego, pojawia się on razem. Używam RStudio, R v3.0.1 w systemie Windows Vista, wyprowadzam do przeglądarki Chrome.Shiny nie wyświetla mojego ggplot, jak się spodziewałem

ui.r

library(ggplot2) 

cities <- c("Anchorage","Fairbanks","Juenau","Wasilla","Homer") 
years <- 2003:2013 
Table <- "Capital Assets" 
Account <- c("Land", "Art", "Buildings", "Equipment") 
dat <- data.frame(City = sort(rep(cities, length(years))), Year = rep(years,length(cities)), Table) 
sampleDat <- rbind(data.frame(dat,Acount = Account[1]), data.frame(dat, Acount = Account[2]), data.frame(dat, Acount = Account[3]), data.frame(dat, Acount = Account[4])) 
finalDat <- data.frame(sampleDat, Value = runif(length(sampleDat[,1]), 1000,10000)) 

shinyUI(pageWithSidebar(

    headerPanel("CAFR Explorer"), 

    selectInput("city","City", as.list(levels(finalDat$City)), selected = NULL, multiple = FALSE), 

    mainPanel(
    h3(textOutput("caption")), 

    plotOutput("CAFRplot") 
))) 

server.r

library(shiny) 
library(ggplot2) 

cities <- c("Anchorage","Fairbanks","Juenau","Wasilla","Homer") 
years <- 2003:2013 
Table <- "Capital Assets" 
Account <- c("Land", "Art", "Buildings", "Equipment") 
dat <- data.frame(City = sort(rep(cities, length(years))), Year = rep(years,length(cities)), Table) 
sampleDat <- rbind(data.frame(dat,Acount = Account[1]), data.frame(dat, Acount = Account[2]), data.frame(dat, Acount = Account[3]), data.frame(dat, Acount = Account[4])) 
finalDat <- data.frame(sampleDat, Value = runif(length(sampleDat[,1]), 1000,10000)) 

shinyServer(function(input, output) { 

    formulaText <- reactive({ 
    paste(input$city) 
    }) 

    output$caption <- renderText({ 
    formulaText() 
    }) 

    output$CAFRplot <- renderPlot({ 

    ## this one isn't working. 
    ggplot(finalDat, aes(x = finalDat[which(finalDat$City == input$city),2], 
         y = finalDat[which(finalDat$City == input$city),5])) + 
    geom_point() 

    ## this one is working 
    #plot(finalDat[which(finalDat$City == input$city),2], y = finalDat[which(finalDat$City == input$city),5]) 


    }) 
}) 
+3

spróbować owijania ty ggplot zadzwonić 'print' czyli' print (ggplot (...) + geom_point) ' –

+0

Należy pokazać pojawia się komunikat o błędzie zamiast mówić "nie działa". Jake ma rację, że powinieneś owijać wydruk wokół twojego połączenia ggplot, ale myślę, że jest coś jeszcze nie tak z twoją rozmową ggplot (problem z zakresu). – GSee

Odpowiedz

17

Istnieją tu dwie kwestie.

Po pierwsze, nie należy podzbioru w aes - oczekuje nazw kolumn. Zamiast tego, podziel dane data.frame, które podasz na ggplot (dzięki @Roland z R chat)

Po drugie, musisz jawnie print swój obiekt ggplot w swojej błyszczącej aplikacji.

Spróbuj tego:

p <- ggplot(finalDat[finalDat$City == input$city,], aes(x = Year, y = Value)) 
p <- p + geom_point() 
print(p) 
+1

+1 Ładne i eleganckie. Nie widziałem twojej odpowiedzi, bo inaczej nie wpisałbym swojej. –

3

Kod potrzebne kilka zmian, aby uzyskać ggplot do renderowania. Zgodnie z powyższymi komentarzami, potrzebne było print(ggplot). Ale także, aes inside ggplot nie może zajmować się podzbiorem.

Podział interesującego miasta na oddzielny reaktywny i wywołanie go z ggplot.

city.df <- reactive({ 
    subset(finalDat, City == input$city) 
    }) 

    output$CAFRplot <- renderPlot({ 
    city <- city.df() 

    print(ggplot(city, aes(x = Year, y=Value)) + geom_point()) 

Pełne server.R (to działa)

library(shiny) 
library(ggplot2) 

cities <- c("Anchorage","Fairbanks","Juenau","Wasilla","Homer") 
years <- 2003:2013 
Table <- "Capital Assets" 
Account <- c("Land", "Art", "Buildings", "Equipment") 
dat <- data.frame(City = sort(rep(cities, length(years))), Year = rep(years,length(cities)), Table) 
sampleDat <- rbind(data.frame(dat,Acount = Account[1]), data.frame(dat, Acount = Account[2]), data.frame(dat, Acount = Account[3]), data.frame(dat, Acount = Account[4])) 
finalDat <- data.frame(sampleDat, Value = runif(length(sampleDat[,1]), 1000,10000)) 

shinyServer(function(input, output) { 

    formulaText <- reactive({ 
    paste(input$city) 
    }) 

    output$caption <- renderText({ 
    formulaText() 
    }) 

    city.df <- reactive({ 
    subset(finalDat, City == input$city) 
    }) 

    output$CAFRplot <- renderPlot({ 
    city <- city.df() 
    ## this one isn't working. 
# print(ggplot(finalDat, aes(x = finalDat[which(finalDat$City == input$city),2], 
#       y = finalDat[which(finalDat$City == input$city),5])) + geom_point()) 

    print(ggplot(city, aes(x = Year, y=Value)) + geom_point()) 

    ## this one is working 
    #plot(finalDat[which(finalDat$City == input$city),2], y = finalDat[which(finalDat$City == input$city),5]) 


    }) 
}) 
2

W ggplot2 można podzbiór ogólne dane są przekazywane do wszystkich warstw (@ odpowiedź GSEE użytkownika) lub, dla indivdual warstw można użyj argumentu subset do podzbioru tylko dla tej warstwy. Może to być przydatne, jeśli tworzysz bardziej złożone wykresy.

Korzystanie z plyr funkcję . jest przydatna tutaj konstruowania argumentów

# required in server.R (along with the other calls to library) 
library(plyr) 

p <- ggplot(finalDat, aes(y =Year, x = Value)) + 
     geom_point(subset = .(City ==input$city)) 
print(p) 
+0

Bardzo fajnie. Dzięki za ten dodatkowy kawałek informacji. – cylondude

Powiązane problemy