闪亮的滑块限制了释放鼠标左键的反应

Pis*_*a46 13 r widget slider mouseevent shiny

我正在使用一个Shiny应用程序,可能需要一些时间才能将滑块设置为正确的值.

因此,在尝试将滑块设置为正确的值(而不是释放我的鼠标左键!)时(即我的本地)服务器观察到几个新值并做出相应的反应.

由于我的服务器对任何新值的响应可能需要几秒钟,我会很高兴,如果我可以:

  • 推迟发信号通知服务器,直到释放鼠标左键,或
  • 在服务器端,如果收到新值,则中止任何先前的响应

gre*_*g L 6

Shiny'ssliderInput使用Ion.RangeSlideronFinish当用户释放鼠标时,它有一个回调。这听起来正是我们所需要的。

这是“惰性”滑块输入的自定义输入绑定,仅在用户松开鼠标 ( onFinish) 或滑块被强制更新 ( onUpdate)时才发出值更改的信号。

例如,我只是内联了更改所有滑块输入行为的代码。您需要将其移至外部脚本并进一步自定义。此外,onUpdate在滑块初始化时调用,但在 Shiny 初始化输入值之前调用。您必须等到 Shiny 执行此操作才能调用onUpdate. 我使用的解决方案并不出色,但我懒得找到更干净的方法。

library(shiny)

ui <- fluidPage(
  tags$head(
    tags$script(HTML("
      (function() {
        var sliderInputBinding = Shiny.inputBindings.bindingNames['shiny.sliderInput'].binding;

        var lazySliderInputBinding = $.extend({}, sliderInputBinding, {
          subscribe: function(el, callback) {
            var $el = $(el);
            var slider = $el.data('ionRangeSlider');

            var handleChange = function() {
              if (!inputsInitialized) return;
              callback(!$el.data('immediate') && !$el.data('animating'));
            };

            slider.update({
              onUpdate: handleChange,
              onFinish: handleChange
            });
          },

          unsubscribe: function(el, callback) {
            var slider = $(el).data('ionRangeSlider');
            slider.update({
              onUpdate: null,
              onFinish: null
            });
          }
        });

        Shiny.inputBindings.register(lazySliderInputBinding, 'shiny.lazySliderInput');

        var inputsInitialized = false;
        $(document).one('shiny:connected', function() {
          inputsInitialized = true;
        });
      })();
    "))
  ),
  sliderInput("sliderA", "A", 0, 10, 5),
  uiOutput("sliderB"),
  verbatimTextOutput("sliderValues"),
  actionButton("resetSliders", "Reset Sliders")
)

server <- function(input, output, session) {
  observeEvent(input$resetSliders, {
    updateSliderInput(session, "sliderA", value = 5)
    updateSliderInput(session, "sliderB", value = c(4, 6))
  })

  output$sliderB <- renderUI({
    sliderInput("sliderB", "B", 0, 10, c(4, 6))
  })

  output$sliderValues <- renderPrint({
    cat(paste("Slider A =", input$sliderA), "\n")
    cat(paste("Slider B =", paste(input$sliderB, collapse = " ")))
  })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)


cre*_*zml 5

好吧,经过一番挖掘,我想我找到了解决方案.看起来最干净的方法是在不需要乱用Java脚本的情况下,使用shinyCustom具有useShinyCustomcustomSliderInput功能的包.使用这些,您可以将反应性设置为"去抖"并且还会延迟延迟时间.如果您要同时使用这些选项,您应该能够找到最佳位置,仅在滑块停止移动时更新输出.它不会是一个完美的"鼠标按钮释放;" 但它应该非常接近!

例如,您可以尝试以下方法:

# Slider delay type is actually "debounce" by default 
useShinyCustom(slider_delay = "500"), # Doubles the default delay time in ms
customSliderInput("bins", #Use customSliderInput instead of sliderInput
              "Number of bins:",
              min = 1,
              max = 50,
              value = 30)
Run Code Online (Sandbox Code Playgroud)

  • 这个包是在[`debounce`](https://shiny.rstudio.com/reference/shiny/1.0.4/debounce.html)之前编写的,并添加了"throttle".现在很容易对任何输入进行去抖动/限制 - 只需将输入值包装成像'去抖动(反应(输入$滑块),500)的反应值. (3认同)