Поскольку вы сохраняете сообщение «Пожалуйста, выберите набор данных» в реактивном объекте data()
, а затем вызываете этот объект для отображения дважды, один раз в output$plot
и один раз в output$table
.
Один из способов реорганизовать приложение и при этом иметь аналогичный опыт - использовать заполнитель в виджете ввода, а затем req()
, чтобы проверить, является ли введенное значение истинным .Если значение неверно («фальси»?), Тогда оценка останавливается, и вы не будете вызывать ошибки из выходных данных, использующих data()
.
library(shiny)
ui <- fluidPage(
titlePanel("Validation App"),
sidebarLayout(
sidebarPanel(
selectInput("data", label = "Data set",
choices = c("Please select a dataset" = "", "mtcars", "faithful", "iris"))
),
# Show a plot of the generated distribution
mainPanel(
tableOutput("table"),
plotOutput("plot")
)
)
)
server <- function(input, output) {
data <- reactive({
req(input$data)
get(input$data, 'package:datasets')
})
output$plot <- renderPlot({
hist(data()[, 1], col = 'forestgreen', border = 'white')
})
output$table <- renderTable({
head(data())
})
}
shinyApp(ui,server)
Другой вариант - переместить validate()
логика от блока data()
до одного из выходов.Таким образом, сообщение будет показано только один раз, но вам, возможно, придется выполнить еще одну проверку данных, поэтому я предпочитаю использовать req
для подобных вещей.