R Shiny Make the slider value dynamic

I have a dropdown selector and a slider bar. I want to display a graph with a drop down selector being the data source. - This part works for me

I just want the max value. the slider changed depending on the selected data set.

Any suggestions?

server.R

library(shiny) shinyServer(function(input, output) { source("profile_plot.R") load("test.Rdata") output$distPlot <- renderPlot({ if(input$selection == "raw") { plot_data <- as.matrix(obatch[1:input$probes,1:36]) } else if(input$selection == "normalised") { plot_data <- as.matrix(eset.spike[1:input$probes,1:36]) } plot_profile(plot_data, treatments = treatment, sep = TRUE) }) }) 

ui.R library (brilliant)

 shinyUI(fluidPage( titlePanel("Profile Plot"), sidebarLayout( sidebarPanel(width=3, selectInput("selection", "Choose a dataset:", choices=c('raw', 'normalised')), hr(), sliderInput("probes", "Number of probes:", min = 2, max = 3540, value = 10) ), mainPanel( plotOutput("distPlot") ) ) )) 
+7
r shiny shiny-server
source share
4 answers

Hope this post helps someone learn Brilliant:

The information in the answers is useful conceptually and mechanically, but does not answer the general question.

So, the most useful function I found in the interface API is conditionalPanel() here

This means that I can create a slider function for each loaded dataset and get the maximum value by loading the data initially in global.R . For those who don’t know, objects loaded in global.R can reference ui.R

global.R - loads test data objects and objects (eset.spike and obatch) into ggplo2

 source("profile_plot.R") load("test.Rdata") 

server.R -

 library(shiny) library(shinyIncubator) shinyServer(function(input, output) { values <- reactiveValues() datasetInput <- reactive({ switch(input$dataset, "Raw Data" = obatch, "Normalised Data - Pre QC" = eset.spike) }) sepInput <- reactive({ switch(input$sep, "Yes" = TRUE, "No" = FALSE) }) rangeInput <- reactive({ df <- datasetInput() values$range <- length(df[,1]) if(input$unit == "Percentile") { values$first <- ceiling((values$range/100) * input$percentile[1]) values$last <- ceiling((values$range/100) * input$percentile[2]) } else { values$first <- 1 values$last <- input$probes } }) plotInput <- reactive({ df <- datasetInput() enable <- sepInput() rangeInput() p <- plot_profile(df[values$first:values$last,], treatments=treatment, sep=enable) }) output$plot <- renderPlot({ print(plotInput()) }) output$downloadData <- downloadHandler( filename = function() { paste(input$dataset, '_Data.csv', sep='') }, content = function(file) { write.csv(datasetInput(), file) } ) output$downloadRangeData <- downloadHandler( filename = function() { paste(input$dataset, '_', values$first, '_', values$last, '_Range.csv', sep='') }, content = function(file) { write.csv(datasetInput()[values$first:values$last,], file) } ) output$downloadPlot <- downloadHandler( filename = function() { paste(input$dataset, '_ProfilePlot.png', sep='') }, content = function(file) { png(file) print(plotInput()) dev.off() } ) }) 

ui.R

 library(shiny) library(shinyIncubator) shinyUI(pageWithSidebar( headerPanel('Profile Plot'), sidebarPanel( selectInput("dataset", "Choose a dataset:", choices = c("Raw Data", "Normalised Data - Pre QC")), selectInput("sep", "Separate by Treatment?:", choices = c("Yes", "No")), selectInput("unit", "Unit:", choices = c("Percentile", "Absolute")), wellPanel( conditionalPanel( condition = "input.unit == 'Percentile'", sliderInput("percentile", label = "Percentile Range:", min = 1, max = 100, value = c(1, 5)) ), conditionalPanel( condition = "input.unit == 'Absolute'", conditionalPanel( condition = "input.dataset == 'Normalised Data - Pre QC'", sliderInput("probes", "Probes:", min = 1, max = length(eset.spike[,1]), value = 30) ), conditionalPanel( condition = "input.dataset == 'Raw Data'", sliderInput("probes", "Probes:", min = 1, max = length(obatch[,1]), value = 30) ) ) ) ), mainPanel( plotOutput('plot'), wellPanel( downloadButton('downloadData', 'Download Data Set'), downloadButton('downloadRangeData', 'Download Current Range'), downloadButton('downloadPlot', 'Download Plot') ) ) )) 
+4
source share

As @Edik noted, the best way to do this is to use a function like update.. It seems that updateSliderInput does not allow you to control the range, so you can try using renderUI on the server side:

 library(shiny) runApp(list( ui = bootstrapPage( numericInput('n', 'Maximum of slider', 100), uiOutput("slider"), textOutput("test") ), server = function(input, output) { output$slider <- renderUI({ sliderInput("myslider", "Slider text", 1, max(input$n, isolate(input$myslider)), 21) }) output$test <- renderText({input$myslider}) } )) 
+4
source share

I think you are looking for the updateSliderInput function, which allows you to programmatically update the brilliant input: http://shiny.rstudio.com/reference/shiny/latest/updateSliderInput.html . Similar functions exist for other inputs.

  observe({ x.dataset.selection = input$selection if (x.dataset.selection == "raw") { x.num.rows = nrow(obatch) } else { x.num.rows = nrow(eset.spike) } # Edit: Turns out updateSliderInput can't do this, # but using a numericInput with # updateNumericInput should do the trick. updateSliderInput(session, "probes", label = paste("Slider label", x.dataset.selection), value = c(1,x.num.rows)) }) 
+2
source share

Another alternative would be to use the renderUI approach, as described in one example of a brilliant gallery:

http://shiny.rstudio.com/gallery/dynamic-ui.html

+2
source share

All Articles