R Блестящие модули с условной панелью и реактивами
Я пытаюсь модулировать сложное блестящее приложение, для которого у меня естьconditionalPanel
это должно появиться только при определенном состоянии ввода.
До того, как я сделал все модульное, входная и условная панели были вui.R
и я мог бы ссылаться на вход, используя что-то вроде этого:
conditionalPanel("input.select == 'Option one'", p('Option one is selected'))
Теперь, когда у меня есть модульные вещи, доступ к входу стал более сложным. Я думал, что следующий способ - это сделать, но это не совсем работает. (Здесь я объединил вещи в один автономный скрипт):
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)
Я думаю, что это должно работать, но это не так - это работает, только если я сделаю еще одну ссылку наoutput$selected
в основном разделе пользовательского интерфейса:
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.'))
))
К сожалению, конечно, это имеет нежелательный эффект рендерингаtextOutput('selected')
, Я могу только догадываться, что причина, по которой это работает, заключается в том, что он каким-то образом запускает реактив так, как не делает ссылка JavaScript.
Любая идея, как я должен заставить эту условную панель работать должным образом?
Спасибо..
РЕДАКТИРОВАТЬ: Оказывается, на самом деле не ошибка:https://github.com/rstudio/shiny/issues/1318, Смотрите мой собственный ответ ниже.
Но также обратите внимание, что мне на самом деле нравитсяrenderUI
Решение, данное в принятом ответе лучше моего оригиналаconditionalPanel
подход.