conditionalPanel 和 uiOutput/req 模式之间的区别
Posted
技术标签:
【中文标题】conditionalPanel 和 uiOutput/req 模式之间的区别【英文标题】:Difference between conditionalPanel and uiOutput/req patterns 【发布时间】:2022-01-09 05:44:07 【问题描述】:考虑以下示例应用程序,该示例应用程序演示了两种根据条件显示 UI 的方法:
library(shiny)
ui <- fluidPage(
tagList(
checkboxInput("toggle", "Toggle"),
conditionalPanel(
condition = "output.condition",
tags$p("Output from conditionalPanel")
),
uiOutput("ui")
)
)
server <- function(input, output, session)
# conditionalPanel
output$condition <- reactive(input$toggle)
outputOptions(output, "condition", suspendWhenHidden = FALSE)
# uiOutput
output$ui <- renderUI(
req(isTRUE(input$toggle))
tags$p("Output from uiOutput")
)
shinyApp(ui, server)
在前端方面,conditionalPanel
和 uiOutput
/req
模式的行为似乎相似。是否有任何差异(尤其是与性能相关的差异)会使一种模式更有益?
【问题讨论】:
conditionalPanel
反应是基于 JS 的,所以客户端,req()
在服务器端
我的回答是否解决了你的问题?
我认为@PorkChop 有效地传达了这两种方法之间的主要区别。两种方法在生成 html 方面具有相同的功能,只是 conditionalPanel
评估自定义 javascript 表达式以显示/隐藏(由用户付费),而 renderUI
评估 server 代码。
【参考方案1】:
这两种方式确实有不同的目的。 conditionalPanel
创建一个“侦听”特定条件的 JavaScript 表达式,例如输入是TRUE
还是FALSE
。服务器端不需要发生任何事情。
renderUI()
相比之下非常灵活。当然,它可以模仿 conditionalPanel
的行为,但也能够通过创建不同的 HTML (UI) 代码来输出任何内容。
关于速度:conditionalPanel
应该几乎总是更快。此外,不是性能应该是两个选项之间的决定因素,而是目标应该。
示例应用
library(shiny)
ui <- fluidPage(
tagList(
checkboxInput("toggle", "Toggle"),
conditionalPanel(
# listens whether toggle is TRUE or FALSE
condition = "input.toggle",
tags$p("Output from conditionalPanel")
),
uiOutput("ui")
)
)
server <- function(input, output, session)
# create a plot
output$myplot <- renderPlot(
plot(mtcars$mpg, mtcars$cyl)
)
# create some text
output$mytext <- renderText(
"I am pointless"
)
# uiOutput
output$ui <- renderUI(
input$toggle
if (rnorm(1) > 0)
plotOutput("myplot")
else
textOutput("mytext")
)
shinyApp(ui, server)
【讨论】:
以上是关于conditionalPanel 和 uiOutput/req 模式之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
闪亮的 conditionalPanel() JS 条件不适用于 bslib
Shiny:基于 selectizeInput 的 conditionalPanel 问题
如何在 Shiny 的 ConditionalPanel 中将列表添加到隐藏的选项中?