在具有基于全局输入的条件的Shiny模块中包含conditionalPanel

时间:2018-02-14 16:11:56

标签: r module shiny conditional-statements

我正在尝试编写一个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)

2 个答案:

答案 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内,以便您可以在浏览器控制台中检查可用对象。