'Shiny R - Drop down list constantly resets to first in list when using observeEvent and updateVarSelection
When using observe event and update var selection it resets every time to top in drop down list
I have a very large data set, when one unit is selected it filters the dataset so the next drop down list only contains parameters related to that unit to plot. This works except that the drop down list refreshes on all inputs not just the changing of the unit, I want it to refresh only when the unit is changed. ie the drop down list becomes unit a temperature, unit a pressure, unit a level etc when unit a is selected. unit b temperature, unit b pressure etc.
However, if I chose unit b the drop down list becomes unit b temperature, unit b temperature etc with the temperature being the first in the list and automatically shown on the chart, if I click on the drop down list and chose pressure, the chart will briefly show the pressure but then apparently the observe event is triggered, the list resets itself and defaults back to temperature
some portions of code summerized for clarity and not here word for word
# Define UI for application that plots User Input and filtered data
ui <- navbarPage( "Viewer",
tabPanel("Chart" , plotOutput(outputId = "newPlot"),
box(selectInput("Unit", "Chose Unit",c(a,b,c),selected = NULL)),
box(varSelectInput("Parameter", "Select the Parameter
to Plot:",TracePlot, selected = NULL )),
))
# Define server logic
server <- function(input, output,session) { output$newPlot <-
renderPlot({
TracePlot<-filters on unit selected (input$Unit)
observeEvent(input$Unit, updateVarSelectInput(session,"Parameter",
"Select the Parameter to Plot:", TracePlot,selected = NULL) )
ggplot(Trace, aes_string(y=input$Parameter, x=input$Batch_Or_Step)) +
geom_point()
})
}
# Run the application
shinyApp(ui = ui, server = server)
Solution 1:[1]
Your code hase several issues:
- Reproducibility: Try to run your code snippet in a refreshed R session before posting
- your alternatives in the unit selector are missing
- you've used a comma at the end of your ui
- You did not define variable
Trace
- Any example data are missing to help you directly with your code. That's necessary as
varSelectInput
requires data
- You cannot use
TracePlot
in ui, so userenderUI
- Reactivity: You do not need to use
observeEvent
insiderenderPlot
as it's reactive already. Instead, useinput$Unit
directly or to update data based oninput$Unit
, call a reactive variable created before. updateVarSelectInput
is redundant if you use the reactive value invarSelectInput("Parameter", ...)
already. If you want to updateselected
, you are probably better off withobserve()
outside ofrenderPlot
Try this one as a start, I explained what I've changed
library(shiny)
library(ggplot2)
# Define UI for application that plots User Input and filtered data
ui <- navbarPage(
"Viewer",
tabPanel(
"Chart" ,
plotOutput(outputId = "newPlot"),
box(selectInput("Unit", "Chose Unit", c("a","b","c"), selected = NULL)),
# uiOutput to render selectInput/varSelectInput in server session using
# reactive Values
box(uiOutput("selectParameter"))
)
)
# Define server logic
server <- function(input, output,session) {
# create reactive
TracePlot <- reactiveValues()
# update reactive with your filter
observe({
# Do your filtering here and save to TracePlot$filter
TracePlot$filter <- input$Unit
})
# From ui to server with renderUI - change to varSelectInput again if data
# provided
output$selectParameter <- renderUI({
req(TracePlot$filter)
selectInput(
"Parameter",
"Select the Parameter to Plot:",
input$Unit,
selected = NULL
)
})
# cannot plot without data and Trace
output$newPlot <- renderPlot({
req(TracePlot$filter)
#ggplot(Trace, aes_string(y=input$Parameter, x=input$Batch_Or_Step)) +
#geom_point()
})
}
# Run the application
shinyApp(ui = ui, server = server)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | NelsonGon |