观察闪亮的多个动作按钮
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
,如果 req
uired 变量不是 "truthy",它会阻止方块触发,如 shiny::isTruthy
所定义. 这是防止在 shiny start and/or 其他问题期间过早触发的便捷方法。)
我是 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
,如果 req
uired 变量不是 "truthy",它会阻止方块触发,如 shiny::isTruthy
所定义. 这是防止在 shiny start and/or 其他问题期间过早触发的便捷方法。)