是否有方法测试saveRDS是否已完成?

sr4lhrrt  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(69)

我有一个Shiny Jmeter 板,用于偶尔使用,涉及加载,操作和保存10 GB文件。我想在保存文件时显示一个微调器,作为一个小小的预防措施,因为保存过程可能需要一分钟左右。这比我预期的要棘手,因为我似乎找不到任何好的方法来挂钩到saveRDS
据我所知,一旦函数开始写文件,无论我做什么,它似乎都是并行运行的,所以我不能把它 Package 在一个函数中,当它完成时提醒我。
saveRDS的参数中没有任何可能的解决方案。
我不能使用file.exists,因为该文件已经存在并被覆盖。
我想可能有一种方法可以轮询到文件的连接是否打开,但is.open似乎不起作用,我似乎找不到任何东西。
是不是有什么明显的地方我漏掉了?
编辑:
我错了微调器只有在运行完 * 所有 * 之后才开始或停止。我实际上遇到了renderUI何时根据React值更新的问题。我至少知道从哪里开始看了。

library(shiny)
library(data.table)
library(shinycssloaders)

ui <- fluidPage(
    titlePanel("Manual outlier removal"),
    sidebarLayout(
        sidebarPanel(
          actionButton(inputId = "saveData", label =  "Save data"),
          uiOutput("spinner")
        ),
        mainPanel()
    )
)

server <- function(input, output, session) {

#  data <- reactiveFileReader(5000, session, "Data/datacleaning.RDS", readFunc = readRDS)

  savingData <- reactiveVal(FALSE)

  observeEvent(input$saveData, {
    savingData(TRUE)
    # saveRDS(data(), "Data/dc.RDS")
    Sys.sleep(5)
    savingData(FALSE)
  })

  output$spinner <- renderUI({
    if(savingData()){
      withSpinner(uiOutput("dummy"))
    } else {
      NULL
    }
  })

}

# Run the application
shinyApp(ui = ui, server = server)

字符串
编辑二:
从reactlog(Button reaction是将reactiveVal savingData设置为TRUE,然后休眠,然后关闭的事件(输入$saveData))

  1. input$saveData有一个新值(1)
  2. Button reaction无效
  3. Button reaction删除对input$saveData的依赖
  4. Button reaction开始计算
  5. Button reaction依赖于input$saveData
  6. Button reaction正在隔离未来的依赖关系
  7. savingData有一个新值:logi TRUE
  8. output$spinner无效
  9. output$spinner删除对savingData的依赖
  10. savingData有一个新值:logi FALSE
  11. Button reaction已停止隔离未来的依赖项
  12. Button reaction停止计算
  13. output$spinner开始计算
  14. output$spinner依赖于savingData
  15. output$spinner停止计算
    微调器在正确的时间失效,但直到按钮观察器停止计算后才开始计算。我相信这是预期的,但我不知道从哪里开始搜索解决方案。
jq6vz3qz

jq6vz3qz1#

正如你已经发现的,你的问题与saveRDS并行运行无关(实际上并没有),而是与你的应用程序的流程有关:
1.单击一个按钮,将savingData设置为TRUE
1.在同一个观察者中,你开始了一个漫长的过程。
1.在漫长的过程结束后,将savingData设置回FALSE
1.现在第一个观察者已经完成了(但不是),任何其他观察者都有机会触发。一个候选者是render函数,但是,唉,savingData不再是TRUE了,所以它不会触发。
1.也就是说,render函数只会在observer完成后才触发,它只会在冗长的操作完成后触发。因此,您看不到任何加载器,因为它不能在另一个观察器仍在运行时触发,之后它不会运行,因为冗长的过程已经完成。
话虽如此,有一个简单的解决方案。(这个想法是,它在渲染输出时将加载动画添加到输出中,但您并不真的想显示输出,您使用输出只是为了使微调器工作),您可以使用另一个库shinybusy,它允许在每个忙碌周期或手动启动加载动画,而后者正是你想要的

library(shiny)
library(data.table)
library(shinybusy)

ui <- fluidPage(
  titlePanel("Manual outlier removal"),
  sidebarLayout(
    sidebarPanel(
      use_busy_spinner("fading-circle", position = "full-page"),
      actionButton(inputId = "saveData", label =  "Save data"),
    ),
    mainPanel()
  )
)

server <- function(input, output, session) {
  observeEvent(input$saveData, {
    show_spinner()
    Sys.sleep(5)
    hide_spinner()
  })
}

shinyApp(ui = ui, server = server)

字符串

相关问题