2016-02-29 3 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 для заполнения choices из yout 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, поэтому выбранная опция остается неизменной.

+0

Спасибо, кажется, работает! У меня есть чувство, что я столкнусь с осложнениями с некоторыми входами, которые существуют только при определенных условиях (поэтому используется renderUI), но это решает более простой вопрос, который я задал. –

0

Я думаю, что проблема заключается в inputId приведены в updateSelectInput.

Попробуйте использовать variable_selector вместо variable.

+0

Спасибо, но он не работает - переменная_селектор - это выход (uiOutput), а не вход. Фактический selectInput, который я хочу обновить, имеет inputId = 'variable'. Дайте мне знать, если я не понимаю. –

+0

кажется, что когда вы нажимаете кнопку, «updateSelectInput» закрашивается, а после этого «renderUI» снова сбрасывается! Я думаю, что вам нужно создать 'selectInput' непосредственно на стороне UI и иметь только' updateSelectInput' на стороне сервера. – user5029763

0

Я считаю, что проблема заключается в том, что у вашего ввода есть опции 'group2_var1', 'group2_var2', но при их сбросе вы пытаетесь установить его на 'group2_variable2'. Попробуйте следующее изменение ...

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

Спасибо, это хороший улов ... отредактированный выше. Но проблема все еще сохраняется - когда я нажимаю кнопку, селектор переменных переходит в «group2_var1» вместо «group2_var2». –

+0

Thats true, он работает, если вы нажмете кнопку дважды по какой-то причине. – user5219763

+0

Да, это проблема. Сброс может напрямую обновлять независимый вход, но зависимый (селектор переменных) должен сначала получить правильный набор значений из другого ввода (селектор групп), и только после этого он может быть правильно обновлен. Поэтому я мог просто нажимать кнопку до тех пор, пока не будет работать, но это не сработает, если входы находятся на других вкладках и не обновляются до тех пор, пока они не станут видимыми. –