2016-02-29 44 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

是的,這是問題 - 重置可以直接更新一個獨立的輸入,但一個依賴的(變量選擇器)必須先從另一個輸入(組選擇器)獲取正確的一組值,然後纔可以正確更新。所以我可以繼續點擊按鈕直到工作,但是如果輸入位於其他選項卡上並且只有在它們變得可見時纔會更新,則這不起作用。 –