Динамические фильтры и реактивный сюжет в сиянии - PullRequest
0 голосов
/ 03 июля 2018

Проблемы между входами и выходом графика

Привет,

Я тестирую базовое приложение ShinyApp, где могу создать график коммерческих услуг с разбивкой по географии и типу услуг.

Идея заключается в том, что я хочу, чтобы пользователь использовал три входа в раскрывающемся меню, каждый из которых зависит от предыдущего выбора, для подмножества данных, которые затем выводятся в ggplot.

Однако у меня проблемы с подключением входов к выходу графика (см. Ниже). Входные данные работают нормально и реагируют, когда они выбраны, но я не могу понять, как связать это с графиком, у меня возникает ощущение, что я не использую правильный источник данных (но не знаю, как это обеспечить). Кроме того, я не знаком с тем, как мне добавить третий фильтр (для «службы»), поскольку я не знаю, как связать свой источник данных с самого начала.

Извините, это, вероятно, просто, но некоторая помощь будет очень полезна.

UI

 #Data
 Test <- dataframe(
           Geography1 = c("Region","Local Authority","County"...),
           Geography2 = c("North West","Aldershot","Cheshire"...),
           Service = c("Shop","Cafe","Library"...),
           Overall_rating = c("Awesome","Good","Fantatstic"...),
           Locations = c(4000, 1300, 1700...)
  )

 #SHINY APP
 ui <- fluidPage(
  titlePanel("Tool"),
   sidebarLayout(
    sidebarPanel(
     uiOutput("geography1"),
     uiOutput("geography2"),
     uiOutput("service")),

  mainPanel(
     plotOutput("plot", height = "400px"))
     )
  )

Сервер

   server <- function(input, output) {

 output$geography1 = renderUI({
    selectInput(inputId = "geog1",
              label = "Geography 1:", 
              choices = as.character(unique(Test$Geography1)),
              selected = "Region")
  })

 output$geography2 = renderUI({

   datasub <- Test[Test$Geography1 == input$geog1, "Name"]

     selectInput(inputId = "geog2", 
                 label = "Geography2:", 
                 choices = unique(datasub),
                 selected = unique(datasub)[1])
  })

  output$service = renderUI({

     datasub2 <- unique(datasub)

     selectInput(inputId = "service",
                 label = "Service type:",
                 choices = unique(...),
                 selected = unique(...)[1])
   })

  output$plot = renderPlot({

    ggplot(datasub2(),aes(x = Overall_rating, y = Locations, fill= Overall_rating))+
     geom_bar(stat = "identity")

   })
 }

  shinyApp(ui, server)

enter image description here

1 Ответ

0 голосов
/ 03 июля 2018

Трудно сказать, как предполагаемые данные должны быть отфильтрованы в приложении, но этот код по крайней мере будет работать и будет интерактивным. Надеюсь, оттуда вы сможете выяснить, как настроить набор данных.

Как сказал BigDataScientist, одна ошибка заключается в том, что вы не используете реактивный набор данных.

#Data
Test <- data.frame(
  Geography1 = c("Region","Local Authority","County"),
  Geography2 = c("North West","Aldershot","Cheshire"),
  Service = c("Shop","Cafe","Library"),
  Overall_rating = c("Awesome","Good","Fantatstic"),
  Locations = c(4000, 1300, 1700)
)

#SHINY APP
ui <- fluidPage(
  titlePanel("Tool"),
  sidebarLayout(
    sidebarPanel(
      uiOutput("geography1"),
      uiOutput("geography2"),
      uiOutput("service")),

    mainPanel(
      plotOutput("plot", height = "400px"))
  )
)

server <- function(input, output) {

  output$geography1 = renderUI({
    selectInput(inputId = "geog1",
                label = "Geography 1:", 
                choices = as.character(unique(Test$Geography1)),
                selected = "Region")
  })

  datasub <- reactive({
    Test[Test$Geography1 == input$geog1,]
  })

  output$geography2 = renderUI({
    selectInput(inputId = "geog2", 
                label = "Geography2:", 
                choices = unique(datasub()[,"Geography2"]),
                selected = unique(datasub()[,"Geography2"])[1])
  })

  datasub2 <- reactive({
    datasub()[Test$Geography2 == input$geog2, ]
  })

  output$service = renderUI({
    selectInput(inputId = "service",
                label = "Service type:",
                choices = unique(datasub2()[,"Service"]),
                selected = unique(datasub2()[,"Service"])[1])
  })

  datasub3 <- reactive({
    datasub()[Test$Service == input$service, ]
  })

  output$plot = renderPlot({
    ggplot(datasub3(),aes(x = Overall_rating, y = Locations, fill= Overall_rating))+
      geom_bar(stat = "identity")

  })
}


shinyApp(ui, server)
...