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