R Módulos brilhantes com painel condicional e reativos
Estou tentando modularizar um aplicativo Shiny complexo para o qual tenho umconditionalPanel
que deve aparecer apenas com um determinado estado de entrada.
Antes de fazer tudo modular, a entrada e o condicionalPanel estavam emui.R
, e eu poderia referenciar a entrada usando algo como isto:
conditionalPanel("input.select == 'Option one'", p('Option one is selected'))
Agora que modifiquei as coisas, acessar a entrada é mais complicado. Eu pensei que o seguinte era a maneira de fazê-lo, mas não funciona muito bem. (Aqui eu combinei as coisas em um único script independente):
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)
Acho que isso deve funcionar, mas não funciona - só funciona se eu fizer outra referência aoutput$selected
na seção principal da interface do usuário:
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.'))
))
Infelizmente, é claro que isso tem o efeito indesejado de renderizar o resultado detextOutput('selected')
. Só posso supor que o motivo disso funcione é porque, de alguma forma, aciona a reativa de uma maneira que a referência JavaScript sozinha não.
Alguma idéia de como eu deveria ter esse condicionalPanel para funcionar corretamente?
Obrigado..
EDIT: Acontece que na verdade não é um bug:https://github.com/rstudio/shiny/issues/1318. Veja minha própria resposta abaixo.
Mas também observe que eu realmente gosto dorenderUI
solução dada na resposta aceita melhor do que a minha originalconditionalPanel
aproximação.