Pytanie Błyszczące niewyświetlanie mojego ggplot, jak się spodziewałem


Co sprawia, że ​​moja mała błyszcząca aplikacja nie wyświetla 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.

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


  })
})

11
2017-08-04 01:33


pochodzenie


spróbuj owinąć cię ggplot call print to znaczy print(ggplot(...) + geom_point) - Jake Burkhead
Powinieneś pokazać komunikat o błędzie, który otrzymujesz zamiast po prostu powiedzieć "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


Odpowiedzi:


Są tu dwa problemy.

Po pierwsze nie powinieneś się dzielić aes - oczekuje nazw kolumn. Zamiast tego należy podsegmentować dane.frame, które podajesz ggplot (dzięki @Roland z czatu R)

Po drugie, musisz wyraźnie print Twój obiekt ggplot w twojej 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)

17
2017-08-04 01:44



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


Twój kod wymagał kilku zmian ggplot renderować. Zgodnie z powyższymi komentarzami, print(ggplot) był potrzebny. Ale także, aes inside ggplot nie może zajmować się podzbiorem.

Podziwiasz swoje miasto w oddzielny reaktywny i dzwonisz do niego z ggplota.

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łny serwer.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])


  })
})

3
2017-08-04 17:55





W ggplot2  możesz podzielić ogólne dane przekazywane do wszystkich warstw (@ odpowiedź GSee) lub, w przypadku poszczególnych warstw, możesz użyć subset argument do podzbioru tylko dla tej warstwy. Może to być przydatne, jeśli tworzysz bardziej złożone wykresy.

Używając plyr funkcjonować . jest użyteczny tutaj przy konstruowaniu 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)

2
2017-08-05 04:40



Bardzo fajny. Dzięki za ten dodatkowy kawałek informacji. - cylondude