【问题标题】:Saving User inputs at end of Shiny session?在闪亮会话结束时保存用户输入?
【发布时间】:2018-05-24 14:41:35
【问题描述】:

我正在尝试制作 Shiny App,它允许用户保存输入并稍后加载它们。

解决这个问题的最简单方法是制作保存按钮,它可以保存输入。这是要演示的基本应用程序:

服务器.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 中的错误:操作未 在没有主动反应上下文的情况下允许。 (你试图做某事 这只能从反应式表达式或观察者内部完成。)

有什么办法可以解决吗?

【问题讨论】:

    标签: r input shiny save session-state


    【解决方案1】:

    使用 isolate 似乎可以解决问题。

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

    【讨论】:

    • 很奇怪,我很高兴你明白了!如果它有效,我会将其设置为答案。
    • 是的,我会的。仍然需要等待一天才能将我自己的评论标记为答案。
    【解决方案2】:

    使用另一个观察事件函数并观察 isClosed() 的值,我们可以 完成这项工作

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

    observeEvent() 和 reactive() 都被认为是“反应式”环境,这意味着它们在整个会话期间观察值的变化,而不仅仅是在启动时。如果您将需要响应的函数放在响应式环境之外,那么 Shiny 会帮助您向您发送该错误,以告知您该函数永远不会被调用,除非我们将其包装在响应式函数中。

    对于结构良好的问题也 +1。

    【讨论】:

    • 感谢您的回答!但是,使用您的解决方案,值似乎是在会话开始时而不是在结束时保存的,这真的很奇怪。我已经尝试过与您类似的解决方案,但之前只使用过 onSessionEnded() 并且它有同样的问题。
    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多