闪亮:如果取消确认,则恢复 radioGroupButtons 上的选择

Shiny: revert choice on radioGroupButtons if confirmation is cancelled

我正在使用 radioGroupButtons 构建一个闪亮的应用程序。这组按钮中有几个选择。 By default one of the choices is selected, but when a different option is selected, a confirmation will pop out.如果确认,我会做一些事情,但是如果在警报中单击 cancel,我希望选择返回到单击 radioGroupButtons 之前的状态。

在我的代码中,至少单击一次 "confirm" 才会发生选择还原,并且它会正常工作。第二个问题是当它工作正常时,它总是触发 2 次警报框。有人知道怎么回事吗?

library(shiny)
library(shinyWidgets)

shinyApp(
    ui = fluidPage(
        tagList(
            radioGroupButtons(
                inputId = "group_btn", label = "Choose source:", 
                selected = "upload",
                choiceNames = c("Upload", "Example"), 
                choiceValues = c("upload", "eg"),
                justified = TRUE, status = "primary",
                checkIcon = list(yes = icon("ok", lib = "glyphicon"), no = icon(""))
            ),
            uiOutput("choice")
        )
    ),
    function(input, output, session) {
        selected_old <- reactiveVal(FALSE)
        observeEvent(input$group_btn, ignoreInit = TRUE, {
            confirmSweetAlert(
                session, inputId = "sweet_change_confirm", 
                title = "change Source?"
                )
            output$choice <- renderUI(p(print(input$group_btn)))
        })
        observeEvent(input$sweet_change_confirm, ignoreNULL = TRUE, {
            if (isTRUE(input$sweet_change_confirm)){
                selected_old(input$group_btn)
            } else {
                updateRadioGroupButtons(session, "group_btn", selected = selected_old(),
                                        checkIcon = list(yes = icon("ok", lib = "glyphicon"), no = icon(""))
                                        )
            }
        })
    }
)

我想当我更新第二个 observeEvent 时,第一个 observeEvent 会再次触发,因为选择已更改。如果是这种情况,我该如何避免?

看来使用 updateRadioGroupButtons 会为您的 input$group_btn 激活您的 observeEvent。当您取消对话框时,您可以创建另一个 reactiveVal 到 "flag",这样它只出现一次。

此外,我将默认的 reactiveVal 更改为 selected_old,因为您似乎希望 "upload" 作为默认的单选按钮。

library(shiny)
library(shinyWidgets)

shinyApp(
  ui = fluidPage(
    tagList(
      radioGroupButtons(
        inputId = "group_btn", label = "Choose source:", 
        selected = "upload",
        choiceNames = c("Upload", "Example"), 
        choiceValues = c("upload", "eg"),
        justified = TRUE, status = "primary",
        checkIcon = list(yes = icon("ok", lib = "glyphicon"), no = icon(""))
      ),
      uiOutput("choice")
    )
  ),
  function(input, output, session) {
    selected_old <- reactiveVal("upload")
    selected_flag <- reactiveVal(TRUE)

    observeEvent(input$group_btn, ignoreInit = TRUE, {
      if (selected_flag() == TRUE) {
        confirmSweetAlert(
          session, inputId = "sweet_change_confirm", 
          title = "change Source?"
        )
      } else {
        selected_flag(TRUE)
      }
    })

    output$choice <- renderUI(p(print(input$group_btn)))

    observeEvent(input$sweet_change_confirm, ignoreNULL = TRUE, {
      if (isTRUE(input$sweet_change_confirm)){
        selected_old(input$group_btn)
      } else {
        updateRadioGroupButtons(session, "group_btn", selected = selected_old(),
                                checkIcon = list(yes = icon("ok", lib = "glyphicon"), no = icon(""))
        )
        selected_flag(FALSE)
      }
    })
  }
)