Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2018
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 87.04 KB | None | 0 0
  1. library(shiny)
  2. library(shinydashboard)
  3. library(data.table)
  4. library(ggplot2)
  5. library(shinyjs)
  6. library(shinyBS)
  7. library(dplyr)
  8. library(scales)
  9. library(magrittr)
  10. library(RPostgreSQL)
  11. library(bit64)
  12. library(stringr)
  13. #library(geojsonio)
  14. #library(leaflet)
  15.  
  16. ##==========================================================================================================================
  17. ## Leitura dos dados do Banco de dados e procedimentos de join
  18. ## Nesta seção os dados são lidos do banco de dados e são feitos alguns joins
  19. ##==========================================================================================================================
  20.  
  21. #Carregando o Driver
  22. drv <- dbDriver("PostgreSQL")
  23.  
  24. #Conectando com a Base de dados
  25. con <- dbConnect(drv, dbname = "mtb",
  26.                  host = "10.1.0.4", port = 5432,
  27.                  user = "radar", password = "RadaR_@5112@18")
  28.  
  29.  
  30. #Lendo as tabelas em datraframes                 
  31. mdl_user <- dbGetQuery(con, "SELECT * FROM public.mdl_user")
  32. mdl_user_enrolments <- dbGetQuery(con, "SELECT * FROM public.mdl_user_enrolments")
  33. mdl_enrol <- dbGetQuery(con, "SELECT * FROM public.mdl_enrol")
  34. mdl_course <- dbGetQuery(con, "SELECT *  FROM public.mdl_course")
  35. mdl_course_categories <- dbGetQuery(con, "SELECT * FROM public.mdl_course_categories")
  36. mdl_badge_issued <- dbGetQuery(con, "SELECT * FROM public.mdl_badge_issued")
  37.  
  38. dim_estudante <- fread("dados/dim_estudante.csv")
  39.  
  40. #Disconectando
  41. dbDisconnect(con)
  42.  
  43. #Descarregando o Driver
  44. dbUnloadDriver(drv)
  45.  
  46.  
  47. # Selecionando apenas as colunas utilizáveis
  48. mdl_user <- select(mdl_user, c("id", "auth", "confirmed", "username", "idnumber", "firstname", "lastname", "email", "country", "lang", "calendartype", "timezone", "firstaccess", "lastaccess", "lastlogin", "currentlogin", "lastip", "timecreated", "alternatename"))
  49.  
  50. #Renomeando 'timecreated' para 'tempocadastro' , 'alternatename' para 'cpf' e "id" para "userid"
  51. mdl_user <- rename(mdl_user, tempocadastro = timecreated)
  52. mdl_user <- rename(mdl_user, cpf = alternatename)
  53. mdl_user <- rename(mdl_user, userid = id)
  54.  
  55. # NÚMERO DE ALUNOS POR CPF
  56. alunos <- mdl_user[!is.na(mdl_user$cpf),]
  57. alunos <- alunos[alunos$cpf != "",]
  58. alunos <- alunos[!duplicated(alunos$cpf),]
  59.  
  60. #### ADICIONANDO MAIS INFORMAÇÕES SOBRE UF
  61.  
  62. #Manipulacoes CPF em 'dim_estudante'
  63. dim_estudante$cpf <- str_pad(dim_estudante$cpf, 11, pad = "0")
  64. dim_estudante$cpf <- as.character(dim_estudante$cpf)
  65.  
  66. #Manipulacoes CPF em 'alunos'
  67. #Retirando 'pontuação'
  68. alunos$cpf <- gsub("[[:punct:]]", "", alunos$cpf)
  69. alunos$cpf <- as.character(alunos$cpf)
  70.  
  71. #Juntando 'dim_estudante' com 'matriculas_curso' por CPF
  72. alunos <- left_join(alunos, dim_estudante, by='cpf')
  73.  
  74. #SUBSTITUINDO NA's por "NI"
  75. alunos[is.na(alunos)] <- c("NI")
  76.  
  77. ##############################
  78. # MATRÍCULAS EM CURSOS
  79. matriculas_curso <- mdl_user_enrolments
  80.  
  81. # Joins para obter courseid, e fullname (nome do curso)
  82. mdl_enrol <- rename(mdl_enrol, enrolid = id)
  83. mdl_course <- rename(mdl_course, courseid = id)
  84. mdl_enrol <- rename(mdl_enrol, enrolname = name)
  85. mdl_course_categories <- rename(mdl_course_categories, categoryName = name)
  86.  
  87. course_enrol_join <- mdl_course
  88. course_enrol_join <- merge(course_enrol_join, mdl_enrol, by.x = "courseid", by.y = "courseid", all.y = TRUE)
  89. course_enrol_join <- merge(course_enrol_join, mdl_course_categories, by.x = "category", by.y = "id")
  90.  
  91. # Seleção de colunas a manter
  92. keep = c(
  93.   "courseid",
  94.   "fullname",
  95.   "enrolid",
  96.   "categoryName"
  97. )
  98. course_enrol_join <- subset(course_enrol_join, select = keep)
  99. course_enrol_join <- distinct(course_enrol_join)
  100.  
  101. matriculas_curso <- left_join(mdl_user_enrolments, course_enrol_join, by = "enrolid")
  102. matriculas_curso <- select(matriculas_curso, -c("id", "status", "modifierid", "timemodified"))
  103.  
  104. # Adição de informação dos alunos através do join com a tabela alunos
  105. matriculas_curso <- left_join(matriculas_curso, alunos, by = "userid")
  106.  
  107. # Remoção de CPFs duplicados para o mesmo curso
  108. matriculas_curso <- distinct(matriculas_curso, cpf, courseid, .keep_all = TRUE)
  109.  
  110.  
  111. ##############################
  112. # QUALIFICAÇÕES
  113.  
  114. # Join por 'userid' com 'alunos'
  115. qualificacoes_cpf <- distinct(mdl_badge_issued)
  116. qualificacoes_cpf <- left_join(qualificacoes_cpf, alunos, by = "userid")
  117.  
  118. # Substituindo NA por NI
  119. qualificacoes_cpf[is.na(qualificacoes_cpf)] <- c("NI")
  120.  
  121. ##==========================================================================================================================
  122.  
  123. #script para criar output cursos_finalizacao_horas
  124. source("scripts/relacionamento_horas_usuarios.R")
  125.  
  126. # Lista de cursos
  127. cursos_lista <- fread("dados/processados/course_enrol_join.csv", encoding = "UTF-8")
  128. cursos_lista <- unique(cursos_lista$fullname)
  129. cursos_lista <- cursos_lista[order(cursos_lista)]
  130.  
  131. # Carrega os dados
  132. user_course_badge_info <- fread("dados/processados/user_course_badge_info.csv", encoding = "UTF-8")
  133. quiz_attempts_user_enrol <- fread("dados/processados/quiz_attempts_user_enrol.csv", encoding = "UTF-8")
  134. user_enrolment_course_info <- fread("dados/processados/user_enrolment_course_info.csv", encoding = "UTF-8")
  135. users_info <- fread("dados/processados/sis_joined_student_info.csv", encoding = "UTF-8")
  136.  
  137. contaNaoInformados <- function(array, value = "") {
  138.   total <- length(array)
  139.   array <- array[array == value]
  140.   paste("Não Informados : ", format(length(array), big.mark=","), " (", round(100*length(array)/total, 2), "%)")
  141. }
  142.  
  143. function(input, output, session) {
  144.  
  145.   ##==========================================================================================================================
  146.   ## TAB Cursos Dados
  147.   ## Esta secao contem os dados que sao utilizados na tab cursos
  148.   ## Em geral, os dados da tab cursos sao filtrados pelos cursos selecionados pelo usuarios
  149.   ##==========================================================================================================================
  150.  
  151.  
  152.   # Dados das conclusoes dos usuarios filtrados por curso
  153.   user_course_badge_info_filtrado <- reactive({
  154.     input$curso_process_button
  155.    
  156.     inicio_periodo <- as.POSIXlt(Sys.Date())
  157.     fim_periodo <- as.POSIXlt(Sys.Date())
  158.     tempo_cadastro <- user_course_badge_info$dateissued
  159.    
  160.     if (input$cursos_filtro_periodo == "Desde o início") {
  161.       inicio_periodo = 0
  162.     } else if (input$cursos_filtro_periodo == "último ano") {
  163.       inicio_periodo$mday <- inicio_periodo$mday - 365
  164.     } else if (input$cursos_filtro_periodo == "último mês") {
  165.       inicio_periodo$mday <- inicio_periodo$mday - 30
  166.     } else if (input$cursos_filtro_periodo == "última semana") {
  167.       inicio_periodo$mday <- inicio_periodo$mday - 7
  168.     } else if (input$cursos_filtro_periodo == "último dia") {
  169.       inicio_periodo$mday <- inicio_periodo$mday - 1
  170.     } else if (input$cursos_filtro_periodo == "Período personalizado") {
  171.       inicio_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[1])
  172.       fim_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[2])
  173.     }
  174.    
  175.     cursos_filtrados <- user_course_badge_info[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
  176.  
  177.     if(input$cursos_filtro_uf != "Todas" && input$cursos_filtro_uf != "Não informado") {
  178.       cursos_filtrados <- subset(cursos_filtrados, input$cursos_filtro_uf == cursos_filtrados$uf)
  179.     }
  180.     else if (input$cursos_filtro_uf == "Não informado") {
  181.       cursos_filtrados <- subset(cursos_filtrados, cursos_filtrados$uf == "")
  182.     }
  183.    
  184.     rows <- cursos_filtrados$fullname %in% isolate(input$curso_filtro_curso)
  185.     cursos_filtrados[rows,]
  186.   })
  187.  
  188.   # Dados dos cadastros dos usuarios filtrados por curso
  189.   user_enrolment_course_info_filtrado <- reactive({
  190.     input$curso_process_button
  191.    
  192.     inicio_periodo <- as.POSIXlt(Sys.Date())
  193.     fim_periodo <- as.POSIXlt(Sys.Date())
  194.     tempo_cadastro <- user_enrolment_course_info$timecreated
  195.    
  196.     if (input$cursos_filtro_periodo == "Desde o início") {
  197.       inicio_periodo = 0
  198.     } else if (input$cursos_filtro_periodo == "último ano") {
  199.       inicio_periodo$mday <- inicio_periodo$mday - 365
  200.     } else if (input$cursos_filtro_periodo == "último mês") {
  201.       inicio_periodo$mday <- inicio_periodo$mday - 30
  202.     } else if (input$cursos_filtro_periodo == "última semana") {
  203.       inicio_periodo$mday <- inicio_periodo$mday - 7
  204.     } else if (input$cursos_filtro_periodo == "último dia") {
  205.       inicio_periodo$mday <- inicio_periodo$mday - 1
  206.     } else if (input$cursos_filtro_periodo == "Período personalizado") {
  207.       inicio_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[1])
  208.       fim_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[2])
  209.     }
  210.    
  211.     cursos_filtrados <- user_enrolment_course_info[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
  212.  
  213.     if(input$cursos_filtro_uf != "Todas" && input$cursos_filtro_uf != "Não informado") {
  214.       cursos_filtrados <- subset(cursos_filtrados, input$cursos_filtro_uf == cursos_filtrados$uf)
  215.     }
  216.     else if (input$cursos_filtro_uf == "Não informado") {
  217.       cursos_filtrados <- subset(cursos_filtrados, cursos_filtrados$uf == "")
  218.     }
  219.    
  220.     rows <- cursos_filtrados$fullname %in% isolate(input$curso_filtro_curso)
  221.    
  222.     cursos_filtrados[rows,]
  223.    
  224.   })
  225.  
  226.   # Dados de testes finalizados filtrados por curso
  227.   quiz_finished_attempts_user_enrol_filtrado <- reactive({
  228.     input$curso_process_button
  229.    
  230.     inicio_periodo <- as.POSIXlt(Sys.Date())
  231.     fim_periodo <- as.POSIXlt(Sys.Date())
  232.     tempo_cadastro <- quiz_attempts_user_enrol$tempocadastro
  233.    
  234.     if (input$cursos_filtro_periodo == "Desde o início") {
  235.       inicio_periodo = 0
  236.     } else if (input$cursos_filtro_periodo == "último ano") {
  237.       inicio_periodo$mday <- inicio_periodo$mday - 365
  238.     } else if (input$cursos_filtro_periodo == "último mês") {
  239.       inicio_periodo$mday <- inicio_periodo$mday - 30
  240.     } else if (input$cursos_filtro_periodo == "última semana") {
  241.       inicio_periodo$mday <- inicio_periodo$mday - 7
  242.     } else if (input$cursos_filtro_periodo == "último dia") {
  243.       inicio_periodo$mday <- inicio_periodo$mday - 1
  244.     } else if (input$cursos_filtro_periodo == "Período personalizado") {
  245.       inicio_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[1])
  246.       fim_periodo <- as.POSIXlt(input$cursos_filtro_periodo_personalizado[2])
  247.     }
  248.    
  249.     cursos_filtrados <- quiz_attempts_user_enrol[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
  250.    
  251.     if(input$cursos_filtro_uf != "Todas" && input$cursos_filtro_uf != "Não informado") {
  252.       cursos_filtrados <- subset(cursos_filtrados, input$cursos_filtro_uf == cursos_filtrados$uf)
  253.     }
  254.     else if (input$cursos_filtro_uf == "Não informado") {
  255.       cursos_filtrados <- subset(cursos_filtrados, cursos_filtrados$uf == "")
  256.     }
  257.    
  258.     rows <- cursos_filtrados$fullname %in% isolate(input$curso_filtro_curso)
  259.     rows <- cursos_filtrados[rows,]
  260.     # seleciona apenas casos que o quiz foi finalizado
  261.     rows[rows$timefinish != 0,]
  262.    
  263.   })
  264.  
  265.   #Indica todos os cursos que foram selecionados
  266.   cursos_selecionados <- reactive({ #Ainda nao funcionando
  267.     input$curso_process_button
  268.     rows <- user_course_badge_info$fullname %in% isolate(input$curso_filtro_curso)
  269.     cursos_selecionados <- levels(as.factor(user_course_badge_info[rows,2]))
  270.   })
  271.  
  272.   # Quantidade de cadastros e concluintes filtrados por curso agrupados por diferentes variaveis
  273.   quantidade_concluintes_por_curso <- reactive({
  274.     table <- select(user_course_badge_info_filtrado(), c(fullname, cpf))
  275.     table %>% group_by(fullname) %>% summarise(concluintes = unique(length(cpf)))
  276.   })
  277.   quantidade_cadastrados_por_curso <- reactive({
  278.     table <- select(user_enrolment_course_info_filtrado(), c(fullname, cpf))
  279.     table %>% group_by(fullname) %>% summarise(cadastrados = unique(length(cpf)))
  280.   })
  281.   quantidade_concluintes_por_idade <- reactive({
  282.     table <- select(user_course_badge_info_filtrado(), c(idade, cpf))
  283.     table %>% group_by(idade) %>% summarise(concluintes = unique(length(cpf)))
  284.   })
  285.   quantidade_cadastrados_por_idade <- reactive({
  286.     table <- select(user_enrolment_course_info_filtrado(), c(idade, cpf))
  287.     table %>% group_by(idade) %>% summarise(cadastrados = unique(length(cpf)))
  288.   })
  289.   quantidade_concluintes_por_tempo_desempregado <- reactive({
  290.     table <- select(user_course_badge_info_filtrado(), c(tempo_desempregado, cpf))
  291.     table %>% group_by(tempo_desempregado) %>% summarise(concluintes = unique(length(cpf)))
  292.   })
  293.   quantidade_cadastrados_por_tempo_desempregado <- reactive({
  294.     table <- select(user_enrolment_course_info_filtrado(), c(tempo_desempregado, cpf))
  295.     table %>% group_by(tempo_desempregado) %>% summarise(cadastrados = unique(length(cpf)))
  296.   })
  297.   quantidade_concluintes_por_escolaridade <- reactive({
  298.     table <- select(user_course_badge_info_filtrado(), c(escolaridade, cpf))
  299.     table %>% group_by(escolaridade) %>% summarise(concluintes = unique(length(cpf)))
  300.   })
  301.   quantidade_cadastrados_por_escolaridade <- reactive({
  302.     table <- select(user_enrolment_course_info_filtrado(), c(escolaridade, cpf))
  303.     table %>% group_by(escolaridade) %>% summarise(cadastrados = unique(length(cpf)))
  304.   })
  305.   quantidade_concluintes_por_dominio <- reactive({
  306.     table <- select(user_course_badge_info_filtrado(), c(dominio, cpf))
  307.     table %>% group_by(dominio) %>% summarise(concluintes = unique(length(cpf)))
  308.   })
  309.   quantidade_cadastrados_por_dominio <- reactive({
  310.     table <- select(user_enrolment_course_info_filtrado(), c(dominio, cpf))
  311.     table %>% group_by(dominio) %>% summarise(cadastrados = unique(length(cpf)))
  312.   })
  313.  
  314.   # Dados dos usuarios cadastrados filtrados por curso, removendo as entradas de usuarios cadastrados
  315.   # em mais de um dos cursos selecionados
  316.   user_enrolment_course_info_filtrado_unique <- reactive({
  317.     user_enrolment_course_info_filtrado()[!duplicated(user_enrolment_course_info_filtrado()[,c('userid')]),]
  318.   })
  319.  
  320.   ##==========================================================================================================================
  321.   ## TAB Cursos Outputs
  322.   ## Esta secao contem todos os outputs (Tabelas, Textos e Graficos) que sao utilizados na tab cursos
  323.   ##==========================================================================================================================
  324.  
  325.   # Histograma que agrupa as pessoas pelas horas que demoraram para completar o curso
  326.   # As horas consistem do tempo entre o cadastro no curso e o momento em que o usuario recebeu a badge do curso
  327.   output$cursos_finalizacao_horas <- renderPlot({ #Ainda testando
  328.     curso <- as.vector(cursos_selecionados())
  329.     #Gera dados para montar histograma
  330.     if(length(curso) > 1) {
  331.       dadosGrafico <- dadosTempo[dadosTempo$courseid == as.nuemric(curso[1])]
  332.     } else {
  333.       dadosGrafico <- dadosTempo[dadosTempo$courseid == as.numeric(curso)]
  334.     }
  335.     #Valida se os dados foram gerados
  336.     shiny::validate(need(nrow(dadosGrafico) > 0, "Nenhum dado encontrado!"))
  337.     #Gera o grafico para o output
  338.     dadosGrafico <- retorna_dados_grafico_desemprego(cursoId = dadosGrafico)
  339.     dfc<-data.frame(do.call(rbind,by(data = dadosGrafico[,-1],INDICES = dadosGrafico$faixa,FUN = colSums)))
  340.     dfc$faixa<-rownames(dfc)
  341.     df.long<-melt(dfc,id.vars="faixa") # formatar para long
  342.     plot(ggplot(df.long,aes(x=faixa,y=value,fill=factor(variable)))+
  343.       geom_bar(stat="identity",position="dodge")+
  344.       scale_fill_discrete(name="Tipo de Usuario:")+
  345.       ylab("Porcentagem"))
  346.   })
  347.  
  348.   # Grafico com barras que mostra a proporcao de pessoas que se cadastraram e concluiram o curso e que nao concluiram
  349.   output$cursos_cadastro_e_concluintes <- renderPlot({
  350.     # Verifica se tabela tem pelo menos uma linha
  351.     shiny::validate(need(nrow(user_course_badge_info_filtrado()) > 0, "Nenhum dado encontrado!"))
  352.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado()) > 0, "Nenhum dado encontrado!"))
  353.  
  354.     # Dados
  355.     completedRows = user_course_badge_info_filtrado() # Quantidade de concluintes
  356.     enrolRows = user_enrolment_course_info_filtrado() # Quantidade de cadastros
  357.     total = nrow(enrolRows) # Total de cadastros
  358.  
  359.     # Dataframe com as proporcoes
  360.     concluintes = nrow(completedRows)
  361.     naoConcluintes = (total-nrow(completedRows))
  362.     frequencia = c(concluintes, naoConcluintes)
  363.     dados <- data.frame(Var1 = c("Concluintes", "Não Concluintes"), Freq = frequencia)
  364.     dados <- mutate(dados, pct=prop.table(dados$Freq)*100)
  365.  
  366.     # Cria grafico
  367.     ggplot(dados, aes(x = Var1, y = Freq,  fill = Var1,label =paste(Freq,pct))) +
  368.     geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
  369.     geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
  370.     theme_classic()+
  371.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  372.     xlab("") +
  373.     ylab("Quantidade")+
  374.     theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
  375.           axis.text.y = element_text(size=11),
  376.           axis.title=element_text(size=14),
  377.           plot.title = element_text(size = rel(2)),
  378.           plot.caption=element_text(size=10))+
  379.     scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
  380.     scale_y_continuous(labels = comma, limits = c(0,max(dados$Freq)*1.15))
  381.   })
  382.  
  383.   # ScatterPlot das Horas x Nota no teste
  384.   # As horas consistem do momento do cadastro ate a finalizacao do teste
  385.   output$cursos_nota_horas <- renderPlot({
  386.     # Verifica se tabela tem pelo menos uma linha
  387.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
  388.  
  389.     # Dados
  390.     selectedRows = quiz_finished_attempts_user_enrol_filtrado()
  391.     selectedRows = mutate(selectedRows, horas = (timefinish - tempocadastro)/3600) # Cria coluna com as horas
  392.  
  393.     # Cria Grafico
  394.     ggplot(selectedRows, aes(x=horas, y=sumgrades)) +
  395.     geom_jitter(color = "steelblue", alpha = 0.2) + # Jitter, para melhor visualizacao
  396.     xlab("Horas desde o cadastro") +
  397.     ylab("Nota no teste")
  398.   })
  399.  
  400.   # Tabela relacionada ao grafico ScatterPlot das Horas x Nota no teste
  401.   # Agrupa os dados por nota e exibe os dados de media, mediana, e desvio padrao das horas
  402.   output$cursos_nota_horas_table <- renderDataTable({
  403.     # Verifica se tabela tem pelo menos uma linha
  404.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, ""))
  405.  
  406.     # Dados
  407.     selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
  408.     selectedRows <- mutate(selectedRows, horas = (timefinish - tempocadastro)/3600)
  409.     # Gera estatisticas
  410.     selectedRows <- selectedRows %>% group_by(sumgrades) %>% summarise(testQuant = n(), media = mean(horas), mediana = median(horas), sd = sd(horas))
  411.  
  412.     # Renomeia colunas
  413.     names(selectedRows)[names(selectedRows) == 'sumgrades'] <- 'Nota'
  414.     names(selectedRows)[names(selectedRows) == 'testQuant'] <- 'Quantidade'
  415.     names(selectedRows)[names(selectedRows) == 'mediana'] <- "Mediana"
  416.     names(selectedRows)[names(selectedRows) == 'media'] <- "Média"
  417.     names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
  418.  
  419.     # Retorna dataframe
  420.     selectedRows
  421.     },
  422.     # Parametros do DataTables
  423.     options = list(
  424.       pageLength = 8, # quantidade de resultados por pagina
  425.       searching = FALSE, # desabilita funcionalidade de searching
  426.       lengthChange = FALSE, # desabilita funcionalidade de troca de quantidade
  427.       info = FALSE, # esconde informacoes do footer
  428.       rowCallback = I( # Modifica vizualizacao de algumas celulas da tabela
  429.       'function(row, data) {
  430.        // Arredonda para dois digitos
  431.        $("td:eq(2)", row).html(parseFloat(data[2]).toFixed(2));
  432.        $("td:eq(3)", row).html(parseFloat(data[3]).toFixed(2));
  433.        $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
  434.  
  435.        // Alinha numeros a direita
  436.        $("td:eq(0)", row).css("text-align", "right");
  437.        $("td:eq(1)", row).css("text-align", "right");
  438.        $("td:eq(2)", row).css("text-align", "right");
  439.        $("td:eq(3)", row).css("text-align", "right");
  440.        $("td:eq(4)", row).css("text-align", "right");
  441.      }')
  442.     )
  443.   )
  444.  
  445.   # Grafico de barras da quantidade de notas dos testes
  446.   output$cursos_nota_quantidade <- renderPlot({
  447.     # Verifica se tabela tem pelo menos uma linha
  448.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
  449.  
  450.     # Cria Grafico
  451.     ggplot(quiz_finished_attempts_user_enrol_filtrado(), aes(x = sumgrades)) +
  452.     geom_bar() +
  453.     xlab("Nota") +
  454.     ylab("Quantidade") +
  455.     scale_x_continuous("Notas",
  456.                         limits = c(-1, 11),
  457.                         breaks = seq(0, 10, by = 1)) # ordena os dados
  458.   })
  459.  
  460.   # Grafico de linhas da quantidade de notas dos testes separados por cursos
  461.   # Grafico nao utilizado
  462.   output$cursos_nota_quantidade_todos <- renderPlot({
  463.     # Verifica se tabela tem pelo menos uma linha
  464.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
  465.  
  466.     # Dados
  467.     selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
  468.     selectedRows <- select(selectedRows, c(fullname, sumgrades))
  469.     selectedRows <- as.data.frame(table(selectedRows))
  470.    
  471.     # Cria Grafico
  472.     ggplot(data = selectedRows, aes(x = sumgrades, y = Freq, colour = fullname, group = fullname)) +
  473.     geom_line(size = 1) +
  474.     xlab("Nota") +
  475.     ylab("Quantidade") +
  476.     labs(color='Curso')
  477.   })
  478.  
  479.   # Tabela com as estatisticas dos cursos
  480.   # Mostra cadastrados, concluintes, teste finalizados, media de notas e desvio padras das notas
  481.   output$cursos_nota_analise_todos <- renderDataTable({
  482.     # Verifica se tabela tem pelo menos uma linha
  483.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
  484.  
  485.     # Dados
  486.     selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
  487.     selectedRows <- select(selectedRows, c(fullname, sumgrades))
  488.     selectedRows <- as.data.frame(selectedRows)
  489.  
  490.     # Gera estatisticas, media das notas e desvio padrao
  491.     selectedRows <- selectedRows %>% group_by(fullname) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
  492.    
  493.     # Join com outros dados
  494.     # Quantidade de cadastrados
  495.     selectedRows <- merge(selectedRows, quantidade_cadastrados_por_curso(), by.x = "fullname", by.y = "fullname")
  496.     # Quantidade de concluintes
  497.     selectedRows <- merge(selectedRows, quantidade_concluintes_por_curso(), by.x = "fullname", by.y = "fullname")
  498.  
  499.     # Reordena colunas
  500.     selectedRows <- selectedRows[c('fullname', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
  501.  
  502.     # Renomeia colunas
  503.     names(selectedRows)[names(selectedRows) == 'fullname'] <- 'Curso'
  504.     names(selectedRows)[names(selectedRows) == 'media'] <- 'Média das Notas'
  505.     names(selectedRows)[names(selectedRows) == 'sd'] <- "Desvio Padrão das Notas"
  506.     names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes Finalizados"
  507.     names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
  508.     names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
  509.  
  510.     # Retorna dataframe
  511.     selectedRows
  512.     },
  513.     options = list(
  514.       paging = FALSE, # Desabilita a troca de paginas
  515.       searching = FALSE, # desabilita funcionalidade de searching
  516.       lengthChange = FALSE, # desabilita funcionalidade de troca de quantidade
  517.       info = FALSE, # esconde informacoes do footer
  518.       rowCallback = I( # Modifica vizualizacao de algumas celulas da tabela
  519.       'function(row, data) {
  520.        // Concatena porcentagem
  521.        var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
  522.        $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
  523.  
  524.        // Arredonda para dois digitos
  525.        $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
  526.        $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
  527.      
  528.        // Alinha numeros a direita
  529.        $("td:eq(1)", row).css("text-align", "right");
  530.        $("td:eq(2)", row).css("text-align", "right");
  531.        $("td:eq(3)", row).css("text-align", "right");
  532.        $("td:eq(4)", row).css("text-align", "right");
  533.        $("td:eq(5)", row).css("text-align", "right");
  534.      }'),
  535.       footerCallback = I(
  536.       'function( tfoot, data, start, end, display ) {
  537.        var api = this.api(), data;
  538.        $( api.column(5).footer()).html("YEY");  
  539.      }'
  540.       )
  541.     )
  542.   )
  543.  
  544.   # Grafico de barras que mostra a proporcao dos generos dos usuarios cadastrados
  545.   output$cursos_genero <- renderPlot({
  546.     # Verifica se tabela tem pelo menos uma linha
  547.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
  548.     sexo <- user_enrolment_course_info_filtrado_unique()$sexo
  549.     # Remove nao informados
  550.     sexo <- sexo[sexo != ""]
  551.     # Verifica se tabela tem pelo menos uma linha informados
  552.     shiny::validate(need(length(sexo) > 0, ""))
  553.  
  554.     sexo <- table(sexo)
  555.     # renomeia colunas
  556.     names(sexo)[names(sexo) == 'Masculino'] <- 'Masculino'
  557.     names(sexo)[names(sexo) == 'Feminino'] <- 'Feminino'
  558.  
  559.     # Gera porcentagens
  560.     sexo <- as.data.frame(sexo)
  561.     sexo <- mutate(sexo, pct=prop.table(sexo$Freq)*100)
  562.  
  563.     # Cria grafico
  564.     ggplot(sexo, aes(x = Var1, y = Freq,  fill = Var1,label =paste(Freq,pct))) +
  565.     geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
  566.     geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
  567.     theme_classic()+
  568.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  569.     xlab("") +
  570.     ylab("Quantidade")+
  571.     theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
  572.           axis.text.y = element_text(size=11),
  573.           axis.title=element_text(size=14),
  574.           plot.title = element_text(size = rel(2)),
  575.           plot.caption=element_text(size=10))+
  576.     scale_fill_manual(values=c("steelblue", "tomato3"), name="Gênero")+
  577.     scale_y_continuous(labels = comma, limits = c(0,max(sexo$Freq)*1.15))
  578.   })
  579.  
  580.   # Texto com a quantidade de usuarios que nao informaram o genero
  581.   output$cursos_genero_nao_informado <- renderUI({
  582.     # Verifica se tabela tem pelo menos uma linha
  583.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
  584.     contaNaoInformados(user_enrolment_course_info_filtrado_unique()$sexo)
  585.   })
  586.  
  587.   # Grafico de barras que mostra a proporcao dos usuarios cadastrados com necessidades especiais
  588.   output$cursos_necessidades_especiais <- renderPlot({
  589.     # Verifica se tabela tem pelo menos uma linha
  590.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
  591.     necessidades <- user_enrolment_course_info_filtrado_unique()$necessidade_especial
  592.     # Remove nao informados
  593.     necessidades <- necessidades[necessidades != ""]
  594.     # Verifica se tabela tem pelo menos uma linha informados
  595.     shiny::validate(need(length(necessidades) > 0, ""))
  596.  
  597.     necessidades <- table(necessidades)
  598.     # renomeia colunas
  599.     names(necessidades)[names(necessidades) == 'SIM'] <- 'Sim'
  600.     names(necessidades)[names(necessidades) == 'NAO'] <- 'Não'
  601.     names(necessidades)[names(necessidades) == ''] <- "Não informado"
  602.  
  603.     # Gera porcentagens
  604.     necessidades <- as.data.frame(necessidades)
  605.     necessidades <- mutate(necessidades, pct=prop.table(necessidades$Freq)*100)
  606.    
  607.     # Cria grafico
  608.     ggplot(necessidades, aes(x = Var1, y = Freq,  fill = Var1,label =paste(Freq,pct))) +
  609.     geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
  610.     geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
  611.     theme_classic()+
  612.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  613.     xlab("") +
  614.     ylab("Quantidade")+
  615.     theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
  616.           axis.text.y = element_text(size=11),
  617.           axis.title=element_text(size=14),
  618.           plot.title = element_text(size = rel(2)),
  619.           plot.caption=element_text(size=10))+
  620.     scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
  621.     scale_y_continuous(labels = comma, limits = c(0,max(necessidades$Freq)*1.15))
  622.   })
  623.  
  624.   # Texto com a quantidade de usuarios que nao informaram necessidades especiais
  625.   output$cursos_necessidades_especiais_nao_informado <- renderUI({
  626.     # Verifica se tabela tem pelo menos uma linha
  627.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
  628.     contaNaoInformados(user_enrolment_course_info_filtrado_unique()$necessidade_especial)
  629.   })
  630.  
  631.  
  632.   # Grafico de barras que mostra a proporcao de usuarios desempregados cadastrados no curso
  633.   output$cursos_desempregado <- renderPlot({
  634.     # Verifica se tabela tem pelo menos uma linha
  635.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
  636.     desempregado <- user_enrolment_course_info_filtrado_unique()$tempo_desempregado
  637.     # remove nao informados
  638.     desempregado <- desempregado[desempregado != ""]
  639.     # Verifica se tabela tem pelo menos uma linha informados
  640.     shiny::validate(need(length(desempregado) > 0, ""))
  641.     # Considera todos os valores diferentes de empregado como desempregado
  642.     desempregado[desempregado != "Empregado"] <- "Desempregado"
  643.  
  644.     # Gera porcentagem
  645.     desempregado <- table(desempregado)
  646.     desempregado <- as.data.frame(desempregado)
  647.     desempregado <- mutate(desempregado, pct=prop.table(Freq)*100)
  648.    
  649.     # Cria grafico
  650.     ggplot(desempregado, aes(x = desempregado, y = Freq,  fill = desempregado,label =paste(Freq,pct))) +
  651.     geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
  652.     geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
  653.     theme_classic()+
  654.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  655.     xlab("") +
  656.     ylab("Quantidade")+
  657.     theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
  658.           axis.text.y = element_text(size=11),
  659.           axis.title=element_text(size=14),
  660.           plot.title = element_text(size = rel(2)),
  661.           plot.caption=element_text(size=10))+
  662.     scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
  663.     scale_y_continuous(labels = comma, limits = c(0,max(desempregado$Freq)*1.15))
  664.   })
  665.  
  666.   # Texto com a quantidade de cadastrados nos cursos que nao informaram se sao desempregados
  667.   output$cursos_desempregados_nao_informado <- renderUI({
  668.     # Verifica se tabela tem pelo menos uma linha
  669.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
  670.     contaNaoInformados(user_enrolment_course_info_filtrado_unique()$tempo_desempregado)
  671.   })
  672.  
  673.   # Grafico de barras que mostra o dominio de internet dos usuarios
  674.   output$cursos_dominio_internet <- renderPlot({
  675.     # Verifica se tabela tem pelo menos uma linha
  676.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
  677.     dominio <- user_enrolment_course_info_filtrado_unique()$dominio
  678.     # Nao informados
  679.     dominio <- dominio[dominio != ""]
  680.     # Verifica se tabela tem pelo menos uma linha informados
  681.     shiny::validate(need(length(dominio) > 0, ""))
  682.    
  683.     # Gera porcentagens
  684.     dominio <- table(dominio)
  685.     dominio <- as.data.frame(dominio)
  686.     dominio <- mutate(dominio, pct=prop.table(Freq)*100)
  687.  
  688.     # ordena colunas
  689.     ordem = c(
  690.       "Nunca usei",
  691.       "Nível Básico",
  692.       "Nível Intermediário",
  693.       "Nível Avançado"
  694.     )
  695.    
  696.     # Cria grafico
  697.     ggplot(dominio, aes(y = Freq, x = dominio)) +
  698.     geom_bar(stat = "identity", fill="steelblue") +
  699.     xlab("Domínio de internet") +
  700.     ylab("Quantidade") +
  701.     scale_x_discrete(limits = ordem) +
  702.     geom_text(aes(y = Freq,    
  703.             label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),    
  704.             hjust= -0.1,
  705.             size = 3.2) +
  706.     theme_classic() +
  707.     coord_flip() +
  708.     theme(axis.text.x = element_text(angle=0, vjust=0.7))+
  709.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  710.     scale_y_continuous(labels = comma, limits = c(0,max(dominio$Freq)*1.4))
  711.   })
  712.  
  713.     # Tabela com as estatisticas dos usuarios agrupados por dominio de internet
  714.   output$cursos_dominio_table <- renderDataTable({
  715.     # Verifica se tabela tem pelo menos uma linha
  716.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
  717.  
  718.     # Dados
  719.     selectedRows = quiz_finished_attempts_user_enrol_filtrado()
  720.     selectedRows <- select(selectedRows, c(dominio, sumgrades))
  721.     selectedRows <- as.data.frame(selectedRows)
  722.    
  723.     # Gera estatisticas, media e desvio padrao das notas
  724.     selectedRows <- selectedRows %>% group_by(dominio) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
  725.    
  726.     # Join com outros dados
  727.     # Quantidade de cadastrados
  728.     selectedRows <- merge(selectedRows, quantidade_cadastrados_por_dominio(), by.x = "dominio", by.y = "dominio")
  729.     # Quantidade de concluintes
  730.     selectedRows <- merge(selectedRows, quantidade_concluintes_por_dominio(), by.x = "dominio", by.y = "dominio")
  731.  
  732.     # Reordena colunas
  733.     selectedRows <- selectedRows[c('dominio', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
  734.  
  735.     # Renomeia nomeia nome das idades
  736.     selectedRows$dominio[selectedRows$dominio == ""] <- "Não informado"
  737.  
  738.     # Cria uma coluna com letras que serao utilizadas para ordenar a lista de idades
  739.     ordem <- data.frame(
  740.       ordem = c(1, 2, 3, 4, 5),
  741.       value = c(
  742.         "Nunca usei",
  743.         "Nível Básico",
  744.         "Nível Intermediário",
  745.         "Nível Avançado",
  746.         "Não informado"
  747.         )
  748.     )
  749.     selectedRows <- merge(selectedRows, ordem, by.x = "dominio", by.y = "value")
  750.  
  751.     # Renomeia colunas
  752.     names(selectedRows)[names(selectedRows) == 'dominio'] <- 'Domínio'
  753.     names(selectedRows)[names(selectedRows) == 'media'] <- 'Média'
  754.     names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
  755.     names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes"
  756.     names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
  757.     names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
  758.  
  759.     # retorna selectedRows
  760.     selectedRows
  761.     },
  762.     # Opcoes da DataTable
  763.     options = list(
  764.       pageLength = 8, # Quantidade de resultados por pagina
  765.       paging = FALSE, # Desabilita a troca de paginas
  766.       searching = FALSE, # Desabilita funcionalidade de searching
  767.       lengthChange = FALSE, # Desabilita funcionalidade de troca de quantidade
  768.       info = FALSE, # Esconde informacoes do footer
  769.       # Ordena a coluna dos nomes da idade de acordo com o valor da coluna "ordem" que nao esta visivel
  770.       columnDefs = list(list(orderData = list(6), targets = 0), list(targets = 6, visible= FALSE, searchable= FALSE)),
  771.       rowCallback = I( # Modifica vizualizacao de algumas celulas da tabela
  772.       'function(row, data) {
  773.        // Concatena porcentagem
  774.        var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
  775.        $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
  776.  
  777.        // Arredonda para dois digitos
  778.        $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
  779.        $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
  780.  
  781.        // Alinha numeros a direita
  782.        $("td:eq(1)", row).css("text-align", "right");
  783.        $("td:eq(2)", row).css("text-align", "right");
  784.        $("td:eq(3)", row).css("text-align", "right");
  785.        $("td:eq(4)", row).css("text-align", "right");
  786.        $("td:eq(5)", row).css("text-align", "right");
  787.      }')
  788.     )
  789.   )
  790.  
  791.   # Texto com a quantidade de usuarios que nao informaram o dominio de internet
  792.   output$cursos_dominio_nao_informado <- renderUI({
  793.     # Verifica se tabela tem pelo menos uma linha
  794.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
  795.     contaNaoInformados(user_enrolment_course_info_filtrado_unique()$dominio)
  796.   })
  797.  
  798.   # Grafico de barras da distribuicao das idades das pessoas cadastradas nos cursos
  799.   output$cursos_idade <- renderPlot({
  800.     # Verifica se tabela tem pelo menos uma linha
  801.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
  802.     idade <- user_enrolment_course_info_filtrado_unique()$idade
  803.     # Remove nao informados
  804.     idade <- idade[idade != ""]
  805.     # Verifica se tabela tem pelo menos uma linha informados
  806.     shiny::validate(need(length(idade) > 0, ""))
  807.  
  808.     idade <- table(idade)
  809.     # renomeia colunas
  810.     names(idade)[names(idade) == '18-24'] <- 'Entre 18 e 24 anos'
  811.     names(idade)[names(idade) == '25-34'] <- 'Entre 25 e 34 anos'
  812.     names(idade)[names(idade) == '35-44'] <- 'Entre 35 e 44 anos'
  813.     names(idade)[names(idade) == '45-54'] <- 'Entre 45 e 54 anos'
  814.     names(idade)[names(idade) == '55-64'] <- 'Entre 55 e 64 anos'
  815.     names(idade)[names(idade) == 'Mais de 65'] <- 'Mais de 65 anos'
  816.    
  817.     idade <- as.data.frame(idade)
  818.     idade <- mutate(idade, pct = prop.table(Freq) * 100)
  819.    
  820.     # Ordem das colunas
  821.     ordem = c(
  822.       'Menos de 18 anos',
  823.       'Entre 18 e 24 anos',
  824.       'Entre 25 e 34 anos',
  825.       'Entre 35 e 44 anos',
  826.       'Entre 45 e 54 anos',
  827.       'Entre 55 e 64 anos',
  828.       "Mais de 65 anos"
  829.     )
  830.  
  831.     ggplot(idade, aes(y = Freq, x = Var1)) +
  832.     geom_bar(stat = "identity", fill="steelblue") +
  833.     xlab("Faixa etária") +
  834.     ylab("Quantidade") +
  835.     scale_x_discrete(limits = ordem) +
  836.     geom_text(aes(y = Freq,    
  837.             label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),    
  838.             hjust= -0.1,
  839.             size = 3.2) +
  840.     theme_classic() +
  841.     coord_flip() +
  842.     theme(axis.text.x = element_text(angle=0, vjust=0.7))+
  843.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  844.     scale_y_continuous(labels = comma, limits = c(0,max(idade$Freq)*1.4))
  845.   })
  846.  
  847.   # Tabela com as estatisticas dos usuarios agrupados por idade
  848.   output$cursos_idade_table <- renderDataTable({
  849.     # Verifica se tabela tem pelo menos uma linha
  850.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
  851.  
  852.     # Dados
  853.     selectedRows = quiz_finished_attempts_user_enrol_filtrado()
  854.     selectedRows <- select(selectedRows, c(idade, sumgrades))
  855.     selectedRows <- as.data.frame(selectedRows)
  856.    
  857.     # Gera estatisticas, media e desvio padrao das notas
  858.     selectedRows <- selectedRows %>% group_by(idade) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
  859.    
  860.     # Join com outros dados
  861.     # Quantidade de cadastrados
  862.     selectedRows <- merge(selectedRows, quantidade_cadastrados_por_idade(), by.x = "idade", by.y = "idade")
  863.     # Quantidade de concluintes
  864.     selectedRows <- merge(selectedRows, quantidade_concluintes_por_idade(), by.x = "idade", by.y = "idade")
  865.  
  866.     # Reordena colunas
  867.     selectedRows <- selectedRows[c('idade', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
  868.  
  869.     # Renomeia nomeia nome das idades
  870.     selectedRows$idade[selectedRows$idade == ""] <- "Não informado"
  871.     selectedRows$idade[selectedRows$idade == "18-24"] <- "Entre 18 e 24 anos"
  872.     selectedRows$idade[selectedRows$idade == "25-34"] <- "Entre 25 e 34 anos"
  873.     selectedRows$idade[selectedRows$idade == "35-44"] <- "Entre 35 e 44 anos"
  874.     selectedRows$idade[selectedRows$idade == "45-54"] <- "Entre 45 e 54 anos"
  875.     selectedRows$idade[selectedRows$idade == "55-64"] <- "Entre 55 e 64 anos"
  876.     selectedRows$idade[selectedRows$idade == "Mais de 65"] <- "Mais de 65 anos"
  877.  
  878.     # Cria uma coluna com letras que serao utilizadas para ordenar a lista de idades
  879.     ordem <- data.frame(
  880.       ordem = c(1, 2, 3, 4, 5, 6, 7, 8),
  881.       value = c(
  882.         "Menos de 18 anos",
  883.         "Entre 18 e 24 anos",
  884.         "Entre 25 e 34 anos",
  885.         "Entre 35 e 44 anos",
  886.         "Entre 45 e 54 anos",
  887.         "Entre 55 e 64 anos",
  888.         "Mais de 65 anos",
  889.         "Não informado"
  890.         )
  891.     )
  892.     selectedRows <- merge(selectedRows, ordem, by.x = "idade", by.y = "value")
  893.  
  894.     # Renomeia colunas
  895.     names(selectedRows)[names(selectedRows) == 'idade'] <- 'Idade'
  896.     names(selectedRows)[names(selectedRows) == 'media'] <- 'Média'
  897.     names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
  898.     names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes"
  899.     names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
  900.     names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
  901.  
  902.     # retorna selectedRows
  903.     selectedRows
  904.     },
  905.     # Opcoes da DataTable
  906.     options = list(
  907.       pageLength = 8, # Quantidade de resultados por pagina
  908.       paging = FALSE, # Desabilita a troca de paginas
  909.       searching = FALSE, # Desabilita funcionalidade de searching
  910.       lengthChange = FALSE, # Desabilita funcionalidade de troca de quantidade
  911.       info = FALSE, # Esconde informacoes do footer
  912.       # Ordena a coluna dos nomes da idade de acordo com o valor da coluna "ordem" que nao esta visivel
  913.       columnDefs = list(list(orderData = list(6), targets = 0), list(targets = 6, visible= FALSE, searchable= FALSE)),
  914.       rowCallback = I( # Modifica vizualizacao de algumas celulas da tabela
  915.       'function(row, data) {
  916.        // Concatena porcentagem
  917.        var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
  918.        $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
  919.  
  920.        // Arredonda para dois digitos
  921.        $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
  922.        $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
  923.  
  924.        // Alinha numeros a direita
  925.        $("td:eq(1)", row).css("text-align", "right");
  926.        $("td:eq(2)", row).css("text-align", "right");
  927.        $("td:eq(3)", row).css("text-align", "right");
  928.        $("td:eq(4)", row).css("text-align", "right");
  929.        $("td:eq(5)", row).css("text-align", "right");
  930.      }')
  931.     )
  932.   )
  933.  
  934.   # Texto com a quantidade de usuarios que nao informaram a idade
  935.   output$cursos_idade_nao_informado <- renderUI({
  936.     # Verifica se tabela tem pelo menos uma linha
  937.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
  938.     contaNaoInformados(user_enrolment_course_info_filtrado_unique()$idade)
  939.   })
  940.  
  941.   # Grafico de barras da quantidade de pessoas desempregadas pelo tempo
  942.   output$cursos_tempo_desempregado <- renderPlot({
  943.     # Verifica se tabela tem pelo menos uma linha
  944.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
  945.     tempo <- user_enrolment_course_info_filtrado_unique()$tempo_desempregado
  946.     # Remove usuarios que nao informaram se estao desempregadas ou nao
  947.     tempo <- tempo[tempo != ""]
  948.     # Remove usuarios que estao empregados
  949.     tempo <- tempo[tempo != "Empregado"]
  950.     # Remove desempregados que nao informaram o tempo
  951.     tempo <- tempo[tempo != "Desempregado, tempo nao informado"]
  952.     # Verifica se tabela tem pelo menos uma linha informados
  953.     shiny::validate(need(length(tempo) > 0, ""))
  954.  
  955.     tempo <- table(tempo)
  956.     tempo <- as.data.frame(tempo)
  957.     tempo <- mutate(tempo, pct = prop.table(Freq) * 100)
  958.    
  959.     # Ordem das colunas
  960.     ordem = c(
  961.       'Até 6 meses',
  962.       'Entre 7 e 12 meses',
  963.       'Entre 13 e 24 meses',
  964.       "Mais de 24 meses"
  965.     )
  966.  
  967.     ggplot(tempo, aes(y = Freq, x = tempo)) +
  968.     geom_bar(stat = "identity", fill="steelblue") +
  969.     xlab("Tempo desempregado") +
  970.     ylab("Quantidade") +
  971.     scale_x_discrete(limits = ordem) +
  972.     geom_text(aes(y = Freq,    
  973.             label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),    
  974.             hjust= -0.1,
  975.             size = 3.2) +
  976.     theme_classic() +
  977.     coord_flip() +
  978.     theme(axis.text.x = element_text(angle=0, vjust=0.7))+
  979.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  980.     scale_y_continuous(labels = comma, limits = c(0,max(tempo$Freq)*1.4))
  981.   })
  982.  
  983.   # Tabela com as estatisticas dos usuarios desempregado agrupados pelo tempo que estao desempregados
  984.   output$cursos_tempo_desempregado_table <- renderDataTable({
  985.     # Verifica se tabela tem pelo menos uma linha
  986.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
  987.  
  988.     # Dados
  989.     selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
  990.     selectedRows <- select(selectedRows, c(tempo_desempregado, sumgrades))
  991.     selectedRows <- as.data.frame(selectedRows)
  992.    
  993.     # Gera estatisticas, media e desvio padrao das notas
  994.     selectedRows <- selectedRows %>% group_by(tempo_desempregado) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
  995.    
  996.     # Join com outros dados
  997.     # Quantidade de cadastrados
  998.     selectedRows <- merge(selectedRows, quantidade_cadastrados_por_tempo_desempregado(), by.x = "tempo_desempregado", by.y = "tempo_desempregado")
  999.     # Quantidade de concluintes
  1000.     selectedRows <- merge(selectedRows, quantidade_concluintes_por_tempo_desempregado(), by.x = "tempo_desempregado", by.y = "tempo_desempregado")
  1001.  
  1002.     # Renomeia dados dos nao informados
  1003.     selectedRows$tempo_desempregado[selectedRows$tempo_desempregado == "Desempregado, tempo nao informado"] <- "Não informado"
  1004.  
  1005.     # Reordena colunas
  1006.     selectedRows <- selectedRows[c('tempo_desempregado', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
  1007.    
  1008.     # Cria uma coluna com letras que serao utilizadas para ordenar a lista de idades
  1009.     ordem <- data.frame(
  1010.       ordem = c(1, 2, 3, 4, 5),
  1011.       value = c(
  1012.         "Até 6 meses",
  1013.         "Entre 7 e 12 meses",
  1014.         "Entre 13 e 24 meses",
  1015.         "Mais de 24 meses",
  1016.         "Não informado"
  1017.         )
  1018.     )
  1019.     selectedRows <- merge(selectedRows, ordem, by.x = "tempo_desempregado", by.y = "value")
  1020.  
  1021.     # Renomeia colunas
  1022.     names(selectedRows)[names(selectedRows) == 'tempo_desempregado'] <- 'Tempo Desempregado'
  1023.     names(selectedRows)[names(selectedRows) == 'media'] <- 'Média'
  1024.     names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
  1025.     names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes"
  1026.     names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
  1027.     names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
  1028.  
  1029.     # retorna selectedRows
  1030.     selectedRows
  1031.     },
  1032.     # Opcoes da DataTable
  1033.     options = list(
  1034.       pageLength = 8, # Quantidade de resultados por pagina
  1035.       paging =FALSE, # Desabilita a troca de paginas
  1036.       searching = FALSE, # Desabilita funcionalidade de searching
  1037.       lengthChange = FALSE, # Desabilita funcionalidade de troca de quantidade
  1038.       info = FALSE, # Esconde informacoes do footer
  1039.       # Ordena a coluna dos nomes da idade de acordo com o valor da coluna "ordem" que nao esta visivel
  1040.       columnDefs = list(list(orderData = list(6), targets = 0), list(targets = 6, visible= FALSE, searchable= FALSE)),
  1041.       rowCallback = I(
  1042.       'function(row, data) {
  1043.        // Concatena porcentagem
  1044.        var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
  1045.        $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
  1046.  
  1047.        // Arredonda para dois digitos
  1048.        $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
  1049.        $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
  1050.        
  1051.        // Alinha numeros a direita
  1052.        $("td:eq(1)", row).css("text-align", "right");
  1053.        $("td:eq(2)", row).css("text-align", "right");
  1054.        $("td:eq(3)", row).css("text-align", "right");
  1055.        $("td:eq(4)", row).css("text-align", "right");
  1056.        $("td:eq(5)", row).css("text-align", "right");
  1057.      }')
  1058.     )
  1059.   )
  1060.  
  1061.   # Texto com a quantidade de usuarios desempregados mas nao informaram o tempo
  1062.   output$cursos_tempo_nao_informado <- renderUI({
  1063.     # Verifica se tabela tem pelo menos uma linha
  1064.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
  1065.     tempo <- user_enrolment_course_info_filtrado_unique()$tempo_desempregado
  1066.     # Remove usuarios que nao informaram se estao desempregadas ou nao
  1067.     tempo <- tempo[tempo != ""]
  1068.     # Remove usuarios que estao empregados
  1069.     tempo <- tempo[tempo != "Empregado"]
  1070.     # Conta desempregados que nao informaram o tempo
  1071.     contaNaoInformados(tempo, value = "Desempregado, tempo nao informado")
  1072.   })
  1073.  
  1074.   # Grafico de barras com a quantidade de pessoas cadastradas agrupadas pela escolaridade
  1075.   output$cursos_escolaridade <- renderPlot({
  1076.     # Verifica se tabela tem pelo menos uma linha
  1077.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, "Nenhum dado encontrado!"))
  1078.     escolaridade <- user_enrolment_course_info_filtrado_unique()$escolaridade
  1079.     # Remove nao informados
  1080.     escolaridade <- escolaridade[escolaridade != ""]
  1081.     # Verifica se tabela tem pelo menos uma linha informados
  1082.     shiny::validate(need(length(escolaridade) > 0, ""))
  1083.    
  1084.     escolaridade <- table(escolaridade)
  1085.     escolaridade <- as.data.frame(escolaridade)
  1086.     escolaridade <- mutate(escolaridade, pct = prop.table(Freq) * 100)
  1087.  
  1088.     # Ordem das colunas
  1089.     ordem = c(
  1090.       "Ensino fundamental incompleto",
  1091.       "Ensino fundamental completo",
  1092.       "Ensino técnico completo",
  1093.       "Ensino médio incompleto",
  1094.       "Ensino médio completo",
  1095.       "Licenciatura incompleto",
  1096.       "Licenciatura completo",
  1097.       "Tecnólogo incompleto",
  1098.       "Tecnólogo completo",
  1099.       "Bacharelado incompleto",
  1100.       "Bacharelado completo",
  1101.       "Especialização",
  1102.       'Mestrado profissional',
  1103.       'Mestrado acadêmico',
  1104.       'Doutorado'
  1105.     )
  1106.    
  1107.     # Cria grafico
  1108.     ggplot(escolaridade, aes(y = Freq, x = escolaridade)) +
  1109.     geom_bar(stat = "identity", fill="steelblue") +
  1110.     xlab("Grau de instrução") +
  1111.     ylab("Quantidade") +
  1112.     scale_x_discrete(limits = ordem) +
  1113.     geom_text(aes(y = Freq,    
  1114.             label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),    
  1115.             hjust= -0.1,
  1116.             size = 3.2) +
  1117.     theme_classic() +
  1118.     coord_flip() +
  1119.     theme(axis.text.x = element_text(angle=0, vjust=0.7))+
  1120.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  1121.     scale_y_continuous(labels = comma, limits = c(0,max(escolaridade$Freq)*1.4))
  1122.   })
  1123.  
  1124.  
  1125.   # Tabela com as estatisticas dos usuarios agrupados por escolaridade
  1126.   output$cursos_escolaridade_table <- renderDataTable({
  1127.     # Verifica se tabela tem pelo menos uma linha
  1128.     shiny::validate(need(nrow(quiz_finished_attempts_user_enrol_filtrado()) > 0, "Nenhum dado encontrado!"))
  1129.  
  1130.     # Dados
  1131.     selectedRows <- quiz_finished_attempts_user_enrol_filtrado()
  1132.     selectedRows <- select(selectedRows, c(escolaridade, sumgrades))
  1133.     selectedRows <- as.data.frame(selectedRows)
  1134.    
  1135.     # Gera estatisticas, media e desvio padrao das notas
  1136.     selectedRows <- selectedRows %>% group_by(escolaridade) %>% summarise(testQuant = n(), media = mean(sumgrades), sd = sd(sumgrades))
  1137.    
  1138.     # Join com outros dados
  1139.     # Quantidade de cadastrados
  1140.     selectedRows <- merge(selectedRows, quantidade_cadastrados_por_escolaridade(), by.x = "escolaridade", by.y = "escolaridade")
  1141.     # Quantidade de concluintes
  1142.     selectedRows <- merge(selectedRows, quantidade_concluintes_por_escolaridade(), by.x = "escolaridade", by.y = "escolaridade")
  1143.  
  1144.     # Renomeia dados dos nao informados
  1145.     selectedRows$escolaridade[selectedRows$escolaridade == ""] <- "Não informado"
  1146.  
  1147.     # Reordena colunas
  1148.     selectedRows <- selectedRows[c('escolaridade', 'cadastrados', 'concluintes', 'testQuant', 'media', 'sd')]
  1149.    
  1150.     # Cria uma coluna com letras que serao utilizadas para ordenar a lista de idades
  1151.     ordem <- data.frame(
  1152.       ordem = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),
  1153.       value = c(
  1154.         "Ensino fundamental incompleto",
  1155.         "Ensino fundamental completo",
  1156.         "Ensino técnico completo",
  1157.         "Ensino médio incompleto",
  1158.         "Ensino médio completo",
  1159.         "Licenciatura incompleto",
  1160.         "Licenciatura completo",
  1161.         "Tecnólogo incompleto",
  1162.         "Tecnólogo completo",
  1163.         "Bacharelado incompleto",
  1164.         "Bacharelado completo",
  1165.         "Especialização",
  1166.         'Mestrado profissional',
  1167.         'Mestrado acadêmico',
  1168.         'Doutorado',
  1169.         "Não informado"
  1170.       )
  1171.     )
  1172.     selectedRows <- merge(selectedRows, ordem, by.x = "escolaridade", by.y = "value")
  1173.  
  1174.     # Renomeia colunas
  1175.     names(selectedRows)[names(selectedRows) == 'escolaridade'] <- 'Escolaridade'
  1176.     names(selectedRows)[names(selectedRows) == 'media'] <- 'Média'
  1177.     names(selectedRows)[names(selectedRows) == 'sd'] <- "DP"
  1178.     names(selectedRows)[names(selectedRows) == 'testQuant'] <- "Testes"
  1179.     names(selectedRows)[names(selectedRows) == 'cadastrados'] <- "Matrículas"
  1180.     names(selectedRows)[names(selectedRows) == 'concluintes'] <- "Qualificações"
  1181.  
  1182.     # retorna selectedRows
  1183.     selectedRows
  1184.     },
  1185.     # Opcoes da DataTable
  1186.     options = list(
  1187.       pageLength = 8, # Quantidade de resultados por pagina
  1188.       searching = FALSE, # Desabilita funcionalidade de searching
  1189.       lengthChange = FALSE, # Desabilita funcionalidade de troca de quantidade
  1190.       info = FALSE, # Esconde informacoes do footer
  1191.       # Ordena a coluna dos nomes da idade de acordo com o valor da coluna "ordem" que nao esta visivel
  1192.       columnDefs = list(list(orderData = list(6), targets = 0), list(targets = 6, visible= FALSE, searchable= FALSE)),
  1193.       rowCallback = I(
  1194.       'function(row, data) {
  1195.        // Concatena porcentagem
  1196.        var porcentagem = parseFloat(100*data[2]/data[1]).toFixed(2)
  1197.        $("td:eq(2)", row).html(data[2] + " (" + porcentagem + "%)");
  1198.  
  1199.        // Arredonda para dois digitos
  1200.        $("td:eq(4)", row).html(parseFloat(data[4]).toFixed(2));
  1201.        $("td:eq(5)", row).html(parseFloat(data[5]).toFixed(2));
  1202.        
  1203.        // Alinha numeros a direita
  1204.        $("td:eq(1)", row).css("text-align", "right");
  1205.        $("td:eq(2)", row).css("text-align", "right");
  1206.        $("td:eq(3)", row).css("text-align", "right");
  1207.        $("td:eq(4)", row).css("text-align", "right");
  1208.        $("td:eq(5)", row).css("text-align", "right");
  1209.      }')
  1210.     )
  1211.   )
  1212.  
  1213.   # Texto com a quantidade de usuarios que nao informaram a escolaridade
  1214.   output$cursos_escolaridade_nao_informado <- renderUI({
  1215.     # Verifica se tabela tem pelo menos uma linha
  1216.     shiny::validate(need(nrow(user_enrolment_course_info_filtrado_unique()) > 0, ""))
  1217.     contaNaoInformados(user_enrolment_course_info_filtrado_unique()$escolaridade)
  1218.   })
  1219.  
  1220.   ##==========================================================================================================================
  1221.   ## TAB Usuarios Dados
  1222.   ## Esta secao contem os dados que sao utilizados na tab usuarios
  1223.   ## Em geral, os dados da tab usuarios sao filtrados por um periodo selecionado pelo usuario
  1224.   ##==========================================================================================================================
  1225.  
  1226.   # Dados dos usuarios, filtrados por periodo
  1227.   usuarios_filtrados <- reactive({
  1228.     inicio_periodo <- as.POSIXlt(Sys.Date())
  1229.     fim_periodo <- as.POSIXlt(Sys.Date())
  1230.     tempo_cadastro = users_info$tempocadastro
  1231.  
  1232.     if (input$usuarios_filtro_periodo == "Desde o início") {
  1233.       inicio_periodo = 0
  1234.     } else if (input$usuarios_filtro_periodo == "último ano") {
  1235.       inicio_periodo$mday <- inicio_periodo$mday - 365
  1236.     } else if (input$usuarios_filtro_periodo == "último mês") {
  1237.       inicio_periodo$mday <- inicio_periodo$mday - 30
  1238.     } else if (input$usuarios_filtro_periodo == "última semana") {
  1239.       inicio_periodo$mday <- inicio_periodo$mday - 7
  1240.     } else if (input$usuarios_filtro_periodo == "último dia") {
  1241.       inicio_periodo$mday <- inicio_periodo$mday - 1
  1242.     } else if (input$usuarios_filtro_periodo == "Período personalizado") {
  1243.       inicio_periodo <- as.POSIXlt(input$usuarios_filtro_periodo_personalizado[1])
  1244.       fim_periodo <- as.POSIXlt(input$usuarios_filtro_periodo_personalizado[2])
  1245.     }
  1246.  
  1247.     users = users_info[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
  1248.  
  1249.     if (input$usuarios_filtro_empregado != "Qualquer") {
  1250.       desempregado = users$tempo_desempregado
  1251.       rows = desempregado != ""
  1252.       rows = rows & desempregado != "Empregado"
  1253.       users = users[rows,]
  1254.     }
  1255.  
  1256.    
  1257.     users
  1258.    
  1259.    
  1260.   })
  1261.  
  1262.   ##==========================================================================================================================
  1263.   ## TAB Usuarios Outputs
  1264.   ## Esta secao contem todos os outputs (Tabelas, Textos e Graficos) que sao utilizados na tab usuarios
  1265.   ##==========================================================================================================================
  1266.  
  1267.   # Grafico de barras que mostra a proporcao dos generos dos usuarios cadastrados
  1268.   output$usuarios_genero <- renderPlot({
  1269.     # Verifica se tabela tem pelo menos uma linha
  1270.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
  1271.     sexo <- usuarios_filtrados()$sexo
  1272.     # Remove nao informados
  1273.     sexo <- sexo[sexo != ""]
  1274.     # Verifica se tabela tem pelo menos uma linha informados
  1275.     shiny::validate(need(length(sexo) > 0, ""))
  1276.  
  1277.     sexo <- table(sexo)
  1278.     # renomeia colunas
  1279.     names(sexo)[names(sexo) == 'Masculino'] <- 'Masculino'
  1280.     names(sexo)[names(sexo) == 'Feminino'] <- 'Feminino'
  1281.  
  1282.     # Gera porcentagens
  1283.     sexo <- as.data.frame(sexo)
  1284.     sexo <- mutate(sexo, pct=prop.table(sexo$Freq)*100)
  1285.  
  1286.     # Cria grafico
  1287.     ggplot(sexo, aes(x = Var1, y = Freq,  fill = Var1,label =paste(Freq,pct))) +
  1288.     geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
  1289.     geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
  1290.     theme_classic()+
  1291.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  1292.     xlab("") +
  1293.     ylab("Quantidade")+
  1294.     theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
  1295.           axis.text.y = element_text(size=11),
  1296.           axis.title=element_text(size=14),
  1297.           plot.title = element_text(size = rel(2)),
  1298.           plot.caption=element_text(size=10))+
  1299.     scale_fill_manual(values=c("steelblue", "tomato3"), name="Gênero")+
  1300.     scale_y_continuous(labels = comma, limits = c(0,max(sexo$Freq)*1.15))
  1301.   })
  1302.  
  1303.   # Texto com a quantidade de usuarios que nao informaram o genero
  1304.   output$usuarios_genero_nao_informado <- renderUI({
  1305.     # Verifica se tabela tem pelo menos uma linha
  1306.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
  1307.     contaNaoInformados(usuarios_filtrados()$sexo)
  1308.   })
  1309.  
  1310.   # Grafico de barras que mostra o dominio de internet dos usuarios
  1311.   output$usuarios_dominio_internet <- renderPlot({
  1312.     # Verifica se tabela tem pelo menos uma linha
  1313.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
  1314.     dominio <- usuarios_filtrados()$dominio
  1315.     # Nao informados
  1316.     dominio <- dominio[dominio != ""]
  1317.     # Verifica se tabela tem pelo menos uma linha informados
  1318.     shiny::validate(need(length(dominio) > 0, ""))
  1319.    
  1320.     # Gera porcentagens
  1321.     dominio <- table(dominio)
  1322.     dominio <- as.data.frame(dominio)
  1323.     dominio <- mutate(dominio, pct=prop.table(Freq)*100)
  1324.  
  1325.     # ordena colunas
  1326.     ordem = c(
  1327.       "Nunca usei",
  1328.       "Nível Básico",
  1329.       "Nível Intermediário",
  1330.       "Nível Avançado"
  1331.     )
  1332.    
  1333.     # Cria grafico
  1334.     ggplot(dominio, aes(y = Freq, x= dominio)) +
  1335.     geom_bar(stat = "identity", fill="steelblue") +
  1336.     xlab("") +
  1337.     ylab("Quantidade") +
  1338.     scale_x_discrete(limits = ordem) +
  1339.     geom_text(aes(y = Freq,    
  1340.             label = paste(comma(Freq),"\n (",round(pct, digits=2),"%)",sep="")),    
  1341.             position = position_dodge(width = .9), vjust=-0.5,
  1342.             size = 3.2) +
  1343.     theme_classic() +
  1344.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  1345.     scale_y_continuous(labels = comma, limits = c(0,max(dominio$Freq)*1.15))
  1346.   })
  1347.  
  1348.   # Texto com a quantidade de usuarios que nao informaram o dominio de internet
  1349.   output$usuarios_dominio_nao_informado <- renderUI({
  1350.     # Verifica se tabela tem pelo menos uma linha
  1351.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
  1352.     contaNaoInformados(usuarios_filtrados()$dominio)
  1353.   })
  1354.  
  1355.  
  1356.   # Grafico de barras que mostra a proporcao de usuarios com necessidades especiais
  1357.   output$usuarios_necessidades_especiais <- renderPlot({
  1358.     # Verifica se tabela tem pelo menos uma linha
  1359.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
  1360.     necessidades <- usuarios_filtrados()$necessidade_especial
  1361.     # Nao informados
  1362.     necessidades <- necessidades[necessidades != ""]
  1363.     # Verifica se tabela tem pelo menos uma linha informados
  1364.     shiny::validate(need(length(necessidades) > 0, ""))
  1365.    
  1366.     necessidades <- table(necessidades)
  1367.     # renomeia colunas
  1368.     names(necessidades)[names(necessidades) == 'SIM'] <- 'Sim'
  1369.     names(necessidades)[names(necessidades) == 'NAO'] <- 'Não'
  1370.  
  1371.     # Gera porcentagens
  1372.     necessidades <- as.data.frame(necessidades)
  1373.     necessidades <- mutate(necessidades, pct=prop.table(necessidades$Freq)*100)
  1374.    
  1375.     # Cria grafico
  1376.     ggplot(necessidades, aes(x = Var1, y = Freq,  fill = Var1,label =paste(Freq,pct))) +
  1377.     geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
  1378.     geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
  1379.     theme_classic()+
  1380.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  1381.     xlab("") +
  1382.     ylab("Quantidade")+
  1383.     theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
  1384.           axis.text.y = element_text(size=11),
  1385.           axis.title=element_text(size=14),
  1386.           plot.title = element_text(size = rel(2)),
  1387.           plot.caption=element_text(size=10))+
  1388.     scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
  1389.     scale_y_continuous(labels = comma, limits = c(0,max(necessidades$Freq)*1.15))
  1390.   })
  1391.  
  1392.   # Texto com a quantidade de usuarios que nao informaram necessidades especiais
  1393.   output$usuarios_necessidades_especiais_nao_informado <- renderUI({
  1394.     # Verifica se tabela tem pelo menos uma linha
  1395.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
  1396.     contaNaoInformados(usuarios_filtrados()$necessidade_especial)
  1397.   })
  1398.  
  1399.   # Grafico de barras que mostra a proporcao de usuarios desempregados
  1400.   output$usuarios_desempregados <- renderPlot({
  1401.     # Verifica se tabela tem pelo menos uma linha
  1402.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
  1403.     desempregado <- usuarios_filtrados()$tempo_desempregado
  1404.     # remove nao informados
  1405.     desempregado <- desempregado[desempregado != ""]
  1406.     # Verifica se tabela tem pelo menos uma linha informados
  1407.     shiny::validate(need(length(desempregado) > 0, ""))
  1408.  
  1409.     # Considera todos os valores diferentes de empregado como desempregado
  1410.     desempregado[desempregado != "Empregado"] <- "Desempregado"
  1411.  
  1412.     # Gera porcentagem
  1413.     desempregado <- table(desempregado)
  1414.     desempregado <- as.data.frame(desempregado)
  1415.     desempregado <- mutate(desempregado, pct=prop.table(Freq)*100)
  1416.    
  1417.     # Cria grafico
  1418.     ggplot(desempregado, aes(x = desempregado, y = Freq,  fill = desempregado,label =paste(Freq,pct))) +
  1419.     geom_bar(stat = "identity", position = position_dodge(width=1), width = 0.5) +
  1420.     geom_text(aes(y = Freq, label = paste(comma(Freq),"\n(",round(pct, digits = 2),"%)",sep="")), position = position_dodge(width = 0.8), vjust=-0.5, size = 3.3)+
  1421.     theme_classic()+
  1422.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  1423.     xlab("") +
  1424.     ylab("Quantidade")+
  1425.     theme(axis.text.x = element_text(size=11,angle=0, vjust=0.6),
  1426.           axis.text.y = element_text(size=11),
  1427.           axis.title=element_text(size=14),
  1428.           plot.title = element_text(size = rel(2)),
  1429.           plot.caption=element_text(size=10))+
  1430.     scale_fill_manual(values=c("steelblue", "tomato3"), name="")+
  1431.     scale_y_continuous(labels = comma, limits = c(0,max(desempregado$Freq)*1.15))
  1432.   })
  1433.  
  1434.   # Texto com a quantidade de usuarios que nao informaram se sao desempregados
  1435.   output$usuarios_desempregados_nao_informado <- renderUI({
  1436.     # Verifica se tabela tem pelo menos uma linha
  1437.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
  1438.     contaNaoInformados(usuarios_filtrados()$tempo_desempregado)
  1439.   })
  1440.  
  1441.   # Grafico de barras da distribuicao das idades das pessoas cadastradas
  1442.   output$usuarios_idade <- renderPlot({
  1443.     # Verifica se tabela tem pelo menos uma linha
  1444.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
  1445.     idade <- usuarios_filtrados()$idade
  1446.     # Remove nao informados
  1447.     idade <- idade[idade != ""]
  1448.     # Verifica se tabela tem pelo menos uma linha informados
  1449.     shiny::validate(need(length(idade) > 0, ""))
  1450.    
  1451.     idade <- table(idade)
  1452.     # renomeia colunas
  1453.     names(idade)[names(idade) == '18-24'] <- 'Entre 18 e 24 anos'
  1454.     names(idade)[names(idade) == '25-34'] <- 'Entre 25 e 34 anos'
  1455.     names(idade)[names(idade) == '35-44'] <- 'Entre 35 e 44 anos'
  1456.     names(idade)[names(idade) == '45-54'] <- 'Entre 45 e 54 anos'
  1457.     names(idade)[names(idade) == '55-64'] <- 'Entre 55 e 64 anos'
  1458.     names(idade)[names(idade) == 'Mais de 65'] <- 'Mais de 65 anos'
  1459.    
  1460.     idade <- as.data.frame(idade)
  1461.     idade <- mutate(idade, pct = prop.table(idade$Freq) * 100)
  1462.  
  1463.     # Ordem das colunas
  1464.     ordem = c(
  1465.       'Menos de 18 anos',
  1466.       'Entre 18 e 24 anos',
  1467.       'Entre 25 e 34 anos',
  1468.       'Entre 35 e 44 anos',
  1469.       'Entre 45 e 54 anos',
  1470.       'Entre 55 e 64 anos',
  1471.       "Mais de 65 anos"
  1472.     )
  1473.  
  1474.     # Cria grafico
  1475.     ggplot(idade, aes(y = Freq, x= Var1)) +
  1476.     geom_bar(stat = "identity", fill="steelblue") +
  1477.     xlab("") +
  1478.     ylab("Quantidade") +
  1479.     scale_x_discrete(limits = ordem) +
  1480.     geom_text(aes(y = Freq,    
  1481.             label = paste(comma(Freq),"\n (",round(pct, digits=2),"%)",sep="")),    
  1482.             position = position_dodge(width = .9), vjust=-0.5,
  1483.             size = 3.2) +
  1484.     theme_classic() +
  1485.     theme(axis.text.x = element_text(angle=20, vjust=0.7))+
  1486.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  1487.     scale_y_continuous(labels = comma, limits = c(0,max(idade$Freq)*1.15))
  1488.   })
  1489.  
  1490.   # Texto com a quantidade de usuarios que nao informaram a idade
  1491.   output$usuarios_idade_nao_informado <- renderUI({
  1492.     # Verifica se tabela tem pelo menos uma linha
  1493.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
  1494.     contaNaoInformados(usuarios_filtrados()$idade)
  1495.   })
  1496.  
  1497.   # Grafico de barras do tempo dos usuarios que estao desempregados
  1498.   output$usuarios_tempo_desempregado <- renderPlot({
  1499.     # Verifica se tabela tem pelo menos uma linha
  1500.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
  1501.     tempo <- usuarios_filtrados()$tempo_desempregado
  1502.     # Remove usuarios que nao informaram se estao desempregadas ou nao
  1503.     tempo <- tempo[tempo != ""]
  1504.     # Remove usuarios que estao empregados
  1505.     tempo <- tempo[tempo != "Empregado"]
  1506.     # Remove desempregados que nao informaram o tempo
  1507.     tempo <- tempo[tempo != "Desempregado, tempo nao informado"]
  1508.     # Verifica se tabela tem pelo menos uma linha informados
  1509.     shiny::validate(need(length(tempo) > 0, ""))
  1510.  
  1511.     tempo <- table(tempo)
  1512.     tempo <- as.data.frame(tempo)
  1513.     tempo <- mutate(tempo, pct = prop.table(Freq) * 100)
  1514.    
  1515.     # Ordem das colunas
  1516.     ordem = c(
  1517.       'Até 6 meses',
  1518.       'Entre 7 e 12 meses',
  1519.       'Entre 13 e 24 meses',
  1520.       "Mais de 24 meses"
  1521.     )
  1522.    
  1523.     # Cria grafico
  1524.     ggplot(tempo, aes(y = Freq, x= tempo)) +
  1525.     geom_bar(stat = "identity", fill="steelblue") +
  1526.     xlab("") +
  1527.     ylab("Quantidade") +
  1528.     scale_x_discrete(limits = ordem) +
  1529.     geom_text(aes(y = Freq,    
  1530.             label = paste(comma(Freq),"\n (",round(pct, digits=2),"%)",sep="")),    
  1531.             position = position_dodge(width = .9), vjust=-0.5,
  1532.             size = 3.2) +
  1533.     theme_classic() +
  1534.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  1535.     scale_y_continuous(labels = comma, limits = c(0,max(tempo$Freq)*1.15))
  1536.   })
  1537.  
  1538.   # Texto com a quantidade de usuarios desempregados que nao informaram o tempo
  1539.   output$usuarios_tempo_nao_informado <- renderUI({
  1540.     # Verifica se tabela tem pelo menos uma linha
  1541.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
  1542.     tempo <- usuarios_filtrados()$tempo_desempregado
  1543.     # Remove usuarios que nao informaram se estao desempregadas ou nao
  1544.     tempo <- tempo[tempo != ""]
  1545.     # Remove usuarios que estao empregados
  1546.     tempo <- tempo[tempo != "Empregado"]
  1547.     # Conta desempregados que nao informaram o tempo
  1548.     contaNaoInformados(tempo, value = "Desempregado, tempo nao informado")
  1549.   })
  1550.  
  1551.   # Grafico de barras da distribuicao das escolaridades
  1552.   output$usuarios_escolaridade <- renderPlot({
  1553.     # Verifica se tabela tem pelo menos uma linha
  1554.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, "Nenhum dado encontrado! Selecione outra Data!"))
  1555.     escolaridade <- usuarios_filtrados()$escolaridade
  1556.     # Remove nao informados
  1557.     escolaridade <- escolaridade[escolaridade != ""]
  1558.     # Verifica se tabela tem pelo menos uma linha informados
  1559.     shiny::validate(need(length(escolaridade) > 0, ""))
  1560.     escolaridade <- table(escolaridade)
  1561.     escolaridade <- as.data.frame(escolaridade)
  1562.     escolaridade <- mutate(escolaridade, pct = prop.table(Freq) * 100)
  1563.     # ordena colunas
  1564.     ordem = c(
  1565.       "Ensino fundamental incompleto",
  1566.       "Ensino fundamental completo",
  1567.       "Ensino técnico completo",
  1568.       "Ensino médio incompleto",
  1569.       "Ensino médio completo",
  1570.       "Tecnólogo incompleto",
  1571.       "Tecnólogo completo",
  1572.       "Licenciatura incompleto",
  1573.       "Licenciatura completo",
  1574.       "Bacharelado incompleto",
  1575.       "Bacharelado completo",
  1576.       "Especialização",
  1577.       'Mestrado profissional',
  1578.       'Mestrado acadêmico',
  1579.       'Doutorado'
  1580.     )
  1581.  
  1582.     # Cria grafico
  1583.     ggplot(escolaridade, aes(y = Freq, x = escolaridade)) +
  1584.     geom_bar(stat = "identity", fill="steelblue") +
  1585.     xlab("Grau de instrução") +
  1586.     ylab("Quantidade") +
  1587.     scale_x_discrete(limits = ordem) +
  1588.     geom_text(aes(y = Freq,    
  1589.             label = paste(comma(Freq)," (",round(pct, digits=2),"%)",sep="")),    
  1590.             hjust= -0.1,
  1591.             size = 3.2) +
  1592.     theme_classic() +
  1593.     coord_flip() +
  1594.     theme(axis.text.x = element_text(angle=0, vjust=0.7))+
  1595.     labs(caption="Fonte: Escola do Trabalhador\nhttp://escola.trabalho.gov.br") +
  1596.     scale_y_continuous(labels = comma, limits = c(0,max(escolaridade$Freq)*1.4))
  1597.   })
  1598.  
  1599.   # Texto com a quantidade de usuarios que nao informaram a escolaridade
  1600.   output$usuarios_escolaridade_nao_informado <- renderUI({
  1601.     # Verifica se tabela tem pelo menos uma linha
  1602.     shiny::validate(need(nrow(usuarios_filtrados()) > 0, ""))
  1603.     contaNaoInformados(usuarios_filtrados()$escolaridade)
  1604.   })
  1605.  
  1606.   # Titulo da pagina da tab usuarios, informa qual o periodo que foi selecionado
  1607.   output$usuarios_titulo_data <- renderText({
  1608.     inicio_periodo <- as.POSIXlt(Sys.Date())
  1609.     fim_periodo <- as.POSIXlt(Sys.Date())
  1610.  
  1611.     if (input$usuarios_filtro_periodo == "Desde o início") {
  1612.       return("")
  1613.     } else if (input$usuarios_filtro_periodo == "último ano") {
  1614.       inicio_periodo$mday <- inicio_periodo$mday - 365
  1615.     } else if (input$usuarios_filtro_periodo == "último mês") {
  1616.       inicio_periodo$mday <- inicio_periodo$mday - 30
  1617.     } else if (input$usuarios_filtro_periodo == "última semana") {
  1618.       inicio_periodo$mday <- inicio_periodo$mday - 7
  1619.     } else if (input$usuarios_filtro_periodo == "último dia") {
  1620.       inicio_periodo$mday <- inicio_periodo$mday - 1
  1621.     } else if (input$usuarios_filtro_periodo == "Período personalizado") {
  1622.       inicio_periodo <- as.POSIXlt(input$usuarios_filtro_periodo_personalizado[1])
  1623.       fim_periodo <- as.POSIXlt(input$usuarios_filtro_periodo_personalizado[2])
  1624.     }
  1625.  
  1626.     gsub("-", "/", paste("entre", inicio_periodo, "e", fim_periodo, sep=" "))
  1627.   })
  1628.  
  1629.   ##==========================================================================================================================
  1630.   ## TAB Home Outputs
  1631.   ## Esta secao contem todos os outputs (Tabelas, Textos e Graficos) que sao utilizados na tab home
  1632.   ##==========================================================================================================================
  1633.  
  1634.   # Titulo da pagina da tab home, informa qual o periodo que foi selecionado
  1635.   output$home_titulo_data <- renderText({
  1636.     inicio_periodo <- as.POSIXlt(Sys.Date())
  1637.     fim_periodo <- as.POSIXlt(Sys.Date())
  1638.    
  1639.     if (input$home_filtro_periodo == "Desde o início") {
  1640.       return("")
  1641.     } else if (input$home_filtro_periodo == "último ano") {
  1642.       inicio_periodo$mday <- inicio_periodo$mday - 365
  1643.     } else if (input$home_filtro_periodo == "último mês") {
  1644.       inicio_periodo$mday <- inicio_periodo$mday - 30
  1645.     } else if (input$home_filtro_periodo == "última semana") {
  1646.       inicio_periodo$mday <- inicio_periodo$mday - 7
  1647.     } else if (input$home_filtro_periodo == "último dia") {
  1648.       inicio_periodo$mday <- inicio_periodo$mday - 1
  1649.     } else if (input$home_filtro_periodo == "Período personalizado") {
  1650.       inicio_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[1])
  1651.       fim_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[2])
  1652.     }
  1653.    
  1654.     gsub("-", "/", paste("Entre", inicio_periodo, "e", fim_periodo, sep=" "))
  1655.   })
  1656.  
  1657.   # Dados dos usuarios, filtrados por periodo
  1658.  
  1659.   home_inscritos_filtrados <- reactive({
  1660.     inicio_periodo <- as.POSIXlt(Sys.Date())
  1661.     fim_periodo <- as.POSIXlt(Sys.Date())
  1662.  
  1663.     if (input$home_filtro_periodo == "Desde o início") {
  1664.       inicio_periodo <- as.numeric(as.Date("2000-01-01"))
  1665.     } else if (input$home_filtro_periodo == "último ano") {
  1666.       inicio_periodo$mday <- inicio_periodo$mday - 365
  1667.     } else if (input$home_filtro_periodo == "último mês") {
  1668.       inicio_periodo$mday <- inicio_periodo$mday - 30
  1669.     } else if (input$home_filtro_periodo == "última semana") {
  1670.       inicio_periodo$mday <- inicio_periodo$mday - 7
  1671.     } else if (input$home_filtro_periodo == "último dia") {
  1672.       inicio_periodo$mday <- inicio_periodo$mday - 1
  1673.     } else if (input$home_filtro_periodo == "Período personalizado") {
  1674.       inicio_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[1])
  1675.       fim_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[2])
  1676.     }
  1677.    
  1678.     users = alunos[alunos$tempocadastro >= as.numeric(inicio_periodo) && alunos$tempocadastro <= as.numeric(fim_periodo),]
  1679.  
  1680.     if (input$home_filtro_empregado == "Desempregado") {
  1681.        desempregado = users$desempregado
  1682.        rows = which(desempregado == "SIM")
  1683.        users = users[rows,]
  1684.      }
  1685.      else if (input$home_filtro_empregado == "Empregado") {
  1686.        desempregado = users$desempregado
  1687.        rows = which(desempregado == "NAO")
  1688.        users = users[rows,]
  1689.      }
  1690.  
  1691.      users
  1692.    
  1693.   })
  1694.  
  1695.   home_matriculados_filtrados <- reactive({
  1696.     inicio_periodo <- as.POSIXlt(Sys.Date())
  1697.     fim_periodo <- as.POSIXlt(Sys.Date())
  1698.     tempo_cadastro = matriculas_curso$tempocadastro
  1699.    
  1700.     if (input$home_filtro_periodo == "Desde o início") {
  1701.       inicio_periodo = 0
  1702.     } else if (input$home_filtro_periodo == "último ano") {
  1703.       inicio_periodo$mday <- inicio_periodo$mday - 365
  1704.     } else if (input$home_filtro_periodo == "último mês") {
  1705.       inicio_periodo$mday <- inicio_periodo$mday - 30
  1706.     } else if (input$home_filtro_periodo == "última semana") {
  1707.       inicio_periodo$mday <- inicio_periodo$mday - 7
  1708.     } else if (input$home_filtro_periodo == "último dia") {
  1709.       inicio_periodo$mday <- inicio_periodo$mday - 1
  1710.     } else if (input$home_filtro_periodo == "Período personalizado") {
  1711.       inicio_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[1])
  1712.       fim_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[2])
  1713.     }
  1714.    
  1715.     users = matriculas_curso[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
  1716.    
  1717.     if (input$home_filtro_empregado == "Desempregado") {
  1718.       desempregado = users$desempregado
  1719.       rows = which(desempregado == "SIM")
  1720.       users = users[rows,]
  1721.     }
  1722.     else if (input$home_filtro_empregado == "Empregado") {
  1723.       desempregado = users$desempregado
  1724.       rows = which(desempregado == "NAO")
  1725.       users = users[rows,]
  1726.     }
  1727.    
  1728.     users
  1729.    
  1730.   })
  1731.  
  1732.   home_qualificados_filtrados <- reactive({
  1733.     inicio_periodo <- as.POSIXlt(Sys.Date())
  1734.     fim_periodo <- as.POSIXlt(Sys.Date())
  1735.     tempo_cadastro = qualificacoes_cpf$dateissued
  1736.    
  1737.     if (input$home_filtro_periodo == "Desde o início") {
  1738.       inicio_periodo = 0
  1739.     } else if (input$home_filtro_periodo == "último ano") {
  1740.       inicio_periodo$mday <- inicio_periodo$mday - 365
  1741.     } else if (input$home_filtro_periodo == "último mês") {
  1742.       inicio_periodo$mday <- inicio_periodo$mday - 30
  1743.     } else if (input$home_filtro_periodo == "última semana") {
  1744.       inicio_periodo$mday <- inicio_periodo$mday - 7
  1745.     } else if (input$home_filtro_periodo == "último dia") {
  1746.       inicio_periodo$mday <- inicio_periodo$mday - 1
  1747.     } else if (input$home_filtro_periodo == "Período personalizado") {
  1748.       inicio_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[1])
  1749.       fim_periodo <- as.POSIXlt(input$home_filtro_periodo_personalizado[2])
  1750.     }
  1751.    
  1752.     users = qualificacoes_cpf[tempo_cadastro >= as.numeric(inicio_periodo) & tempo_cadastro < as.numeric(fim_periodo),]
  1753.    
  1754.     if (input$home_filtro_empregado == "Desempregado") {
  1755.       desempregado = users$desempregado
  1756.       rows = which(desempregado == "SIM")
  1757.       users = users[rows,]
  1758.     }
  1759.     else if (input$home_filtro_empregado == "Empregado") {
  1760.       desempregado = users$desempregado
  1761.       rows = which(desempregado == "NAO")
  1762.       users = users[rows,]
  1763.     }
  1764.    
  1765.     users
  1766.    
  1767.   })
  1768.  
  1769.   output$usuarios_inscritos <- renderText({
  1770.     inscritos = nrow(home_inscritos_filtrados())
  1771.     format(inscritos, big.mark = ".", decimal.mark = ",")
  1772.   })
  1773.  
  1774.   output$usuarios_matriculados <- renderText({
  1775.     matriculados = nrow(home_matriculados_filtrados())
  1776.     format(matriculados, big.mark = ".", decimal.mark = ",")
  1777.   })
  1778.  
  1779.   output$usuarios_qualificados <- renderText({
  1780.     qualificados = nrow(home_qualificados_filtrados())
  1781.     format(qualificados, big.mark = ".", decimal.mark = ",")
  1782.   })
  1783.  
  1784.  
  1785.   # Mostra inscritos, matriculados e qualificados por uf
  1786.   output$dados_gerais_por_uf <- renderDataTable({
  1787.    
  1788.     inscritos_uf = home_inscritos_filtrados()
  1789.     inscritos_uf$uf[inscritos_uf$uf == "EX"] <- ""
  1790.     inscritos_uf$uf[inscritos_uf$uf == "NI"] <- ""
  1791.  
  1792.     inscritos_uf = inscritos_uf %>%
  1793.       group_by(uf) %>%
  1794.       summarise(Cadastros = length(userid))
  1795.     total_inscritos = data_frame(uf = "Total", Cadastros = sum(inscritos_uf$Cadastros))
  1796.     inscritos_uf = bind_rows(inscritos_uf, total_inscritos)
  1797.    
  1798.     matriculados_uf = home_matriculados_filtrados()
  1799.     matriculados_uf$uf[matriculados_uf$uf == "EX"] <- ""
  1800.     matriculados_uf$uf[matriculados_uf$uf == "NI"] <- ""
  1801.    
  1802.     matriculados_uf = matriculados_uf %>%
  1803.       group_by(uf) %>%
  1804.       summarise(Matrículas = length(userid))
  1805.     total_matriculados = data_frame(uf = "Total", Matrículas = sum(matriculados_uf$Matrículas))
  1806.     matriculados_uf = bind_rows(matriculados_uf, total_matriculados)
  1807.    
  1808.     qualificados_uf = home_qualificados_filtrados()
  1809.     qualificados_uf$uf[qualificados_uf$uf == "EX"] <- ""
  1810.     qualificados_uf$uf[qualificados_uf$uf == "NI"] <- ""
  1811.    
  1812.     qualificados_uf = qualificados_uf %>%
  1813.       group_by(uf) %>%
  1814.       summarise(Qualificações = length(userid))
  1815.     total_qualificados = data_frame(uf = "Total", Qualificações = sum(qualificados_uf$Qualificações))
  1816.     qualificados_uf = bind_rows(qualificados_uf, total_qualificados)
  1817.    
  1818.     join1 = merge(matriculados_uf, inscritos_uf, by = "uf")
  1819.     dados_uf = merge(join1, qualificados_uf, by = "uf")
  1820.    
  1821.     names(dados_uf)[names(dados_uf) == 'uf'] <- 'UF'
  1822.     dados_uf[1,1] = "Não Informado"
  1823.     dados_uf
  1824.     },
  1825.    
  1826.   options = list(
  1827.     paging = FALSE, # Desabilita a troca de paginas
  1828.     searching = FALSE, # desabilita funcionalidade de searching
  1829.     lengthChange = FALSE, # desabilita funcionalidade de troca de quantidade
  1830.     info = FALSE
  1831.   )
  1832.   )
  1833.   ##==========================================================================================================================
  1834.   ## TAB Mapas Outputs
  1835.   ## Esta secao contem todos os outputs (Textos e Mapas) que sao utilizados na tab mapas
  1836.   ##==========================================================================================================================
  1837.  
  1838.   #states = geojsonio::geojson_read("dados//mapas//Brasil.json", what = "sp")
  1839.   #states@data = select(states@data, -N)
  1840.  
  1841.   #qualificados_uf = user_course_badge_info %>%
  1842.   #  group_by(uf) %>%
  1843.   #  summarise(Qualificados = length(userid))
  1844.   #names(qualificados_uf)[names(qualificados_uf) == 'uf'] <- 'UF'
  1845.  
  1846.   #states = sp::merge(states, qualificados_uf, by = "UF", all.x = TRUE)
  1847.   #states$Qualificados = as.numeric(as.character(states$Qualificados))
  1848.  
  1849.   #output$mapas_output <- renderLeaflet({
  1850.    
  1851.   #  bins = c(0, 200, 800, 1500, 4000, 8000, Inf)
  1852.   #  pal = colorBin("YlGnBu", domain = states$Qualificados, bins = bins)
  1853.    
  1854.   #  leaflet(states) %>%
  1855.   #    setView(-48, -13, 4) %>%
  1856.   #    addProviderTiles("MapBox", options = providerTileOptions(
  1857.   #      id = "mapbox.light",
  1858.   #      accessToken = Sys.getenv('pk.eyJ1IjoiaHVkc29ua3p2IiwiYSI6ImNqaGgzaWI2ODF4NHYzMHM2NTc0bjg0OXQifQ.0GrsfGGMRHYtSTHJcExopQ'))) %>%
  1859.   #    addPolygons(
  1860.   #      fillColor = ~pal(Qualificados),
  1861.   #      weight = 2,
  1862.   #      opacity = 1,
  1863.   #      color = "white",
  1864.   #      dashArray = "3",
  1865.   #      fillOpacity = 0.7) %>%
  1866.   #    addLegend(pal = pal, values = ~Qualificados, opacity = 0.7, title = "Qualificados x Estado",
  1867.   #              position = "bottomright")
  1868.   #})
  1869.  
  1870.   ##==========================================================================================================================
  1871.   ## Eventos na UI
  1872.   ##==========================================================================================================================
  1873.  
  1874.   # Altera o titulo a ser mostrado na tab usuarios dependendo do input de selecao de desempregados
  1875.   observeEvent(input$usuarios_filtro_empregado, {
  1876.     if(input$usuarios_filtro_empregado == "Qualquer") {
  1877.       hide(id = "usuarios-titulo-desempregado", anim = FALSE)
  1878.       show(id = "usuarios-titulo-todos", anim = FALSE)
  1879.     } else {
  1880.       hide(id = "usuarios-titulo-todos", anim = FALSE)
  1881.       show(id = "usuarios-titulo-desempregado", anim = FALSE)
  1882.     }
  1883.   })
  1884.  
  1885.   # Esconde e Mostra o input de periodo personalizado na sidebar tab usuarios
  1886.   observeEvent(input$usuarios_filtro_periodo, {
  1887.     if(input$usuarios_filtro_periodo == "Período personalizado") {
  1888.       show(id = "usuarios_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1889.     } else {
  1890.       hide(id = "usuarios_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1891.     }
  1892.  
  1893.     if(input$usuarios_filtro_periodo == "Período personalizado" | input$usuarios_filtro_periodo == "Desde o início") {
  1894.       hide(id = "usuarios_criterio", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1895.     } else {
  1896.       show(id = "usuarios_criterio", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1897.     }
  1898.   })
  1899.  
  1900.   # Esconde e Mostra o input de periodo personalizado na sidebar tab home
  1901.   observeEvent(input$cursos_filtro_periodo, {
  1902.     if(input$cursos_filtro_periodo == "Período personalizado") {
  1903.       show(id = "cursos_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1904.     } else {
  1905.       hide(id = "cursos_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1906.     }
  1907.     })
  1908.  
  1909.     observeEvent(input$home_filtro_periodo, {
  1910.     if(input$home_filtro_periodo == "Período personalizado") {
  1911.       show(id = "home_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1912.     } else {
  1913.       hide(id = "home_filtro_periodo_personalizado", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1914.     }
  1915.    
  1916.     if(input$home_filtro_periodo == "Período personalizado" | input$usuarios_filtro_periodo == "Desde o início") {
  1917.       hide(id = "home_criterio", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1918.     } else {
  1919.       show(id = "home_criterio", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1920.     }
  1921.   })
  1922.  
  1923.  
  1924.   # Esconde e Mostra os inputs na sidebar conforme a tab escolhida
  1925.   observeEvent(input$tabs, {
  1926.     if(input$tabs == "usuarios") {
  1927.       show(id = "usuarios_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1928.     } else {
  1929.       hide(id = "usuarios_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1930.     }
  1931.  
  1932.     if(input$tabs == "cursos") {
  1933.       show(id = "curso_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1934.     } else {
  1935.       hide(id = "curso_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1936.     }
  1937.    
  1938.     if(input$tabs == "mapas") {
  1939.       show(id = "mapas_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1940.     } else {
  1941.       hide(id = "mapas_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1942.     }
  1943.    
  1944.     if(input$tabs == "home") {
  1945.       show(id = "home_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1946.     } else {
  1947.       hide(id = "home_tab_input", anim = TRUE, animType = "slide", time = 0.3, selector = NULL)
  1948.     }
  1949.   })
  1950.  
  1951.   # Evento do botao de marcar/desmarcar todos os cursos na tab Cursos
  1952.   observeEvent(input$curso_marcar, {
  1953.     if (length(input$curso_filtro_curso) == 0) {
  1954.       updateCheckboxGroupInput(session,"curso_filtro_curso", NULL, choices=cursos_lista, selected=cursos_lista)
  1955.     } else {
  1956.       updateCheckboxGroupInput(session,"curso_filtro_curso", NULL, choices=cursos_lista)
  1957.     }
  1958.   })
  1959.  
  1960.   # Troca o texto do botao de marcar/desmarcar todos na tab Cursos
  1961.   observeEvent(input$curso_filtro_curso, {
  1962.     if(length(input$curso_filtro_curso) == 0){
  1963.       updateActionButton(session, "curso_marcar", label = "Marcar Todos")
  1964.     } else {
  1965.       updateActionButton(session, "curso_marcar", label = "Desmarcar Todos")
  1966.     }
  1967.   }, ignoreNULL = FALSE)
  1968. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement