r - 获取在 Shiny 中触发的事件?

标签 r events shiny

我想知道在下面的示例中哪个事件在多个 ObserveEvent() 中被触发.

ui <- fluidPage(
  numericInput("a", "a", 0),
  textInput("b", "b")
)

server <- function(input, output, session) {
  observeEvent({
    input$a
    input$b
  },{

    # If only input$a is fired, I want to know that is input$a

  })
}

shinyApp(ui, server)

或者唯一的解决办法是有两个ObserveEvent()喜欢第二个链接?像那样 ?
ui <- fluidPage(
  numericInput("a", "a", 0),
  textInput("b", "b")
)

server <- function(input, output, session) {
  observeEvent({
    input$a
  },{

    my_function_or_reactive_function(input,1)

  })

  observeEvent({
    input$b
  },{

    my_function_or_reactive_function(input,2)

  })

}

shinyApp(ui, server)

关联:
  • How to listen for more than one event expression within a Shiny eventReactive handler
  • https://groups.google.com/forum/#!topic/shiny-discuss/vd_nB-BH8sw
  • 最佳答案

    您可以使用 Shiny 的 JS event shiny:inputchanged检查哪个输入改变了:

    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)
    

    Result :
    编辑 - 来自@TristanTran 的请求使用 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)
    

    关于r - 获取在 Shiny 中触发的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56770222/

    相关文章:

    r - 使用 R 中的 dplyr 添加每个因子水平的汇总行

    将一个 DF 中的 NA 替换为另一个 DF 中的值

    c++ - 窗口事件之间

    r - 使用 fileInput Shiny R 打开特定目录

    json - R + fromJSON - 如何发送标题信息?

    regex - 如何在R中仅grep 10场比赛?

    r - 计数对字符向量内容的更改

    c# - 应用程序中的等待事件

    .net - WinForms:如何以编程方式触发事件处理程序?

    r - 观察事件有两个条件