Skip to content

Commit

Permalink
Fix for adding summary row styles and footnotes (#924)
Browse files Browse the repository at this point in the history
* Fix indentation

* Ensure that all combinations of params are used

* Add several testthat tests

* Use `expand.grid()` more selectively

* Update dt_footnotes.R
  • Loading branch information
rich-iannone authored Apr 19, 2022
1 parent 0832f57 commit 8f6e6e5
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 34 deletions.
34 changes: 21 additions & 13 deletions R/dt_footnotes.R
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,34 @@ dt_footnotes_init <- function(data) {
dt_footnotes_set(footnotes = ., data = data)
}

dt_footnotes_add <- function(data,
locname,
grpname,
colname,
locnum,
rownum,
footnotes) {
dt_footnotes_add <- function(
data,
locname,
grpname,
colname,
locnum,
rownum,
footnotes
) {

data %>%
dt_footnotes_get() %>%
dplyr::bind_rows(
dplyr::tibble(
locname = locname,
expand.grid(
grpname = grpname,
colname = colname,
locnum = locnum,
rownum = rownum,
colnum = NA_integer_,
footnotes = list(footnotes)
)
stringsAsFactors = FALSE
) %>%
dplyr::as_tibble() %>%
dplyr::mutate(
locname = locname,
locnum = locnum,
colnum = NA_integer_,
footnotes = list(footnotes)
) %>%
dplyr::distinct() %>%
dplyr::select(locname, grpname, colname, locnum, rownum, footnotes)
) %>%
dt_footnotes_set(footnotes = ., data = data)
}
34 changes: 21 additions & 13 deletions R/dt_styles.R
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,34 @@ dt_styles_init <- function(data) {
dt_styles_set(styles = ., data = data)
}

dt_styles_add <- function(data,
locname,
grpname,
colname,
locnum,
rownum,
styles) {
dt_styles_add <- function(
data,
locname,
grpname,
colname,
locnum,
rownum,
styles
) {

data %>%
dt_styles_get() %>%
dplyr::bind_rows(
dplyr::tibble(
locname = locname,
expand.grid(
grpname = grpname,
colname = colname,
locnum = locnum,
rownum = rownum,
colnum = NA_integer_,
styles = list(styles)
)
stringsAsFactors = FALSE
) %>%
dplyr::as_tibble() %>%
dplyr::mutate(
locname = locname,
locnum = locnum,
colnum = NA_integer_,
styles = list(styles)
) %>%
dplyr::distinct() %>%
dplyr::select(locname, grpname, colname, locnum, rownum, styles)
) %>%
dt_styles_set(styles = ., data = data)
}
Expand Down
20 changes: 12 additions & 8 deletions R/location_methods.R
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,12 @@ as_locations <- function(locations) {
locations
}

add_summary_location_row <- function(loc,
data,
style,
df_type = "styles_df") {
add_summary_location_row <- function(
loc,
data,
style,
df_type = "styles_df"
) {

stub_df <- dt_stub_df_get(data = data)

Expand Down Expand Up @@ -133,10 +135,12 @@ add_summary_location_row <- function(loc,
data
}

add_grand_summary_location_row <- function(loc,
data,
style,
df_type = "styles_df") {
add_grand_summary_location_row <- function(
loc,
data,
style,
df_type = "styles_df"
) {

summary_data <- dt_summary_get(data = data)

Expand Down
7 changes: 7 additions & 0 deletions tests/testthat/_snaps/summary_rows.md
Original file line number Diff line number Diff line change
Expand Up @@ -3240,3 +3240,10 @@
}

# summary rows can be styled comprehensively

Code
.
Output
[1] "<table class=\"gt_table\">\n \n <thead class=\"gt_col_headings\">\n <tr>\n <th class=\"gt_col_heading gt_columns_bottom_border gt_left\" rowspan=\"1\" colspan=\"1\"></th>\n <th class=\"gt_col_heading gt_columns_bottom_border gt_right\" rowspan=\"1\" colspan=\"1\">hp</th>\n <th class=\"gt_col_heading gt_columns_bottom_border gt_right\" rowspan=\"1\" colspan=\"1\">trq</th>\n </tr>\n </thead>\n <tbody class=\"gt_table_body\">\n <tr class=\"gt_group_heading_row\">\n <td colspan=\"3\" class=\"gt_group_heading\">Lamborghini</td>\n </tr>\n <tr class=\"gt_row_group_first\"><td class=\"gt_row gt_right gt_stub\">Aventador</td>\n<td class=\"gt_row gt_right\">700</td>\n<td class=\"gt_row gt_right\">507</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub\">Huracan</td>\n<td class=\"gt_row gt_right\">610</td>\n<td class=\"gt_row gt_right\">413</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub\">Gallardo</td>\n<td class=\"gt_row gt_right\">550</td>\n<td class=\"gt_row gt_right\">398</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">Minimum</td>\n<td class=\"gt_row gt_right gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">550.00</td>\n<td class=\"gt_row gt_right gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">398.00</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">Maximum</td>\n<td class=\"gt_row gt_right gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">700.00</td>\n<td class=\"gt_row gt_right gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">507.00</td></tr>\n <tr class=\"gt_group_heading_row\">\n <td colspan=\"3\" class=\"gt_group_heading\">Maserati</td>\n </tr>\n <tr class=\"gt_row_group_first\"><td class=\"gt_row gt_right gt_stub\">Granturismo</td>\n<td class=\"gt_row gt_right\">454</td>\n<td class=\"gt_row gt_right\">384</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub\">Quattroporte</td>\n<td class=\"gt_row gt_right\">404</td>\n<td class=\"gt_row gt_right\">406</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub\">Ghibli</td>\n<td class=\"gt_row gt_right\">345</td>\n<td class=\"gt_row gt_right\">369</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">Minimum</td>\n<td class=\"gt_row gt_right gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">345.00</td>\n<td class=\"gt_row gt_right gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">369.00</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">Maximum</td>\n<td class=\"gt_row gt_right gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">454.00</td>\n<td class=\"gt_row gt_right gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">406.00</td></tr>\n <tr class=\"gt_group_heading_row\">\n <td colspan=\"3\" class=\"gt_group_heading\">Aston Martin</td>\n </tr>\n <tr class=\"gt_row_group_first\"><td class=\"gt_row gt_right gt_stub\">DB11</td>\n<td class=\"gt_row gt_right\">608</td>\n<td class=\"gt_row gt_right\">516</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub\">Rapide S</td>\n<td class=\"gt_row gt_right\">552</td>\n<td class=\"gt_row gt_right\">465</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub\">Vanquish</td>\n<td class=\"gt_row gt_right\">568</td>\n<td class=\"gt_row gt_right\">465</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub\">Vantage</td>\n<td class=\"gt_row gt_right\">430</td>\n<td class=\"gt_row gt_right\">361</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">Minimum</td>\n<td class=\"gt_row gt_right gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">430.00</td>\n<td class=\"gt_row gt_right gt_summary_row gt_first_summary_row thick\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">361.00</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">Maximum</td>\n<td class=\"gt_row gt_right gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">608.00</td>\n<td class=\"gt_row gt_right gt_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">516.00</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub gt_grand_summary_row gt_first_grand_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">Minimum</td>\n<td class=\"gt_row gt_right gt_grand_summary_row gt_first_grand_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">345.00</td>\n<td class=\"gt_row gt_right gt_grand_summary_row gt_first_grand_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">361.00</td></tr>\n <tr><td class=\"gt_row gt_right gt_stub gt_grand_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">Maximum</td>\n<td class=\"gt_row gt_right gt_grand_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">700.00</td>\n<td class=\"gt_row gt_right gt_grand_summary_row gt_last_summary_row\" style=\"background-color: #DA291C; border-left-width: 4px; border-left-style: solid; border-left-color: #FFC72C; border-right-width: 4px; border-right-style: solid; border-right-color: #FFC72C; border-top-width: 4px; border-top-style: solid; border-top-color: #FFC72C; border-bottom-width: 4px; border-bottom-style: solid; border-bottom-color: #FFC72C; color: #FFFFFF; font-weight: bold;\">516.00</td></tr>\n </tbody>\n \n \n</table>"

38 changes: 38 additions & 0 deletions tests/testthat/test-summary_rows.R
Original file line number Diff line number Diff line change
Expand Up @@ -1595,3 +1595,41 @@ test_that("Situtations where `rowname` is a column name don't interfere with int
expect_warning(regexp = NA, summary_tbl_6 %>% as_latex())
expect_warning(regexp = NA, summary_tbl_6 %>% as_rtf())
})

test_that("summary rows can be styled comprehensively", {

# Generate a gt table with group and grand summary rows and style
# every one of these cells in a single, comprehensive `tab_style()` stmt
gt_tbl <-
gtcars %>%
dplyr::select(mfr, model, hp, trq) %>%
dplyr::filter(mfr %in% c("Lamborghini", "Maserati", "Aston Martin")) %>%
gt(rowname_col = "model", groupname_col = "mfr") %>%
summary_rows(
groups = TRUE,
fns = list(
Minimum = ~min(.),
Maximum = ~max(.)
)
) %>%
grand_summary_rows(
fns = list(
Minimum = ~min(.),
Maximum = ~max(.)
)
) %>%
tab_style(
style = list(
cell_fill(color = "#DA291C"),
cell_borders(color = "#FFC72C", weight = "4px"),
cell_text(color = "white", weight = "bold")
),
locations = list(
cells_summary(), cells_stub_summary(),
cells_grand_summary(), cells_stub_grand_summary()
)
)

# Take a snapshot of `gt_tbl`
gt_tbl %>% render_as_html() %>% expect_snapshot()
})

0 comments on commit 8f6e6e5

Please sign in to comment.