在 Shiny 中,req() 和 if() 语句有什么区别?

In Shiny, what's the difference between req() and an if() statement?

假设我有以下 UI:

ui <- fluidPage(
checkboxGroupInput("checkbox", "", choices = colnames(mtcars)),
tableOutput("table")
)

我想在至少选中一个复选框选项后呈现 mtcars 的 table。为此,我遇到了 req(),但我看不出它与 if 语句有何不同,即使阅读有关此函数的文档,它的定义也非常接近 [=15] =] 声明:

Ensure that values are available ("truthy"–see Details) before proceeding with a calculation or action. If any of the given values is not truthy, the operation is stopped by raising a "silent" exception (not logged by Shiny, nor displayed in the Shiny app's UI).

所以,table 渲染如何:

server <- function(input, output) {

    output$table <- renderTable({
    req(input$checkbox)
    mtcars %>% select(input$checkbox)
    })
}

shinyApp(ui, server)

与这个不同?:

server <- function(input, output) {

    output$table <- renderTable({
    if(!is.null(input$checkbox))
    mtcars %>% select(input$checkbox)
    })
}

shinyApp(ui, server)

TL;DR:req()if 语句有何不同,除了您的书写方式之外?

好吧,您可以通过输入不带括号的名称来查看 req 的代码。

function (..., cancelOutput = FALSE) 
{
    dotloop(function(item) {
        if (!isTruthy(item)) {
            if (isTRUE(cancelOutput)) {
                cancelOutput()
            }
            else {
                reactiveStop(class = "validation")
            }
        }
    }, ...)
    if (!missing(..1)) 
        ..1
    else invisible()
}

基本上发生的事情是它循环遍历您传入的所有值并检查它们是否看起来 "truthy" 而不是仅仅检查空值。如果是这样,它将取消输出。而if语句只会有条件地执行一段代码,不一定会取消输出。例如,当你有这个块时

server <- function(input, output) {
    output$table <- renderTable({
      if(!is.null(input$checkbox)) 
         mtcars %>% select(input$checkbox)
      print("ran")
    })
}

if 表达式中的代码是有条件的 运行,但是后面的 print() 仍然总是 运行 因为它不在 if 块中.但是 req

server <- function(input, output) {
    output$table <- renderTable({
      req(input$checkbox)
      mtcars %>% select(input$checkbox)
      print("ran")
    })
}

req() 基本上中止块的其余部分,因此如果 req 不是 "truthy" 值,print() 不会 运行。它只是更容易防止不必要的代码来自 运行ning.