7

My shiny app has a sliderInput, but want to replace values as character labels. How could I implement it? Thanks for any suggestions.

This is my example code:

library(shiny)
values <- as.factor(c('Label 1', 'Label 3', 'Label 3'))
ui <- shinyUI(bootstrapPage(
    headerPanel("test"),
    sliderInput("foo", "Animation duration", 
                min = 1,
                max = length(values), 
                value = values)
))

server <- shinyServer(function(input, output, session) {
})

shinyApp(ui = ui, server = server)
Bangyou
  • 9,462
  • 16
  • 62
  • 94
  • What is the second line doing? Converting character vectors to dates? That does not work. – Gopala Feb 01 '16 at 01:56
  • @Gopala. Sorry I have fixed the wrong codes – Bangyou Feb 01 '16 at 01:57
  • If you are really trying to use categorical inputs, you should use selectInput (drop down) or radio buttons. Slider input is really for numeric values, and trying to fit character labels is not the way it is designed to work. – Gopala Feb 01 '16 at 02:04
  • I understand selectInput is another option, but prefer to use sliderInput in this case. IonRangeSlider, shiny used, can show character in slider. So I think we can do the same thing in shiny, but just not sure how to implement it (May need to write some js script). – Bangyou Feb 01 '16 at 02:08
  • Probably....I can't be of help on that since I have not used custom JS in Shiny. – Gopala Feb 01 '16 at 02:09
  • Thanks for your help anyway. – Bangyou Feb 01 '16 at 02:10
  • 2
    See my answer here: http://stackoverflow.com/questions/30502870/shiny-slider-on-logarithmic-scale . Basically change the `.update({'values':vals})` to the array of values you want. I just tried changing `vals` to `['one', 'two', 'three', 'four' ,'five']` and it worked. – DeanAttali Feb 01 '16 at 07:48
  • @daattali Thanks for your help. It points me to the right direction. – Bangyou Feb 01 '16 at 11:58

2 Answers2

4

This can be easily done using sliderTextInput function in shiny. No need to add all this complex js function. Just a few lines of code will do the trick.Install the shinywidgets package which contains the sliderTextInput function. Do the following :

  sliderTextInput("foo","Animation Duration" , 
                  choices = c("Label 1", "Label 3", "Label 3"), 
                  selected = c("Label 1", "Label 3", "Label 3"), #incase you want all values by default 
                  animate = FALSE, grid = FALSE, 
                  hide_min_max = FALSE, from_fixed = FALSE,
                  to_fixed = FALSE, from_min = NULL, from_max = NULL, to_min = NULL,
                  to_max = NULL, force_edges = FALSE, width = NULL, pre = NULL,
                  post = NULL, dragRange = TRUE)
Ankit Daimary
  • 148
  • 1
  • 6
3

Thanks @daattli for pointing me the right direction and letting me know how to use js to change the shiny element.

I have implemented a solution to change labels of sliderInput and a selectInput to switch different values (and length). I think this feature should be implemented into shiny which uses ionRangeSlider.

Please improve my codes if you think there is a better way to implement it, as it is my first js script.

library(shiny)
values <- list(A = c('A1', 'A2', 'A3'),
               B = c('B1', 'B2', 'B3', 'B4'))

ui <- shinyUI(bootstrapPage(
    selectInput('selection', 'selection', c('A',  'B'), 'A'),
    uiOutput('selectUI'),
    sliderInput(inputId = "target", label = "Target",
                min = 0, max = length(values$A) - 1,
                step = 1,
                value = length(values$A) - 1),
    verbatimTextOutput('summary')
))

server <- shinyServer(function(input, output, session) {
    output$summary <- renderPrint({
        print(input$target)
        print(values[[input$selection]][input$target + 1])
    })
    output$selectUI <- renderUI({

        sel_values <- paste(paste0('"', values[[input$selection]], '"'), collapse = ',')
        print(sel_values)
        list(
            (HTML(
                sprintf('
                        <script type="text/javascript">
                        $(document).ready(function() {
                        var vals = [%s];
                        $(\'#target\').data(\'ionRangeSlider\').update(
                        {values:vals,
                        min: 0,
                        max: %s,
                        from:%s})
                        })
                        </script>
                        ', sel_values, 
                        length(values[[input$selection]]) - 1,
                        length(values[[input$selection]]) - 1)))
        )}
    )}
)

shinyApp(ui = ui, server = server)
tospig
  • 7,762
  • 14
  • 40
  • 79
Bangyou
  • 9,462
  • 16
  • 62
  • 94