我有一个闪亮的应用程序,其功能需要花费几分钟才能计算出来。我希望用户知道该功能正在运行并等待(例如,不要再次按下按钮)
我建立了对象的依赖关系,希望它会显示“等待”消息,但是由于某种原因它无法正常工作。
在我的服务器文件中,有这个
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()
的值改回为空不会显示的字符串,(第二个观察者将再次被触发,但是按钮的值仍然相同,因此不应导致计算再次发生)
从不显示等待消息,并且在应用程序中显示该消息之前会进行long函数的计算。
我试图使用eventReactive
代替observeEvent
,但是由于某些原因,当我单击按钮时,值没有改变。
我阅读了diffdifference between observeEvent and eventReactive和有关这两个函数的其他一些问题,但无法弄清楚为什么我的eventReactive不起作用,而是使用了带有反应性值的观察器。
答案 0 :(得分:1)
此代码中存在一些基本缺陷。
首要的是-观察者仅用于其“副产品”(即他们在后台运行的代码),而不返回可在另一个变量中分配的值。
一个可以实现您想要做的事情的最小应用看起来像这样:
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))
}
)
})
}
)