Как сбросить форму после выделения в ShinyR?

Этот вопрос является расширением этого вопрос. Я хотел бы перевести это приложение на следующий шаг, где после выбора «Система» пользователь должен иметь возможность нажать кнопку «Сбросить форму», которая очистит выбранную «Систему» ​​в «Выборе системы», а также очистит отображаемый вывод. в 1_. Я могу полностью сбросить выбранную опцию. Однако я не могу очистить datatable.

Пожалуйста, предоставьте объяснение с кодом.

Код, очищающий выбранный ввод...

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)

person biggboss2019    schedule 20.07.2019    source источник


Ответы (1)


В selectInput есть две части:

  1. Текст, отображаемый в пользовательском интерфейсе.
  2. Значение передано на сервер

Эти два значения могут быть одинаковыми или разными в зависимости от того, что предоставляется choices.

Установив updateSelectInput(session,"slct",selected = 'Null'), он устанавливает выбранное значение в 'Null', но 'Null' не предоставляется в choices, поэтому оно будет отображаться пустым в пользовательском интерфейсе.

Результат таков: вы предоставляете что-то не в choices и SelectInput не передаст значение на сервер. Так что input$slct остается без изменений.

Чтобы убедиться в этом, вы можете попробовать:

Добавьте print(input$slct) после resetForm(session) в свои серверные коды. И вы должны обнаружить, что resetForm() не может сбросить input$slct.

Чтобы ответить на ваш вопрос:

  1. Измените свою функцию resetForm() на:

Вы должны использовать "", так как он особенный. Это засчитывается как выбор, но не отображается в пользовательском интерфейсе.

resetForm<-function(session){
    updateSelectInput(session,"slct",selected = "")
}
  1. Измените choices в selectInput:
# 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)
person yusuzech    schedule 20.07.2019