Блестящая кнопка нужна только один раз - PullRequest
0 голосов
/ 04 мая 2019

Я хочу, чтобы событие было запущено в первый раз только нажатием кнопки.После этого я хочу, чтобы он реагировал на ввод слайдера.

Я попробовал следующее:

  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 после того, как один раз нажал на ввод $ go.Но это не так и нужно вводить $ go, чтобы каждый раз нажимать.

1 Ответ

1 голос
/ 04 мая 2019

Для этого есть несколько способов.

Один из способов - сохранить значение в 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)
...