/sections/content_fullTable/fullTable.R

https://github.com/chschoenenberger/covid19_dashboard · R · 132 lines · 131 code · 1 blank · 0 comment · 6 complexity · 4b721eb995e6e4f72a1d9de8355e575c MD5 · raw file

  1. getFullTableData <- function(groupBy) {
  2. padding_left <- max(str_length(data_evolution$value_new), na.rm = TRUE)
  3. data <- data_evolution %>%
  4. filter(date == current_date) %>%
  5. pivot_wider(names_from = var, values_from = c(value, value_new)) %>%
  6. select(-date, -Lat, -Long) %>%
  7. add_row(
  8. "Province/State" = "World",
  9. "Country/Region" = "World",
  10. "population" = 7800000000,
  11. "value_confirmed" = sum(.$value_confirmed, na.rm = T),
  12. "value_new_confirmed" = sum(.$value_new_confirmed, na.rm = T),
  13. "value_recovered" = sum(.$value_recovered, na.rm = T),
  14. "value_new_recovered" = sum(.$value_new_recovered, na.rm = T),
  15. "value_deceased" = sum(.$value_deceased, na.rm = T),
  16. "value_new_deceased" = sum(.$value_new_deceased, na.rm = T),
  17. "value_active" = sum(.$value_active, na.rm = T),
  18. "value_new_active" = sum(.$value_new_active, na.rm = T)
  19. ) %>%
  20. group_by(!!sym(groupBy), population) %>%
  21. summarise(
  22. confirmed_total = sum(value_confirmed, na.rm = T),
  23. confirmed_new = sum(value_new_confirmed, na.rm = T),
  24. confirmed_totalNorm = round(sum(value_confirmed, na.rm = T) / max(population, na.rm = T) * 100000, 2),
  25. recovered_total = sum(value_recovered, na.rm = T),
  26. recovered_new = sum(value_new_recovered, na.rm = T),
  27. deceased_total = sum(value_deceased, na.rm = T),
  28. deceased_new = sum(value_new_deceased, na.rm = T),
  29. active_total = sum(value_active, na.rm = T),
  30. active_new = sum(value_new_active, na.rm = T),
  31. active_totalNorm = round(sum(value_active, na.rm = T) / max(population, na.rm = T) * 100000, 2)
  32. ) %>%
  33. mutate(
  34. "confirmed_newPer" = confirmed_new / (confirmed_total - confirmed_new) * 100,
  35. "recovered_newPer" = recovered_new / (recovered_total - recovered_new) * 100,
  36. "deceased_newPer" = deceased_new / (deceased_total - deceased_new) * 100,
  37. "active_newPer" = active_new / (active_total - active_new) * 100
  38. ) %>%
  39. mutate_at(vars(contains('_newPer')), list(~na_if(., Inf))) %>%
  40. mutate_at(vars(contains('_newPer')), list(~na_if(., 0))) %>%
  41. mutate(
  42. confirmed_new = str_c(str_pad(confirmed_new, width = padding_left, side = "left", pad = "0"), "|",
  43. confirmed_new, if_else(!is.na(confirmed_newPer), sprintf(" (%+.2f %%)", confirmed_newPer), "")),
  44. recovered_new = str_c(str_pad(recovered_new, width = padding_left, side = "left", pad = "0"), "|",
  45. recovered_new, if_else(!is.na(recovered_newPer), sprintf(" (%+.2f %%)", recovered_newPer), "")),
  46. deceased_new = str_c(str_pad(deceased_new, width = padding_left, side = "left", pad = "0"), "|",
  47. deceased_new, if_else(!is.na(deceased_newPer), sprintf(" (%+.2f %%)", deceased_newPer), "")),
  48. active_new = str_c(str_pad(active_new, width = padding_left, side = "left", pad = "0"), "|",
  49. active_new, if_else(!is.na(active_newPer), sprintf(" (%+.2f %%)", active_newPer), ""))
  50. ) %>%
  51. select(-population) %>%
  52. as.data.frame()
  53. }
  54. output$fullTable <- renderDataTable({
  55. data <- getFullTableData("Country/Region")
  56. columNames <- c(
  57. "Country",
  58. "Total Confirmed",
  59. "New Confirmed",
  60. "Total Confirmed <br>(per 100k)",
  61. "Total Estimated Recoveries",
  62. "New Estimated Recoveries",
  63. "Total Deceased",
  64. "New Deceased",
  65. "Total Active",
  66. "New Active",
  67. "Total Active <br>(per 100k)")
  68. datatable(
  69. data,
  70. rownames = FALSE,
  71. colnames = columNames,
  72. escape = FALSE,
  73. selection = "none",
  74. options = list(
  75. pageLength = -1,
  76. order = list(8, "desc"),
  77. scrollX = TRUE,
  78. scrollY = "calc(100vh - 250px)",
  79. scrollCollapse = TRUE,
  80. dom = "ft",
  81. server = FALSE,
  82. columnDefs = list(
  83. list(
  84. targets = c(2, 5, 7, 9),
  85. render = JS(
  86. "function(data, type, row, meta) {
  87. if (data != null) {
  88. split = data.split('|')
  89. if (type == 'display') {
  90. return split[1];
  91. } else {
  92. return split[0];
  93. }
  94. }
  95. }"
  96. )
  97. ),
  98. list(className = 'dt-right', targets = 1:ncol(data) - 1),
  99. list(width = '100px', targets = 0),
  100. list(visible = FALSE, targets = 11:14)
  101. )
  102. )
  103. ) %>%
  104. formatStyle(
  105. columns = "Country/Region",
  106. fontWeight = "bold"
  107. ) %>%
  108. formatStyle(
  109. columns = "confirmed_new",
  110. valueColumns = "confirmed_newPer",
  111. backgroundColor = styleInterval(c(10, 20, 33, 50, 75), c("NULL", "#FFE5E5", "#FFB2B2", "#FF7F7F", "#FF4C4C", "#983232")),
  112. color = styleInterval(75, c("#000000", "#FFFFFF"))
  113. ) %>%
  114. formatStyle(
  115. columns = "deceased_new",
  116. valueColumns = "deceased_newPer",
  117. backgroundColor = styleInterval(c(10, 20, 33, 50, 75), c("NULL", "#FFE5E5", "#FFB2B2", "#FF7F7F", "#FF4C4C", "#983232")),
  118. color = styleInterval(75, c("#000000", "#FFFFFF"))
  119. ) %>%
  120. formatStyle(
  121. columns = "active_new",
  122. valueColumns = "active_newPer",
  123. backgroundColor = styleInterval(c(-33, -20, -10, 10, 20, 33, 50, 75), c("#66B066", "#99CA99", "#CCE4CC", "NULL", "#FFE5E5", "#FFB2B2", "#FF7F7F", "#FF4C4C", "#983232")),
  124. color = styleInterval(75, c("#000000", "#FFFFFF"))
  125. ) %>%
  126. formatStyle(
  127. columns = "recovered_new",
  128. valueColumns = "recovered_newPer",
  129. backgroundColor = styleInterval(c(10, 20, 33), c("NULL", "#CCE4CC", "#99CA99", "#66B066"))
  130. )
  131. })