使用 shinyalert 确认数据更新

Use shinyalert to confirm data update

我想根据用户的要求使闪亮背后的数据可刷新。但是,由于刷新需要几分钟,我想在实际开始该过程之前警告用户并允许他们取消。

我使用@deanattali 提供的超级shinyalert 包来设置警报。这是一个可重现的小例子。把data(mtcars)想成是取一些数据,把平均计算想成是在处理一些数据,两者都需要一些时间。

library(shiny)
library(shinyalert)
library(data.table)

ui <- bootstrapPage(
    useShinyalert(),
    actionButton("refresh", "Refresh"),
    dataTableOutput("table")
)

server <- function(input, output) {
    observeEvent(input$refresh, {
        shinyalert("You are abouto to refresh data...", showCancelButton = TRUE)
    })

    aggregated_data <- eventReactive(input$shinyalert, {
        message("reload data")
        data(mtcars)
        as.data.table(mtcars)[, .(avg_speed = mean(mpg)), by = cyl]
    }, ignoreNULL = FALSE)

    output$table <- renderDataTable(
        aggregated_data()
    )
}

shinyApp(ui, server)

然而,它并不如我所愿。它会在 input$shinyalert 更改时重新加载数据,而不是在用户单击 "OK" 时重新加载数据(我知道这是预期的功能,我只是不知道如何实现我想要的功能)。我如何重写它以仅在输入 $shinyalert 更改为 TRUE 时重新计算 aggregated_data 反应?

(我在 eventReactive 中尝试了一个简单的 if 语句,但如果条件计算结果为 FALSE,它不会 return 任何东西。)

您使用 eventReactive 的方式有误。这没有按预期工作,因为 shinyalert returns FALSE 如果您单击 cancel 并因此触发 eventReactive - 请参阅 shinyalert github readme

When there is no input field in the modal, the value of the modal is TRUE if the user clicked the “OK” button, and FALSE if the user clicked the “Cancel” button.

尝试 reactiveValues 而不是 eventReactive 并在忽略 FALSE

的观察者中使用 req()
server <- function(input, output) {
  observeEvent(input$refresh, {
    shinyalert("You are abouto to refresh data...", showCancelButton = TRUE)
  })

  aggregated <- reactiveValues()

  observe({
    req(input$shinyalert)
    message("reload data")
    data(mtcars)
    aggregated$data <- as.data.table(mtcars)[, .(avg_speed = mean(mpg)), by = cyl]
  })

  output$table <- renderDataTable(
    aggregated$data
  )
}

此外,如果您想再次设置 ignoreNULL = FALSE,您可以通过创建 aggregated

来指定它