Search code examples
rshinyreactive-programmingdashboard

Problems with shiny: Graph doesn't show when inputs are updated (plus some error)


As a continuation of my previous problem here, now I'm stuck with my graph.I really thought it would be so simple because my inputs are correctly updated but i'm receiving this error when the browser opens to display the app:

Error: no applicable method for 'filter' applied to an object of class "shiny.tag"

I'm really confused and exhausted and I just can't see where the problem is: in the code that generates the database for the graph (I used many dplyr::filter because I thought the problem was there but that makes no difference) or the code for the graph itself or in both.

I appreciate all your feedback and comments.

Below is all you need to replicate:

Dummy database:

x <-   structure(list(año = c("2019", "2019", "2019", "2019", "2019", 
    "2019", "2019", "2019", "2019", "2019", "2019", "2019", "2019", 
    "2019", "2019", "2019", "2019", "2019", "2020", "2020", "2020", 
    "2020", "2020", "2020", "2020", "2020", "2020", "2020", "2020", 
    "2020", "2020", "2020", "2020", "2020", "2020", "2020", "2021", 
    "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", 
    "2021", "2021", "2021", "2021", "2021", "2021", "2021", "2021", 
    "2021"), opciones = c("L1", "L1", "L1", "L2", "L2", "L2", "L3", 
    "L3", "L3", "LA", "LA", "LA", "LB", "LB", "LB", "LC", "LC", "LC", 
    "L1", "L1", "L1", "L2", "L2", "L2", "L3", "L3", "L3", "LA", "LA", 
    "LA", "LB", "LB", "LB", "LC", "LC", "LC", "L1", "L1", "L1", "L2", 
    "L2", "L2", "L3", "L3", "L3", "LA", "LA", "LA", "LB", "LB", "LB", 
    "LC", "LC", "LC"), lugar = c("EXT", "INT", "LOC", "NOM", "KHA", 
    "POC", "TMO", "MCR", "GNR", "APV", "HOT", "ROR", "GRU", "BOY", 
    "POK", "NOT", "LOX", "TAK", "EXT", "INT", "LOC", "NOM", "KHA", 
    "POC", "TMO", "MCR", "GNR", "APV", "HOT", "ROR", "GRU", "BOY", 
    "POK", "NOT", "LOX", "TAK", "EXT", "INT", "LOC", "NOM", "KHA", 
    "POC", "TMO", "MCR", "GNR", "APV", "HOT", "ROR", "GRU", "BOY", 
    "POK", "NOT", "LOX", "TAK"), numeros = c(4011L, 18564L, 24325L, 
    9798L, 18621L, 11165L, 6071L, 23466L, 22472L, 23990L, 3980L, 
    2976L, 24142L, 3140L, 20317L, 11884L, 9427L, 20704L, 609L, 23428L, 
    19853L, 10450L, 577L, 14153L, 4757L, 6393L, 18461L, 1988L, 20044L, 
    8371L, 21371L, 12312L, 17368L, 16045L, 11492L, 7903L, 21409L, 
    12547L, 19926L, 17857L, 6728L, 5584L, 14837L, 10269L, 20168L, 
    13092L, 22233L, 20663L, 11975L, 14672L, 19389L, 7329L, 14062L, 
    167L), mes = c("Agosto", "Julio", "Agosto", "Febrero", "Julio", 
    "Agosto", "Mayo", "Noviembre", "Abril", "Diciembre", "Julio", 
    "Febrero", "Mayo", "Octubre", "Septiembre", "Febrero", "Enero", 
    "Febrero", "Noviembre", "Julio", "Septiembre", "Marzo", "Diciembre", 
    "Octubre", "Enero", "Agosto", "Septiembre", "Abril", "Julio", 
    "Enero", "Febrero", "Febrero", "Abril", "Septiembre", "Agosto", 
    "Septiembre", "Abril", "Septiembre", "Abril", "Febrero", "Marzo", 
    "Febrero", "Abril", "Noviembre", "Noviembre", "Septiembre", "Abril", 
    "Enero", "Marzo", "Julio", "Mayo", "Febrero", "Febrero", "Agosto"
    )), class = "data.frame", row.names = c(NA, -54L))

The code for the app:

# Options for tabs

años <- c("2019", "2020", "2021")

meses <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Juno", "Julio",
           "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")

opciones <- c("L1","L2","L3","LA","LB","LC")

lugar <- list(L1=c("EXT","INT","LOC"), L2=c("NOM","KHA","POC"),
              L3= c("TMO", "MCR", "GNR"), LA=c("APV", "HOT", "ROR"),
              LB= c("GRU", "BOY", "POK"), LC=c("NOT", "LOX", "TAK"))

## App 

