假设我具有以下用户界面:
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()
语句的区别在于您如何编写?
答案 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
不会运行。只是可以更轻松地防止不必要的代码运行。