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: ex.xlsx - Google Sheets). 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?
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)