checkboxGroupInput与checkboxInput行为

时间:2017-01-09 11:40:24

标签: r shiny

我有一个checkboxGroupInput,但我希望有checkboxInput行为。我希望有独立的反应函数,只有当您(联合国)勾选ab时才会激活。这可以通过单独checkboxInput s轻松实现,但不能在checkboxGroupInput内完成。

ui <- shinyUI(pageWithSidebar(
    headerPanel("checkboxGroupInput"),
    sidebarPanel(
        checkboxGroupInput('sources',
                           label='Sources',
                           choices=list('a'='a',
                                        'b'='b')),
        checkboxInput('a',
                      'a'),
        checkboxInput('b',
                      'b')
    ),
    mainPanel(
        # empty
    )
))

server <- shinyServer(function(input, output) {
    thingy <- reactive({
        return('a' %in% input$sources)
    })
    observeEvent(thingy(), {
        print("I'm here (a+b)")
    })
    observeEvent(input$a, {
        print("I'm here (a only)")
    })
    observeEvent(input$b, {
        print("I'm here (b only)")
    })

})

shinyApp(ui=ui,server=server) 

我在上面的示例中尝试的是存储布尔值a是否在checkboxGroupInput中。即使值保持TRUE(即重复点击b),thingy()仍会被激活。

1 个答案:

答案 0 :(得分:1)

您可以将每个复选框存储在reactiveValue中。见代码。

 ui <- shinyUI(pageWithSidebar(
  headerPanel("checkboxGroupInput"),
  sidebarPanel(
    checkboxGroupInput('sources',
                       label='Sources',
                       choices=list('a'='a',
                                    'b'='b')),
    checkboxInput('a',
                  'a'),
    checkboxInput('b',
                  'b')
  ),
  mainPanel(
    # empty
  )
))

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

  rv <- reactiveValues(a=FALSE, b=FALSE) 

  observe( {
    is.a <- 'a' %in% input$sources 
    if (  rv$a != is.a){
      rv$a <- is.a
    } 
    is.b <- 'b' %in% input$sources 
    if (  rv$b != is.b){
      rv$b <- is.b
    }  
  })   

  # thingy <- reactive({
  #     return('a' %in% input$sources)
  # })
  # observeEvent(thingy(), {
  #     print("I'm here (a+b)")
  # })
  # 

  observeEvent(rv$a, {
    print("a only")
  })

  observeEvent(rv$b, {
    print("b only")
  }) 

  observeEvent(input$a, {
    print("I'm here (a only)")
  })

  observeEvent(input$b, {
    print("I'm here (b only)")
  })

})

shinyApp(ui=ui,server=server)