Вы уже проверили этот пакет - глянцевая обратная связь ?
Вы можете увидеть несколько примеров здесь .
Чтобы использовать несколько отзывов, вам следуетнапишите все условия в одном наблюдаемом событии - хотя мне не удалось заставить работать несколько отзывов.
Вот пример кода с этой страницы для множественных отзывов:
library(shiny)
library(shinyFeedback)
ui <- fluidPage(
useShinyFeedback(), # include shinyFeedback
numericInput(
"multiFeedbacks",
"1 is scary 2 is dangerous",
value = 1
)
)
server <- function(input, output) {
observeEvent(input$multiFeedbacks, {
feedbackWarning(
inputId = "multiFeedbacks",
condition = input$multiFeedbacks >= 1,
text = "Warning 1 is a lonely number"
)
feedbackDanger(
inputId = "multiFeedbacks",
condition = input$multiFeedbacks >= 2,
text = "2+ is danger"
)
})
}
shinyApp(ui, server)
Другой вариант - использовать пакет smoothjs , где вы можете запустить java-скрипти отправьте css-код в браузер.Вы должны поместить useShinyjs () в панель инструментов тела.Класс "irs-bar" используется для всех ползунков в блестящем, поэтому, если вы хотите, чтобы поведение было только на определенном слайдере, вам придется адаптировать селектор css (.irs-bar).(См. Следующий пример).Вот небольшой пример того, как вы могли бы достичь желаемого поведения:
library(shiny)
library(shinydashboard)
library(shinyjs)
ui <- dashboardPage(skin = "black",
dashboardHeader(title = "test"),
dashboardSidebar(
sidebarMenu(
menuItem("Complete", tabName = "comp"))),
dashboardBody(
shinyjs::useShinyjs(),
tabItems(
tabItem(tabName = "comp",
fluidRow(
sliderInput("range_var", "", value = c(90,100), min = 0, max = 100, width = '200%'))))))
server <- function(input, output, session) {
observeEvent(input$range_var, {
if (input$range_var[1] <= 40) {
runjs(paste0('$(".irs-bar").css("background-color"," red")'))
}
if (input$range_var[1] > 40 & input$range_var[1] < 60) {
runjs(paste0('$(".irs-bar").css("background-color"," blue")'))
}
if (input$range_var[1] > 60 & input$range_var[1] < 100) {
runjs(paste0('$(".irs-bar").css("background-color"," green")'))
}
})
}
shinyApp(ui, server)
В следующем примере показано, как стилизовать только один конкретный sliderInput.SliderInputs помещается в 2 деления с идентификаторами.В функции runjs селектор css адаптирован для стиля только первого sliderInput.
library(shiny)
library(shinydashboard)
library(shinyjs)
ui <- dashboardPage(skin = "black",
dashboardHeader(title = "test"),
dashboardSidebar(
sidebarMenu(
menuItem("Complete", tabName = "comp"))),
dashboardBody(
shinyjs::useShinyjs(),
tabItems(
tabItem(tabName = "comp",
fluidRow(
div(id="range_var_css",
sliderInput("range_var", "", value = c(90,100), min = 0, max = 100, width = '200%')
),
div(id="range_var_css1",
sliderInput("range_var1", "", value = c(90,100), min = 0, max = 100, width = '200%')
)
))))
)
server <- function(input, output, session) {
observeEvent(input$range_var, {
if (input$range_var[1] <= 40) {
runjs(paste0('$("#range_var_css .irs-bar").css("background-color"," red")'))
}
if (input$range_var[1] > 40 & input$range_var[1] < 60) {
runjs(paste0('$("#range_var_css .irs-bar").css("background-color"," blue")'))
}
if (input$range_var[1] > 60 & input$range_var[1] < 100) {
runjs(paste0('$("#range_var_css .irs-bar").css("background-color"," green")'))
}
})
}
Чтобы полностью настроить sliderInput на нужный вам цвет, вы также должны изменить css для border-bottom и border-вверху ползунка, примерно так:
if (input$range_var[1] <= 40) {
runjs(paste0('$("#range_var_css .irs-bar").css({
"background-color": "red",
"border-top": "1px solid red",
"border-bottom": "1px solid red"})'))
}