Considere la siguiente aplicación de muestra que muestra dos formas de mostrar la interfaz de usuario en función de una condición:
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) En términos de front-end, los patrones conditionalPanel y uiOutput / req parecen comportarse de manera similar. ¿Hay alguna diferencia, especialmente relacionada con el rendimiento, que haría que un patrón fuera más beneficioso?
Estas dos formas tienen diferentes propósitos . conditionalPanel crea una expresión de JavaScript que "escucha" una condición específica, por ejemplo, si una entrada es TRUE o FALSE . No es necesario que suceda nada en el lado del servidor.
renderUI() por el contrario es muy flexible. Por supuesto, puede imitar el comportamiento de conditionalPanel pero también es capaz de generar básicamente cualquier cosa mediante la creación de un código HTML (UI) diferente.
Con respecto a la velocidad: conditionalPanel casi siempre debería ser más rápido. Además, no es el rendimiento el que decide entre ambas opciones, sino el objetivo .
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)