You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 line
1.8KB

  1. ---
  2. output: js4shiny::html_document_js
  3. ---
  4. ```{r htmldeps, echo=FALSE}
  5. library(htmltools)
  6. library(dplyr)
  7. library(tidyr)
  8. library(babynames)
  9. tagList(
  10. div(id = "chart"),
  11. htmltools::htmlDependency(
  12. name = "frappe-charts",
  13. version = "1.3.0",
  14. package = "frappeCharts",
  15. src = "htmlwidgets/lib/frappe-charts",
  16. script = "frappe-charts.min.iife.js",
  17. all_files = TRUE
  18. )
  19. )
  20. ```
  21. ```{r data}
  22. # data <- list(
  23. # labels = rep(c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"), 4),
  24. # datasets = list(
  25. # list(name = "Python", values = runif(7 * 4, 0, 50)),
  26. # list(name = "R", values = runif(7 * 4, 0, 100))
  27. # )
  28. # )
  29. data <-
  30. babynames %>%
  31. filter(
  32. name %in% c("Ruth", "August"),
  33. year >= 1980
  34. ) %>%
  35. group_by(year, name) %>%
  36. summarize(n = sum(n)) %>%
  37. ungroup() %>%
  38. pivot_wider(year, name, values_from = n)
  39. data[1:5, ]
  40. opts <- list(
  41. title = "My AwesomeR Chart",
  42. type = "line",
  43. height = 250,
  44. colors = c("#466683", "#44bc96"),
  45. data = data,
  46. lineOptions = list(regionFill = TRUE, hideDots = FALSE),
  47. axisOptions = list(xIsSeries = TRUE),
  48. isNavigable = c(TRUE, TRUE)
  49. )
  50. tags$script(
  51. id = "chart-opts",
  52. type = "application/json",
  53. htmlwidgets:::toJSON(opts)
  54. )
  55. ```
  56. ```{js}
  57. let x = document.getElementById('chart-opts')
  58. x = JSON.parse(x.textContent)
  59. const chartData = {labels: [], datasets: []}
  60. // Get keys of data, assume that first entry is for labels, the rest are data
  61. let labelColumn = Object.keys(x.data)[0]
  62. let columns = Object.keys(x.data).slice(1)
  63. // First column in x.data is the labels
  64. chartData.labels = x.data[labelColumn]
  65. // Create an appropriate object for each column, reformat data and add to chartData
  66. columns.forEach(function(col) {
  67. chartData.datasets.push({name: col, values: x.data[col]})
  68. })
  69. x.data = chartData
  70. const chart = new frappe.Chart("#chart", x)
  71. ```