r - 在 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
解决方案
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
它只是更容易防止不必要的代码运行。
推荐阅读
- android - 在android视图的画布中的给定点以给定字体绘制单个字符/字形的最有效方法是什么?
- c - 用 C 编写的基本计算器仅添加
- julia - 在 Julia 中是否有一种优雅的方式来“不参与”?
- javascript - 将激光存储在阵列中,然后根据当前枪绘制“X”数量的激光
- python - Python 错误“ZeroDivisionError:浮点除以零”
- c# - 如何修复跨机器的字符串比较
- ruby-on-rails - 使用 gmail 从我的 Rails 应用程序发送电子邮件时出现问题
- cordova - ionic 4 Native Audio 找不到我的 mp3 文件
- javascript - Array.prototype.filter - 是否可以使用多个条件过滤多个条件?[JS,VueJS]
- java - 运行多个 JBOSS EAP 7 实例