From ef50e4e399d972eddeb4b67d291fdd1ec7578fcd Mon Sep 17 00:00:00 2001 From: Abhirupa Ghosh <100681585+AbhirupaGhosh@users.noreply.github.com> Date: Tue, 28 Jul 2026 11:41:27 -0600 Subject: [PATCH 1/4] Refactor summary report generation: improve formatting and update example paths --- R/amRdataPlots.R | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/R/amRdataPlots.R b/R/amRdataPlots.R index 7cf3f63..572641c 100644 --- a/R/amRdataPlots.R +++ b/R/amRdataPlots.R @@ -9,12 +9,14 @@ #' #' @examples #' generateSummary( -#' metadata_parquet = "results/metadata.parquet", -#' out_path = "results/" +#' metadata_parquet = "data/metadata.parquet", +#' out_path = "data/" #' ) #' #' @export -generateSummary <- function(metadata_parquet, out_path) { +generateSummary <- function(metadata_parquet, + out_path +) { # Little helper to apply distinct + non-empty + sorted vector clean_distinct <- function(df, col) { df |> @@ -60,7 +62,9 @@ generateSummary <- function(metadata_parquet, out_path) { dplyr::pull() # Core summaries - TotalEntryCount <- metadata |> dplyr::count() + TotalEntryCount <- metadata |> + dplyr::count() + CleanEntryCount <- metadata |> dplyr::distinct(genome.genome_id) |> dplyr::count() @@ -172,7 +176,7 @@ ResPropbyDrugClass <- drug_class_calls |> # Header write_new( md_path, - sprintf("# AMR summary report for *%s*", Species_name) + sprintf("# AMR summary report for *%s*", paste(Species_name, collapse = ", ")) ) # Basic stats @@ -218,18 +222,14 @@ ResPropbyDrugClass <- drug_class_calls |> append_lines(md_path, c("## Isolation sources", "", md_tbl(SourceCount), "", "")) append_lines(md_path, c("## Hosts", "", md_tbl(HostCount), "", "")) - - # Hosts as a simple list - # if (length(Host)) { - # append_lines(md_path, c("## Hosts", "", paste0("- ", Host), "", "")) - # } +invisible(md_path) } #' Write all summary plots to file(s) #' -#' Expects `metadata_parquet` to be the output of `runDataProcessing()`'s -#' `cleanData()` step (or an export of the resulting `metadata` table), since +#' Expects `metadata_parquet` to be the output of +#' `cleanMetadata()` step (or an export of the resulting `metadata` table), since #' `drug_abbr`, `drug_class`, and `num_resistant_classes` are only populated #' after that step joins in the reference drug tables. #' @@ -238,9 +238,16 @@ ResPropbyDrugClass <- drug_class_calls |> #' #' @return Invisibly returns the path to the written PDF (all plots as #' separate pages of one multi-page file). +#' +#' @examples +#' generatePlots( +#' metadata_parquet = "data/metadata.parquet", +#' out_path = "data/" +#' ) #' @export generatePlots <- function(metadata_parquet, - out_path) { + out_path + ) { if (!dir.exists(out_path)) { dir.create(out_path, showWarnings = FALSE, recursive = TRUE) } From cfa634c2b30bbbaf71bab99687186af72616f2e3 Mon Sep 17 00:00:00 2001 From: Emily Boyer Date: Tue, 4 Aug 2026 13:10:26 -0600 Subject: [PATCH 2/4] Fix stale comment: susceptible color is blue, not grey --- R/utils_colors.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/utils_colors.R b/R/utils_colors.R index 7c4a25e..4ec3fce 100644 --- a/R/utils_colors.R +++ b/R/utils_colors.R @@ -3,7 +3,7 @@ # AMR phenotype palette (R/S/I plus full-word + lowercase variants so it works # regardless of how the column is encoded). Susceptible is intentionally -# neutral grey so Resistant amber stands out as the signal of interest. +# a muted blue so Resistant amber stands out as the signal of interest. PHENOTYPE_COLORS <- c( R = "#d4872a", Resistant = "#d4872a", resistant = "#d4872a", S = "#5b8db8", Susceptible = "#5b8db8", susceptible = "#5b8db8", From faccb79a34cb9e6a1705d95815bf8b1ce8732c27 Mon Sep 17 00:00:00 2001 From: Emily Boyer Date: Tue, 4 Aug 2026 14:32:09 -0600 Subject: [PATCH 3/4] Wrap examples in \dontrun{}, fix cleanMetaData() reference, document invisible return --- R/amRdataPlots.R | 12 ++++++++---- man/generatePlots.Rd | 12 ++++++++++-- man/generateSummary.Rd | 10 ++++++---- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/R/amRdataPlots.R b/R/amRdataPlots.R index 572641c..18c35a3 100644 --- a/R/amRdataPlots.R +++ b/R/amRdataPlots.R @@ -4,14 +4,16 @@ #' standardized AMR metadata. #' @param out_path Character string. Directory where the Markdown report is written. #' -#' @return Writes a structured, human‑readable summary report to -#' "/amr_metadata_summary.md". +#' @return Invisibly returns the path to the written Markdown summary report +#' ("/amr_metadata_summary.md"). #' #' @examples +#' \dontrun{ #' generateSummary( #' metadata_parquet = "data/metadata.parquet", #' out_path = "data/" #' ) +#' } #' #' @export generateSummary <- function(metadata_parquet, @@ -228,8 +230,8 @@ invisible(md_path) #' Write all summary plots to file(s) #' -#' Expects `metadata_parquet` to be the output of -#' `cleanMetadata()` step (or an export of the resulting `metadata` table), since +#' Expects `metadata_parquet` to be the output of +#' `cleanMetaData()` step (or an export of the resulting `metadata` table), since #' `drug_abbr`, `drug_class`, and `num_resistant_classes` are only populated #' after that step joins in the reference drug tables. #' @@ -240,10 +242,12 @@ invisible(md_path) #' separate pages of one multi-page file). #' #' @examples +#' \dontrun{ #' generatePlots( #' metadata_parquet = "data/metadata.parquet", #' out_path = "data/" #' ) +#' } #' @export generatePlots <- function(metadata_parquet, out_path diff --git a/man/generatePlots.Rd b/man/generatePlots.Rd index 82845a2..2ba6636 100644 --- a/man/generatePlots.Rd +++ b/man/generatePlots.Rd @@ -16,8 +16,16 @@ Invisibly returns the path to the written PDF (all plots as separate pages of one multi-page file). } \description{ -Expects \code{metadata_parquet} to be the output of \code{runDataProcessing()}'s -\code{cleanData()} step (or an export of the resulting \code{metadata} table), since +Expects \code{metadata_parquet} to be the output of +\code{cleanMetaData()} step (or an export of the resulting \code{metadata} table), since \code{drug_abbr}, \code{drug_class}, and \code{num_resistant_classes} are only populated after that step joins in the reference drug tables. } +\examples{ +\dontrun{ +generatePlots( + metadata_parquet = "data/metadata.parquet", + out_path = "data/" +) +} +} diff --git a/man/generateSummary.Rd b/man/generateSummary.Rd index bbe49ef..246a824 100644 --- a/man/generateSummary.Rd +++ b/man/generateSummary.Rd @@ -13,16 +13,18 @@ standardized AMR metadata.} \item{out_path}{Character string. Directory where the Markdown report is written.} } \value{ -Writes a structured, human‑readable summary report to -"/amr_metadata_summary.md". +Invisibly returns the path to the written Markdown summary report +("/amr_metadata_summary.md"). } \description{ Generate a summary report for AMR metadata } \examples{ +\dontrun{ generateSummary( - metadata_parquet = "results/metadata.parquet", - out_path = "results/" + metadata_parquet = "data/metadata.parquet", + out_path = "data/" ) +} } From bfad4d8e698d3efaf3963d3b1d6199a041864060 Mon Sep 17 00:00:00 2001 From: Abhirupa Ghosh <100681585+AbhirupaGhosh@users.noreply.github.com> Date: Tue, 4 Aug 2026 15:17:18 -0600 Subject: [PATCH 4/4] example run --- data/amRdata_exploratory_plots.pdf | Bin 17875 -> 17935 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/amRdata_exploratory_plots.pdf b/data/amRdata_exploratory_plots.pdf index f54769b808ac222aa362712c4ec5a07722595a71..6066afd907abc13ef79bab4f726f238062fd9371 100644 GIT binary patch delta 10446 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 G?Y{s|Sg{WP delta 10352 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