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

时间:2019-12-11 13:35:37

标签: r shiny shiny-reactivity

假设我具有以下用户界面:

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

至少要选中一个复选框,我要呈现mtcars表。为此,我遇到了req(),但是我看不出它与if语句有什么不同,即使阅读有关此函数的文档,其定义也与{{1 }}语句可以:

  

请确保在使用之前值可用(“真实” –请参阅“详细信息”)   进行计算或操作。如果任何给定值是   不真实,通过引发“静默”异常来停止操作   (不是由Shiny记录,也不显示在Shiny应用的用户界面中。)

那么,此表的呈现方式如何:

if

与这个不同吗?:

server <- function(input, output) {

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

shinyApp(ui, server)

TL; DR:server <- function(input, output) { output$table <- renderTable({ if(!is.null(input$checkbox)) mtcars %>% select(input$checkbox) }) } shinyApp(ui, server) req()语句的区别在于您如何编写?

1 个答案:

答案 0 :(得分:1)

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

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

基本上发生的是,它遍历您传入的所有值,并检查它们是否看起来“真实”,而不仅仅是检查null。如果是这样,它将取消输出。并且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()基本上中止了该块的其余部分,因此如果print()不是一个“真实的”值,则req不会运行。只是可以更轻松地防止不必要的代码运行。