如何在长计算之前和之后立即更改reactiveValue

时间:2016-03-31 17:24:08

标签: r shiny

我有一个应用程序,在长时间的计算中,我想显示一条消息。虽然我喜欢this SO answer,但我觉得这个条件过于宽泛;我希望更精细地控制何时(或任何)消息出现。

我的自然倾向是建立在a previous SO question I asked的基础之上,我经常使用它来显示和显示/隐藏其他用户选择的内容。我经常通过进行"切换" 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)

按下按钮,消息消失。再次按,消息回来。

现在,如果按钮触发了长时间的操作,我想我可以在之前和之后切换vals$show来暂时隐藏消息:

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

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

我尝试过的其他一些解决方案包括使用<<-,使用普通observe,并使用多个observeEvents(一个用于翻转开关,另一个用于执行计算,然后翻转开关)。这些都不起作用!

实现此功能的正确方法是什么?如何在需要时更新output$show

0 个答案:

没有答案