R 如何在长时间计算前后立即更改反应值

R 如何在长时间计算前后立即更改反应值,r,shiny,R,Shiny,我有一个应用程序,在长时间的计算过程中,我想显示一条消息。当我爱的时候,我发现这个条件太宽泛了;我希望对该(或任何)消息何时显示进行更细粒度的控制 我的自然倾向是建立在我经常使用的解决方案的基础上,根据其他用户选择显示和显示/隐藏内容。我经常更进一步,在reactiveValues中保留一个“开关”变量,以使控制输出无功依赖于它;下面是一个小例子: # app.R library(shiny) ui <- shinyUI(fluidPage( titlePanel("Switch t

我有一个应用程序,在长时间的计算过程中,我想显示一条消息。当我爱的时候,我发现这个条件太宽泛了;我希望对该(或任何)消息何时显示进行更细粒度的控制

我的自然倾向是建立在我经常使用的解决方案的基础上,根据其他用户选择显示和显示/隐藏内容。我经常更进一步,在
reactiveValues
中保留一个“开关”变量,以使控制输出无功依赖于它;下面是一个小例子:

# app.R
library(shiny)

ui <- shinyUI(fluidPage(
  titlePanel("Switch test"),
  sidebarLayout(
    sidebarPanel(
      actionButton("action", "show/hide output")
    ),
    mainPanel(
      conditionalPanel(
        condition = "output.show",
        h5("HELLO!")
      )
    )
  )
))

server <- shinyServer(function(input, output) {

  vals <- reactiveValues(
    show = TRUE
  )

  output$show <- reactive(vals$show)
  outputOptions(output, "show", suspendWhenHidden = FALSE)

  observeEvent(input$action, {
    vals$show <- !(vals$show)
  })
})

shinyApp(ui = ui, server = server)
但实际发生的是,当消息显示预期值时,
output$show
似乎直到整个块完成执行后才会更新。为什么,
vals$show
中的更改不应该触发
output$show
立即重新计算


我尝试过的其他一些解决方案包括使用
,似乎即使值实时更改,ui更新也要等到整个
observeEvent
完成后才能完成。我猜您可以直接使用Javascript读取值并更新界面,或者使用
renderUI
reactivePoll
的组合(我还不能让它工作,但我认为它可以完成)。顺便说一句,我想这是您链接问题的最后一个答案,只需将“显示/隐藏”代码更改为显示消息的代码即可。@warmoverflow该链接中的答案太重,不太理想,因此我希望用一种更自然的方式来实现这一点。我无法让
renderUI
reactivePoll
单独工作,也不清楚如何组合它们。如果你想出一个办法,请张贴答案!如果您能解释一下为什么在
observeEvent
完成之前用户界面不更新,我也会很感激,因为这种行为似乎没有很好的文档记录,并且让我感到惊讶。我刚刚注意到
with progress
函数是一种替代方法(这不完全是您想要的,但是当您正在进行计算时,很容易添加状态指示器。
observeEvent(输入$button,{withProgress(message=“calculation in progress”,detail=“这可能需要一段时间”,value=0,{incProgress(1)Sys.sleep(5)})
@warmoverflow如果没有确定性循环或至少恒定时间操作,则不应使用该函数。如果计算时间长于估计时间(表现为
incProgress
Sys.sleep
),则进度将在100暂停一段时间,这是不可接受的用户体验。
  observeEvent(input$action, {
    vals$show <- FALSE
    message(paste("vals$show, before:", vals$show))

    Sys.sleep(5)  # long computation

    vals$show <- TRUE
    message(paste("vals$show, after:", vals$show))
  })