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