【问题标题】:Capture the label of an actionButton once it is clicked单击操作按钮后捕获它的标签
【发布时间】:2015-06-05 05:29:26
【问题描述】:

是否可以在单击操作按钮后捕获其标签?

假设我的 ui.R 上有 3 个按钮,根据我单击的哪个按钮,我想在 server.R 上执行不同的操作。

需要注意的是,按钮是在 server.R 上动态创建的,带有动态标签(因此有必要在点击时捕获标签)

谢谢

【问题讨论】:

    标签: r shiny shiny-server


    【解决方案1】:

    类似的东西?

    library(shiny)
    
    server <- function(input, session, output) {
    
      output$printLabel <- renderPrint({input$btnLabel})
    
    }
    
    ui <- fluidPage(
    
      actionButton("btn1", "Label1", 
                   onclick = "Shiny.setInputValue('btnLabel', this.innerText);"),
      actionButton("btn2", "Label2", 
                   onclick = "Shiny.setInputValue('btnLabel', this.innerText);"),
    
      verbatimTextOutput("printLabel")  
    
    )
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      【解决方案2】:

      1) 用户最后点击的是哪个按钮?

      要回答这个问题,您可以使用observeEvent 函数并使用reactiveValues 函数设置一个变量。确保更新库并使用最新版本的R (version 3.1.3),因为shiny 依赖于此版本。在 Windows 上工作,您可以按照示例了解如何更新 here

      rm(list = ls())
      library(shiny)
      
      ui =fluidPage(
        sidebarPanel(
          textInput("sample1", "Name1", value = "A"),
          textInput("sample2", "Name2", value = "B"),
          textInput("sample3", "Name3", value = "C"),
          div(style="display:inline-block",uiOutput("my_button1")),
          div(style="display:inline-block",uiOutput("my_button2")),
          div(style="display:inline-block",uiOutput("my_button3"))),
        mainPanel(textOutput("text1"))
      )
      
      server = function(input, output, session){
      
        output$my_button1 <- renderUI({actionButton("action1", label = input$sample1)})
        output$my_button2 <- renderUI({actionButton("action2", label = input$sample2)})
        output$my_button3 <- renderUI({actionButton("action3", label = input$sample3)})
      
        my_clicks <- reactiveValues(data = NULL)
      
        observeEvent(input$action1, {
          my_clicks$data <- input$sample1
        })
      
        observeEvent(input$action2, {
          my_clicks$data <- input$sample2
        })  
      
        observeEvent(input$action3, {
          my_clicks$data <- input$sample3
        })  
      
        output$text1 <- renderText({ 
          if (is.null(my_clicks$data)) return()
          my_clicks$data
        })
      }
      runApp(list(ui = ui, server = server))
      

      2) 保存点击以供进一步操作如下

      这是基于Shiny UI: Save the Changes in the InputsshinyStorage 包中jdharrison 工作的小示例。

      rm(list = ls())
      #devtools::install_github("johndharrison/shinyStorage")
      library(shinyStorage)
      library(shiny)
      
      my_clicks <- NULL
      
      ui =fluidPage(
        #
        addSS(),
        sidebarPanel(
          textInput("sample_text", "test", value = "0"),
          uiOutput("my_button")),
        mainPanel(uiOutput("text1"))
      )
      
      server = function(input, output, session){
        ss <- shinyStore(session = session)
      
        output$my_button <- renderUI({
          actionButton("action", label = input$sample_text)
        })
      
        observe({
          if(!is.null(input$sample_text)){
            if(input$sample_text != ""){
              ss$set("myVar", input$sample_text)
            }
          }
        })  
      
        output$text1 <- renderUI({
          input$action
          myVar <- ss$get("myVar")
          if(is.null(myVar)){
            textInput("text1", "You button Name")
          }else{
            textInput("text1", "You button Name", myVar)          
          }
        })
      }
      runApp(list(ui = ui, server = server))
      

      【讨论】:

      • 感谢 pops,但这不是我想要的。我想根据按钮的标签在组件上设置文本。我使用您在此处发布的代码 (stackoverflow.com/questions/27326929/…) 来动态创建带有动态标签的按钮(比如说 A、B 和 C),现在我需要知道用户点击了哪个按钮。谢谢
      • 嗨@Diego,你有没有想过如何做到这一点?我遇到了类似的问题...谢谢。
      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多