我正在使用radioGroupButtons
构建一个闪亮的应用程序。在这组按钮中有一些选择。默认情况下,将选择一个选项,但是当选择其他选项时,将弹出确认。如果确认,我会执行某些操作,但是如果在警报中单击cancel
,则我希望选择返回到单击radioGroupButtons
之前的状态。
在我的代码中,只有在至少单击一次“确认”之后,选择恢复才会发生,并且可以正常工作。第二个问题是,当它工作正常时,它始终会触发两次警报框。有人知道怎么了吗?
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
会激活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)
}
})
}
)