我希望仅通过单击一个按钮即可首次触发事件。之后,我希望它对滑块输入有反应。
我尝试了以下操作:
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。
答案 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)