r - 在 ShinyR 中选择后如何重置表单?



这个问题是这个问题的扩展。我想将此应用程序带到下一步,选择"系统"后,用户应该能够单击"重置表单"按钮,这将清除"选择系统"中选定的"系统",并清除mainpanel中显示的输出。我能够完全重置所选选项。但是,我无法清除数据表。

请提供代码说明。

清除所选输入的代码...

df <- data.frame("Users" =c('A',"B","A",'C','B'), "Date" = c('17 Mar 2019','15 Mar 2019','11 Mar 2019','20 Apr 2019',"21 Apr 2019"), "Systems" = c("Sys1", "Sys1","Sys2","Sys3","Sys4"), stringsAsFactors = FALSE)
df
library(shiny)
library(DT)
library(dplyr)
resetForm<-function(session){
updateSelectInput(session,"slct",selected = 'Null')
}

ui <- basicPage(
h2("Different Systems"),
sidebarLayout(
sidebarPanel(
selectInput('slct',"Select System",choices = df$Systems),
actionButton('clear',"Reset Form")
),
mainPanel(
DT::dataTableOutput("mytable")
)
)
)
server <- function(input, output,session) {
#df$system<-rownames(df$Systems)
output$mytable = DT::renderDataTable({
req(input$slct) # add this line
df %>%
filter(stringr::str_detect(Systems, as.character(input$slct)))
})
observeEvent(input$clear,{
req(input$slct)
resetForm(session)
})
}
shinyApp(ui, server)

selectInput有两个部分:

  1. UI 上显示的文本。
  2. 传递给服务器的值

这两个值可以相同或不同,具体取决于提供给choices的内容。

通过设置updateSelectInput(session,"slct",selected = 'Null'),它将所选值设置为'Null',但'Null'choices中没有提供,因此它将在UI中显示为空白。

结果是:您提供了不在choices中的内容,SelectInput不会将值传递给服务器。所以input$slct保持不变。

要确认这一点,您可以尝试:

在服务器代码中resetForm(session)后添加print(input$slct)。你应该发现resetForm()无法重置input$slct.

要解决您的问题:

  1. resetForm()函数更改为:

你应该使用""因为它非常特别。它被视为一个选项,但它不会显示在 UI 中。

resetForm<-function(session){
updateSelectInput(session,"slct",selected = "")
}
  1. 修改selectInput中的choices
# Change choices to c("",df$Systems)
selectInput('slct',"Select System",choices = c("",df$Systems)),

以下脚本应该可以工作:

df <- data.frame("Users" =c('A',"B","A",'C','B'), "Date" = c('17 Mar 2019','15 Mar 2019','11 Mar 2019','20 Apr 2019',"21 Apr 2019"), "Systems" = c("Sys1", "Sys1","Sys2","Sys3","Sys4"), stringsAsFactors = FALSE)
df
library(shiny)
library(DT)
library(dplyr)
resetForm<-function(session){
updateSelectInput(session,"slct",selected = '')
}

ui <- basicPage(
h2("Different Systems"),
sidebarLayout(
sidebarPanel(
selectInput('slct',"Select System",choices = c("",df$Systems)),
actionButton('clear',"Reset Form")
),
mainPanel(
DT::dataTableOutput("mytable")
)
)
)
server <- function(input, output,session) {
#df$system<-rownames(df$Systems)
output$mytable = DT::renderDataTable({
req(input$slct) # add this line
df %>%
filter(stringr::str_detect(Systems, as.character(input$slct)))
})
observeEvent(input$clear,{
req(input$slct)
resetForm(session)
})
}
shinyApp(ui, server)

最新更新