[英]shiny reactive values update order
我有一个闪亮的应用程序,它有一个需要几分钟来计算的函数。 我希望用户知道该功能正在运行并等待(例如,不要再次按下按钮)
我建立了对象的依赖关系,希望它会显示“等待”消息,但由于某种原因它不起作用。
在我的服务器文件中,我有这个-
function(input, output, session) {
inProgressValue <- reactiveVal('')
inProgressValue2 <- reactiveVal(0)
myCalculatedValue <- reactive(NULL)
inProgressEvent <- observeEvent(input$myButton,{
inProgressValue('In progress please wait')
})
inProgressEvent2 <- observeEvent(inProgressValue(),{
inProgressValue2(input$myButton)
})
longFunctionEvent <- observeEvent(inProgressEvent2(),{
#make some calculations
inProgressValue('')
})
output$waiting <- renderText({
inProgressPlsValue()
})
output$mainData <- renderPlot({
#do some stuff with myCalculatedValue()
})
}
在 ui 文件中,我有-
fluidRow(h3(textOutput('waiting'))),
fluidRow(h3(plotOutput('waiting')))
我希望当myButton
被点击并且值会改变时,第一个观察者将被触发并且inProgressValue()
将更改为“正在进行中,请稍候”,这将在应用程序中打印。 然后第二个观察者会被触发, inProgressValue2()
的值会被设置为myButton
值,所有的计算都会被执行, inProgressValue()
的值会被改回一个不会显示的空字符串,(第二个观察者将再次被触发,但按钮的值仍然相同,因此这不应导致计算再次发生)
等待消息永远不会显示,长函数的计算发生在消息显示在应用程序中之前。 我试图使用eventReactive
而不是observeEvent
,但由于某种原因,当我点击按钮时,这些值没有改变。
我阅读了observeEvent 和 eventReactive 之间的差异以及关于这两个函数的其他一些问题,但无法弄清楚为什么我的 eventReactive 不起作用,而是使用具有反应值的观察者。
这段代码有一些基本的缺陷。
首先也是最重要的 - 观察者仅用于它们的“副产品”(即它们在后台运行的代码),而不是返回可以在另一个变量中分配的值。
一个可以实现你想要做的事情的最小应用程序看起来像这样:
library(shiny)
shinyApp(
ui = fluidPage(actionButton(inputId = "btn", label = "run")),
server = function(input, output, session) {
observeEvent(input$btn, {
withProgress(
message = "Please wait",
value = 0.35,
expr = {
# some time consuming operations, e.g:
mean(rnorm(n = 50000000))
}
)
})
}
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.