观察多个动作按钮闪亮

时间:2018-04-15 00:03:23

标签: r events button eventtrigger action-button

我是R开发的新手,我正在努力实现这一目标。我有一段代码,我观察两个动作按钮等待点击它们。现在我想知道if语句中哪一个被点击了,但我的实现不起作用。我已经搜索了一些可能的解决方案,但我无法找到它。有人可以给我一点帮助吗?谢谢!

observeEvent({c(input[["button1"]], input[["button2"]])}, {        

      output$mean<- renderPlotly({            

       if(input[["button1"]]){ 

           output_mean(out(), start_date(), geo(), language(), grupo(), TRUE, "button1")

        }else if(input[["button2"]]){

           output_mean(out(), start_date(), geo(), language(), grupo(), TRUE, "button2")

        }
      })

    #}
  })

1 个答案:

答案 0 :(得分:2)

两件事:

  • render*函数具有固有的反应性,因此它们不应嵌套在另一个函数中。在这种情况下,它已经能够在不添加任何内容的情况下做出反应。

  • 操作按钮的工作方式是每次按下时增加其值。这意味着如果用户点击它的速度比R可以反应的速度快,那么它实际上可能会增加2(不太可能,但也许可行)。按钮的值更改(递增)的动作是触发反应的行为,因此您需要知道先前的值是什么,以便知道哪一个(假设只有一个)被点击。

    < / LI>

尝试以下方法:

server <- function(input, output, session) {
  buttonstates <- reactiveValues(one=0, two=0)
  output$mean <- renderPlotly({
    req(input$button1, input$button2)
    if (input$button1 != buttonstates$one) {
      buttonstates$one <- input$button1
      output_mean(out(), start_date(), geo(), language(), grupo(), TRUE, "button1")
    } else if (input$button2 != buttonstates$two) {
      buttonstates$two <- input$button2
      output_mean(out(), start_date(), geo(), language(), grupo(), TRUE, "button2")
    }
  })
}

另一种选择是将按钮确定分成 它自己的反应块。这样做的好处是它简化了 你的renderPlotly阻止:

server <- function(input, output, session) {
  buttonstates <- reactiveValues(one=0) # don't need two=0
  whichbutton <- reactive({
    req(input$button1, input$button2)
    if (input$button1 != buttonstates$one) "button1" else "button2"
  })
  output$mean <- renderPlotly({
    req(whichbutton())
    output_mean(out(), start_date(), geo(), language(), grupo(), TRUE, whichbutton())
  })
}

(如果您不熟悉shiny::req,如果req已满足的变量不是“真理”,它会阻止块被触发,如shiny::isTruthy所定义。它非常方便在闪亮的开始和/或其他问题期间防止过早射击的方法。)