【问题标题】:update dependent chain of inputs更新依赖的输入链
【发布时间】:2016-06-12 15:02:41
【问题描述】:

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

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

下面提供了一个小示例应用程序。您可以看到变量选择取决于所选组(组 1 或组 2)。

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

但点击只准确设置组,变量设置为第一个(默认)选择。

我假设我必须等到一个独立输入完全重置后才能更新任何相关输入,但是有没有一种系统的方法可以在一个观察()中完成所有这些操作?还是有其他首选方法?

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)

【问题讨论】:

    标签: r shiny shiny-server


    【解决方案1】:

    您在此处使用renderUI,因此variable 输入被正确重置,但随后整个selectInput 被重新创建。

    为避免这种情况,您可以使用 updateSelectInput 来填充 choicesvariable 输入。

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

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

    server.R:

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

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

    【讨论】:

    • 谢谢,似乎有效!我有一种感觉,我会遇到一些仅在特定条件下存在的输入的复杂情况(因此使用了 renderUI),但这确实解决了我提出的更简单的问题。
    【解决方案2】:

    我认为问题在于updateSelectInput 中给出的inputId

    尝试使用variable_selector 而不是variable

    【讨论】:

    • 谢谢,但它似乎不起作用 - variable_selector 是输出 (uiOutput),而不是输入。我要更新的实际 selectInput 具有 inputId = 'variable'。如果我误解了,请告诉我。
    • 似乎当您单击按钮时,updateSelectInput 被刷新,然后renderUI 也被刷新!我认为您必须直接在UI-side 上创建一个selectInput,并且在server-side 上只有updateSelectInput
    【解决方案3】:

    我认为问题在于您的输入有选项'group2_var1', 'group2_var2',但是当您重置它们时,您试图将其设置为'group2_variable2'。尝试以下更改...

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

    【讨论】:

    • 谢谢,这是一个很好的收获...在上面编辑。但问题仍然存在 - 当我单击按钮时,变量选择器转到“group2_var1”而不是“group2_var2”。
    • 没错,如果你出于某种原因按两次按钮,它会起作用。
    • 是的,这就是问题所在 - 重置可以直接更新独立输入,但依赖的输入(变量选择器)必须首先从另一个输入(组选择器)获取正确的值集,并且只有那么它可以正确更新。所以我可以一直点击按钮直到工作,但如果输入在其他选项卡上并且在它们变得可见之前不会更新,那将不起作用。
    猜你喜欢
    • 2018-11-07
    • 1970-01-01
    • 2020-04-30
    • 2021-07-27
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多