为什么闪亮显示两次验证消息?

时间:2019-05-08 12:44:07

标签: r validation shiny

我们如何确保用户仅看到一次验证错误消息

即使在Shiny验证页面中,他们也两次显示错误消息: https://shiny.rstudio.com/articles/validation.html

此外,如果我使用其他语言,则以下链接可能会有所帮助。 Knockout - validation showing same error message twice

即使** Stackoverflow在这里也有类似的问题,但指的是不同的问题** Show validate error message only once

这意味着不同。

我指的是显示两次的“请选择一个数据集”消息

library(shiny)

ui <- fluidPage(

    titlePanel("Validation App"),

    sidebarLayout(
        sidebarPanel(
            selectInput("data", label = "Data set",
                        choices = c("", "mtcars", "faithful", "iris"))
        ),

        # Show a plot of the generated distribution
        mainPanel(
            tableOutput("table"),
            plotOutput("plot")
        )
    )
)
server <- function(input, output) {

    data <- reactive({
        validate(
            need(input$data != "", "Please select a data set")
        )
        get(input$data, 'package:datasets')
    })

    output$plot <- renderPlot({
        hist(data()[, 1], col = 'forestgreen', border = 'white')
    })

    output$table <- renderTable({
        head(data())
    })

}
shinyApp(ui,server)

如果有错误,理想情况下只有1次,否则应该通知用户。

1 个答案:

答案 0 :(得分:0)

因为您将消息“请选择一个数据集”存储在反应对象data()中,然后将该对象调用两次显示,一次在output$plot中一次,一次在output$table中显示

重构应用程序并仍然具有类似体验的一种方法是在输入窗口小部件中使用占位符,然后使用req()检查是否输入了value is truthy。如果值不为真(“ falsey”?),则评估将停止,并且不会从使用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这样的原因。