闪亮的r-如何在单击后禁用复选框组输入?

时间:2016-09-01 16:31:05

标签: r shiny

在闪亮的r?

中单击后,是否有办法禁用checkboxgroup元素

我试图弄清楚问题,但没有成功。我添加了我正在工作的复选框组。 谢谢你的帮助!

library(shiny)

shinyUI(fluidPage(
  checkboxGroupInput("a","A",choices = 1:7),
  tags$head(HTML(
    '
    <script type="text/javascript">
    document.getElementById("a").onclick = function(){
        document.getElementById("a").disabled=true;
    }
    </script>
    '
  ))
  ))

shinyServer(function(input, output, session) {
  

  })

2 个答案:

答案 0 :(得分:5)

您可以使用shinyjs包,它随附disable功能。您可以使用observeEvent触发禁用,其中事件是复选框值。使用shinyjs的唯一警告是在应用程序的ui中添加函数useShinyjs

library(shiny)

ui <- shinyUI(fluidPage(
  shinyjs::useShinyjs(),
  checkboxGroupInput("a","A",choices = 1:7)
))

server <- shinyServer(function(input, output, session) {
  observeEvent(input$a, shinyjs::disable("a"))
})

shinyApp(ui,server)

该软件包具有其他功能,例如enable可启用已禁用的元素,或toggleState可在启用/禁用状态之间切换元素。

从checkboxGroupInput

禁用单个复选框

disable shinyjs函数有一个选择器参数,可用于标识要禁用的元素而不使用它们的闪亮ID。我通过使用SelectorGadget确定传递给选择器的正确查询的方式。小工具给了一个不包括有光泽的,所以我添加了一个“B”复选框组,并且确实更改了ID以包含闪亮的ID“a”所以我相当自信这应该在添加更多元素到闪亮的应用程序后工作。知道选择器查询后,解决方案的其余部分将识别单击该组中复选框的标签,并构建要使用的disable函数的字符串。希望这会有所帮助。

library(shiny)

ui <- shinyUI(fluidPage(
  shinyjs::useShinyjs(),
  #original checkbox group
  checkboxGroupInput("a","A",choices = 1:7),
  #additional checkbox group to identify how to work around multiple groups
  checkboxGroupInput("b","B",choices = 1:7)
))

server <- shinyServer(function(input, output, session) {

  #initialize reactive values (will use to store selected boxes to identify newest selection)
  rv <- reactiveValues()
  #initialize selected boxes to NULL
  rv$selectedBoxes <- NULL 

  observeEvent(input$a, {
    #extract newest selection by identifying which values are in a that have not been previously selected
    newSelection <- input$a[which(!(input$a %in% rv$selectedBoxes))]
    #create object that identifies newly selected checkbox (syntax found using selectorgadget)
    subElement <- paste0("#a .checkbox:nth-child(", newSelection,") label")
    #disable single checkbox of group
    shinyjs::disable(selector=subElement)
    #store all selected checkboxes
    rv$selectedBoxes <- input$a
  })
})

shinyApp(ui,server)

答案 1 :(得分:0)

两件事:

tags$head(HTML(
    '
    <script type="text/javascript">
    document.getElementById("a").onclick = function(){
        document.getElementById("a").disabled=true;
    }
    </script>
    '
  ))

应该是:

tags$script(HTML(
    '
    document.getElementById("a").onclick = function(){
        document.getElementById("a").disabled=true;
    }
    '
  ))

这仍然无效,因为checkboxGroupInput没有onclick事件。如果您为"a"使用不同的HTML元素,则可以使用:

library(shiny)

shinyUI(fluidPage(
  actionButton("a","A"),
  tags$head(HTML(
    '
    document.getElementById("a").onclick = function(){
        document.getElementById("a").disabled=true;
    }
    '
  ))
  ))

shinyServer(function(input, output, session) {
  

  })