这是另一个适用于静态或动态输入的选项,并且不涉及完全重新渲染输入。
它使用:
reactiveValuesToList 获取所有初始输入值,以及(可选)之后初始化的任何动态输入值。
session$sendInputMessage 更新通用输入的值。 updateXyzInput 函数在底层调用它,如 session$sendInputMessage(inputId, list(value = x, ...)。
每个 Shiny 输入都使用value 作为其输入消息,并且几乎所有输入都将按原样更新其输入值。我发现只有两个输入需要特殊的大小写 - checkboxGroupInput 在未检查任何内容时不发送 NULL,dateRangeInput 将其 c(start, end) 转换为 list(start = start, end = end)。
盲目地重置所有输入可能不是一个好主意(即使选项卡也会被重置),但这很容易适应重置一组过滤的输入。
library(shiny)
ui <- pageWithSidebar(
headerPanel("'Reset inputs' button example"),
sidebarPanel(
numericInput("mynumber", "Enter a number", 20),
textInput("mytext", "Enter text", "test"),
textAreaInput("mytextarea", "Enter text", "test"),
passwordInput("mypassword", "Enter a password", "password"),
checkboxInput("mycheckbox", "Check"),
checkboxGroupInput("mycheckboxgroup", "Choose a number", choices = c(1, 2, 3)),
radioButtons("myradio", "Select a number", c(1, 2, 3)),
sliderInput("myslider", "Select a number", 1, 5, c(1,2)),
uiOutput("myselUI"),
uiOutput("mydateUI"),
tags$hr(),
actionButton("reset_input", "Reset inputs")
),
mainPanel(
h4("Summary"),
verbatimTextOutput("summary")
)
)
server <- function(input, output, session) {
initialInputs <- isolate(reactiveValuesToList(input))
observe({
# OPTIONAL - save initial values of dynamic inputs
inputValues <- reactiveValuesToList(input)
initialInputs <<- utils::modifyList(inputValues, initialInputs)
})
observeEvent(input$reset_input, {
for (id in names(initialInputs)) {
value <- initialInputs[[id]]
# For empty checkboxGroupInputs
if (is.null(value)) value <- ""
session$sendInputMessage(id, list(value = value))
}
})
output$myselUI <- renderUI({
selectInput("mysel", "Select a number", c(1, 2, 3))
})
output$mydateUI <- renderUI({
dateInput("mydate", "Enter a date")
})
output$summary <- renderText({
return(paste(input$mytext, input$mynumber))
})
}
shinyApp(ui, server)