How to adjust functionality for input data in shiny code

The code below works, but I would like to make an adjustment. Note that I have two forms of input: Excel and Database. For this test, let's use the first option. Note that after choosing the Excel option, a fileInput will be loaded, and later you can load the file (You can download this file from the link: https://syr.us/rVo). After loading the file, an output table is generated, as figure below. But I have a doubt:

Note that in if (input$button ="Excel") inside the observe, I only insert output$fileInput. However, here it would not be necessary to insert data and data2 as well inside the observe? However, when I do that, then the app doesn't work. Could you try it out and help me solve this problem?

This resolved question can help: How to adjust error using observe function in a shiny app

Executable code below

library(shiny)
library(dplyr)
library(shinythemes)

ui <- fluidPage(
  
  shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                    br(),
                    tabPanel("PAGE1",
                             sidebarLayout(
                               sidebarPanel(
                                 radioButtons("button", 
                                              label = h3("Data source"),
                                              choices = list("Excel" = "Excel",
                                                             "Database" = "database"), 
                                              selected = "File"),
                                 br(),br(),
                                 uiOutput('fileInput'),
                                 uiOutput('daterange')
                                 
                               ),
                               mainPanel(
                                 dataTableOutput('table')
                               )))))



server <- function(input, output) {
  

  observe({
    if(is.null(input$button)) {
      
    }else if (input$button =="Excel"){
      
      output$fileInput <- renderUI({
        fileInput("file",h4("Import file"), multiple = T, accept = ".xlsx")
      })
      
      
    } else if(input$button=="database"){
      
      
      con <- DBI::dbConnect(odbc::odbc(),
                            Driver   = "[your driver's name]",
                            Server   = "[your server's path]",
                            Database = "[your database's name]",
                            UID      = rstudioapi::askForPassword("Database user"),
                            PWD      = rstudioapi::askForPassword("Database password"),
                            Port     = 1433)
      
      data <-tbl(con, in_schema("dbo", "date1")) %>%
        collect()
      
      data2 <- tbl(con, in_schema("dbo", "date2")) %>% 
        collect()
      
    } else {
      output$fileInput <- NULL
    }
  })

  data <- reactive({
    if (is.null(input$file)) {
      return(NULL)
    }
    
    else {
      df3 <- read_excel(input$file$datapath,sheetnames()[1])
      validate(need(all(c('date1', 'date2') %in% colnames(df3)), "Incorrect file"))
      df4 <- df3 %>% mutate_if(~inherits(., what = "POSIXct"), as.Date)
      return(df4)
    }
  })
  
  data2 <- reactive({
    req(input$file)
    df1 <- read_excel(input$file$datapath,sheetnames()[2])
    df1
  })
  
  sheetnames <- eventReactive(input$file, {
    available_sheets = openxlsx::getSheetNames(input$file$datapath)
  })  
 
  output$daterange <- renderUI({
    req(data())
    dateRangeInput("daterange1", "Period you want to see:",
                   start = min(data()$date2),
                   end   = max(data()$date2))
  })
  
  data_subset <- reactive({
    req(input$daterange1)
    days <- seq(input$daterange1[1], input$daterange1[2], by = 'day')
    subset(data(), date2 %in% days)
  })
  
  output$table <- renderDataTable({
    data_subset()
  })
  
}

shinyApp(ui = ui, server = server)

Generated table enter image description here


You could use reactiveVal combined with observe:

library(shiny)
library(dplyr)
library(shinythemes)
library(readxl)

ui <- fluidPage(
  
  shiny::navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
                    br(),
                    tabPanel("PAGE1",
                             sidebarLayout(
                               sidebarPanel(
                                 radioButtons("button", 
                                              label = h3("Data source"),
                                              choices = list("Excel" = "Excel",
                                                             "Database" = "database"), 
                                              selected = "File"),
                                 br(),br(),
                                 uiOutput('fileInput'),
                                 uiOutput('daterange')
                                 
                               ),
                               mainPanel(
                                 dataTableOutput('table')
                               )))))



server <- function(input, output) {
  
  data <- reactiveVal()
  data2 <- reactiveVal()
  
  observe({
    if(is.null(input$button)) {
      
    }else if (input$button =="Excel"){
      
      output$fileInput <- renderUI({
        fileInput("file",h4("Import file"), multiple = T, accept = ".xlsx")
      })
      
      
    } else if(input$button=="database"){
      
      
      # con <- DBI::dbConnect(odbc::odbc(),
      #                       Driver   = "[your driver's name]",
      #                       Server   = "[your server's path]",
      #                       Database = "[your database's name]",
      #                       UID      = rstudioapi::askForPassword("Database user"),
      #                       PWD      = rstudioapi::askForPassword("Database password"),
      #                       Port     = 1433)
      # 
      # data(tbl(con, in_schema("dbo", "date1")) %>%
      #   collect())
      # 
      # data2(tbl(con, in_schema("dbo", "date2")) %>% 
      #   collect())
      
      
      Test <- structure(list(date1 = structure(c(18808, 18808, 18809, 18810
      ), class = "Date"),date2 = structure(c(18808, 18808, 18809, 18810
      ), class = "Date"), Category = c("FDE", "ABC", "FDE", "ABC"), 
      coef = c(4, 1, 6, 1)), row.names = c(NA, 4L), class = "data.frame")
      
      data(Test)
      data2(Test)
      
    } else {
      output$fileInput <- NULL
    }
  })
  
  observe({
    if (is.null(input$file)) {
      return(NULL)
    }
    
    else {
      df3 <- read_excel(input$file$datapath,sheetnames()[1])
      validate(need(all(c('date1', 'date2') %in% colnames(df3)), "Incorrect file"))
      df4 <- df3 %>% mutate_if(~inherits(., what = "POSIXct"), as.Date)
      data(df4)
    }
  })
  
  observe({
    req(input$file)
    df1 <- read_excel(input$file$datapath,sheetnames()[2])
    data(df1)
  })
  
  sheetnames <- eventReactive(input$file, {
    available_sheets = openxlsx::getSheetNames(input$file$datapath)
  })  
  
  output$daterange <- renderUI({
    req(data())
    dateRangeInput("daterange1", "Period you want to see:",
                   start = min(data()$date2),
                   end   = max(data()$date2))
  })
  
  data_subset <- reactive({
    req(input$daterange1)
    days <- seq(input$daterange1[1], input$daterange1[2], by = 'day')
    subset(data(), date2 %in% days)
  })
  
  output$table <- renderDataTable({
    data_subset()
  })
  
}

shinyApp(ui = ui, server = server)