如何在 Shiny R 中选择后重置表单?

How to resetform after selection in ShinyR?

这个问题是 的延伸。我想将此应用程序带到下一步,在选择 "System" 后,用户应该能够单击重置表单按钮,这将清除 "Select System" 中选定的 "System" 并清除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',但是choices中没有提供'Null',所以在[中显示为空白=64=].

结果是:您提供了 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)