在一个watchEvent处理程序中两次更改reactVal

时间:2019-12-16 16:19:40

标签: r shiny

当用户单击操作按钮时,我的Shiny应用程序将运行脚本build.R。我想通知用户不要在运行脚本时关闭应用程序。完成后,将通知用户构建成功。

这是我最小的可复制代码:

library(shiny)

ui <- fluidPage(
  actionButton("build", "run the buildscript"),
  textOutput("rstatus")
)

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

  reloadstatus <- reactiveVal("")

  observeEvent(input$build, {

    reloadstatus("building, do not close the app")

    # in the actual app would be source("build.R")
    Sys.sleep(1)

    reloadstatus("successfully built")
  })

  output$rstatus <- renderText({
    reloadstatus()
  })
}

shinyApp(ui, server)

我猜这是行不通的,因为Shiny尝试先运行observeEvent直到最后,然后再更改reactVal。如何获得所需的输出(第一个“正在重新加载...”,第二个“成功...”)?

1 个答案:

答案 0 :(得分:2)

您可以使用shinyjs更新消息的内容。

library(shiny)
library(shinyjs)

ui <- fluidPage(
  shinyjs::useShinyjs(),
  actionButton("build", "run the buildscript"),
  p(id = "rstatus", "")
)

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

  observeEvent(input$build, {

    shinyjs::html("rstatus", "building, do not close the app")

    # in the actual app would be source("build.R")
    Sys.sleep(1)

    shinyjs::html("rstatus", "successfully built")
  })

}

shinyApp(ui, server)