首页 > 解决方案 > 在 Shiny 中,req() 和 if() 语句有什么区别?

问题描述

假设我有以下用户界面:

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

mtcars一旦选择了至少一个复选框选项,我想呈现一张表格。为此,我遇到了req(),但我看不出它与if语句有什么不同,即使阅读有关此函数的文档,它的定义也非常接近if语句的作用:

在继续进行计算或操作之前,确保值可用(“真实” - 请参阅详细信息)。如果任何给定值不真实,则通过引发“静默”异常来停止操作(Shiny 不会记录,也不会显示在 Shiny 应用程序的 UI 中)。

那么,这个表格是如何呈现的:

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

标签: rshinyshiny-reactivity

解决方案


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

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

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

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

if表达式中的代码是有条件地运行的,但是print()由于它不在if块中,因此仍然始终运行 after。但是用一个req

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

基本上中止块的req()其余部分,因此如果不是“真实”值,print()则不会运行。req它只是更容易防止不必要的代码运行。


推荐阅读