更改Shiny滑块以使用自定义javascript表示分类/字符串功能

时间:2016-11-29 18:18:21

标签: javascript r loops shiny categorical-data

我正在尝试创建一个代表一年中几个月的Shiny滑块。理想情况下,我希望将月份显示为字符串/字符而不是整数(其中1 = 1月,2 = 2月等)。

我找到this question,这导致我this answer允许字符显示在Shiny滑块上。它将JS代码插入到R.

当我尝试更改上面的答案以适合我的示例时,我可以正确显示月份名称,但我认为JS代码中的循环存在问题。而不是1对应的值为1,它对应的值为0.我相信这是JS索引从0开始的结果,而R索引来自1.但我只是JS的新手,所以我'我不知道如何纠正这个问题,以便我的滑块正确显示1s作为1月等。作为一个说明,再次,我是一个JS新手,所以我在这里提供的代码被改为一些简单的工作,可能有很大的提升空间!我只是在给出这个例子。

library(shiny)

JScode <-
  "$(function() {
setTimeout(function(){
var vals = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
for (i = 1; i >= vals.length; i++) {
var val = (1,12);
vals.push(val);
}
$('#month').data('ionRangeSlider').update({'values':vals})
}, 12)})"

runApp(shinyApp(
  ui = fluidPage(
    tags$head(tags$script(HTML(JScode))),

    sliderInput("month",
                "Month:",
                min = 1,
                max = 12,
                value = 1,
                step = 1,
                width = "100%")
  ),
  server = function(input, output, session) {

    observeEvent(input$month, {
      print(input$month)
    })
  }
))

上面的代码导致: enter image description here

我的滑块设置为1,因此自动显示应该是1月。相反,它是在二月。

任何补救措施?我相信这个问题存在于JS循环中,但我整天都在修改它并找不到解决方案。

2 个答案:

答案 0 :(得分:2)

使用闪亮的 sliderTextInput 函数可以轻松完成此操作。无需添加所有这些复杂的js函数。仅需执行几行代码即可。安装包含 sliderTextInput 函数的 shinywidgets 软件包。执行以下操作:

  sliderTextInput("Month","Select Month" , 
                  choices = c("January", "February", "March", "April" #Add more months), 
                  selected = c("January", "February", "March", "April"), #if you want any default values 
                  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)

答案 1 :(得分:1)

我认为这取决于你的代码下一步要做什么,而只是让视觉效果显示1月作为第一个月:

在R代码中将min设置为0,max设置为11,将值设置为0

sliderInput("month",
                "Month:",
                min = 0,
                max = 11,
                value = 0,
                step = 1,
                width = "100%")
  ),