bounty还有4天到期。回答此问题可获得+100声望奖励。ava希望引起更多关注此问题。
我已经写了一个闪亮的应用程序,向用户呈现不同的单选按钮。根据输入的不同,数字将被添加到一个score/counter
,其他单选按钮将弹出(而前一个将被禁用)。
我现在想知道,我如何实现一个“后退”按钮,让用户后退一步(例如,在误点击的情况下),这意味着:
1.隐藏最近的单选按钮
1.再次激活最后一个单选按钮
1.调整score/counter
我学习了how to add a "reset" button that calls session$reload()
,它删除了所有内容,用户可以重新开始。但是,如果用户可以只后退一步,那就好多了。
我发现了类似的问题(Create general purpose "go back" button in shiny和https://www.collinberke.com/blog/posts/2021-09-12-shiny-implementing-a-next-and-back-button/index.html),但是,这些问题处理的设置略有不同。
示例:
ui.R
ui <- fluidPage(
shinyjs::useShinyjs(),
# Add an invisible counter to store the total score
verbatimTextOutput(outputId = "counter", placeholder = TRUE),
# Add a radio button with two choices
radioButtons(inputId = "a",
# label = "a",
label = "a",
choices = c("10", "5"),
selected = ""),
# UI elements for the b and c radio buttons
uiOutput("b"),
uiOutput("c"),
uiOutput("d"),
uiOutput("c1"),
uiOutput("e"),
uiOutput("f"),
# Add a back button to allow the user to go back to the previous question
actionButton(
inputId = "reset_button",
label = "Reset",
width = "50%"
),
textOutput("reset_val")
)
服务器.R
server <- function(input, output, session) {
reset_rv <- reactiveVal(value = 0L)
# Initialize the counter to 0
counter <- reactiveValues(value = 0)
# Track the selected options
selected_options <- reactiveValues(
a = NULL,
b = NULL,
d = NULL,
c = NULL,
e = NULL,
f = NULL
)
# Update the counter when the a radio button is clicked
observeEvent(input$a, {
if (!is.null(input$a)) {
selected_options$a <- input$a
if (input$a == "5") {
counter$value <- counter$value + 0
output$b <- renderUI({
radioButtons(inputId = "b",
label = "b",
choices = c("a", "10"),
selected = "")
})
} else if (input$a == "10") {
counter$value <- counter$value + 8
output$c <- renderUI({
radioButtons(inputId = "c",
label = "c",
choices = c("L", "R"),
selected = "")
})
}}
shinyjs::disable("a")
})
# 2 -----------------------------------------------------------------------
observeEvent(input$b, {
if (!is.null(input$b)) {
selected_options$b <- input$b
if (input$b == "5") {
counter$value <- counter$value + 0
output$d <- renderUI({
radioButtons(inputId = "d",
label = "d",
choices = c("5", "10"),
selected = "")
})
} else if (input$b == "10") {
counter$value <- counter$value + 6
output$c1 <- renderUI({
radioButtons(inputId = "c1",
label = "c",
choices = c("L", "R"),
selected = "")})}}
shinyjs::disable("a")
shinyjs::disable("b")
})
observeEvent(input$c, {
if (!is.null(input$c)) {
selected_options$c <- input$c
if (input$c == "R") {
counter$value <- counter$value + 0
output$e <- renderUI({
radioButtons(inputId = "e",
label = "e",
choices = c("5", "10"),
selected = "")
})
} else if (input$c == "L") {
counter$value <- counter$value + 4
output$f <- renderUI({
radioButtons(inputId = "f",
label = "L",
choices = c("5", "10"),
selected = "")})}}
shinyjs::disable("a")
shinyjs::disable("c")
})
# Update the counter output
output$counter <- renderText({
paste("Score:", counter$value)
})
observeEvent(input$reset_button, {
reset_rv(input$reset_button)
session$reload()
})
}
快跑
shinyApp(ui = ui, server = server)
1条答案
按热度按时间3b6akqbq1#
我建议(几乎总是)放弃
renderUI
并使用updateXXX函数(updateRadioButtons
),因为重新呈现元素比更新现有元素慢。此外,您可以利用
radioButtons
'choiceNames
/choiceValues
结构来避免冗长的if子句。要隐藏我正在使用
conditionalPanels
的元素:PS:在这个上下文中,你可能想检查库(shinyglide)。