简体   繁体   English

Shiny,两个动作按键,只响应第二个按键,不响应第一个按键

[英]Shiny, two action buttons, it only responds to the second button and not to the first button

Tell me in R Shiny, there are two action buttons.在 R Shiny 告诉我,有两个操作按钮。 I want to update the data according to the button I press.我想根据我按下的按钮更新数据。 But for some reason it only responds to the second button and not to the first button.但由于某种原因,它只响应第二个按钮而不响应第一个按钮。 What is the solution?解决办法是什么?

if (interactive()) {
  ui <- fluidPage(
    sidebarLayout(
      sidebarPanel(
        actionButton("action_1", "Get 1"),
        actionButton("action_2", "Get 2"),
      ),
      mainPanel(
        textOutput("result")
      ),
    )
  )
  
  server <- function(input, output) {
    data <- eventReactive(input$action_1, 1)
    data <- eventReactive(input$action_2, 2)
    output$result <- renderText(data())
  }
  
  shinyApp(ui, server)
}

The second line of this piece of code overwrites the first one:这段代码的第二行覆盖了第一行:

data <- eventReactive(input$action_1, 1)
data <- eventReactive(input$action_2, 2)

You can do:你可以做:

  ui <- fluidPage(
    sidebarLayout(
      sidebarPanel(
        actionButton("action_1", "Get 1"),
        actionButton("action_2", "Get 2"),
      ),
      mainPanel(
        textOutput("result")
      ),
    )
  )
  
  server <- function(input, output) {
    result <- reactiveVal()
    observeEvent(input$action_1, { result(1) })
    observeEvent(input$action_2, { result(2) })
    output$result <- renderText(result())
  }
  
  shinyApp(ui, server)
}

If you have many buttons you can simply add a class to it and some simple JS to monitor the last click like so:如果你有很多按钮,你可以简单地添加一个class和一些简单的JS来监控最后一次点击,如下所示:

library(shiny)

monitorJS <- "$(document).on('click', '.monitor', function () {
                                Shiny.onInputChange('last_click',this.id);
                               });"


ui <- fluidPage(
    tags$head(tags$script(monitorJS)),
    sidebarLayout(
        sidebarPanel(
         uiOutput("buttons")
        ),
        mainPanel(
            textOutput("result")
        ),
    )
)

server <- function(input, output, session) {
    
    output$buttons <- renderUI({
        a <- list()
        for(i in 1:200){
            id <- paste0("action_",i)
            name <- paste0("Get ",i)
            a[[i]] <- actionButton(id, name, class = "monitor")
        }
        tagList(a)
    })
    
    data <- eventReactive(input$last_click,{
        # Your click ligic here
        value <- gsub("action_","",input$last_click)
        value
    })
    
    output$result <- renderText({
        data()
    })

}

shinyApp(ui, server)

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM