Get the event which is fired in Shiny?

后端 未结 1 873
夕颜
夕颜 2020-12-12 00:49

I would like to know in the example below which event is fired in the multiple ObserveEvent().

ui <- fluidPage(
  numericInput(\"a\", \"a\",         


        
相关标签:
1条回答
  • 2020-12-12 00:55

    You can use shiny's JS event shiny:inputchanged to check which input changed:

    ui <- fluidPage(
      tags$head(
        tags$script(
          "$(document).on('shiny:inputchanged', function(event) {
              if (event.name != 'changed') {
                Shiny.setInputValue('changed', event.name);
              }
            });"
        )
      ),
      numericInput("a", "a", 0),
      textInput("b", "b"),
      textInput("c", "c"),
      textOutput("changedInputs"),
      textOutput("aFired")
    )
    
    server <- function(input, output, session) {
      output$changedInputs <- renderText({
        paste("Outside observer: Latest input fired:", paste(input$changed, collapse = ", "))
      })
      
      observeEvent({
        c(input$a,
          input$b)
      }, {
        req(input$changed)
        if (input$changed == "a") {
          output$aFired <- renderText("Inside observer: input$a was fired")
        } else if (input$changed == "b") {
          output$aFired <- renderText("Inside observer: input$b was fired")
        } else if (input$changed == "c") {
          output$aFired <- renderText("Inside observer: input$c was fired")
        }
      }, ignoreInit = TRUE)
    }
    
    shinyApp(ui, server)
    

    :

    Edit - request from @TristanTran using renderUI:

    library(shiny)
    
    ui <- fluidPage(
      tags$head(
        tags$script(
          "$(document).on('shiny:inputchanged', function(event) {
              if (event.name != 'changed') {
                Shiny.setInputValue('changed', event.name);
              }
            });"
        )
      ),
      uiOutput("serverside"),
      textOutput("changedInputs"),
      textOutput("aFired")
    )
    
    server <- function(input, output, session) {
      output$changedInputs <- renderText({
        paste("Outside observer: Latest input fired:", paste(input$changed, collapse = ", "))
      })
      
      output$serverside <- renderUI({
        tagList(
          numericInput("a", "a", 0),
          textInput("b", "b"),
          textInput("c", "c")
        )
      })
      
      observeEvent({
        c(input$a,
          input$b)
      }, {
        req(input$changed)
        if (input$changed == "a") {
          output$aFired <- renderText("Inside observer: input$a was fired")
        } else if (input$changed == "b") {
          output$aFired <- renderText("Inside observer: input$b was fired")
        } else if (input$changed == "c") {
          output$aFired <- renderText("Inside observer: input$c was fired")
        }
      }, ignoreInit = TRUE)
    }
    
    shinyApp(ui, server)
    
    0 讨论(0)
提交回复
热议问题