0

考虑下面的示例应用程序,演示了两种基于条件显示 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)

就前端而言,conditionalPaneland uiOutput/req模式的行为似乎相似。是否有任何差异,特别是与性能相关的差异,会使一种模式更有益?

4

1 回答 1

-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)
于 2021-12-02T19:23:14.477 回答