在操作按钮中使用验证
Using validation in an action button
我对 R shiny 中 req 和 validate 之间的区别有点困惑。我能看到的唯一真正区别是验证向用户提供了一条消息。我正在构建一个界面并使用了一堆隐藏的消息和条件语句。我想压缩我的代码并喜欢使用验证的想法。我只想在用户尝试单击按钮并尝试继续 UI.
的另一部分时显示我的消息
我提供了一个简化版的代码,“成功”消息只会在点击id和同意按钮的文本输入时显示。如果缺少一个或两个,条件面板将显示验证文本。
我担心在操作按钮内显示输出会破坏环境并将其变成反应性环境。我在验证检查后使用了 req,这样除非为两者都提供了输入,否则不会显示成功消息。这是最好的方法吗?还是有更efficient/proper的方式?我主要担心的是,当我建立复杂性时,我会破坏应用程序。
library(shiny)
ui <- fluidPage(
textInput(inputId = "id",
label = 'Please enter your id'
),
checkboxInput("agree", label = "I agree", value = FALSE),
conditionalPanel(condition = "input.id == '' || !input.agree",
textOutput('error_msg')
),
actionButton("submit_info", "Submit"),
textOutput('success_msg')
)
server <- function(input, output) {
observeEvent(input$submit_info, {
output$error_msg <- renderText({
shiny::validate(
shiny::need(input$id != '', 'You must enter your id above to continue.'
),
shiny::need(input$agree, "You must agree to continue")
)
})
shiny::req(input$id)
shiny::req(input$agree)
output$success_msg <- renderText({"Success"})
})
}
shinyApp(ui = ui, server = server)
更新:我已经解决了这个问题。本质上,我只在单击按钮并将验证移到观察事件之外时才显示条件面板。这是代码:
library(shiny)
ui <- fluidPage(
textInput(inputId = "id",
label = 'Please enter your id'
),
checkboxInput("agree", label = "I agree", value = FALSE),
conditionalPanel(condition = "(input.submit_info >= 1) & ((input.id == '') || (!input.agree))",
textOutput('error_msg')
),
actionButton("submit_info", "Submit"),
textOutput('success_msg')
)
server <- function(input, output) {
output$error_msg <- renderText({
shiny::validate(
shiny::need(input$id != '', 'You must enter your id above to continue.'
),
shiny::need(input$agree, "You must agree to continue")
)
})
observeEvent(input$submit_info, {
shiny::req(input$id)
shiny::req(input$agree)
output$success_msg <- renderText({"Success"})
})
}
shinyApp(ui = ui, server = server)
我对 R shiny 中 req 和 validate 之间的区别有点困惑。我能看到的唯一真正区别是验证向用户提供了一条消息。我正在构建一个界面并使用了一堆隐藏的消息和条件语句。我想压缩我的代码并喜欢使用验证的想法。我只想在用户尝试单击按钮并尝试继续 UI.
的另一部分时显示我的消息我提供了一个简化版的代码,“成功”消息只会在点击id和同意按钮的文本输入时显示。如果缺少一个或两个,条件面板将显示验证文本。
我担心在操作按钮内显示输出会破坏环境并将其变成反应性环境。我在验证检查后使用了 req,这样除非为两者都提供了输入,否则不会显示成功消息。这是最好的方法吗?还是有更efficient/proper的方式?我主要担心的是,当我建立复杂性时,我会破坏应用程序。
library(shiny)
ui <- fluidPage(
textInput(inputId = "id",
label = 'Please enter your id'
),
checkboxInput("agree", label = "I agree", value = FALSE),
conditionalPanel(condition = "input.id == '' || !input.agree",
textOutput('error_msg')
),
actionButton("submit_info", "Submit"),
textOutput('success_msg')
)
server <- function(input, output) {
observeEvent(input$submit_info, {
output$error_msg <- renderText({
shiny::validate(
shiny::need(input$id != '', 'You must enter your id above to continue.'
),
shiny::need(input$agree, "You must agree to continue")
)
})
shiny::req(input$id)
shiny::req(input$agree)
output$success_msg <- renderText({"Success"})
})
}
shinyApp(ui = ui, server = server)
更新:我已经解决了这个问题。本质上,我只在单击按钮并将验证移到观察事件之外时才显示条件面板。这是代码:
library(shiny)
ui <- fluidPage(
textInput(inputId = "id",
label = 'Please enter your id'
),
checkboxInput("agree", label = "I agree", value = FALSE),
conditionalPanel(condition = "(input.submit_info >= 1) & ((input.id == '') || (!input.agree))",
textOutput('error_msg')
),
actionButton("submit_info", "Submit"),
textOutput('success_msg')
)
server <- function(input, output) {
output$error_msg <- renderText({
shiny::validate(
shiny::need(input$id != '', 'You must enter your id above to continue.'
),
shiny::need(input$agree, "You must agree to continue")
)
})
observeEvent(input$submit_info, {
shiny::req(input$id)
shiny::req(input$agree)
output$success_msg <- renderText({"Success"})
})
}
shinyApp(ui = ui, server = server)