#' Saldae Dashboard Module UI
#' @description Saldae Dashboard module UI : data upload
#' @author Farid Azouaou
#' @param id server module ID
#' @export
ghred_tisefka_UI <- function(id){
ns <- NS(id)
fluidPage(
# tags$head(tags$style(".progress-bar{background-color:#A6761D;}")),
uiOutput(ns("data_reader")),
#-----------date related settings
fluidRow(column(width = 2,
uiOutput(ns("date_variable"))),
column(width = 4,
uiOutput(ns("time_period"))),
column(width = 3,
uiOutput(ns("tisefka_target_variables"))),
column(width = 3,
uiOutput(ns("tisefka_categorical_variables")))
),
# Data Overview 1 (key figures)
uiOutput(ns("SA_tisefka_overview")),
# Data overview 2
uiOutput(ns("SA_tisefka_overview2"))
)
}
#' Saldae dashboard module: upload data
#' @description upload rwa data and prepare it to be used for exploration and analysis
#' @author Farid Azouaou
#' @param input input shinydashboard elements containing information to use data upload
#' @param output output shinydashboard element
#' @param session shiny session
#' @return output objects to be displayed in corresponding UI module
#' @export
ghred_tisefka_mod <-function(input, output, session, i18n ){
ns <- session$ns
output$data_source <- renderUI({
shinyWidgets::radioGroupButtons(
inputId = ns("data_source"),
label = i18n$t("Data Source"),
choices = c(
`<i class="fas fa-file-csv"></i>` = "file", `<i class="fas fa-database"></i>` = "database",
`<i class="fas fa-globe"></i>` = "web_api",`<i class="fas fa-cloud-upload-alt"></i>` = "cloud",
`<i class="fab fa-dropbox"></i>` = "dropbox"),
status = "info",
justified = TRUE,
selected = "file"
)
})
output$tisefka_file <- renderUI({
fileInput(inputId = ns("tisefka_file"), label = i18n$t("Choose file(csv text xls)"),
multiple = FALSE,
accept = c("csv")
)
})
file_tasetta <- reactive({
req(input$tisefka_file)
tools::file_ext(input$tisefka_file$name)
})
excel_tiwriqin <- reactive({
req(input$tisefka_file)
req(file_tasetta())
if(file_tasetta()=="csv")return(".csv")
if(file_tasetta()=="xlsx"){
readxl::excel_sheets(input$tisefka_file$datapath)
}
})
output$excel_tawriqt <- renderUI({
req(req(input$tisefka_file))
req(file_tasetta())
req(excel_tiwriqin())
excel_sheets <- excel_tiwriqin()
xl_label <- i18n$t("Target Sheet")
if(excel_tiwriqin() == ".csv"){
excel_sheets <- gsub(".csv","",input$tisefka_file$name)
}
shinyWidgets::pickerInput(
inputId = ns("excel_tawriqt"),
label = i18n$t(xl_label),
choices = excel_sheets
)
})
output$data_reader <- renderUI({
fluidRow(
column(width= 3, uiOutput(ns("data_source"))),
column(width = 3, uiOutput(ns("tisefka_file"))),
column(width = 3, uiOutput(ns("excel_tawriqt")))
)
})
tisefka <- reactive({
if(input$data_source == "file"){
req(input$tisefka_file)
req(file_tasetta())
req(input$excel_tawriqt)
tisefka <- SaldaeDataExplorer::ghred_tisefka_aqerru(input_file = input$tisefka_file , tala = file_tasetta(), tawriqt = input$excel_tawriqt)
}else if(input$data_source == "cloud"){
tisefka <- load_object_from_cloud(s3_bucket = "belgatrans", s3_prefix = "dashboard/",
s3_action = "read",
data_name = "dashboard_data")
to_discard <- c("jour_semaine", "semaine","annee")
tisefka <- tisefka$exploitation_data%>%
janitor::clean_names()%>%
dplyr::mutate(couts = as.numeric(couts), frais_route= as.numeric(frais_route))%>%
dplyr::mutate(frais_route = dplyr::case_when(is.na(frais_route)~0,.default = frais_route))%>%
janitor::remove_empty(which = "cols")%>%
dplyr::select(-!!to_discard)
}else if(input$data_source == "web_api"){
"error"
}else{
"error"
}
tisefka <- tisefka%>%janitor::clean_names()%>%
janitor::remove_constant()%>%
janitor::remove_empty(which = "cols")
shinyalert::shinyalert(i18n$t("Data Upload"), text = i18n$t("Data Successfully uploaded"), type = "success",
closeOnClickOutside = TRUE,showConfirmButton = TRUE)
return(tisefka)
})
#------- select date variable
dates_yellan <- reactive({
req(tisefka())
dates_yellan <- SaldaeDataExplorer::detect_possible_date_var(tisefka())
if(length(dates_yellan)==0){
shinyalert::shinyalert(i18n$t("Data Upload"), text = i18n$t("Time variable not available"), type = "error",
closeOnClickOutside = TRUE,showConfirmButton = TRUE)
}
return(dates_yellan)
})
output$date_variable <- renderUI({
req(tisefka())
req(dates_yellan())
date_choices <- dates_yellan()
shinyWidgets::pickerInput(
inputId = ns("date_variable"),
label = i18n$t("Time variable"),
choices = date_choices
)
})
tisefka_tizegzawin <- eventReactive(input$date_variable,{
req(tisefka())
tisefka_tizegzawin <- SaldaeDataExplorer::sbed_tisefka(tisefka = tisefka(), date_variable = input$date_variable)%>%
dplyr::mutate(date = as.Date(date))
return(tisefka_tizegzawin)
})
output$time_period <- renderUI({
req(tisefka_tizegzawin())
date_vect <- tisefka_tizegzawin()%>%dplyr::pull(date)%>%unique()
# shiny::sliderInput(inputId = ns("time_period"), label = i18n$t("Time Period"), min = min(date_vect), max = max(date_vect), timeFormat = "%Y-%m-%d",
# value = c(min(date_vect), max(date_vect)))
shiny::dateRangeInput(inputId = ns("time_period"), label = i18n$t("Time Period"), min = min(date_vect), max = max(date_vect),
start = min(date_vect), end = max(date_vect))
})
output$tisefka_target_variables <- renderUI({
req(tisefka_tizegzawin())
var_class <- dlookr::get_class(tisefka_tizegzawin())%>%dplyr::filter(class%in%c("numeric","integer"))%>%dplyr::pull(variable)%>%paste()
shinyWidgets::pickerInput(
inputId = ns("tisefka_target_variables"),
label = i18n$t("Target variables"),
choices = var_class,
selected = var_class,
options = list(`actions-box` = TRUE),
multiple = TRUE
)
})
output$tisefka_categorical_variables <- renderUI({
req(tisefka_tizegzawin())
req(non_numeric_variables())
var_class <- non_numeric_variables()
shinyWidgets::pickerInput(
inputId = ns("tisefka_categorical_variables"),
label = i18n$t("Categorical variables"),
choices = var_class,
selected = var_class,
options = list(`actions-box` = TRUE),
multiple = TRUE
)
})
# Tisefka dataset
#--------- display raw data
output$tisefka_tizegzawin_dt <- DT::renderDataTable({
req(tisefka_tizegzawin())
tisefka_tizegzawin()
})
# get data summary
data_summary <- reactive({
req(tisefka_tizegzawin())
diag_output <- SaldaeDataExplorer::data_diagnosis_f(tisefka = tisefka_tizegzawin(), categoricals_ukud = NULL)
return(diag_output)
})
#------- display data Overview
output$SA_tisefka_overview <- renderUI({
req(tisefka_tizegzawin())
fluidRow(
bs4Dash::valueBoxOutput(ns("SA_overview1")),
bs4Dash::infoBoxOutput(ns("SA_overview2")),
bs4Dash::infoBoxOutput(ns("SA_overview3"))
)
})
output$SA_overview1 <- bs4Dash::renderInfoBox({
req(ts_time_units())
req(input$date_variable)
time_freq <- ts_time_units()[1]
time_freq <- i18n$t(time_freq)
bs4Dash::infoBox(title = i18n$t("Time frequency"),
value = time_freq,subtitle = paste(i18n$t("Time variable"),": ",input$date_variable),color = "info",fill = TRUE,
shiny::icon("hourglass")
)
})
output$SA_overview2 <- bs4Dash::renderInfoBox({
req(tisefka_tizegzawin())
info_val <- paste(ncol(tisefka_tizegzawin()),"x",nrow(tisefka_tizegzawin()))
bs4Dash::infoBox(title = i18n$t("Data Info"),
value = info_val,subtitle = "Variables x Elements",color = "navy",fill = TRUE,
shiny::icon("fas fa-chart-bar")
)
})
output$SA_overview3 <- bs4Dash::renderInfoBox({
req(data_summary())
val_quality <- mean(data_summary()$diagnosis$missing_percent)
val_quality <- round((100 - ifelse(is.na(val_quality),0,val_quality)),2)
qual_col <- "success"
if(val_quality < 95 )qual_col <- "lime"
if(val_quality < 75 )qual_col <- "warning"
if(val_quality < 60 )qual_col <- "danger"
# primary, secondary, info, success, warning, danger, gray-dark, gray, white, indigo, lightblue, navy, purple, fuchsia, pink, maroon, orange, lime, teal, olive.
bs4Dash::infoBox(title = i18n$t("Data Quality"),
value = val_quality,subtitle = i18n$t("% not missing values"),color = qual_col,fill = TRUE,
shiny::icon("tasks")
)
})
ts_time_units <- reactive({
req(tisefka_tizegzawin())
req(dates_yellan())
req(input$date_variable)
return(SaldaeDataExplorer::possible_units_for_summary(time_vect = tisefka_tizegzawin()$date))
})
tisefka_overview <- reactive({
req(data_summary())
req(tisefka_tizegzawin())
SaldaeDataExplorer::Handson_exploration(tisefka = tisefka_tizegzawin(), tisefka_report = data_summary())
})
#-------------------------
# output$tisefka_outliers <- rhandsontable::renderRHandsontable({
# req(data_summary())
# return(rhandsontable::rhandsontable(data_summary()$outliers, rowHeaders = NULL, width = 1000, height = 300))
# })
# output$tisefka_view <- rhandsontable::renderRHandsontable({
# req(tisefka_overview())
# return(tisefka_overview())
# })
output$SA_tisefka_overview2 <- renderUI({
bs4Dash::tabsetPanel(
tabPanel(title = i18n$t("Dataset"),icon = icon("eye"),
DT::dataTableOutput(ns("tisefka_tizegzawin_dt"))
) #,
# tabPanel(title = i18n$t("Overview"),icon = icon("eye"),
# h2("tbd")
# # rhandsontable::rHandsontableOutput(ns("tisefka_view"))
# ),
# tabPanel(title = i18n$t("Outliers"),icon = icon("fas fa-stethoscope"),
# h2("t.b.d")
# # rhandsontable::rHandsontableOutput(ns("tisefka_outliers"))
# )
)
})
non_numeric_variables <- reactive({
req(data_summary())
req(input$tisefka_target_variables)
non_numeric_variables <- data_summary()$categoricals
if(length(non_numeric_variables)==0)return(NULL)
temp_vect<- sapply(non_numeric_variables,function(x)x%in%input$tisefka_target_variables)
non_numeric_variables <- non_numeric_variables[!temp_vect]
non_numeric_variables <- non_numeric_variables[non_numeric_variables!="date"]
return(non_numeric_variables)
})
explore_output <- reactive({
req(input$tisefka_target_variables)
req(input$tisefka_categorical_variables)
req(tisefka_tizegzawin())
# req(tisefka_overview())
req(input$time_period)
output <- list()
selected_vars <- c("date",input$tisefka_target_variables,input$tisefka_categorical_variables)
output$tisefka_tizegzawin <- tisefka_tizegzawin()%>%
dplyr::select(!!selected_vars)%>%
dplyr::filter(date >= !!input$time_period[1] & date <= input$time_period[2])
# output$tisefka_overview <- tisefka_overview()
output$ts_time_units <- ts_time_units()
output$numeric_variables <- input$tisefka_target_variables
output$non_numeric_variables <- input$tisefka_categorical_variables
output$categoricals_unique_values <- data_summary()$categoricals_unique_values
return(output)
})
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.