В приложении я пытаюсь реализовать некоторые функции «восстановления настроек», но у меня возникают проблемы с восстановлением значений динамически создаваемых входов. Я создал простой пример, чтобы проиллюстрировать мою проблему.
library(shiny)
ui = fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("num_sliders", "Number of sliders:",
min = 0,max = 10, value = 0),
actionButton("load1", "Load v1"),
actionButton("load2", "Load v2"),
),
# Show a plot of the generated distribution
mainPanel(
uiOutput("dynamic_sliders")
)
)
)
server = function(input, output, session) {
rv = reactiveValues()
rv$restored_inputs = FALSE
output$dynamic_sliders = renderUI({
req(input$num_sliders > 0)
fluidRow(tagList(
lapply(1:input$num_sliders,
function (n)
column(3, sliderInput(paste0("slider", n),
paste("Slider", n),
min = 0, max = 9, value = 0)))
))
})
observeEvent(input$load1, {
updateSliderInput(session, "num_sliders", value = 3)
updateSliderInput(session, "slider1", value = 5)
})
observeEvent(input$load2, {
updateSliderInput(session, "num_sliders", value = 3)
rv$restored_inputs = TRUE
})
observe({
req(rv$restored_inputs)
updateSliderInput(session, "slider2", value = 5)
rv$restored_inputs = FALSE
}, priority = -999)
}
shinyApp(ui = ui, server = server)
Если я нажму «Load v1», ясно, что проблема в том, что я пытаюсь обновить вход, который еще не был создан ( выходные данные недействительны, но не пересчитываются до того, как я попытаюсь обновить значение).
Не ясно, почему «Load v2» не решает проблему. После того, как я обновлю num_sliders, я вместо этого вызову реактивное значение. И блоки renderUI, и блоки наблюдения становятся недействительными. Я подумал, что из-за того, что я снизил приоритет блоков наблюдения, сначала будет произведен пересчет блока renderUI, а затем будет существовать ползунок ввода в то время, когда я пытаюсь обновить его значение. но я все еще не могу понять это. Кто-нибудь знает, как я могу форсировать желаемый порядок выполнения?
Очевидно, что проблема не возникает ни для одной из кнопок загрузки, если перед тестированием вручную изменить num_sliders на значение больше 0.
У меня есть изучил некоторые встроенные функции закладок в Rshiny и не думаю, что они являются решением в этом случае, так как в полном приложении мне нужен очень жесткий контроль над тем, что восстанавливается при поддержании производительности.