观察闪亮的多个动作按钮

Observing multiple action Buttons Shiny

我是 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")

        }
      })

    #}
  })

两件事:

  • render* 函数本质上是响应式的,因此它们不应嵌套在另一个函数中。在这种情况下,它已经可以在不添加任何东西的情况下做出反应。

  • 动作按钮的工作原理是每次按下时增加它们的值。这意味着如果用户点击它的速度快于 R 的反应速度,它实际上可能会增加 2(不太可能但也许可行)。按钮值 变化 (递增)的行为触发了反应,因此您需要知道以前的值是什么才能知道点击了哪个(假设只有一个)。

尝试以下操作:

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,如果 required 变量不是 "truthy",它会阻止方块触发,如 shiny::isTruthy 所定义. 这是防止在 shiny start and/or 其他问题期间过早触发的便捷方法。)