观察有两个条件

时间:2018-02-10 17:37:35

标签: r shiny

我试图窝点一些"观察事件"在Shiny中创建一个条件规则。

它应该是这样的:

  • 如果单击一个框,则在单击该按钮时显示相应的单个输出。
  • 如果单击两个框,则在单击按钮时显示两个输出。

但它始终显示两个输出。

有什么建议吗?

shinyApp(
  ui = basicPage(
    checkboxInput("box1", label = "Checkbox1", value = FALSE),
    checkboxInput("box2", label = "Checkbox2", value = FALSE),
    actionButton('buttn', 'Validate'),
    verbatimTextOutput("out1"),
    verbatimTextOutput("out2")
  ),
  server = function(input, output) {
    observeEvent(input$buttn, {

      observeEvent(input$box1, {
        output$out1 <-  renderText({"Foo"})});

      observeEvent(input$box2, {
        output$out2 <-  renderText({"bar"})})

    })
  }
)

2 个答案:

答案 0 :(得分:2)

您不需要额外的活动观察员。只需观察按钮单击并使用标准R条件逻辑根据复选框调整输出。

shinyApp(
    ui = basicPage(
        checkboxInput("box1", label = "Checkbox1", value = FALSE),
        checkboxInput("box2", label = "Checkbox2", value = FALSE),
        actionButton('buttn', 'Validate'),
        verbatimTextOutput("out1"),
        verbatimTextOutput("out2")
    ),
    server = function(input, output) {
        observeEvent(input$buttn, {
            if (input$box1) {
                output$out1 <-  renderText({"Foo"})
            }
            if (!input$box1) {
                output$out1 <-  renderText({NULL})
            }
            if (input$box2) {
                output$out2 <-  renderText({"Bar"})
            }
            if (!input$box2) {
                output$out2 <-  renderText({NULL})
            }
        })
    }
)

答案 1 :(得分:2)

请注意,将observeEventsreactives置于其他observeEvents内是不好的做法。请参阅this slide and the two after it from a presentation by Joe Cheng

一种可能的解决方案是使用shinyjs包显示或隐藏元素。下面给出一个工作实例。

另一个解决方案是使用reactiveVal来保存要显示的文本,并从观察者那里更新。

希望这有帮助!

解决方案1 ​​

library(shiny)
library(shinyjs)    

ui <- basicPage(
  checkboxInput("box1", label = "Checkbox1", value = FALSE),
  checkboxInput("box2", label = "Checkbox2", value = FALSE),
  actionButton('buttn', 'Validate'),
  shinyjs::hidden(div(id='div1', verbatimTextOutput("out1"))),
  shinyjs::hidden(div(id='div2', verbatimTextOutput("out2"))),
  useShinyjs()
)

server <- function(input, output) {
  observeEvent(input$buttn, {
    if(input$box1)
      shinyjs::show('div1')
    else
      shinyjs::hide('div1')

    if(input$box2)
      shinyjs::show('div2')
    else
      shinyjs::hide('div2')
  })

  output$out1 <-  renderText({"Foo"})
  output$out2 <-  renderText({"bar"})

}

shinyApp(ui,server)

解决方案2

library(shiny)
library(shinyjs)

ui <- basicPage(
  checkboxInput("box1", label = "Checkbox1", value = FALSE),
  checkboxInput("box2", label = "Checkbox2", value = FALSE),
  actionButton('buttn', 'Validate'),
  verbatimTextOutput("out1"),
  verbatimTextOutput("out2")
)

server <- function(input, output) {
  text1 <- reactiveVal(NULL)
  text2 <- reactiveVal(NULL)

  observeEvent(input$buttn, {
    ifelse(input$box1,text1('Foo'),text1(NULL))
    ifelse(input$box2,text2('Bar'),text2(NULL))
  })

  output$out1 <-  renderText({text1()})
  output$out2 <-  renderText({text2()})

}

shinyApp(ui,server)

enter image description here