В Shiny, в чем разница между req () и оператором if ()? - PullRequest
0 голосов
/ 11 декабря 2019

Допустим, у меня есть следующий пользовательский интерфейс:

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

Я хочу отобразить таблицу mtcars, если хотя бы один флажок был выбран. Для этого я наткнулся на req(), но я не вижу, чем он отличается от оператора if, даже читая документацию по этой функции, его определение очень близко к тому, что делает оператор if:

Убедитесь, что значения доступны («правдивые» - см. «Детали»), прежде чем приступать к расчету или действию. Если какое-либо из указанных значений не соответствует действительности, операция останавливается, вызывая «тихое» исключение (не регистрируемое Shiny и не отображаемое в пользовательском интерфейсе приложения Shiny).

Итак, как эторендеринг таблицы:

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 от того, как вы его пишете?

1 Ответ

1 голос
/ 11 декабря 2019

Ну, вы можете увидеть код для 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. Но с req

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

req() в основном прерывает оставшуюся часть блока, поэтому print() не запускается, если req не является "истинным" значением. Это просто предотвращает запуск ненужного кода.

...