更新相关的输入链

时间:2016-02-29 14:16:56

标签: r shiny shiny-server

我有一个相当复杂的用户界面,有很长的依赖用户输入链。

我想添加的一个功能是能够在任何给定时间将所有输入值存储为字符串,并使用该字符串重置所有输入作为actionButton的结果。将字符串存储为JSON很容易,但恢复依赖输入已经证明是棘手的,我想知道是否有任何好的想法。

下面提供了一个很小的示例应用程序。您可以看到变量选项取决于所选的组(group1或group2)。

单击actionButton后,我想设置group = group2和variable = group2_variable2。

但是点击只能准确地设置组,而变量被设置为第一个(默认)选项。

我认为在更新任何相关输入之前我必须等到独立输入完全复位,但是有一种系统的方法可以在一个observe()内完成所有操作吗?或者还有另一种首选方式吗?

library(shiny)

groups <- c('group1', 'group2')

variables <- list(
  group1 = c('group1_var1', 'group1_var2'),
  group2 = c('group2_var1', 'group2_var2'))


ui <- pageWithSidebar(

  # Application title
  headerPanel('Demo'),

  # Sidebar with a slider input for number of bins
  sidebarPanel(
    selectInput(
      inputId = 'group',
      label   = 'Group:',
      choices = groups),

    uiOutput('variable_selector'),

    actionButton(
      inputId = 'reset_parameters',
      label = 'Reset Parameters')
  ),

  # Show a plot of the generated distribution
  mainPanel(
    h4('Demo')
  )
)

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

  output$variable_selector <- renderUI({

    selectInput(
      inputId = 'variable',
      label   = 'Variable:',
      choices = variables[[input$group]])
  })

  observe({
    if (input$reset_parameters > 0) {
      updateSelectInput(
        session,
        inputId = 'group',
        selected = 'group2')

      updateSelectInput(
        session,
        inputId = 'variable',
        selected = 'group2_var2')
    }

  })

})

shinyApp(ui = ui, server = server)

3 个答案:

答案 0 :(得分:1)

您在此处使用renderUI,因此variable输入已正确重置,但重新创建了整个selectInput

为避免这种情况,您可以使用updateSelectInput填充choices输入的variable

ui.R中,您可以将uiOutput('variable_selector')替换为:

selectInput(inputId = 'variable',
            label   = 'Variable:',
            choices = "")

server.R

observeEvent(input$group,{updateSelectInput(
                session,
                inputId = 'variable',
                choices = variables[[input$group]])
        })

当您按下按钮时,updateSelectInput中的observeEvent会重新运行,但它不会从头开始重新创建selectInput,只会更改choices以便所选选项保持不变同样的。

答案 1 :(得分:0)

我认为问题是inputId中给出的updateSelectInput

尝试使用variable_selector代替variable

答案 2 :(得分:0)

我认为问题在于您的输入包含选项<tr app-info...,但是当您重置它们时,您会尝试将其设置为'group2_var1', 'group2_var2'。请尝试以下更改...

'group2_variable2'