首页 > 解决方案 > R Shiny:如何通过复选框禁用/启用滑块?

问题描述

以下代码生成了一个包含三个滑块和三个复选框的示例。

如果勾选了一个复选框,则应禁用下面的滑块。这意味着滑块不应再修改所选值。

此外,所有滑块值的总和不应超过最大值,在本例中为 10。

library(shiny)

u <- shinyUI(fluidPage(
    titlePanel("title panel"),
    sidebarLayout(position = "left",
                  sidebarPanel("sidebar panel",
                               checkboxInput("check1", "disable/enable", value = T),
                               sliderInput("slider1","value 1",min=1,max=10,value=3),
                               checkboxInput("check2", "disable/enable", value = F),
                               sliderInput("slider2","Value 2",min=1,max=10,value=3),
                               checkboxInput("check3", "disable/enable", value = F),
                               sliderInput("slider3","Value 3",min=1,max=10,value=3)
                  ),
                  mainPanel("main panel")
                  )))

s <- shinyServer(function(input, output){})
shinyApp(u,s)

标签: rcheckboxshinyslider

解决方案


也许这将满足您的需求

u <- fluidPage(
                useShinyjs(),
                sidebarPanel("sidebar panel",
                             checkboxInput("check1", "disable/enable", value = F),
                             uiOutput("slidr1"),
                             checkboxInput("check2", "disable/enable", value = F),
                             uiOutput("slidr2"),
                             checkboxInput("check3", "disable/enable", value = F),
                             uiOutput("slidr3")
                ),
                mainPanel("main panel")

)

s <- function(input, output, session){
  
  output$slidr1 <- renderUI({
    sliderInput("slider1","Value 1",min=1,max=8,value=3)
  })
  
  output$slidr2 <- renderUI({
    req(input$slider1)
    max2 <- reactive({9-(input$slider1 )})
    sliderInput("slider2","Value 2",min=1,max=max2(),value=3)
  })
  
  output$slidr3 <- renderUI({
    req(input$slider1,input$slider2)
    max3 <- reactive({10-(input$slider1 + input$slider2)})
    sliderInput("slider3","Value 3",min=1,max=max3(),value=3)
  })
  
  
  # Want the initial state of this button to be disabled?
  #shinyjs::disable(id="slider1")
  observeEvent(input$check1,{
    if (input$check1) shinyjs::disable(id="slider1")  
    else shinyjs::enable(id="slider1") 
  })
    
  observeEvent(input$check2,{
    if (input$check2) shinyjs::disable(id="slider2")  
    else shinyjs::enable(id="slider2") 
  })
  
  observeEvent(input$check3,{
    if (input$check3) shinyjs::disable(id="slider3") 
    else shinyjs::enable(id="slider3") 
  })
  
}

shinyApp(ui=u, server=s)

推荐阅读