Overall Domain Results

reactable(
  overall_domain,
  defaultSorted = "DomainNbr",
  striped = TRUE,
  bordered = TRUE,
  highlight = TRUE,
  columns = list(
    DomainNbr = colDef(name = "#", width = 60),
    DomainLabel = colDef(name = "ICP Domain", minWidth = 260),
    mean = colDef(
      name = "Average score",
      format = colFormat(digits = 2)
    ),
    sd = colDef(
      name = "SD",
      format = colFormat(digits = 2)
    ),
    pct_good_or_better = colDef(
      name = "% Good or better (5–7)",
      format = colFormat(percent = TRUE, digits = 0)
    )
  )
)

Agency-level results (domain means by agency)

reactable(
  agency_domain,
  searchable = TRUE,
  filterable = TRUE,
  striped = TRUE,
  bordered = TRUE,
  highlight = TRUE,
  defaultPageSize = 15,
  columns = list(
    Agency = colDef(minWidth = 180),
    DomainNbr = colDef(name = "#", width = 60),
    DomainLabel = colDef(name = "ICP Domain", minWidth = 260),
    mean = colDef(name = "Avg", format = colFormat(digits = 2)),
    pct_good_or_better = colDef(
      name = "% Good (5–7)",
      format = colFormat(percent = TRUE, digits = 0)
    )
  )
)

Site/Class-level results (nested by agency → site)

reactable(
  agency_nested,
  searchable = TRUE,
  filterable = TRUE,
  striped = TRUE,
  bordered = TRUE,
  highlight = TRUE,
  defaultPageSize = 10,
  columns = list(
    Agency = colDef(minWidth = 180),
    Site_Class_Name = colDef(name = "Site / Class", minWidth = 220),
    details = colDef(show = FALSE)
  ),
  details = function(index) {
    row <- agency_nested[index, , drop = FALSE]
    detail_tbl <- row$details[[1]] %>%
      mutate(mean = round(mean, 2))

    div(
      style = "padding: 12px 4px 4px 4px;",
      tags$b("Domain detail"),
      reactable(
        detail_tbl,
        compact = TRUE,
        striped = TRUE,
        bordered = TRUE,
        columns = list(
          DomainNbr = colDef(name = "#", width = 60),
          DomainLabel = colDef(name = "ICP Domain", minWidth = 280),
          n_scored = colDef(name = "N", width = 70),
          mean = colDef(name = "Avg", format = colFormat(digits = 2))
        )
      )
    )
  }
)

Score Distribution View

dist_domain <- icp_long %>%
  filter(!is.na(Score)) %>%   # drop missing scores
  mutate(
    ScoreLabel = factor(
      ScoreLabel,
      levels = c(
        "Needs support (1–2.99)",
        "Emerging (3–4.99)",
        "Good or better (5–7)"
      )
    )
  ) %>%
  count(DomainNbr, DomainLabel, ScoreLabel) %>%
  group_by(DomainNbr, DomainLabel) %>%
  mutate(
    pct = n / sum(n)
  ) %>%
  ungroup() %>%
  arrange(DomainNbr, ScoreLabel)

reactable(
  dist_domain,
  striped = TRUE,
  bordered = TRUE,
  highlight = TRUE,
  defaultPageSize = 10,
  columns = list(
    DomainNbr = colDef(name = "#", width = 60),
    DomainLabel = colDef(name = "ICP Domain", minWidth = 300),
    ScoreLabel = colDef(name = "Category", minWidth = 200),
    n = colDef(name = "Count", width = 90),
    pct = colDef(
      name = "Percent",
      format = colFormat(percent = TRUE, digits = 0),
      width = 110
    )
  )
)