Сохранение пользовательских данных в конце сеанса Shiny? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь создать приложение Shiny, которое позволяет пользователям сохранять входные данные, а затем загружать их.

Самый простой способ добиться этого - создать кнопку Сохранить, которая сохраняет входные данные.Вот базовое приложение для демонстрации:

server.R

ui <- fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("integer", "Integer:",
            min = 0, max = 1000,
            value = 500)
),

mainPanel(tableOutput("values"),
actionButton('save_inputs', 'Save inputs')
)

))

server <- function(input, output, session) {
  sliderValues <- reactive({
    value = input$integer
  })

  output$values <- renderTable({
    sliderValues()
  })

  observeEvent(input$save_inputs,{
    saveRDS( input$integer , file = 'integer.RDS')
  })
}

shinyApp(ui = ui, server = server)

Однако я хотел бы сделать автоматическое сохранение, например, я хочу, чтобы входы были сохранены в конце сеанса.onSessionEnded () должен быть ответом на это, но он не может достичь входных значений и сохранить их.

 session$onSessionEnded( function() {
   saveRDS( input$integer, file = 'integer.RDS')
 })

, который возвращает ошибку: Предупреждение:

Ошибка в .getReactiveEnvironment () $ currentContext: операция не разрешена без активного реактивного контекста.(Вы пытались сделать что-то, что может быть сделано только внутри реактивного выражения или наблюдателя.)

Есть ли способ решить это?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Использование isolate , кажется, решает проблему.

 session$onSessionEnded(function() {
   isolate(saveRDS( input$integer, file = 'integer.RDS'))
 })
0 голосов
/ 24 мая 2018

Используя другую функцию события наблюдения и наблюдая за значением isClosed (), мы можем сделать эту работу

observeEvent(session$isClosed()==T,{
saveRDS( input$integer, file = 'integer.RDS')
})

наблюдаем (), а также реактивная () считаются "реактивными" средами, что означает, что ониследить за изменением значений на протяжении всего сеанса, а не только при запуске.Если вы поместите функцию, которая должна быть реактивной, за пределы реактивной среды, то вы будете рады отправить вам эту ошибку, чтобы сообщить, что эта функция никогда не будет вызвана, если мы не включим ее в реактивную функцию.

Также +1 за хорошо составленный вопрос.

...