闪亮的反应性值更新顺序

时间:2018-08-02 13:04:06

标签: r shiny reactive-programming

我有一个闪亮的应用程序,其功能需要花费几分钟才能计算出来。我希望用户知道该功能正在运行并等待(例如,不要再次按下按钮)

我建立了对象的依赖关系,希望它会显示“等待”消息,但是由于某种原因它无法正常工作。

在我的服务器文件中,有这个

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不起作用,而是使用了带有反应性值的观察器。

1 个答案:

答案 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)) 
        }
      )
    })

  }
)