lucido di sliderInput
utilizza Ion.RangeSlider, che ha un onFinish
di callback per quando un utente rilascia il mouse. Sembra proprio quello di cui abbiamo bisogno.
Ecco un binding di input personalizzato per un input di scorrimento "pigro" che segnala solo un cambiamento di valore quando un utente rilascia il proprio mouse (onFinish
) o quando il cursore viene aggiornato forzatamente (onUpdate
).
Per l'esempio, ho appena inserito il codice che cambia il comportamento di ALL sliderInputs. Dovrai spostarlo su uno script esterno e personalizzare ulteriormente. Inoltre, onUpdate
viene chiamato quando lo slider viene inizializzato, ma prima che Shiny inizializzi i valori di input. Devi aspettare fino a quando Shiny lo fa per chiamare la callback della modifica del valore in onUpdate
. La soluzione in cui ho lavorato non è fantastica, ma ero troppo pigro per trovare un modo più pulito.
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)
bel pacchetto. In effetti, è la metà strada da percorrere per risolvere il pb ... – agenis
sì, sto immaginando se l'utente è interessato a ottenere esattamente quello che hanno richiesto, potrebbero probabilmente scavare nello script Java generato da questo codice. Ma è un po 'fuori dalla mia portata, per quanto riguarda il tempo di investigare. – creutzml
Questo pacchetto è stato scritto prima di ['debounce'] (https://shiny.rstudio.com/reference/shiny/1.0.4/debounce.html) e' throttle' sono stati aggiunti. Ora è facile debounce/throttle qualsiasi input - solo avvolgere il valore di input in un reattivo come 'debounce (reactive (input $ slider), 500)' –