简体   繁体   中英

Update slider with dataset min and max values

Consider this dummy example. I have two different datasets that I need to plot two different graphs. The slider has been set to show the range of years of the "First" graphic and "table" , however, my second dataset (table2) has a different range of years. How can I update the slider to automatically update itself to the range of years of my second graphic? I have read quite a lot about updateSliderInput but can't figure it out. Here is my example

library(shiny)
library(ggplot2)

# Define input choices
type <- c("first", "second")
# Data for lambda
table <- structure(list(year = 1991:2010, lambda = c(
  0.68854, 0.75545,
  1.63359, 1.22282, 1.70744, 1.09692, 0.51159, 1.3904, 1.09132,
  0.59846, 0.43055, 0.80135, 0.69027, 0.65646, 0.95485, 1.04818,
  0.67859, 1.00461, 1.16665, 1.28203
)), row.names = c(NA, -20L), class = "data.frame")

table2 <- structure(list(year = 1991:2005, lambda = c(0.68854, 0.75545, 
          1.63359, 1.22282, 1.70744, 1.09692, 0.51159, 1.3904, 1.09132, 
          0.59846, 0.43055, 0.80135, 0.69027, 0.65646, 0.95485)), row.names = c(NA, 
          15L), class = "data.frame")

ui <- fluidPage(
  sidebarPanel(
    h3(""),
    
    # Dropdown to select the desired kind of graphic
    selectInput(
      inputId = "graphtype",
      label = "Graphic",
      choices = type,
      selected = "first"),
    #Slider to select custom years
    sliderInput(inputId = "Yearslider",
                label="Years to plot",
                sep="",
                min=1991,
                max=2010,
                value=c(1991,2010))),
  mainPanel(
    plotOutput("plot")
  )
)
######################################################
#When "second" graph is selected from dropdown I want the slider to update itself
#to reflect the min and max year eg. 1991 to 2005.

server<- function (input, output, session) {
  session$onSessionEnded(function() {
    stopApp()
  })
  
  plot_data <- reactive({
    table[table$year >= input$Yearslider[1] & table$year <= input$Yearslider[2], ] 
  })
  
  plot_data2 <- reactive({
    table2[table2$year >= input$Yearslider[1] & table2$year <= input$Yearslider[2], ] 
  })
  
  dataInput <- reactive({
    switch(input$graphtype,
           "first" = plot_data(),
           "second" = plot_data2())
  })
           
  # Plot data
  create_plots <- reactive({
    #Make the plots
      theme_set(theme_classic(14)) 
      xlabels <- 1991:2010
      if (input$graphtype == "first") {
        disable("Fixed")
        ggplot(plot_data(),aes(year,lambda)) + geom_line(size=1.5,colour="blue") + 
          geom_point(colour="orange",size=4) + geom_hline(yintercept=1,color="hotpink",linetype="dashed") +
          scale_x_continuous("",breaks = xlabels) + 
          theme(axis.text.x = element_text(angle = 45, vjust = 0.5)) + 
          labs(x="",y=expression("Lambda ("~lambda *")"),
               title= paste0("Fish migration ", 
                             table[table$year >= input$Yearslider[1] & table$year <= input$Yearslider[2], ]))
      }
     else{
       ggplot(plot_data2(),aes(year,lambda)) + geom_line(size=1.5,colour="red") + 
         geom_point(colour="orange",size=4) + geom_hline(yintercept=1,color="blue",linetype="dashed") +
         scale_x_continuous("",breaks = xlabels) + 
         theme(axis.text.x = element_text(angle = 45, vjust = 0.5)) + 
         labs(x="",y=expression("Lambda ("~lambda *")"),
              title= paste0("Fish Migration ", 
              table2[table2$year >= input$Yearslider[1] & table2$year <= input$Yearslider[2], ]))
     }
      
  }) 
  
  #Render plots
  output$plot <- renderPlot({
    create_plots()
  },height = 475)
  }         
           
shinyApp(ui = ui, server = server) 

The plot stops at 2005 so the slider has been hardcoded to max year 2010. It needs to be updated to reflect 2005 as the max year for this particular plot. Thanks beforehand. 在此处输入图像描述

Try this on the server side

observe({
    if (input$graphtype == "first") {
      min = min(table$year)
      max = max(table$year)
    }else{
      min = min(table2$year)
      max = max(table2$year)
    }
    updateSliderInput(session, "Yearslider", min=min, max=max, value=c(min,max))
  })

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM