Shiny na sliderInput
wykorzystuje Ion.RangeSlider, która ma onFinish
zwrotnego dla kiedy użytkownik zwolni ich myszy. To brzmi jak to, czego potrzebujemy.
Oto niestandardowe powiązanie wejścia dla "leniwego" wejścia suwaka, które sygnalizuje zmianę wartości tylko wtedy, gdy użytkownik zwolni swoją mysz (onFinish
) lub gdy suwak zostanie zmieniony na siłę (onUpdate
).
Dla przykładu, właśnie napisałem kod, który zmienia zachowanie ALL sliderInputs. Będziesz chciał przenieść to do zewnętrznego skryptu i dostosować dalej. Ponadto, onUpdate
zostaje wywołany po zainicjowaniu suwaka, ale zanim Shiny zainicjuje wartości wejściowe. Musisz poczekać, aż Shiny zrobi to, aby wywołać wywołanie zmiany wartości w onUpdate
. Rozwiązanie, w którym pracowałem, nie jest fantastyczne, ale byłem zbyt leniwy, aby znaleźć czystszy sposób.
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)
fajny pakiet. Rzeczywiście, jest to połowa drogi do rozwiązania pb ... – agenis
tak, wyobrażam sobie, że jeśli użytkownik jest zainteresowany uzyskaniem dokładnie tego, o co prosił, prawdopodobnie mogliby zagłębić się w skrypt Java wygenerowany przez ten kod. Ale jest to trochę poza moim zasięgiem, jeśli chodzi o czas potrzebny na zbadanie sprawy. – creutzml
Ten pakiet został napisany przed dodaniem ['debounce'] (https://shiny.rstudio.com/reference/shiny/1.0.4/debounce.html) i' przepustnicy'. Teraz łatwo jest wydłubać dowolne wejście - wystarczy owinąć wartość wejściową w reaktywny jak np. 'Debounce (reaktywny (input $ slider), 500)' –