【问题标题】:Why does shiny display validation message twice?为什么闪亮显示验证消息两次?
【发布时间】:2019-05-08 21:15:22
【问题描述】:

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

即使在 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 次,否则应通知用户,否则可能会很烦人。

【问题讨论】:

    标签: r validation shiny


    【解决方案1】:

    因为您将消息“请选择数据集”存储在反应对象 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 来处理此类事情。

    【讨论】:

    • 服务器函数在每个块中都有 ifelse 块,根据读取的数据,验证应该向用户显示不同的消息。如果使用 req,消息将不会传递给用户。有办法吗?
    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 2012-12-30
    • 2014-01-04
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多