繁体   English   中英

闪亮的反应值更新顺序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM