#r #shiny
Вопрос:
У меня есть код с a fileInput
и календарем. Если я импортирую файл Excel fileInput
, появится календарь. Пока все в порядке, но я хотел бы настроить функцию на своей reset
кнопке. reset
Кнопка удаляет даты, которые я выбрал в календаре, но мои fileInput
остаются прежними Upload complete
. Есть ли способ отрегулировать это, то есть очистить и мой fileInput
?
library(shiny) library(shinythemes) df1 lt;- structure( list(date1= c("2021-06-28","2021-06-28","2021-06-28"), date2 = c("2021-07-01","2021-07-02","2021-07-04"), Category = c("ABC","ABC","ABC"), Week= c("Wednesday","Wednesday","Wednesday")), class = "data.frame", row.names = c(NA, -3L)) ui lt;- fluidPage( shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE, br(), tabPanel("", sidebarLayout( sidebarPanel( fileInput("file",h4(("Import file"), multiple = T,accept = ".xlsx")), br(), uiOutput("date"), actionButton("reset", "Reset") ), mainPanel( ), )) )) server lt;- function(input, output,session) { data lt;- reactive(df1) data lt;- eventReactive(input$file, { if (is.null(input$file)) { return(NULL) } else { df lt;- read_excel(input$file$datapath) return(df) } }) output$date lt;- renderUI({ all_dates lt;- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day") disabled lt;- as.Date(setdiff(all_dates, as.Date(data()$date2)), origin = "1970-01-01") dateInput(input = "database", label = h4("Choose"), min = min(data()$date2), max = max(data()$date2), value = NA, datesdisabled = disabled) }) observeEvent(input$reset, { df1 lt;- data() updateDateInput(session, 'database', value = NA) }) } shinyApp(ui = ui, server = server)
Пример того, как это выглядит:
Ответ №1:
Вы можете включить fileInput
его со стороны сервера и перезагрузить после нажатия reset
.
library(shiny) library(shinythemes) library(readxl) df1 lt;- structure( list(date1= c("2021-06-28","2021-06-28","2021-06-28"), date2 = c("2021-07-01","2021-07-02","2021-07-04"), Category = c("ABC","ABC","ABC"), Week= c("Wednesday","Wednesday","Wednesday")), class = "data.frame", row.names = c(NA, -3L)) ui lt;- fluidPage( shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE, br(), tabPanel("", sidebarLayout( sidebarPanel( uiOutput('fileInput'), br(), uiOutput("date"), actionButton("reset", "Reset") ), mainPanel( ), )) )) server lt;- function(input, output,session) { data lt;- reactive(df1) data lt;- eventReactive(input$file, { if (is.null(input$file)) { return(NULL) } else { df lt;- read_excel(input$file$datapath) return(df) } }) output$date lt;- renderUI({ all_dates lt;- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day") disabled lt;- as.Date(setdiff(all_dates, as.Date(data()$date2)), origin = "1970-01-01") dateInput(input = "database", label = h4("Choose"), min = min(data()$date2), max = max(data()$date2), value = NA, datesdisabled = disabled) }) observeEvent(input$reset, { df1 lt;- data() updateDateInput(session, 'database', value = NA) output$fileInput lt;- renderUI({ fileInput("file",h4(("Import file"), multiple = T,accept = ".xlsx")) }) }) output$fileInput lt;- renderUI({ fileInput("file",h4(("Import file"), multiple = T,accept = ".xlsx")) }) } shinyApp(ui = ui, server = server)
Комментарии:
1. Большое вам спасибо за ответ!. Вопрос после того, как я нажму
reset
кнопку, есть ли способ удалить календарь и показать толькоfileInput
его ?2. Вы можете заняться
shinyjs::hide()
этим, чтобы сделать это.