Shiny: отменить выбор на radioGroupButtons, если подтверждение отменено - PullRequest
0 голосов
/ 04 марта 2020

Я создаю блестящее приложение с radioGroupButtons. В этой группе кнопок есть несколько вариантов. По умолчанию выбран один из вариантов, но при выборе другого варианта появится подтверждение. Если это подтверждается, я что-то делаю, но если в предупреждении нажата кнопка cancel, я хочу, чтобы выделение вернулось в состояние go до нажатия кнопки radioGroupButtons.

В моем коде реверсия выбора не произойдет, пока не будет нажата хотя бы однажды кнопка «Подтвердить», и она будет работать нормально. Вторая проблема - когда он работает нормально, он всегда срабатывает 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 запускается снова, потому что выбор был изменен. Если это так, как я могу избежать?

1 Ответ

0 голосов
/ 04 марта 2020

Похоже, что использование updateRadioGroupButtons активирует observeEvent для вашего input$group_btn. Вы можете создать еще один reactiveVal для «пометки» при отмене диалогового окна, чтобы оно появлялось только один раз

Кроме того, я изменил значение по умолчанию reactiveVal на selected_old, так как казалось, что вы хотите «загрузить» в качестве переключателя по умолчанию.

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