我有一个应用程序,在长时间的计算中,我想显示一条消息。虽然我喜欢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
?