test_lugar <- tabPanel(
  titlePanel= "Test", 
  titlePanel(h5("Test")),
  sidebarLayout(    
    sidebarPanel(
      selectInput("año", "Año", choices=años,
                  selected= "2019"), 
      selectInput("mes", "Mes", choices=meses,
                  selected="Enero", multiple=TRUE),
      selectInput("opcion", "Opción",
                  choices=opciones, selected="L1"),
      selectInput("lugar", "Lugar", c(), multiple=TRUE) 
      ), 
    mainPanel(  
      #plotlyOutput("afluencia_lugar", height = "400px", width="1000px")
    )
  )
)


ui <- navbarPage(title = h5(strong("XXXX")),
                 theme = shinytheme("paper"),
                 test_lugar)

server <- function(input, output, session) {
  
  seleccionar_opcion_lugar <- eventReactive(input$opcion, {
    get("lugar")[[input$opcion]]
  })
  
  observe({print(seleccionar_opcion_lugar())})
  
  lugar_seleccionado <- 
  observeEvent(input$opcion, {
    req(seleccionar_opcion_lugar())
    choices <- unlist(seleccionar_opcion_lugar())
    updateSelectInput(session,"lugar", choices=choices,
                      selected=choices[1])
  }, ignoreNULL = FALSE)
  
 
### CODE FOR THE GRAPH 


lugar_mensual <- reactive({
    x%>%  
      dplyr::filter(año==input$año)%>%
        dplyr::filter(mes%in%input$mes)%>%
        dplyr::filter(opcion==input$opcion)%>%
        dplyr::filter(lugar%in%input$lugar())
        })
  
 
  output$afluencia_lugar <- renderPlotly({
   ggplot(data= lugar_mensual(), 
            aes(x=mes, y=numeros)) +
            labs(x="Fecha", y="Afluencia")+
            geom_col() +
            theme_minimal() +
            facet_wrap(~input$lugar)
 })



  
}

shinyApp(ui, server, options = list(launch.browser = TRUE)) 

Solution

  • You had a few issues. There was a typo, and you don't need lugar_seleccionado <- as you don't need to assign observeEvent. Also, you need to use plotly object in renderPlotly, just convert your ggplot object by using ggplotly. Lastly, in the facet_wrap(), you should use the variables present in the dataframe (say, lugar) which has already used the user input variable input$lugar to subset the required info. Try this

      # Options for tabs
    
      años <- c("2019", "2020", "2021")
    
      meses <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Juno", "Julio",
                 "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
    
      opciones <- c("L1","L2","L3","LA","LB","LC")
    
      lugar <- list(L1=c("EXT","INT","LOC"), L2=c("NOM","KHA","POC"),
                    L3= c("TMO", "MCR", "GNR"), LA=c("APV", "HOT", "ROR"),
                    LB= c("GRU", "BOY", "POK"), LC=c("NOT", "LOX", "TAK"))
    
      ## App
    
      test_lugar <- tabPanel(
        titlePanel= "Test",
        titlePanel(h5("Test")),
        sidebarLayout(
          sidebarPanel(
            selectInput("año", "Año", choices=años,
                        selected= "2019"),
            selectInput("mes", "Mes", choices=meses,
                        selected="Enero", multiple=TRUE),
            selectInput("opcion", "Opción",
                        choices=opciones, selected="L1"),
            selectInput("lugar", "Lugar", c(), multiple=TRUE)
          ),
          mainPanel(  DTOutput("t1"),
            plotlyOutput("afluencia_lugar", height = "400px")
          )
        )
      )
    
    
      ui <- navbarPage(title = h5(strong("XXXX")),
                       theme = shinytheme("paper"),
                       test_lugar)
    
      server <- function(input, output, session) {
    
        seleccionar_opcion_lugar <- eventReactive(input$opcion, {
          get("lugar")[[input$opcion]]
        })
    
        observe({print(as.character(input$año))})
    
        ## lugar_seleccionado <-
          observeEvent(input$opcion, {
            req(seleccionar_opcion_lugar())
            choices <- unlist(seleccionar_opcion_lugar())
            updateSelectInput(session,"lugar", choices=choices, selected=choices[1])
          }, ignoreNULL = FALSE)
    
        ### CODE FOR THE GRAPH
    
        lugar_mensual <- reactive({
          x %>%
            dplyr::filter(año %in% input$año)%>%
            dplyr::filter(mes %in% input$mes)%>%
            dplyr::filter(opciones %in% input$opcion)%>%
            dplyr::filter(lugar %in% input$lugar )
        })
    
        output$t1 <- renderDT(lugar_mensual())
        output$afluencia_lugar <- renderPlotly({
          p <- ggplot(data= lugar_mensual(),
                 aes(x=mes, y=numeros)) +
            geom_col() +
            labs(x="Fecha", y="Afluencia")+
            theme_minimal() +
            facet_wrap(~lugar)
          ggplotly(p)
        })
    
      }
    
      shinyApp(ui, server, options = list(launch.browser = TRUE))
    

    output