R Módulos brillantes con conditionalPanel y reactivos
Estoy tratando de modularizar una aplicación Shiny compleja para la cual tengo unconditionalPanel
eso solo debería aparecer dado un cierto estado de entrada.
Antes de hacer todo modular, la entrada y el conditionalPanel estaban ambos enui.R
, y podría hacer referencia a la entrada usando algo como esto:
conditionalPanel("input.select == 'Option one'", p('Option one is selected'))
Ahora que he modularizado las cosas, acceder a la entrada es más complicado. Pensé que lo siguiente era la forma de hacerlo, pero no funciona del todo. (Aquí he combinado cosas en un solo script independiente):
library(shiny)
## Module code for 'selectorUI' and 'selector'
selectorUI <- function(id) {
ns <- NS(id)
selectizeInput(inputId = ns('select'),
label = 'Make a choice:',
choices = c('Option one', 'Option two'))
}
selector <- function(input, output, session) {
reactive(input$select)
}
## Main app
ui <- shinyUI(fluidPage(
selectorUI('id1'),
conditionalPanel(condition = "output.selected == 'Option one'", p('Option one is selected.'))
))
server <- shinyServer(function(input, output, session) {
output$selected <- callModule(selector, 'id1')
})
shinyApp(ui = ui, server = server)
Creo que esto debería funcionar, pero no funciona, solo funciona si hago otra referencia aoutput$selected
en la sección principal de la interfaz de usuario:
ui <- shinyUI(fluidPage(
selectorUI('id1'),
textOutput('selected'), ## Adding just this one line makes the next line work
conditionalPanel(condition = "output.selected == 'Option one'", p('Option one is selected.'))
))
Desafortunadamente, esto tiene el efecto no deseado de representar el resultado detextOutput('selected')
. Solo puedo adivinar que la razón por la que esto funciona es porque de alguna manera activa el reactivo de una manera que la referencia de JavaScript por sí sola no.
¿Alguna idea de cómo debería hacer que este conditionalPanel funcione correctamente?
Gracias..
EDITAR: Resulta que en realidad no es un error:https://github.com/rstudio/shiny/issues/1318. Vea mi propia respuesta a continuación.
Pero también tenga en cuenta que en realidad me gusta elrenderUI
solución dada en la respuesta aceptada mejor que mi originalconditionalPanel
acercarse a, aproximarse.