我有一个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))
input$saveData
有一个新值(1)Button reaction
无效Button reaction
删除对input$saveData
的依赖Button reaction
开始计算Button reaction
依赖于input$saveData
Button reaction
正在隔离未来的依赖关系savingData
有一个新值:logi TRUE
output$spinner
无效output$spinner
删除对savingData
的依赖savingData
有一个新值:logi FALSE
Button reaction
已停止隔离未来的依赖项Button reaction
停止计算output$spinner
开始计算output$spinner
依赖于savingData
output$spinner
停止计算
微调器在正确的时间失效,但直到按钮观察器停止计算后才开始计算。我相信这是预期的,但我不知道从哪里开始搜索解决方案。
1条答案
按热度按时间jq6vz3qz1#
正如你已经发现的,你的问题与
saveRDS
并行运行无关(实际上并没有),而是与你的应用程序的流程有关:1.单击一个按钮,将
savingData
设置为TRUE
。1.在同一个观察者中,你开始了一个漫长的过程。
1.在漫长的过程结束后,将
savingData
设置回FALSE
1.现在第一个观察者已经完成了(但不是),任何其他观察者都有机会触发。一个候选者是
render
函数,但是,唉,savingData
不再是TRUE
了,所以它不会触发。1.也就是说,
render
函数只会在observer
完成后才触发,它只会在冗长的操作完成后触发。因此,您看不到任何加载器,因为它不能在另一个观察器仍在运行时触发,之后它不会运行,因为冗长的过程已经完成。话虽如此,有一个简单的解决方案。(这个想法是,它在渲染输出时将加载动画添加到输出中,但您并不真的想显示输出,您使用输出只是为了使微调器工作),您可以使用另一个库
shinybusy
,它允许在每个忙碌周期或手动启动加载动画,而后者正是你想要的字符串