【问题标题】:eventReactive with 2 action button across 2 tabseventReactive 与 2 个选项卡上的 2 个操作按钮
【发布时间】:2018-05-26 22:51:13
【问题描述】:

我有一个带有 2 个选项卡的应用程序,每个选项卡都有一个操作按钮。如果按下任一按钮,我希望触发相同的过程。所以我是这样写的:

library(shiny)

ui <- fluidPage(
  tabsetPanel(
    tabPanel("tab1",
      actionButton("btn1","Button 1"),
      textOutput("text")
    ),
    tabPanel("tab2",
      actionButton("btn2","Button 2")
    )
  )

)

server <- function(input, output) {
  data=eventReactive(c(input$btn1,input$btn2),{
    print("Button is pressed!")
    print(input$btn1)
    print(input$btn2)
    iris
  })
  output$text=renderText({
    req(data())
    print(head(data()))
    "Really? Button is pressed!"
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

而且我不明白为什么会在应用初始化时触发eventReactive 表达式,然后再按下任何按钮。

如果我只使用 1 个按钮,即 input$btn1 而不是 c(input$btn1, input$btn2),那么我会得到预期的行为,但不会使用 2 个依赖项。

谁能启发我?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    eventReactive 有一个参数ignoreInit,默认为False,参见help(eventReactive)

    您的问题通过修改以下行得到解决:

    data=eventReactive(c(input$btn1,input$btn2),{
    

    data=eventReactive(c(input$btn1,input$btn2),ignoreInit = T,{
    

    我希望这会有所帮助!

    【讨论】:

    • 您的解决方案确实有效。但我仍然不明白这种行为。 1. 文档说“与ignoreNULL 发生的情况不同,只有observeEvent 接受ignoreInit 参数。”好吧,显然 eventReactive 也接受了这个论点。 2. 在我看来,这个解决方案是抑制valueExpr 而不是触发器(eventExpr)。 3. 为什么一键能用?
    • 我认为这是文档中的错误,因为该参数适用于两者。我在Github 上为此创建了一个问题,让我们看看我们是否正确;)
    • 最后被github.com/rstudio/shiny/pull/2036关闭。感谢您的报告!
    【解决方案2】:

    我的猜测是表达式自动评估为 TRUE,因此它在加载时执行。相反,您应该使用{} to listen from two buttons

    修改代码:

    library(shiny)
    
    ui <- fluidPage(
      tabsetPanel(
        tabPanel("tab1",
                 actionButton("btn1","Button 1"),
                 textOutput("text")
        ),
        tabPanel("tab2",
                 actionButton("btn2","Button 2")
        )
      )
    
    )
    
    server <- function(input, output) {
      data=eventReactive({
        input$btn2
        input$btn1},{
        print("Button is pressed!")
        print(input$btn1)
        print(input$btn2)
        iris
      })
      output$text=renderText({
        req(data())
        print(head(data()))
        "Really? Button is pressed!"
      })
    }
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 我认为这个解决方案行不通。我将触发器设为“与”条件。也就是说,在某些事情发生之前需要按下两个按钮。当然,我也不明白为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多