2016-02-29 83 views
2

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

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

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

点击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) 

回答

1

您使用renderUI这里所以variable输入正确复位,则整个selectInput被重建。

为了避免这种情况,您可以使用updateSelectInput来填充您输入的choiceschoices

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

而且在server.R

在你ui.R,您可以通过更换uiOutput('variable_selector')observeEvent

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

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

+0

谢谢,似乎工作!我有一种感觉,我会遇到一些只在某些条件下才存在的输入(因此使用renderUI),但这确实解决了我提出的一个更简单的问题。 –

0

我认为这个问题是在updateSelectInput给出的inputId。使用代替variable

+0

谢谢,但它似乎并没有工作 - variable_selector是一个输出(uiOutput),而不是输入。我想更新的实际selectInput有inputId ='variable'。如果我误解,请告诉我。 –

+0

看起来,当你点击按钮时,'updateSelectInput'被刷新,然后'renderUI'也被刷新!我认为你必须直接在UI端创建一个'selectInput',并且在服务器端只有'updateSelectInput'。 – user5029763

0

我相信问题是您的输入有选项'group2_var1', 'group2_var2',但是当您重置它们时,您正尝试将其设置为'group2_variable2'。请尝试以下变化...

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

谢谢,这是一个很好的...上面编辑。但问题仍然存在 - 当我点击按钮时,变量选择器会转到'group2_var1'而不是'group2_var2'。 –

+0

这是真的,如果你出于某种原因点击了按钮两次,它的作品。 – user5219763

+0

是的,这是问题 - 重置可以直接更新一个独立的输入,但一个依赖的(变量选择器)必须先从另一个输入(组选择器)获取正确的一组值,然后才可以正确更新。所以我可以继续点击按钮直到工作,但是如果输入位于其他选项卡上并且只有在它们变得可见时才会更新,则这不起作用。 –