Я пытаюсь заставить блестящее приложение переключать цвета ввода слайдера при определенных условиях вместе с обновлением.Пример ниже демонстрирует несовершенную версию того, что я пытаюсь сделать.Он просто имеет ползунковый ввод и две кнопки.Две кнопки используют функцию updateSliderInput
для изменения некоторых свойств ползунка, затем я использую shinyjs
для добавления класса к ползунку, который вызывает изменение его цвета.
ui.R
library(shiny)
library(shinyjs)
shinyUI(fluidPage(
includeCSS('www/style.css'),
useShinyjs(),
sliderInput("slider",
"A slider",
min = 1,
max = 50,
value = 30),
actionButton('type1','type 1'),
actionButton('type2','type 2')
))
server.R
library(shiny)
library(shinyjs)
shinyServer(function(input, output,session) {
observeEvent(input$type1,{
updateSliderInput(session,
inputId = 'slider',
min = 0,
value = 10,
max = 20)
delay(3,{
removeClass(selector = '.js-irs-0', class = 'type2')
addClass(selector = '.js-irs-0', class = 'type1')
})
})
observeEvent(input$type2,{
updateSliderInput(session,
inputId = 'slider',
min = 0,
value = 20,
max = 40)
delay(3,{
removeClass(selector = '.js-irs-0', class = 'type1')
addClass(selector = '.js-irs-0', class = 'type2')
})
})
})
(файл www / css находится в конце вопроса, поскольку его содержание менее актуально)
В быстрой системе результаты выглядят хорошо, поскольку между выполнением строк имеется небольшая задержка.Однако, если я переключаюсь на более медленную машину, вы можете увидеть, что ползунок мигает обратно к своему первоначальному синему цвету при переключении между цветами, предоставляемыми type1
и type2
.Это происходит потому, что updateSliderInput
удаляет все классы, добавленные в слайдер вручную при применении его собственных обновлений.Я ищу способ предотвратить это.Я подозреваю, что это может быть сделано с помощью session$sendCustomMessage
или session$sendInputMessage
, но я пока не добился успеха.
Примечания: функция delay
была необходима, потому что без нее updateSliderInput
отменял измененияв исполнении addClass
.removeClass
не является строго необходимым, поскольку updateSliderInput
уже удаляет добавленные вручную классы, но я сохранил строку, поскольку исправление, возможно, будет включать в себя предотвращение updateSliderInput
этого.
Как и было обещано:
www / style.css
.type1 .irs-bar {
border-top-color: #8B1A1A;
border-bottom-color: #8B1A1A;
}
.type1 .irs-bar-edge {
border-color: #8B1A1A;
}
.type1 .irs-single, .type1 .irs-bar-edge, .type1 .irs-bar {
background: #8B1A1A;
}
.type2 .irs-bar {
border-top-color: #6959CD;
border-bottom-color: #6959CD;
}
.type2 .irs-bar-edge {
border-color: #6959CD;
}
.type2 .irs-single, .type2 .irs-bar-edge, .type2 .irs-bar {
background: #6959CD;
}