我正在尝试编写一个Shiny模块,该模块根据全局UI的输入显示conditionalPanel。在下面的最小示例中,当单击全局UI中的复选框时,conditionalPanel应显示radioButtons小部件,但我无法使其工作。
我做错了什么?
library(shiny)
conditional <- function(input, output, session, check){
output$check <- reactive({check()})
outputOptions(output, "check", suspendWhenHidden = FALSE)
output$conditional <- renderUI({
ns <- session$ns
conditionalPanel(
condition = 'output.check',
radioButtons(ns('radioItem'),
'Select option',
choices = c('option 1','option 2'))
)
})
}
conditionalUI <- function(id){
ns <- NS(id)
uiOutput(ns('conditional'))
}
ui <- fluidPage(
fluidRow(checkboxInput('check','Show')),
fluidRow(conditionalUI('mymod'))
)
server <- function(input, output, session) {
check <- reactive({input$check})
callModule(conditional, 'mymod', check = check)
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:0)
简单修复 - 条件应为condition = input.check
而不是condition = output.check
。
答案 1 :(得分:0)
您遇到闪亮模块强制执行的命名约定问题。
虽然模块中有一个类似的output
对象,但它与server
中的对象不同。如果指定输出
func <- function(input, output, session) {
output$something <- (...)
}
在模块内,用
调用callModule(func, 'someIdentifier')
然后您的输出ID(闪亮用于引用所有元素)变为
someIdentifier-something
您可以通过撰写uiOutput("mymod-conditional")
代替uiOutput(ns('conditional'))
来测试此内容。
通常,这不应该让您感到困扰,因为模块的工作方式是在模块中解析所有引用。但conditionalPanel
条件是JavaScript(&#34;另一方面&#34;可以这么说),必须使用全局引用。
因此,您的问题的解决方法是将条件更改为
condition = 'output["mymod-check"]'
请注意,破折号不能与JavaScript点表示法一起使用,因此必须使用括号表示法。
帮助我识别问题的一个技巧是将JavaScript注入到条件中,以便在客户端显示output
的当前值。我将condition = 'console.log(output)'
放在conditionalPanel
内,以便您可以在浏览器控制台中检查可用对象。