LimitSlider

时间:2016-04-27 19:30:14

标签: input slider shiny jquery-ui-slider

我正在尝试为Shiny编写自定义输入小部件(在此之后:http://shiny.rstudio.com/articles/building-inputs.html),包装jQuery UI Limitslider(http://vanderlee.github.io/limitslider/) - 基本上,我想要一个包含3个节点的滑块对三角形分布进行参数化。我正在努力让Shiny“看到”改变事件。

这是我的 app.R 脚本:

library(shiny)

limitSlider <- function(id, label, a, b, c, min = a, max = b) {
   div(class = 'form-group shiny-input-container',
       tags$label(label),
         div(class = "ui-limitslider", 
             id = id,
             `data-a` = a,
             `data-b` = b,
             `data-c` = c,
             `data-min` = min,
             `data-max` = max)
   )
}

ui <- shinyUI(fluidPage(

  tags$head(
    tags$link(rel = "stylesheet", type = "text/css",
              href = "jquery-ui.css")
  ),

  tags$head(
    tags$link(rel = "stylesheet", type = "text/css",
              href = "limitslider.css")
  ),

  tags$head(
    tags$script(src = "jquery-ui.js")
  ),

  tags$head(
    tags$script(src = "limitslider.js")
  ),

  tags$head(
    tags$script(src = "limitslidershiny.js")
  ),

  tags$head(
    tags$script(src = "limitsliderinputbinding.js")
  ),

  titlePanel("Test Limit Slider"),

  sidebarLayout(
    sidebarPanel(
      limitSlider("test1", "Test 1:", a = 25, b = 110, c = 80,
                   min = 0, max = 200),
    ),
    mainPanel(
      tableOutput("values")
    )
  )
))


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

  sliderValues <- reactive({

    data.frame(
      Name  = c("test1"),
      Value = c(as.character(c(paste(input$test1, collapse = ' '))))
    )

  })

  output$values <- renderTable({
    sliderValues()
  })

})

# Run the application 
shinyApp(ui = ui, server = server)

正如您所看到的,我在顶部加载了一系列CSS和JS文件以使其工作 - 它们位于“www”目录中。这是我的 limitslidershiny.js 文件 - 我认为问题不在这里:

$(function() {

  $('.ui-limitslider').each(function(){

    // a,b,c correspond to the rtriangle function signature
    var a = $(this).data('a');
    var c = $(this).data('c');
    var b = $(this).data('b');

    // the rest of these correspond to the limitslider API
    var min = $(this).data('min');
    var max = $(this).data('max');

    $(this).limitslider({
      values: [a, c, b],
      gap: 0,
      label: true,
      min: min,
      max: max
    });
  });
});

这是我的 limitsliderinputbinding.js 脚本:

var limitSliderInputBinding = new Shiny.InputBinding();

$.extend(limitSliderInputBinding, {

  find: function(scope) {
    return $(scope).find(".ui-limitslider");
  },

  getValue: function(el) {
    return $(el).limitslider("values");  
  },

  setValue: function(el, values) {
    $(el).limitslider("values", values);
  },

  subscribe: function(el, callback) {
    $(el).on("slidechange.limitSliderInputBinding", function(e) {
      callback();
    });
  },

  unsubscribe: function(el) {
    $(el).off(".limitSliderInputBinding");
  }

});

Shiny.inputBindings.register(limitSliderInputBinding);

我认为,但不确定,问题出在 subscribe 属性中。

我正在使用jQuery UI v1.11.4。如果有人有任何提示或建议或事情要尝试,我欢迎帮助!

非常感谢!

1 个答案:

答案 0 :(得分:1)

好的,有些同事帮我解决了这个问题。事实证明,基于jQuery-UI构建的limitslider并没有带来改变&#34;函数初始化。所以,这些修复工作:

$(this).limitslider({
   values: [a, c, b],
   gap: 0,
   label: true,
   min: min,
   max: max,
   change: function(event, ui){}
})

我对 limitslidershiny.js 文件进行了修改。

事实证明,抛出的事件类型称为&#34; limitsliderchange&#34; (你可以通过执行console.log(event)来看到。)

因此,基于此,我对limitsliderinputbinding.js文件进行了以下更改:

subscribe: function(el, callback) {
  $(el).on("limitsliderchange.limitSliderInputBinding", function(e) {
    callback();
  });
}

......和取消订阅类似。