闪亮按钮只需一次

时间:2019-05-04 19:06:34

标签: button shiny reactive

我希望仅通过单击一个按钮即可首次触发事件。之后,我希望它对滑块输入有反应。

我尝试了以下操作:

  ui <- fluidPage(
  actionButton("go", "Go"),
  sliderInput("n", label = "Sample size", min = 1, max = 100, value = 10),
  plotOutput('samples')
)
server <- function(input, output, session){
  activate = reactive({FALSE})
  activate = eventReactive(input$go, {
    isolate(TRUE)
  })

  samples = eventReactive(activate(), {
    rnorm(input$n)
  })

  output$samples <- renderPlot({ hist(samples()) })

}
shinyApp(ui = ui, server = server)

我希望它会使输入$ n在单击一次$$之后对其产生反应。但这不是,并且仍然需要每次单击input $ go。

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现。

一种方法是将值存储在reactiveValues()中,或仅使用req(),请参见下文。

使用eventReactive(activate(), ...的问题在于,只有执行activate()时,它才会触发内部代码,只有在单击input$go时才会发生。

带有req()的可复制示例:

ui <- fluidPage(
  actionButton("go", "Go"),
  sliderInput("n", label = "Sample size", min = 1, max = 100, value = 10),
  plotOutput('samples')
)
server <- function(input, output, session){

  output$samples <- renderPlot({
    req(input$go > 0)
    hist(rnorm(input$n)) 
  })

}
shinyApp(ui = ui, server = server)

带有reactiveValues()的可复制示例:

ui <- fluidPage(
  actionButton("go", "Go"),
  sliderInput("n", label = "Sample size", min = 1, max = 100, value = 10),
  plotOutput('samples')
)
server <- function(input, output, session){
  global <- reactiveValues(showPlot = FALSE)

  observeEvent(input$go, {
    global$showPlot <- TRUE
  })

  samples = reactive({
    rnorm(input$n)
  })

  output$samples <- renderPlot({
    req(global$showPlot)

    hist(samples()) 
  })

}
shinyApp(ui = ui, server = server)