From a0df4b5d7f07669fcb33cbf5b2e879874c8e4fcd Mon Sep 17 00:00:00 2001 From: m7pr Date: Mon, 30 Jun 2025 13:33:44 +0200 Subject: [PATCH 1/7] add option to remove empty columns --- R/tm_t_crosstable.R | 17 +++++++++++++++-- man/tm_t_crosstable.Rd | 24 ++++++++++++++---------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/R/tm_t_crosstable.R b/R/tm_t_crosstable.R index 15fd5c8a8..b8214ace1 100644 --- a/R/tm_t_crosstable.R +++ b/R/tm_t_crosstable.R @@ -25,6 +25,14 @@ #' #' @inherit shared_params return #' +#' @section Table Settings: +#' The module provides several table settings that can be adjusted: +#' \itemize{ +#' \item \code{Show column percentage}: Shows column percentages when enabled +#' \item \code{Show total column}: Shows a total column when enabled +#' \item \code{Remove zero-only columns}: Removes columns that contain only zeros from the output table +#' } +#' #' @section Decorating Module: #' #' This module generates the following objects, which can be modified in place using decorators: @@ -245,7 +253,8 @@ ui_t_crosstable <- function(id, x, y, show_percentage, show_total, pre_output, p bslib::accordion_panel( title = "Table settings", checkboxInput(ns("show_percentage"), "Show column percentage", value = show_percentage), - checkboxInput(ns("show_total"), "Show total column", value = show_total) + checkboxInput(ns("show_total"), "Show total column", value = show_total), + checkboxInput(ns("remove_zero_columns"), "Remove zero-only columns", value = FALSE) ) ), ui_decorate_teal_data(ns("decorator"), decorators = select_decorators(args$decorators, "table")) @@ -352,6 +361,7 @@ srv_t_crosstable <- function(id, data, reporter, filter_panel_api, label, x, y, show_percentage <- input$show_percentage show_total <- input$show_total + remove_zero_columns <- input$remove_zero_columns plot_title <- paste( "Cross-Table of", @@ -416,9 +426,12 @@ srv_t_crosstable <- function(id, data, reporter, filter_panel_api, label, x, y, substitute( expr = { ANL <- tern::df_explicit_na(ANL) + if (remove_zero_columns) { + ANL[[y_name]] <- droplevels(ANL[[y_name]]) + } table <- rtables::build_table(lyt = table, df = ANL[order(ANL[[y_name]]), ]) }, - env = list(y_name = y_name) + env = list(y_name = y_name, remove_zero_columns = remove_zero_columns) ) ) }) diff --git a/man/tm_t_crosstable.Rd b/man/tm_t_crosstable.Rd index c761018da..c4ba5537e 100644 --- a/man/tm_t_crosstable.Rd +++ b/man/tm_t_crosstable.Rd @@ -18,9 +18,6 @@ tm_t_crosstable( ) } \arguments{ -\item{label}{(\code{character(1)}) Label shown in the navigation item for the module or module group. -For \code{modules()} defaults to \code{"root"}. See \code{Details}.} - \item{x}{(\code{data_extract_spec} or \code{list} of multiple \code{data_extract_spec}) Object with all available choices with pre-selected option for variable X - row values. In case of \code{data_extract_spec} use \code{select_spec(..., ordered = TRUE)} if table elements should be @@ -52,9 +49,6 @@ The argument is merged with options variable \code{teal.basic_table_args} and de For more details see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}} -\item{transformators}{(\code{list} of \code{teal_transform_module}) that will be applied to transform module's data input. -To learn more check \code{vignette("transform-input-data", package = "teal")}.} - \item{decorators}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} (named \code{list} of lists of \code{teal_transform_module}) optional, decorator for tables or plots included in the module output reported. @@ -73,6 +67,16 @@ options for showing percentages and sub-totals. For more examples, please see the vignette "Using cross table" via \code{vignette("using-cross-table", package = "teal.modules.general")}. } +\section{Table Settings}{ + +The module provides several table settings that can be adjusted: +\itemize{ +\item \code{Show column percentage}: Shows column percentages when enabled +\item \code{Show total column}: Shows a total column when enabled +\item \code{Remove zero-only columns}: Removes columns that contain only zeros from the output table +} +} + \section{Decorating Module}{ @@ -196,13 +200,13 @@ if (interactive()) { \describe{ \item{example-1}{ \href{https://shinylive.io/r/app/#code=NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAGwEsAjAJykYE8AKcqajGIgEwCu1OAGcMAcwpxm1AJQAdCLTIyoBUrQBucAAQAeALS6AZoIgbaJdnN0AVLAFUAokqUBiXVIhrqu-lCkULpwAB6wqCJKAUEGxlzUAPoxUDbRgcFGugDutKQAFirsKbi6IEq6ujCkBCyicVU1dRWmRIy67Fq6KroE7AqErNQDpQNaoiO6A7CTA1IsA3K25RCVldW1jKLAwFoAunsNUOIm6qRt7Bt1O-t7iqu6AL4tV1s7A6iMtDAsrIkA1nBWAMDg1RHAAI6JEQQdgQRhEbKXJpbJZKR73ABWRBUAKBomKGVsWWxuMBrAJpIgeI4A1eEzwUzA9NmYE+31+NMW9yUaFQDRUeX6DxSugAvP4MrgXgJhGJxVVZSICS1KqQYIlSIkCAjRKIgvQRMK1mtqFB6HA-BKBgBhXX1OzmqJ4VVrUIKlKJMKkZgaRKiVBwPquk0paDwBV0lEM6UPE2VcEiDQKxNBrUBoPG+Mms0Wq1MgDKlrTui0LFoTrgiBGIfjBHyOII8olZa+le1DdoTYJKXezOjIL2pWDg2GjLGMaZM3HYHmjG5sezJtTGjg-AVI4IQ1Zc8Wi6X62EmkieglDhc+4PbX4MjXCvPzkvS5MtFCd4lADEAIIAGQLrjjeN7mzOQn0qVgPQyL1Qh9M5-UDYNANDDJw1PJkWRdJC1hXUgU2LP0M0Qg9KlzS1IzAIsk1w1sK0NKsaywk160bZtS3LdtmK7MRCSCPsMIOYd+lHVlxlZadRlnOAFjAJYwPjHD3yZUTMOIqoj1oE8FW-P9H1rE0XzfddP1-f89N0YCgNdCz7nuWgTA6FRyF9TQdBsZYWlEQoIFYL90HYPkABJBFoUpAvBRgdEYe5nggMBHj2IA}{Open in Shinylive} - \if{html}{\out{}} - \if{html}{\out{}} + \if{html}{\out{}} + \if{html}{\out{}} } \item{example-2}{ \href{https://shinylive.io/r/app/#code=NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAGwEsAjAJykYE8AKcqajGIgEwCu1OAGcMAcwpxm1AJQAdCLTIyoBUrQBucAAQAeALS6AZoIgbaJdnN0AVLAFUAokqUBiXQGEAIgEkAZS9dfihSKF04AA9YVBElUPCDYy5qAH1EqBsEsIijXQB3WlIACxV2TNxdECVdXQBBHwCAGWTdVIxMxERGRpalAF9FCAArIhU0gGs4VlEK3Nt8-jgTKGFSNIJ+WlECNLGJ6dngaHg5zLkAXTdodDaVYvZakNzdAF4X8NxnviERUXeul+wjETwgdTqpBgaQ2BEYRFEonC9BEYIhEOoUHocGogIUYC88MR9ix8Twz3RUUBmTS0VIzA0aVEqDgBDR6IhmVOeg++L6zXx33BHLqohxrNIgLFIkZzNZ7JFdUx2NxvLAAXFGl0WhYtFJcEQgopioIJXGBDEgJ1jD1KLgmzNtAt51ywGAfKaArAl0uVVEgnoYslHzMFk01gu1WNit0tH4VPyAEIdehqBxKrGICUZMVRFVqEQJE7uOwAIxyKps-E+MJwQW6fEABQA8gE-AANDT1putjvUUj4uTDGPoxhwUiCRgQdjcl3hOTAONRS7DkdDIUj3TSiVwfh4gnNxwAOQcAE0jcKYzB1rQ4jz7E5nBuR0RGMsx3uPg4XM+YyZaFEu6AgAYvUzQBK4l4cqu6IVtGuisNSuS0lE9LqBscpVlB6JcrA94ev05LYRC25ah8pEYSyWGbsqOL7hqMqStatoiIaRGbqa5qWh8zH6g6XFzlAboEV6Pp+gGQaAqGlgRgsUbESKS5tCmcTprkVQ7BgqwaK++aFsW1BlkO8EimOE5TjOeGCQuS4riZELrvZoqauQn4Nuqzjthem7Xv2t4iCBYEQb+ir-oBbmgeBkExjBEKxauwzDLQJi6OwKjkAymg6DYtg1MKohlBArD1Og7BoKgAAkgi0FU5UVWKjA6IwwwDEoYADJcQA}{Open in Shinylive} - \if{html}{\out{}} - \if{html}{\out{}} + \if{html}{\out{}} + \if{html}{\out{}} } } } From 8dba181b104b5e039eedf8d3035e16adbd8403de Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 11:41:26 +0000 Subject: [PATCH 2/7] [skip roxygen] [skip vbump] Roxygen Man Pages Auto Update --- man/tm_t_crosstable.Rd | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/man/tm_t_crosstable.Rd b/man/tm_t_crosstable.Rd index c4ba5537e..c4f4e947c 100644 --- a/man/tm_t_crosstable.Rd +++ b/man/tm_t_crosstable.Rd @@ -18,6 +18,9 @@ tm_t_crosstable( ) } \arguments{ +\item{label}{(\code{character(1)}) Label shown in the navigation item for the module or module group. +For \code{modules()} defaults to \code{"root"}. See \code{Details}.} + \item{x}{(\code{data_extract_spec} or \code{list} of multiple \code{data_extract_spec}) Object with all available choices with pre-selected option for variable X - row values. In case of \code{data_extract_spec} use \code{select_spec(..., ordered = TRUE)} if table elements should be @@ -49,6 +52,9 @@ The argument is merged with options variable \code{teal.basic_table_args} and de For more details see the vignette: \code{vignette("custom-basic-table-arguments", package = "teal.widgets")}} +\item{transformators}{(\code{list} of \code{teal_transform_module}) that will be applied to transform module's data input. +To learn more check \code{vignette("transform-input-data", package = "teal")}.} + \item{decorators}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} (named \code{list} of lists of \code{teal_transform_module}) optional, decorator for tables or plots included in the module output reported. @@ -200,13 +206,13 @@ if (interactive()) { \describe{ \item{example-1}{ \href{https://shinylive.io/r/app/#code=NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAGwEsAjAJykYE8AKcqajGIgEwCu1OAGcMAcwpxm1AJQAdCLTIyoBUrQBucAAQAeALS6AZoIgbaJdnN0AVLAFUAokqUBiXVIhrqu-lCkULpwAB6wqCJKAUEGxlzUAPoxUDbRgcFGugDutKQAFirsKbi6IEq6ujCkBCyicVU1dRWmRIy67Fq6KroE7AqErNQDpQNaoiO6A7CTA1IsA3K25RCVldW1jKLAwFoAunsNUOIm6qRt7Bt1O-t7iqu6AL4tV1s7A6iMtDAsrIkA1nBWAMDg1RHAAI6JEQQdgQRhEbKXJpbJZKR73ABWRBUAKBomKGVsWWxuMBrAJpIgeI4A1eEzwUzA9NmYE+31+NMW9yUaFQDRUeX6DxSugAvP4MrgXgJhGJxVVZSICS1KqQYIlSIkCAjRKIgvQRMK1mtqFB6HA-BKBgBhXX1OzmqJ4VVrUIKlKJMKkZgaRKiVBwPquk0paDwBV0lEM6UPE2VcEiDQKxNBrUBoPG+Mms0Wq1MgDKlrTui0LFoTrgiBGIfjBHyOII8olZa+le1DdoTYJKXezOjIL2pWDg2GjLGMaZM3HYHmjG5sezJtTGjg-AVI4IQ1Zc8Wi6X62EmkieglDhc+4PbX4MjXCvPzkvS5MtFCd4lADEAIIAGQLrjjeN7mzOQn0qVgPQyL1Qh9M5-UDYNANDDJw1PJkWRdJC1hXUgU2LP0M0Qg9KlzS1IzAIsk1w1sK0NKsaywk160bZtS3LdtmK7MRCSCPsMIOYd+lHVlxlZadRlnOAFjAJYwPjHD3yZUTMOIqoj1oE8FW-P9H1rE0XzfddP1-f89N0YCgNdCz7nuWgTA6FRyF9TQdBsZYWlEQoIFYL90HYPkABJBFoUpAvBRgdEYe5nggMBHj2IA}{Open in Shinylive} - \if{html}{\out{}} - \if{html}{\out{}} + \if{html}{\out{}} + \if{html}{\out{}} } \item{example-2}{ \href{https://shinylive.io/r/app/#code=NobwRAdghgtgpmAXGKAHVA6ASmANGAYwHsIAXOMpMAGwEsAjAJykYE8AKcqajGIgEwCu1OAGcMAcwpxm1AJQAdCLTIyoBUrQBucAAQAeALS6AZoIgbaJdnN0AVLAFUAokqUBiXQGEAIgEkAZS9dfihSKF04AA9YVBElUPCDYy5qAH1EqBsEsIijXQB3WlIACxV2TNxdECVdXQBBHwCAGWTdVIxMxERGRpalAF9FCAArIhU0gGs4VlEK3Nt8-jgTKGFSNIJ+WlECNLGJ6dngaHg5zLkAXTdodDaVYvZakNzdAF4X8NxnviERUXeul+wjETwgdTqpBgaQ2BEYRFEonC9BEYIhEOoUHocGogIUYC88MR9ix8Twz3RUUBmTS0VIzA0aVEqDgBDR6IhmVOeg++L6zXx33BHLqohxrNIgLFIkZzNZ7JFdUx2NxvLAAXFGl0WhYtFJcEQgopioIJXGBDEgJ1jD1KLgmzNtAt51ywGAfKaArAl0uVVEgnoYslHzMFk01gu1WNit0tH4VPyAEIdehqBxKrGICUZMVRFVqEQJE7uOwAIxyKps-E+MJwQW6fEABQA8gE-AANDT1putjvUUj4uTDGPoxhwUiCRgQdjcl3hOTAONRS7DkdDIUj3TSiVwfh4gnNxwAOQcAE0jcKYzB1rQ4jz7E5nBuR0RGMsx3uPg4XM+YyZaFEu6AgAYvUzQBK4l4cqu6IVtGuisNSuS0lE9LqBscpVlB6JcrA94ev05LYRC25ah8pEYSyWGbsqOL7hqMqStatoiIaRGbqa5qWh8zH6g6XFzlAboEV6Pp+gGQaAqGlgRgsUbESKS5tCmcTprkVQ7BgqwaK++aFsW1BlkO8EimOE5TjOeGCQuS4riZELrvZoqauQn4Nuqzjthem7Xv2t4iCBYEQb+ir-oBbmgeBkExjBEKxauwzDLQJi6OwKjkAymg6DYtg1MKohlBArD1Og7BoKgAAkgi0FU5UVWKjA6IwwwDEoYADJcQA}{Open in Shinylive} - \if{html}{\out{}} - \if{html}{\out{}} + \if{html}{\out{}} + \if{html}{\out{}} } } } From ad2597665e914ddc3971e1d2d4ef690b7d20630d Mon Sep 17 00:00:00 2001 From: m7pr Date: Thu, 3 Jul 2025 11:46:34 +0200 Subject: [PATCH 3/7] clean show R code for remove zero-only columns --- R/tm_t_crosstable.R | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/R/tm_t_crosstable.R b/R/tm_t_crosstable.R index b8214ace1..180828346 100644 --- a/R/tm_t_crosstable.R +++ b/R/tm_t_crosstable.R @@ -378,7 +378,7 @@ srv_t_crosstable <- function(id, data, reporter, filter_panel_api, label, x, y, ANL ) - teal.code::eval_code( + obj <- teal.code::eval_code( merged$anl_q_r(), substitute( expr = { @@ -423,17 +423,32 @@ srv_t_crosstable <- function(id, data, reporter, filter_panel_api, label, x, y, ) ) %>% teal.code::eval_code( - substitute( - expr = { - ANL <- tern::df_explicit_na(ANL) - if (remove_zero_columns) { + expression(ANL <- tern::df_explicit_na(ANL)) + ) + + if (remove_zero_columns) { + obj <- obj %>% + teal.code::eval_code( + substitute( + expr = { ANL[[y_name]] <- droplevels(ANL[[y_name]]) - } - table <- rtables::build_table(lyt = table, df = ANL[order(ANL[[y_name]]), ]) - }, - env = list(y_name = y_name, remove_zero_columns = remove_zero_columns) + table <- rtables::build_table(lyt = table, df = ANL[order(ANL[[y_name]]), ]) + }, + env = list(y_name = y_name) + ) ) - ) + } else { + obj <- obj %>% + teal.code::eval_code( + substitute( + expr = { + table <- rtables::build_table(lyt = table, df = ANL[order(ANL[[y_name]]), ]) + }, + env = list(y_name = y_name) + ) + ) + } + obj }) decorated_output_q <- srv_decorate_teal_data( From dd2005220d1a45b5663c11b38cf553a7885f94a4 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 09:48:37 +0000 Subject: [PATCH 4/7] [skip style] [skip vbump] Restyle files --- R/tm_t_crosstable.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/tm_t_crosstable.R b/R/tm_t_crosstable.R index 180828346..a23252379 100644 --- a/R/tm_t_crosstable.R +++ b/R/tm_t_crosstable.R @@ -439,7 +439,7 @@ srv_t_crosstable <- function(id, data, reporter, filter_panel_api, label, x, y, ) } else { obj <- obj %>% - teal.code::eval_code( + teal.code::eval_code( substitute( expr = { table <- rtables::build_table(lyt = table, df = ANL[order(ANL[[y_name]]), ]) From 948174558dffbfecec80535174f242d329a4565d Mon Sep 17 00:00:00 2001 From: m7pr Date: Thu, 3 Jul 2025 11:53:10 +0200 Subject: [PATCH 5/7] add parameter for remove_zero_columns --- R/tm_t_crosstable.R | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/R/tm_t_crosstable.R b/R/tm_t_crosstable.R index 180828346..39feca93e 100644 --- a/R/tm_t_crosstable.R +++ b/R/tm_t_crosstable.R @@ -19,6 +19,9 @@ #' @param show_total (`logical(1)`) #' Indicates whether to show total column. #' Defaults to `TRUE`. +#' @param remove_zero_columns (`logical(1)`) +#' Indicates whether to remove columns that contain only zeros from the output table. +#' Defaults to `FALSE`. #' #' @note For more examples, please see the vignette "Using cross table" via #' `vignette("using-cross-table", package = "teal.modules.general")`. @@ -163,6 +166,7 @@ tm_t_crosstable <- function(label = "Cross Table", y, show_percentage = TRUE, show_total = TRUE, + remove_zero_columns = FALSE, pre_output = NULL, post_output = NULL, basic_table_args = teal.widgets::basic_table_args(), @@ -183,6 +187,7 @@ tm_t_crosstable <- function(label = "Cross Table", checkmate::assert_flag(show_percentage) checkmate::assert_flag(show_total) + checkmate::assert_flag(remove_zero_columns) checkmate::assert_multi_class(pre_output, c("shiny.tag", "shiny.tag.list", "html"), null.ok = TRUE) checkmate::assert_multi_class(post_output, c("shiny.tag", "shiny.tag.list", "html"), null.ok = TRUE) checkmate::assert_class(basic_table_args, classes = "basic_table_args") @@ -197,6 +202,7 @@ tm_t_crosstable <- function(label = "Cross Table", label = label, x = x, y = y, + remove_zero_columns = remove_zero_columns, basic_table_args = basic_table_args, decorators = decorators ) @@ -215,7 +221,7 @@ tm_t_crosstable <- function(label = "Cross Table", } # UI function for the cross-table module -ui_t_crosstable <- function(id, x, y, show_percentage, show_total, pre_output, post_output, ...) { +ui_t_crosstable <- function(id, x, y, show_percentage, show_total, remove_zero_columns, pre_output, post_output, ...) { args <- list(...) ns <- NS(id) is_single_dataset <- teal.transform::is_single_dataset(x, y) @@ -254,7 +260,7 @@ ui_t_crosstable <- function(id, x, y, show_percentage, show_total, pre_output, p title = "Table settings", checkboxInput(ns("show_percentage"), "Show column percentage", value = show_percentage), checkboxInput(ns("show_total"), "Show total column", value = show_total), - checkboxInput(ns("remove_zero_columns"), "Remove zero-only columns", value = FALSE) + checkboxInput(ns("remove_zero_columns"), "Remove zero-only columns", value = remove_zero_columns) ) ), ui_decorate_teal_data(ns("decorator"), decorators = select_decorators(args$decorators, "table")) @@ -268,7 +274,7 @@ ui_t_crosstable <- function(id, x, y, show_percentage, show_total, pre_output, p } # Server function for the cross-table module -srv_t_crosstable <- function(id, data, reporter, filter_panel_api, label, x, y, basic_table_args, decorators) { +srv_t_crosstable <- function(id, data, reporter, filter_panel_api, label, x, y, remove_zero_columns, basic_table_args, decorators) { with_reporter <- !missing(reporter) && inherits(reporter, "Reporter") with_filter <- !missing(filter_panel_api) && inherits(filter_panel_api, "FilterPanelAPI") checkmate::assert_class(data, "reactive") From 5df0ecead6625012fe9d9a5d4d27bf8485bf811c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 10:01:54 +0000 Subject: [PATCH 6/7] [skip roxygen] [skip vbump] Roxygen Man Pages Auto Update --- man/tm_t_crosstable.Rd | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/man/tm_t_crosstable.Rd b/man/tm_t_crosstable.Rd index c4f4e947c..0682c348b 100644 --- a/man/tm_t_crosstable.Rd +++ b/man/tm_t_crosstable.Rd @@ -10,6 +10,7 @@ tm_t_crosstable( y, show_percentage = TRUE, show_total = TRUE, + remove_zero_columns = FALSE, pre_output = NULL, post_output = NULL, basic_table_args = teal.widgets::basic_table_args(), @@ -39,6 +40,10 @@ Defaults to \code{TRUE}.} Indicates whether to show total column. Defaults to \code{TRUE}.} +\item{remove_zero_columns}{(\code{logical(1)}) +Indicates whether to remove columns that contain only zeros from the output table. +Defaults to \code{FALSE}.} + \item{pre_output}{(\code{shiny.tag}) optional, text or UI element to be displayed before the module's output, providing context or a title. with text placed before the output to put the output into context. For example a title.} From 6f89792f1ea734c0ec46fd1eee5ca0d3737e79fe Mon Sep 17 00:00:00 2001 From: m7pr Date: Tue, 8 Jul 2025 09:14:57 +0200 Subject: [PATCH 7/7] add NEWS --- NEWS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS.md b/NEWS.md index 4dcfaea65..c244d5e47 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,6 +5,9 @@ ### Bug fixes * Fixes output is not updated when filter is added for the modules: `tm_a_pca`, `tm_a_regression`, `tm_g_scatterplot`, `tm_g_association`, `tm_g_bivariate`, `tm_g_distribution`, `tm_g_response`, `tm_t_crosstable` (#870) +### Enhancements +* Added `remove_zero_columns` to `tm_t_crosstable` to add an option to remove empty columns (#890) + # teal.modules.general 0.4.0 ### Enhancements