eventReactive,包含2个选项卡上的2个操作按钮

时间:2017-12-13 05:51:46

标签: r shiny

我有一个带有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个依赖项。

有人可以启发我吗?

2 个答案:

答案 0 :(得分:1)

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

我的问题已解决,修改以下行:

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

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

我希望这有帮助!

答案 1 :(得分:0)

我的猜测是表达式自动计算为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)