Я думаю, вам следует использовать req
, поскольку он исключает (и очищает!) Рендеринг графика, если условия не выполняются.
library(shiny)
shinyApp(
ui = fluidPage(
checkboxInput("cb", "Plot?"),
sliderInput("cyls", "Cylinders", min = 1, max = 8, value = 4, step = 1),
plotOutput("plt")
),
server = function(input, output, session) {
output$plt <- renderPlot({
req(input$cb, input$cyls)
ggplot(mtcars[mtcars$cyl >= input$cyls,,drop = FALSE],
aes(disp, mpg, color = factor(cyl))) +
geom_point()
})
}
)
![ggplot2 conditional plot with req function](https://i.stack.imgur.com/Xo0WL.png)
Три скриншота выше расположены в последовательности: начинаются с «Сюжет?» не выбран, график не отображается; выберите его, появится сюжет; отмените выбор, существующий график исчезнет.
Способ адаптации этого к вам - заменить req(input$cb)
чем-то, что соответствует вашему условию «очистить график». (Я также включил сюда input$cyls
, просто чтобы не дать более крупным и сложным приложениям достичь блока сюжета до того, как все входные данные стабилизируются. Возможно, не требуется в большинстве приложений, но это защитный ход, который не имеет большого значения, если он избыточен, но много выгоды, когда это необходимо.)
Небольшая модификация темы, «сообщающая пользователю, почему сюжет исчез». Замените req
на validate
и хотя бы один need
:
# req(input$cb, input$cyls)
validate(
need(input$cb, "You deselected \"Plot!\"")
)
![tell the user why](https://i.stack.imgur.com/t9Zws.png)