R Shiny中交互式仪表板

时间:2017-11-02 05:38:01

标签: r shiny

我正在构建一个Rshiny仪表板,我正在努力集成一些闪亮的交互式功能,我正在使用renderUI函数,我应该根据另一个输入的值创建其他小部件/输入参数参数。我遇到了一个简单的错误,但调试有困难。以下是包含相关代码的演示:

choices = c('All', 'None')
names(choices) = choices
ui <- fluidPage(theme = shinytheme('united'),

     # create permanent input for shot chart type (should be 5 options)
     selectInput(inputId = 'choice.input', label = 'Select a choice', multiple = FALSE,
                 choices = choices, selected = 'All'),

     uiOutput('secondinput')

)

server <- shinyServer(function(input, output) {

  if(input$choice.input == 'All') {

    my.second.input <- c('a', 'b', 'c', 'd', 'e')
    names(my.second.input) <- my.second.input

    # player parameter for player whose shot chart will be shown
    output$secondinput <- renderUI({
      selectInput(inputId = 'another.input', label = 'Check this input', multiple = FALSE,
                  choices = my.second.input, selected = 'a')
    })
  }
})

shinyApp(ui, server)

我不确定这里有什么问题 - 我认为我在服务器函数中使用了renderUI(),名称匹配(输出$ secondinput,uiOutput('secondinput'))是正确的,但是这是我的错误......

请注意,我的完整代码有几个choice.input选项,我想在服务器中为每个(4-5)choice.input()值设置一个if()大小写。任何有关错误的帮助都表示赞赏,谢谢!

编辑 - 澄清一下,选择输入choice.input,标签为“选择一个选择”,应该始终显示。当此输入设置为“全部”时,我希望显示另一个输入,即第二个输入。如果choice.input未设置为“All”,那么我不希望显示第二个输入。希望这会有所帮助。

1 个答案:

答案 0 :(得分:1)

这是您的代码版本。我不确定这是不是你想要的,这有点难以辨别,但希望你可以从那里拿走它。

choices = c('All', 'None')
names(choices) = choices
ui <- fluidPage(
  # create permanent input for shot chart type (should be 5 options)
  selectInput(inputId = 'choice.input', label = 'Select a choice', multiple = FALSE,
              choices = choices, selected = 'All'),
  uiOutput('secondinput')
)

server <- shinyServer(function(input, output) {
  # player parameter for player whose shot chart will be shown
  output$secondinput <- renderUI({
    if(input$choice.input == 'All') {

      my.second.input <- c('a', 'b', 'c', 'd', 'e')
      names(my.second.input) <- my.second.input
      selectInput(inputId = 'another.input', label = 'Check this input', multiple = FALSE,
                  choices = my.second.input, selected = 'a')    

    } else{
      return(NULL)
    }
  })
})

shinyApp(ui, server)

发生的错误告诉您,您在没有被动上下文的情况下尝试访问被动值。您试图访问渲染函数或观察函数之外的输入值(它是被动的),这是反应性上下文。

如果你不明白这意味着什么,我强烈建议你阅读我写的一篇有光泽的教程,reactivity 101

这里的第二个问题是你试图&#34;筑巢&#34;一个渲染函数,可以工作,但却是错误的思考方式,并暗示你可能没有真正掌握反应的概念并完全渲染函数。请注意,我将渲染功能移到了外面,这通常是闪亮编程的正确方法。如果你有一点时间,我建议观看Joe Cheng的(有光泽的)视频和有效的反应式编程I和II&#34;来自2016年闪亮的会议https://www.rstudio.com/resources/webinars/shiny-developer-conference/