Как рассчитать время обновления реактивного ввода в R блестяще для входов в блоке renderUI / uiOutput, которые еще не были созданы? - PullRequest
0 голосов
/ 21 февраля 2020

В приложении я пытаюсь реализовать некоторые функции «восстановления настроек», но у меня возникают проблемы с восстановлением значений динамически создаваемых входов. Я создал простой пример, чтобы проиллюстрировать мою проблему.

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 и не думаю, что они являются решением в этом случае, так как в полном приложении мне нужен очень жесткий контроль над тем, что восстанавливается при поддержании производительности.

...