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)

在前端方面,conditionalPaneluiOutput/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 中将列表添加到隐藏的选项中?

使 conditionalPanel 依赖于使用 fileInput 上传的文件

总是会出现闪亮的conditionalPanel

基于用户选择的输入数量的条件面板