diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..04c946c --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,15 @@ +^\.pixi +^pixi\.toml$ +^pixi\.lock$ +^demo_output +^legacy examples +^test_simple_dice\.R$ +^test_fill_legend_fix\.R$ +^Rplots\.pdf$ +^\.github +^\.DS_Store$ +^\.claude +^CLAUDE\.md$ +^examples +^README\.html$ +^data-raw$ diff --git a/DESCRIPTION b/DESCRIPTION index edf85ad..46b635c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: ggdiceplot Title: DicePlot Visualization for ggplot2 -Version: 1.0.0 +Version: 1.1.0 Authors@R: person( given = "Matthias", @@ -20,15 +20,16 @@ Description: Provides ggplot2 extensions for creating dice-based visualizations License: MIT + file LICENSE Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.2 +RoxygenNote: 7.3.3 URL: https://github.com/maflot/ggdiceplot BugReports: https://github.com/maflot/ggdiceplot/issues -Imports: +Imports: + dplyr, ggplot2 (>= 3.4.0), grid, - dplyr, legendry, - scales + scales, + tibble LazyData: true -Depends: - R (>= 4.0.0) +Depends: + R (>= 4.1.0) diff --git a/LICENSE b/LICENSE index 191dd6d..7fbd856 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,2 @@ -MIT License - -Copyright (c) 2024 Matthias Flotho - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +YEAR: 2026 +COPYRIGHT HOLDER: Matthias Flotho diff --git a/NAMESPACE b/NAMESPACE index 4c45309..711e5f9 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -5,6 +5,9 @@ export(geom_dice) export(make_offsets) export(scale_dots_discrete) export(theme_dice) +importFrom(dplyr,bind_rows) +importFrom(dplyr,distinct) +importFrom(dplyr,filter) importFrom(ggplot2,"%+replace%") importFrom(ggplot2,Geom) importFrom(ggplot2,aes) @@ -15,6 +18,7 @@ importFrom(ggplot2,ggproto) importFrom(ggplot2,layer) importFrom(ggplot2,theme) importFrom(ggplot2,theme_grey) +importFrom(grid,drawDetails) importFrom(grid,gpar) importFrom(grid,grobTree) importFrom(grid,nullGrob) @@ -23,3 +27,5 @@ importFrom(grid,rectGrob) importFrom(grid,unit) importFrom(legendry,guide_legend_base) importFrom(scales,pal_hue) +importFrom(tibble,column_to_rownames) +importFrom(tibble,remove_rownames) diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..ea8e368 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,61 @@ +# ggdiceplot 1.1.0 + +## New features + +* **`pip_scale` parameter** — New argument to `geom_dice()` that controls pip + diameter as a fraction (0–1) of the maximum available space inside each die + face. When `size` is constant (not mapped), all pips are drawn at + `pip_scale × max_diameter`. When `size` is mapped to a variable, pips scale + between 25% and `pip_scale` of the maximum pip diameter. Set `pip_scale = NULL` + to disable auto-scaling and use the raw `size` aesthetic (legacy behaviour). + Default: `0.75`. + +* **Deferred rendering via `DiceGrob`** — Pip sizing is now calculated at + grid draw time rather than ggplot build time, so pip diameters adapt + correctly to the final figure dimensions. + +* **Scale expansion for edge tiles** — `setup_data` now exposes + `xmin`/`xmax`/`ymin`/`ymax` so ggplot2 trains axis scales to include the + full tile area, preventing clipping of border tiles. + +* **New datasets** — `sample_dice_large` (480 rows, 60 taxa) and + `sample_dice_miRNA` (~90 rows, miRNA dysregulation) are included for + demonstrating high-density and categorical-fill use cases. + +## Breaking changes + +* **Minimum R version raised to 4.1.0** (was 4.0.0). R 4.1 is required for + the native pipe operator (`|>`) used internally. + +* **`tibble` is now a hard dependency** — added to `Imports` for + `column_to_rownames()` / `remove_rownames()`. + +* **`draw_panel` signature changed** — The method now takes explicit named + arguments (`na.rm`, `ndots`, `x_length`, `y_length`, `pip_scale`) instead of + `params, ...`. Code that subclassed `GeomDice` or called `draw_panel` + directly will need updating. + +* **Sample datasets restructured**: + - `sample_dice_data1`: 48 rows → 160 rows (8 taxa × 4 diseases × 5 + specimens). Columns are the same but `lfc` and `q` may now contain `NA`. + - `sample_dice_data2`: 48 rows → 160 rows; the `replicate` column has been + removed. Column count changed from 6 to 5. + +* **Legend key for unmapped fill** — When `fill` is not mapped, legend keys now + draw a solid black dot instead of an empty circle, making spatial/dots-only + legends more readable. + +## Minor changes + +* `LICENSE` switched to CRAN-standard two-line format (`YEAR` / `COPYRIGHT + HOLDER`). +* `.Rbuildignore` added to exclude pixi, demo output, test scripts, and other + non-package files from the R CMD build tarball. +* `data-raw/` directory created; dataset-generation scripts moved there from + `data/`. +* `pixi.toml` / `pixi.lock` added for reproducible environment management. +* Demo scripts (`create_demo_plots.R`, `test_simple_dice.R`) rewritten to + exercise the new `pip_scale` feature and run from the project root. +* README updated with new examples, a parameter table, and the published + Bioinformatics citation. +* RoxygenNote bumped to 7.3.3. diff --git a/R/geom-dice-ggprotto.R b/R/geom-dice-ggprotto.R index 90b98b9..33f6d85 100644 --- a/R/geom-dice-ggprotto.R +++ b/R/geom-dice-ggprotto.R @@ -3,10 +3,10 @@ #' @usage NULL #' @export GeomDice <- ggplot2::ggproto("GeomDice", ggplot2::Geom, - + extra_aes = c("dots"), required_aes = c("x", "y", "dots"), - + default_aes = ggplot2::aes( linewidth = 0.1, linetype = 1, @@ -20,8 +20,8 @@ GeomDice <- ggplot2::ggproto("GeomDice", ggplot2::Geom, width = 0.5, height = 0.5 ), - - extra_params = c("na.rm", "ndots", "x_length", "y_length"), + + extra_params = c("na.rm", "ndots", "x_length", "y_length", "pip_scale"), setup_data = function(data, params, ...) { data$na.rm <- data$na.rm %||% params$na.rm @@ -32,26 +32,40 @@ GeomDice <- ggplot2::ggproto("GeomDice", ggplot2::Geom, if (is.factor(data$dots)) { attr(data, "dots_levels") <- levels(data$dots) } + + # Expose tile extents so ggplot2 trains x/y scales to include the + # full tile area, preventing panel clipping of edge tiles. + # Note: default_aes values (width, height) are applied AFTER + # setup_data in ggplot2 >=3.5, so we must supply the fallback. + w <- data$width %||% 0.5 + h <- data$height %||% 0.5 + data$xmin <- data$x - w / 2 + data$xmax <- data$x + w / 2 + data$ymin <- data$y - h / 2 + data$ymax <- data$y + h / 2 data }, draw_key = function(data, params, size) { - # Always use filled circle (shape 21) to properly display fill colors in legend - # This ensures that when fill is mapped to a discrete variable, - # the legend shows the fill colors correctly data$shape <- 21 - # Set stroke color to match fill for clean appearance, but only if fill is actually set - # Check for NULL, NA, and also the string "NA" (which ggplot2 can pass when fill is unmapped) if (!is.null(data$fill) && !is.na(data$fill)) { + # fill is mapped: match stroke to fill for a solid-coloured pip data$colour <- data$fill + } else { + # fill is unmapped (spatial/dots-only legend): show solid black dot + data$fill <- "black" + data$colour <- "black" } ggplot2::draw_key_point(data, params, size) }, - draw_panel = function(data, panel_params, coord, params, ...) { + draw_panel = function(data, panel_params, coord, + na.rm = FALSE, ndots = NULL, + x_length = NULL, y_length = NULL, + pip_scale = 0.75) { data$x <- as.numeric(data$x) data$y <- as.numeric(data$y) - + tile_coords <- dplyr::distinct(data, x, y) dots_levels <- attr(data, "dots_levels") @@ -66,12 +80,12 @@ GeomDice <- ggplot2::ggproto("GeomDice", ggplot2::Geom, width = unique(data$width)[1], height = unique(data$height)[1] ) - + offsets_mat <- offsets |> tibble::remove_rownames() |> tibble::column_to_rownames("key") |> as.matrix() - + point_coords_list <- lapply(seq_len(nrow(tile_coords)), function(i) { coords <- sweep(offsets_mat, 2, as.matrix(tile_coords)[i, ], FUN = "+") df <- as.data.frame(coords) @@ -80,18 +94,18 @@ GeomDice <- ggplot2::ggproto("GeomDice", ggplot2::Geom, df$key <- present_levels df }) - + point_coords <- dplyr::bind_rows(point_coords_list) point_coords$id <- paste0(point_coords$key, point_coords$x_coord, point_coords$y_coord) - + # Use original dots_original to create point_id data$point_id <- paste0(data$dots_original, data$x, data$y) point_df <- dplyr::filter(point_coords, id %in% data$point_id) - + # Precise attribute matching attr_lookup <- data[!duplicated(data$point_id), ] match_idx <- match(point_df$id, attr_lookup$point_id) - + point_df$size <- attr_lookup$size[match_idx] point_df$shape <- attr_lookup$shape[match_idx] point_df$stroke <- attr_lookup$stroke[match_idx] @@ -100,22 +114,22 @@ GeomDice <- ggplot2::ggproto("GeomDice", ggplot2::Geom, point_df$colour <- attr_lookup$fill[match_idx] point_df$group <- attr_lookup$group[match_idx] point_df$PANEL <- 1 - + bad_mask <- is.infinite(point_df$size) | point_df$size <= 0 if (any(bad_mask, na.rm = TRUE)) { warning(sum(bad_mask, na.rm = TRUE), " zero(s)/negative(s)/infinitive(s) detected in dot size... converted to NA.") point_df$size[bad_mask] <- NA } - - if (isTRUE(unique(data$na.rm))) { + + if (isTRUE(na.rm)) { na_mask <- is.na(point_df$size) if (any(na_mask)) { warning(sum(na_mask), " NA's detected in dot size. Removing them...") point_df <- dplyr::filter(point_df, !is.na(size)) } } - + tile_df <- tile_coords tile_df$width <- unique(data$width) tile_df$height <- unique(data$height) @@ -125,12 +139,124 @@ GeomDice <- ggplot2::ggproto("GeomDice", ggplot2::Geom, tile_df$PANEL <- 1 tile_df$group <- seq_len(nrow(tile_coords)) tile_df$linewidth <- unique(data$linewidth) - - tile_df <- ggplot2::GeomTile$setup_data(tile_df, params) - - grid::gList( - ggplot2::GeomTile$draw_panel(tile_df, panel_params, coord, ...), - ggplot2::GeomPoint$draw_panel(point_df, panel_params, coord, ...) + + tile_df <- ggplot2::GeomTile$setup_data(tile_df, list()) + + tile_width <- unique(data$width)[1] + tile_height <- unique(data$height)[1] + min_half_tile <- min(tile_width / 2, tile_height / 2) + + # Compute minimum inter-pip distance and maximum absolute offset. + if (nrow(offsets) > 1) { + pos_mat <- as.matrix(offsets[, c("x", "y")]) + dist_mat <- as.matrix(dist(pos_mat)) + diag(dist_mat) <- Inf + min_inter_pip <- min(dist_mat) + } else { + min_inter_pip <- Inf + } + max_abs_offset <- if (nrow(offsets) > 0) max(pmax(abs(offsets$x), abs(offsets$y))) else 0 + + # Tight-packing scale factor: at s_tight, pip border clearance equals + # half the inter-pip distance (pips simultaneously touch each other + # and tile borders). s_tight = 1 when inter-pip is the binding constraint. + if (is.finite(min_inter_pip) && max_abs_offset > 0) { + s_tight <- min(1.0, min_half_tile / (max_abs_offset + min_inter_pip / 2)) + } else { + s_tight <- 1.0 + } + + # Maximum pip radius at tight-packing positions (both constraints). + pip_radius_tight <- min( + min_half_tile - max_abs_offset * s_tight, + if (is.finite(min_inter_pip)) min_inter_pip * s_tight / 2 else min_half_tile + ) + + # Auto-scale pip size only when size is constant (not user-mapped). + auto_scale <- length(unique(data$size)) == 1 + + # Shift pip centers toward tile center proportionally to pip_scale, + # so larger pips fit without clipping at tile borders. + if (!is.null(pip_scale) && pip_scale > 0 && s_tight < 1) { + offset_scale <- 1 - pip_scale * (1 - s_tight) + point_df$x <- point_df$x_coord + (point_df$x - point_df$x_coord) * offset_scale + point_df$y <- point_df$y_coord + (point_df$y - point_df$y_coord) * offset_scale + } + + dice_grob( + point_df = point_df, + tile_df = tile_df, + panel_params = panel_params, + coord = coord, + max_pip_radius = pip_radius_tight, + tile_width = tile_width, + pip_scale = pip_scale, + auto_scale = auto_scale ) } ) + +# --------------------------------------------------------------------------- +# DiceGrob: defers pip-size calculation to grid draw time so that we can +# convert data-unit distances to physical mm via the live panel viewport. +# --------------------------------------------------------------------------- + +dice_grob <- function(point_df, tile_df, panel_params, coord, + max_pip_radius, tile_width, pip_scale, auto_scale) { + grid::grob( + point_df = point_df, + tile_df = tile_df, + panel_params = panel_params, + coord = coord, + max_pip_radius = max_pip_radius, + tile_width = tile_width, + pip_scale = pip_scale, + auto_scale = auto_scale, + cl = "DiceGrob" + ) +} + +#' @importFrom grid drawDetails +#' @method drawDetails DiceGrob +drawDetails.DiceGrob <- function(x, recording) { + point_df <- x$point_df + + if (!is.null(x$pip_scale)) { + # Convert tile width from data units to mm using the live panel viewport. + panel_w_mm <- grid::convertUnit(grid::unit(1, "npc"), "mm", valueOnly = TRUE) + + ref_df <- data.frame(x = c(0, x$tile_width), y = c(0, 0), PANEL = 1L, group = 1L) + ref_npc <- x$coord$transform(ref_df, x$panel_params) + tile_w_mm <- abs(ref_npc$x[2] - ref_npc$x[1]) * panel_w_mm + + # Maximum pip diameter in mm (accounts for inter-pip and border constraints). + max_pip_mm <- 2 * (x$max_pip_radius / x$tile_width) * tile_w_mm + + if (x$auto_scale) { + # Constant size: all pips at pip_scale fraction of max. + pip_size_mm <- max_pip_mm * x$pip_scale + if (is.finite(pip_size_mm) && pip_size_mm > 0) { + point_df$size <- pip_size_mm + } + } else { + # Variable size: map to [min_fill, pip_scale] of max pip diameter. + # Default: smallest value -> 0.25, largest -> pip_scale (typically 1.0). + min_fill <- 0.25 + sizes <- point_df$size + size_range <- range(sizes, na.rm = TRUE) + if (diff(size_range) > 0) { + normalized <- (sizes - size_range[1]) / diff(size_range) + fill_fracs <- min_fill + (x$pip_scale - min_fill) * normalized + } else { + fill_fracs <- rep(x$pip_scale, length(sizes)) + } + point_df$size <- max_pip_mm * fill_fracs + } + } + + # Drop NA-size rows: ggplot2 >=4.x gpar rejects mixed NA/non-NA fontsize. + point_df <- point_df[!is.na(point_df$size), ] + + grid::grid.draw(ggplot2::GeomTile$draw_panel(x$tile_df, x$panel_params, x$coord)) + grid::grid.draw(ggplot2::GeomPoint$draw_panel(point_df, x$panel_params, x$coord)) +} diff --git a/R/geom-dice.R b/R/geom-dice.R index 49f93ce..08edf7a 100644 --- a/R/geom-dice.R +++ b/R/geom-dice.R @@ -22,8 +22,14 @@ #' @param show.legend Whether to include in legend. #' @param inherit.aes If `FALSE`, overrides the default aesthetics. #' @param ndots Integer (1–6): number of positions shown per dice. -#' @param x_length, x_length Numeric: used for aspect ratio. -#' @param y_length, y_length Numeric: used for aspect ratio. +#' @param x_length Numeric: number of x categories (used for aspect ratio). +#' @param y_length Numeric: number of y categories (used for aspect ratio). +#' @param pip_scale Numeric (0–1): controls pip diameter relative to the +#' maximum available space. When `size` is constant (not mapped), all pips +#' are drawn at `pip_scale` fraction of the die face. When `size` is mapped +#' to a variable, pips scale between 0.25 (smallest value) and `pip_scale` +#' (largest value) of the maximum pip diameter. Default is `0.75`. Set to +#' `NULL` to disable auto-scaling and use the raw `size` aesthetic. #' @param ... Additional arguments passed to `layer()`. #' #' @return A `ggplot2` layer that draws dice with categorical dot encodings. @@ -43,8 +49,9 @@ geom_dice <- function(mapping = NULL, data = NULL, stat = "identity", position = "identity", ndots = NULL, x_length = NULL, y_length = NULL, + pip_scale = 0.75, na.rm = FALSE, show.legend = TRUE, inherit.aes = TRUE, ...) { - + list( ggplot2::layer( geom = GeomDice, @@ -58,7 +65,8 @@ geom_dice <- function(mapping = NULL, data = NULL, na.rm = na.rm, ndots = ndots, x_length = x_length, - y_length = y_length + y_length = y_length, + pip_scale = pip_scale ) ), theme_dice(x_length = x_length, y_length = y_length), @@ -68,7 +76,7 @@ geom_dice <- function(mapping = NULL, data = NULL, theme = ggplot2::theme( legend.background = ggplot2::element_rect( fill = "white", colour = "grey", linewidth = 0.5), - legend.key = ggplot2::element_rect(fill = "white"), + legend.key = ggplot2::element_rect(fill = NA, colour = NA), legend.key.spacing.x = grid::unit(0.1, "cm"), legend.key.spacing.y = grid::unit(0.5, "cm"), legend.text = ggplot2::element_text(hjust = 0.5), diff --git a/R/ggdiceplot-package.R b/R/ggdiceplot-package.R index 12956b2..6b186e9 100644 --- a/R/ggdiceplot-package.R +++ b/R/ggdiceplot-package.R @@ -26,6 +26,7 @@ "_PACKAGE" ## usethis namespace: start +#' @importFrom dplyr bind_rows distinct filter #' @importFrom ggplot2 aes #' @importFrom ggplot2 Geom #' @importFrom ggplot2 ggproto @@ -36,5 +37,6 @@ #' @importFrom grid pointsGrob #' @importFrom grid rectGrob #' @importFrom grid unit +#' @importFrom tibble column_to_rownames remove_rownames ## usethis namespace: end NULL diff --git a/R/sample_dice_data1.R b/R/sample_dice_data1.R index 0f6d113..ea8e2e9 100644 --- a/R/sample_dice_data1.R +++ b/R/sample_dice_data1.R @@ -5,13 +5,13 @@ #' It simulates log fold-change (LFC) and adjusted p-values (q-values) for a range of #' oral taxa across disease types and specimen sites. #' -#' @format A data frame with 48 rows and 5 columns: +#' @format A data frame with 160 rows and 5 columns: #' \describe{ -#' \item{taxon}{Character. Microbial taxon name.} -#' \item{disease}{Character. Disease condition (e.g., Caries, Periodontitis, etc.).} -#' \item{specimen}{Character. Body site specimen (e.g., Saliva, Plaque).} -#' \item{lfc}{Numeric. Simulated log2 fold change value.} -#' \item{q}{Numeric. Simulated adjusted p-value (q-value).} +#' \item{taxon}{Character. Microbial taxon name (8 taxa).} +#' \item{disease}{Character. Disease condition (Caries, Periodontitis, Healthy, Gingivitis).} +#' \item{specimen}{Character. Body site specimen (Saliva, Plaque, Tongue, Buccal, Gingival).} +#' \item{lfc}{Numeric. Simulated log2 fold change value; may contain NA.} +#' \item{q}{Numeric. Simulated adjusted p-value (q-value); may contain NA.} #' } #' #' @usage data(sample_dice_data1) diff --git a/R/sample_dice_data2.R b/R/sample_dice_data2.R index 74bdb48..140892e 100644 --- a/R/sample_dice_data2.R +++ b/R/sample_dice_data2.R @@ -1,21 +1,16 @@ -#' Sample Dice Dataset 2 for Visualization with Replicates +#' Sample Dice Dataset 2 for Visualization #' #' @description -#' `sample_dice_data2` is a toy dataset designed to demonstrate the usage of `geom_dice()` -#' in more advanced scenarios. It simulates log2 fold-change (LFC) and adjusted p-values -#' (q-values) for common oral taxa across disease conditions and specimen types, -#' including replicates and missing values. +#' `sample_dice_data2` is a toy dataset designed to demonstrate `geom_dice()` +#' with multiple specimen types. It simulates log2 fold-change (LFC) and +#' adjusted p-values (q-values) for oral taxa across disease conditions and +#' specimen sites, with some missing values. #' -#' This version filters for `replicate == 1` but retains structure from a more complex -#' design, making it useful for testing visualizations that account for filtering, -#' grouping, or handling of `NA` values. -#' -#' @format A data frame with 48 rows and 6 columns: +#' @format A data frame with 160 rows and 5 columns: #' \describe{ -#' \item{taxon}{Character. Microbial taxon name.} -#' \item{disease}{Character. Disease condition (e.g., Caries, Periodontitis).} -#' \item{specimen}{Character. Body site specimen (e.g., Saliva, Plaque).} -#' \item{replicate}{Integer. Experimental replicate ID. Only replicate 1 is included here.} +#' \item{taxon}{Character. Microbial taxon name (8 taxa).} +#' \item{disease}{Character. Disease condition (Caries, Periodontitis, Healthy, Gingivitis).} +#' \item{specimen}{Character. Body site specimen (Saliva, Plaque, Tongue, Buccal, Gingival).} #' \item{lfc}{Numeric. Simulated log2 fold change; may contain NA.} #' \item{q}{Numeric. Simulated adjusted p-value (q-value); may contain NA.} #' } diff --git a/R/sample_dice_large.R b/R/sample_dice_large.R new file mode 100644 index 0000000..134c4ac --- /dev/null +++ b/R/sample_dice_large.R @@ -0,0 +1,23 @@ +#' Large Sample Dice Dataset +#' +#' @description +#' `sample_dice_large` is a larger toy dataset with 60 taxa, designed to test +#' `geom_dice()` at higher density. It simulates log2 fold-change and q-values +#' with approximately 50\% missing data. +#' +#' @format A data frame with 480 rows and 6 columns: +#' \describe{ +#' \item{taxon}{Character. Taxon name (Taxon_1 through Taxon_60).} +#' \item{disease}{Character. Disease condition (Caries, Periodontitis, Healthy, Gingivitis).} +#' \item{specimen}{Character. Specimen type (Saliva, Plaque).} +#' \item{replicate}{Integer. Replicate identifier.} +#' \item{lfc}{Numeric. Simulated log2 fold change; may contain NA.} +#' \item{q}{Numeric. Simulated adjusted p-value; may contain NA.} +#' } +#' +#' @usage data(sample_dice_large) +#' @keywords datasets +#' @examples +#' data(sample_dice_large) +#' head(sample_dice_large) +"sample_dice_large" diff --git a/R/sample_dice_miRNA.R b/R/sample_dice_miRNA.R new file mode 100644 index 0000000..807dbea --- /dev/null +++ b/R/sample_dice_miRNA.R @@ -0,0 +1,22 @@ +#' Sample miRNA Dice Dataset +#' +#' @description +#' `sample_dice_miRNA` is a toy dataset for demonstrating `geom_dice()` with +#' categorical fill mapping. It simulates miRNA dysregulation across compounds +#' and organs, with direction (Up, Down, Unchanged) as the fill variable. +#' +#' @format A data frame with approximately 90 rows and 5 columns: +#' \describe{ +#' \item{miRNA}{Factor. miRNA identifier (miR-1 through miR-5).} +#' \item{Compound}{Factor. Treatment compound (Control, Compound_1 through Compound_4).} +#' \item{Organ}{Factor. Target organ (Lung, Liver, Brain, Kidney).} +#' \item{log2FC}{Numeric. Simulated log2 fold change.} +#' \item{direction}{Factor. Regulation direction (Down, Unchanged, Up).} +#' } +#' +#' @usage data(sample_dice_miRNA) +#' @keywords datasets +#' @examples +#' data(sample_dice_miRNA) +#' head(sample_dice_miRNA) +"sample_dice_miRNA" diff --git a/README.md b/README.md index 4e93664..16213c5 100644 --- a/README.md +++ b/README.md @@ -15,111 +15,70 @@ A ggplot2 extension for creating dice plot visualizations, where each dice repre ```r # Install from local directory devtools::install_local("path/to/ggdiceplot") - -# Or install dependencies manually -install.packages(c("ggplot2", "tibble")) ``` ```r install.packages(c("ggdiceplot")) ``` -## Example: Taxonomy +## Example: Taxonomy ```r library(ggplot2) library(ggdiceplot) -# Create sample data -data("sample_dice_data1", package = "ggdiceplot") -toy_data = sample_dice_data1 -# Effect size -lo = floor(min(toy_data$lfc, na.rm = TRUE)) -up = ceiling(max(toy_data$lfc, na.rm=TRUE)) -mid = (lo + up)/2 - -minsize = floor(min(-log10(toy_data$q), na.rm=TRUE)) -maxsize = ceiling(max(-log10(toy_data$q), na.rm=TRUE)) -midsize = ceiling(quantile(-log10(toy_data$q), c(0.5), na.rm=TRUE)) - -# -## PLOT -# - -ggplot(toy_data, aes(x=specimen, y=taxon)) + - geom_dice(aes(dots=disease, fill=lfc, size=-log10(q), - # Square dims - width = 0.5, height = 0.5), - # For legend display - show.legend=TRUE, - # For legend position calculation - ndots=length(unique(toy_data$disease)), - # For aspect.ratio: ensure squares (now automatic with coord_fixed) - x_length = length(unique(toy_data$specimen)), - y_length = length(unique(toy_data$taxon)), - )+ - scale_fill_continuous(name="lfc") + - scale_fill_gradient2(low = "#40004B", high = "#00441B", mid = "white", - na.value = "white", - limit = c(lo, up), - midpoint = mid, - name = "Log2FC") + - scale_size_continuous(limits = c(minsize, maxsize), - breaks = c(minsize, midsize, maxsize), - labels = c(10^minsize, 10^-midsize, 10^-maxsize), - name = "q-value") +data("sample_dice_data2", package = "ggdiceplot") +toy_data <- sample_dice_data2 + +lo <- floor(min(toy_data$lfc, na.rm = TRUE)) +up <- ceiling(max(toy_data$lfc, na.rm = TRUE)) +mid <- (lo + up) / 2 +minsize <- floor(min(-log10(toy_data$q), na.rm = TRUE)) +maxsize <- ceiling(max(-log10(toy_data$q), na.rm = TRUE)) +midsize <- ceiling(quantile(-log10(toy_data$q), 0.5, na.rm = TRUE)) + +ggplot(toy_data, aes(x = specimen, y = taxon)) + + geom_dice( + aes(dots = disease, fill = lfc, size = -log10(q), width = 0.9, height = 0.9), + na.rm = TRUE, + show.legend = TRUE, + pip_scale = 0.9, + ndots = length(unique(toy_data$disease)), + x_length = length(unique(toy_data$specimen)), + y_length = length(unique(toy_data$taxon)) + ) + + scale_fill_gradient2( + low = "#40004B", high = "#00441B", mid = "white", + na.value = "white", limit = c(lo, up), midpoint = mid, + name = "Log2FC" + ) + + scale_size_continuous( + range = c(2, 8), + limits = c(minsize, maxsize), + breaks = c(minsize, midsize, maxsize), + labels = c(10^minsize, 10^-midsize, 10^-maxsize), + name = "q-value" + ) ``` -![](demo_output/example1.png) +![](demo_output/example2.png) ## Example: miRNA dysregulation ```r -## ---- SETUP ---- library(ggplot2) library(ggdiceplot) -## ---- LOAD SAMPLE DATA (from package) ---- -# If internal dataset exists, use it; otherwise fall back to df_dice -if ("sample_dice_miRNA" %in% data(package="ggdiceplot")$results[, "Item"]) { - data("sample_dice_miRNA", package = "ggdiceplot") - df_dice <- sample_dice_miRNA -} else { - message("sample_dice_miRNA not found in package — using inline example.") - - df_dice <- data.frame( - miRNA = c("miR-1","miR-1","miR-1","miR-2","miR-2","miR-2","miR-3","miR-3"), - Compound = c("Compound_1","Compound_1","Compound_2","Compound_1","Compound_2","Compound_3","Compound_3","Compound_1"), - Organ = c("Lung","Brain","Liver","Lung","Liver","Brain","Liver","Brain"), - log2FC = c(1.2,-0.8,0.3,-1.1,0.6,2,-0.5,1.5) - ) - - df_dice$direction <- ifelse(df_dice$log2FC > 0.5, "Up", - ifelse(df_dice$log2FC < -0.5, "Down","Unchanged")) - - df_dice$Organ <- factor(df_dice$Organ, levels = c("Lung","Liver","Brain")) - df_dice$direction <- factor(df_dice$direction, levels = c("Down","Unchanged","Up")) - df_dice$Compound <- factor(df_dice$Compound, levels = c("Compound_1","Compound_2","Compound_3")) - df_dice$miRNA <- factor(df_dice$miRNA) -} +data("sample_dice_miRNA", package = "ggdiceplot") +df_dice <- sample_dice_miRNA -## ---- COLORS ---- -direction_colors <- c( - Down = "#2166ac", - Unchanged = "grey80", - Up = "#b2182b" -) +direction_colors <- c(Down = "#2166ac", Unchanged = "grey80", Up = "#b2182b") -## ---- PLOT ---- -p_dice <- ggplot(df_dice, aes(x = miRNA, y = Compound)) + +ggplot(df_dice, aes(x = miRNA, y = Compound)) + geom_dice( - aes( - dots = Organ, - fill = direction, - width = 0.8, - height = 0.8 - ), + aes(dots = Organ, fill = direction, width = 0.8, height = 0.8), show.legend = TRUE, + pip_scale = 1.0, ndots = length(levels(df_dice$Organ)), x_length = length(levels(df_dice$miRNA)), y_length = length(levels(df_dice$Compound)) @@ -136,12 +95,11 @@ p_dice <- ggplot(df_dice, aes(x = miRNA, y = Compound)) + x = "miRNA", y = "Compound" ) - -print(p_dice) ``` -![](demo_output/example2.png) -## Example 3: ZEBRA Domino Plot +![](demo_output/example_miRNA.png) + +## Example: ZEBRA Domino Plot This example demonstrates using `geom_dice()` to create a domino plot for gene expression analysis across multiple diseases and cell types. @@ -151,82 +109,61 @@ library(ggdiceplot) library(dplyr) library(tidyr) -# Load ZEBRA dataset zebra.df <- read.csv("legacy examples/data/ZEBRA_sex_degs_set.csv") - -# Select genes of interest genes <- c("SPP1", "APOE", "SERPINA1", "PINK1", "ANGPT1", "ANGPT2", "APP", "CLU", "ABCA7") -# Filter and prepare data -zebra.df <- zebra.df %>% +zebra.df <- zebra.df %>% filter(gene %in% genes) %>% filter(contrast %in% c("MS-CT", "AD-CT", "ASD-CT", "FTD-CT", "HD-CT")) %>% mutate( cell_type = factor(cell_type, levels = sort(unique(cell_type))), - contrast = factor(contrast, levels = c("MS-CT", "AD-CT", "ASD-CT", "FTD-CT", "HD-CT")), - gene = factor(gene, levels = genes) + contrast = factor(contrast, levels = c("MS-CT", "AD-CT", "ASD-CT", "FTD-CT", "HD-CT")), + gene = factor(gene, levels = genes) ) %>% filter(PValue < 0.05) %>% group_by(gene, cell_type, contrast) %>% - summarise( - logFC = mean(logFC, na.rm = TRUE), - FDR = min(FDR, na.rm = TRUE), - .groups = "drop" - ) %>% - complete(gene, cell_type, contrast, fill = list(logFC = NA, FDR = NA)) - -# Calculate scale limits -lo <- floor(min(zebra.df$logFC, na.rm = TRUE)) -up <- ceiling(max(zebra.df$logFC, na.rm = TRUE)) -mid <- (lo + up) / 2 + summarise(logFC = mean(logFC, na.rm = TRUE), FDR = min(FDR, na.rm = TRUE), .groups = "drop") %>% + complete(gene, cell_type, contrast, fill = list(logFC = NA_real_, FDR = NA_real_)) +lo <- floor(min(zebra.df$logFC, na.rm = TRUE)) +up <- ceiling(max(zebra.df$logFC, na.rm = TRUE)) +mid <- (lo + up) / 2 minsize <- floor(min(-log10(zebra.df$FDR), na.rm = TRUE)) maxsize <- ceiling(max(-log10(zebra.df$FDR), na.rm = TRUE)) -midsize <- ceiling(quantile(-log10(zebra.df$FDR), c(0.5), na.rm = TRUE)) +midsize <- ceiling(quantile(-log10(zebra.df$FDR), 0.5, na.rm = TRUE)) -# Create domino plot ggplot(zebra.df, aes(x = gene, y = cell_type)) + geom_dice( - aes( - dots = contrast, - fill = logFC, - size = -log10(FDR) - ), - na.rm = TRUE, + aes(dots = contrast, fill = logFC, size = -log10(FDR)), + na.rm = TRUE, show.legend = TRUE, - ndots = 5, # We have 5 contrasts - x_length = length(genes), - y_length = length(unique(zebra.df$cell_type)) + ndots = 5, + x_length = length(genes), + y_length = length(unique(zebra.df$cell_type)) ) + scale_fill_gradient2( - low = "#40004B", - high = "#00441B", - mid = "white", - na.value = "white", - limit = c(lo, up), - midpoint = mid, + low = "#40004B", high = "#00441B", mid = "white", + na.value = "white", limit = c(lo, up), midpoint = mid, name = "Log2FC" ) + scale_size_continuous( limits = c(minsize, maxsize), breaks = c(minsize, midsize, maxsize), labels = c(10^minsize, 10^-midsize, 10^-maxsize), - name = "FDR" + name = "FDR" ) + theme_minimal() + theme( - axis.text.x = element_text(angle = 45, hjust = 1, size = 12), - axis.text.y = element_text(size = 12), - legend.text = element_text(size = 12), - legend.title = element_text(size = 12), - legend.key = element_blank(), + axis.text.x = element_text(angle = 45, hjust = 1, size = 12), + axis.text.y = element_text(size = 12), + legend.text = element_text(size = 12), + legend.title = element_text(size = 12), + legend.key = element_blank(), legend.key.size = unit(0.8, "cm") ) + - labs( - x = "Gene", - y = "Cell Type", - title = "ZEBRA Sex DEGs Domino Plot" - ) + labs(x = "Gene", y = "Cell Type", title = "ZEBRA Sex DEGs Domino Plot") + +ggsave("ZEBRA_domino_example.png", width = 12, height = 14, dpi = 300) ``` ![](demo_output/ZEBRA_domino_example.png) @@ -234,40 +171,35 @@ ggplot(zebra.df, aes(x = gene, y = cell_type)) + ## Features - **1:1 Aspect Ratio**: Dice automatically appear as perfect squares using `coord_fixed(ratio = 1)` -- **Automatic Sizing**: Dice automatically scale based on grid density -- **Boundary Safety**: Dice stay within plot boundaries -- **Flexible Mapping**: Map any categories to dice positions 1-6 +- **Automatic Pip Scaling**: `pip_scale` (0–1) controls pip diameter as a fraction of the maximum available space. `pip_scale = 1.0` fills the die face fully; set to `NULL` to use a fixed size +- **Boundary Safety**: Pips never exceed tile borders; positions shift inward as density increases +- **Flexible Mapping**: Map any categories to dice positions 1–6 - **Multiple Applications**: Gene expression, survey data, clinical trials, market research -- **Customizable**: Control dice size, colors, and positioning +- **Customizable**: Control dice size, colors, pip density, and positioning -## Important Update +## Key Parameters -**Automatic Aspect Ratio Control**: As of the latest version, `geom_dice()` automatically applies `coord_fixed(ratio = 1)` to ensure dice appear as perfect squares. The `x_length` and `y_length` parameters are maintained for compatibility but no longer affect aspect ratio. +| Parameter | Description | +|-----------|-------------| +| `dots` | Aesthetic mapping — which category occupies which pip position | +| `pip_scale` | Pip diameter as fraction of max space (default `0.75`; `1.0` = tight fill; `NULL` = fixed size) | +| `ndots` | Number of pip positions on each die face (1–6) | +| `x_length`, `y_length` | Grid dimensions (used for aspect ratio) | +| `na.rm` | Drop observations with missing size/fill values | ## Key Functions - `geom_dice()`: Main geom for creating dice plots with automatic 1:1 aspect ratio - `theme_dice()`: Minimal theme optimized for dice plots -- `create_dice_positions()`: Generate standard dice dot positions -- `make_offsets()`: Calculate dice dot positions for rendering +- `create_dice_positions()`: Generate standard dice dot position layouts +- `make_offsets()`: Calculate pip positions for rendering -## Demo Examples +## Running the Examples -See the `demo_output/` directory for: -- Basic functionality examples -- Real-world usage scenarios (ZEBRA gene expression analysis) -- Boundary validation tests -- Custom sizing demonstrations - -Run the demo scripts: ```bash -cd demo_output -Rscript create_demo_plots.R -Rscript usage_examples.R - -# Run the ZEBRA domino example -cd examples -Rscript zebra_domino_example.R +# From the project root +Rscript demo_output/create_demo_plots.R +Rscript test_simple_dice.R ``` ## Package Structure @@ -275,31 +207,27 @@ Rscript zebra_domino_example.R - `R/`: Core package functions - `data/`: Sample datasets - `demo_output/`: Example plots and output images -- `examples/`: Real-world usage examples (ZEBRA domino plot) +- `examples/`: Real-world usage examples - `legacy examples/`: Legacy examples and data files - `man/`: Documentation files -- `inst/`: Package installation files - -## Documentation - -- Package functions: `help(package = "ggdiceplot")` -- Main function: `?geom_dice` -- Vignette: `vignette("introduction", package = "ggdiceplot")` ## Citation If you use this code or the R and Python packages for your own work, please cite diceplot as: - -> M. Flotho, P. Flotho, A. Keller, "Diceplot: A package for high dimensional categorical data visualization," arxiv, 2024. [doi:10.48550/arXiv.2410.23897](https://doi.org/10.48550/arXiv.2410.23897) + +> M. Flotho, P. Flotho, A. Keller, "DicePlot: a package for high-dimensional categorical data visualization," *Bioinformatics*, vol. 42, no. 2, btaf337, 2026. BibTeX entry: -``` -@article{flotea2024, - author = {Flotho, M. and Flotho, P. and Keller, A.}, - title = {Diceplot: A package for high dimensional categorical data visualization}, - year = {2024}, - journal = {arXiv preprint}, - doi = {https://doi.org/10.48550/arXiv.2410.23897} +```bibtex +@article{flotho2026diceplot, + title = {DicePlot: a package for high-dimensional categorical data visualization}, + author = {Flotho, Matthias and Flotho, Philipp and Keller, Andreas}, + journal = {Bioinformatics}, + volume = {42}, + number = {2}, + pages = {btaf337}, + year = {2026}, + publisher = {Oxford University Press} } ``` diff --git a/data/sample_dice_data1.R b/data-raw/sample_dice_data1.R similarity index 100% rename from data/sample_dice_data1.R rename to data-raw/sample_dice_data1.R diff --git a/data/sample_dice_data2.R b/data-raw/sample_dice_data2.R similarity index 100% rename from data/sample_dice_data2.R rename to data-raw/sample_dice_data2.R diff --git a/data/sample_dice_large.R b/data-raw/sample_dice_large.R similarity index 100% rename from data/sample_dice_large.R rename to data-raw/sample_dice_large.R diff --git a/data/sample_dice_miRNA.R b/data-raw/sample_dice_miRNA.R similarity index 100% rename from data/sample_dice_miRNA.R rename to data-raw/sample_dice_miRNA.R diff --git a/data/sample_dice_data1.rda b/data/sample_dice_data1.rda index 18bf1d7..a22e0d1 100644 Binary files a/data/sample_dice_data1.rda and b/data/sample_dice_data1.rda differ diff --git a/data/sample_dice_data2.rda b/data/sample_dice_data2.rda index 6c1d7b9..894cd6f 100644 Binary files a/data/sample_dice_data2.rda and b/data/sample_dice_data2.rda differ diff --git a/demo_output/ZEBRA_domino_example.pdf b/demo_output/ZEBRA_domino_example.pdf deleted file mode 100644 index 93d414d..0000000 Binary files a/demo_output/ZEBRA_domino_example.pdf and /dev/null differ diff --git a/demo_output/ZEBRA_domino_example.png b/demo_output/ZEBRA_domino_example.png index a17db37..1454132 100644 Binary files a/demo_output/ZEBRA_domino_example.png and b/demo_output/ZEBRA_domino_example.png differ diff --git a/demo_output/ZEBRA_domino_example_custom_labels.png b/demo_output/ZEBRA_domino_example_custom_labels.png deleted file mode 100644 index d3bec81..0000000 Binary files a/demo_output/ZEBRA_domino_example_custom_labels.png and /dev/null differ diff --git a/demo_output/create_demo_plots.R b/demo_output/create_demo_plots.R index e79565e..1dcfb39 100644 --- a/demo_output/create_demo_plots.R +++ b/demo_output/create_demo_plots.R @@ -1,162 +1,159 @@ #!/usr/bin/env Rscript # Demo script for ggdiceplot package -# This script creates demonstration plots showcasing the package capabilities +# Run from the project root: Rscript demo_output/create_demo_plots.R library(ggplot2) - -# Load the ggdiceplot functions -library(ggdiceplot) - -# Already in demo_output directory -cat("Working from demo_output directory...\n") - -cat("Creating ggdiceplot demonstration plots...\n") - -# Demo 1: Basic dice plot functionality -cat("1. Creating example1 plot demo...\n") - -# Load dataset sample_dice_data1 from package data folder and assign to toy_data1 -load("../data/sample_dice_data1.rda") # loads object sample_dice_data1 in environment +library(legendry) +library(scales) +library(grid) + +source("R/utils.R") +source("R/geom-dice-ggprotto.R") +source("R/geom-dice.R") + +make_dice_plot <- function(toy_data) { + lo <- floor(min(toy_data$lfc, na.rm = TRUE)) + up <- ceiling(max(toy_data$lfc, na.rm = TRUE)) + mid <- (lo + up) / 2 + minsize <- floor(min(-log10(toy_data$q), na.rm = TRUE)) + maxsize <- ceiling(max(-log10(toy_data$q), na.rm = TRUE)) + midsize <- ceiling(quantile(-log10(toy_data$q), 0.5, na.rm = TRUE)) + + ggplot(toy_data, aes(x = specimen, y = taxon)) + + geom_dice( + aes(dots = disease, fill = lfc, size = -log10(q), width = 0.9, height = 0.9), + na.rm = TRUE, + show.legend = TRUE, + pip_scale = 0.9, + ndots = length(unique(toy_data$disease)), + x_length = length(unique(toy_data$specimen)), + y_length = length(unique(toy_data$taxon)) + ) + + scale_fill_gradient2( + low = "#40004B", high = "#00441B", mid = "white", + na.value = "white", limit = c(lo, up), midpoint = mid, + name = "Log2FC" + ) + + scale_size_continuous( + range = c(2, 8), + limits = c(minsize, maxsize), + breaks = c(minsize, midsize, maxsize), + labels = c(10^minsize, 10^-midsize, 10^-maxsize), + name = "q-value" + ) +} + +# ---- Example 1 -------------------------------------------------------------- +cat("1. Creating example1...\n") +load("data/sample_dice_data1.rda") +ggsave("demo_output/example1.png", make_dice_plot(sample_dice_data1), + width = 12, height = 12, dpi = 300) + +# ---- Example 2 -------------------------------------------------------------- +cat("2. Creating example2...\n") +load("data/sample_dice_data2.rda") +ggsave("demo_output/example2.png", make_dice_plot(sample_dice_data2), + width = 10, height = 10, dpi = 300) + +# ---- Example large ---------------------------------------------------------- +cat("3. Creating example_large...\n") +load("data/sample_dice_large.rda") +ggsave("demo_output/example_large.png", make_dice_plot(sample_dice_large), + width = 10, height = 30, dpi = 300) + +# ---- Example 4: fill-only, pip_scale = 1.0 ----------------------------------- +# No size mapping → auto-scaling active; pip_scale = 1.0 fills die face fully. +cat("4. Creating example4_fill_only...\n") +load("data/sample_dice_data1.rda") toy_data <- sample_dice_data1 - -# Effect size -lo = floor(min(toy_data$lfc, na.rm = TRUE)) -up = ceiling(max(toy_data$lfc, na.rm=TRUE)) -mid = (lo + up)/2 - -minsize = floor(min(-log10(toy_data$q), na.rm=TRUE)) -maxsize = ceiling(max(-log10(toy_data$q), na.rm=TRUE)) -midsize = ceiling(quantile(-log10(toy_data$q), c(0.5), na.rm=TRUE)) - -# -## PLOT -# - -pex1 <- ggplot(toy_data, aes(x=specimen, y=taxon)) + - geom_dice(aes(dots=disease, fill=lfc, size=-log10(q), - # Square dims - width = 0.5, height = 0.5), - # For missing info - na.rm = TRUE, - # For legend display - show.legend=TRUE, - # For legend position calculation - ndots=length(unique(toy_data$disease)), - # For aspect.ratio: ensure squares - x_length = length(unique(toy_data$specimen)), - y_length = length(unique(toy_data$taxon)), - )+ - scale_fill_continuous(name="lfc") + - scale_fill_gradient2(low = "#40004B", high = "#00441B", mid = "white", - na.value = "white", - limit = c(lo, up), - midpoint = mid, - name = "Log2FC") + - scale_size_continuous(limits = c(minsize, maxsize), - breaks = c(minsize, midsize, maxsize), - labels = c(10^minsize, 10^-midsize, 10^-maxsize), - name = "q-value") - -ggsave("example1.png", pex1, width = 8, height = 8, dpi = 300) - - -# Demo 2: Dense grid showcase -cat("2. Creating example2 plot demo...\n") -# Load dataset sample_dice_data2 from package data folder and assign to toy_data2 -load("../data/sample_dice_data2.rda") -toy_data <- sample_dice_data2 - -# Effect size -lo = floor(min(toy_data$lfc, na.rm = TRUE)) -up = ceiling(max(toy_data$lfc, na.rm=TRUE)) -mid = (lo + up)/2 - -minsize = floor(min(-log10(toy_data$q), na.rm=TRUE)) -maxsize = ceiling(max(-log10(toy_data$q), na.rm=TRUE)) -midsize = ceiling(quantile(-log10(toy_data$q), c(0.5), na.rm=TRUE)) - -# -## PLOT -# - -pex2 <- ggplot(toy_data, aes(x=specimen, y=taxon)) + - geom_dice(aes(dots=disease, fill=lfc, size=-log10(q), - # Square dims - width = 0.5, height = 0.5), - # For missing info - na.rm = TRUE, - # For legend display - show.legend=TRUE, - # For legend position calculation - ndots=length(unique(toy_data$disease)), - # For aspect.ratio: ensure squares - x_length = length(unique(toy_data$specimen)), - y_length = length(unique(toy_data$taxon)), - )+ - scale_fill_continuous(name="lfc") + - scale_fill_gradient2(low = "#40004B", high = "#00441B", mid = "white", - na.value = "white", - limit = c(lo, up), - midpoint = mid, - name = "Log2FC") + - scale_size_continuous(limits = c(minsize, maxsize), - breaks = c(minsize, midsize, maxsize), - labels = c(10^minsize, 10^-midsize, 10^-maxsize), - name = "q-value") - -ggsave("example2.png", pex1, width = 10, height = 6, dpi = 300) - - -# Demo 3: Large Y axis case -cat("2. Creating largecase plot demo...\n") -# Load dataset sample_dice_data2 from package data folder and assign to toy_data2 -load("../data/sample_dice_large.rda") -toy_data <- sample_dice_large - -# Effect size -lo = floor(min(toy_data$lfc, na.rm = TRUE)) -up = ceiling(max(toy_data$lfc, na.rm=TRUE)) -mid = (lo + up)/2 - -minsize = floor(min(-log10(toy_data$q), na.rm=TRUE)) -maxsize = ceiling(max(-log10(toy_data$q), na.rm=TRUE)) -midsize = ceiling(quantile(-log10(toy_data$q), c(0.5), na.rm=TRUE)) - -# -## PLOT -# - -pex3 <- ggplot(toy_data, aes(x=specimen, y=taxon)) + - geom_dice(aes(dots=disease, fill=lfc, size=-log10(q), - # Square dims - width = 0.5, height = 0.5), - # For missing info - na.rm = TRUE, - # For legend display - show.legend=TRUE, - # For legend position calculation - ndots=length(unique(toy_data$disease)), - # For aspect.ratio: ensure squares - x_length = length(unique(toy_data$specimen)), - y_length = length(unique(toy_data$taxon)), - )+ - scale_fill_continuous(name="lfc") + - scale_fill_gradient2(low = "#40004B", high = "#00441B", mid = "white", - na.value = "white", - limit = c(lo, up), - midpoint = mid, - name = "Log2FC") + - scale_size_continuous(limits = c(minsize, maxsize), - breaks = c(minsize, midsize, maxsize), - labels = c(10^minsize, 10^-midsize, 10^-maxsize), - name = "q-value") - -ggsave("example_large.png", pex3, width = 10, height = 6, dpi = 300) - - +lo <- floor(min(toy_data$lfc, na.rm = TRUE)) +up <- ceiling(max(toy_data$lfc, na.rm = TRUE)) +mid <- (lo + up) / 2 + +pex4 <- ggplot(toy_data, aes(x = specimen, y = taxon)) + + geom_dice( + aes(dots = disease, fill = lfc, width = 0.9, height = 0.9), + na.rm = TRUE, + show.legend = TRUE, + pip_scale = 1.0, + ndots = length(unique(toy_data$disease)), + x_length = length(unique(toy_data$specimen)), + y_length = length(unique(toy_data$taxon)) + ) + + scale_fill_gradient2( + low = "#40004B", high = "#00441B", mid = "white", + na.value = "white", limit = c(lo, up), midpoint = mid, + name = "Log2FC" + ) + + labs( + title = "Fill-only dice plot (pip_scale = 1.0)", + subtitle = "Pips fill the die face at maximal density" + ) + +ggsave("demo_output/example4_fill_only.png", pex4, width = 10, height = 10, dpi = 300) + +# ---- ZEBRA domino example --------------------------------------------------- +cat("5. Creating ZEBRA_domino_example...\n") +library(dplyr) +library(tidyr) + +zebra.df <- read.csv("legacy examples/data/ZEBRA_sex_degs_set.csv") +genes <- c("SPP1", "APOE", "SERPINA1", "PINK1", "ANGPT1", "ANGPT2", "APP", "CLU", "ABCA7") + +zebra.df <- zebra.df %>% + filter(gene %in% genes) %>% + filter(contrast %in% c("MS-CT", "AD-CT", "ASD-CT", "FTD-CT", "HD-CT")) %>% + mutate( + cell_type = factor(cell_type, levels = sort(unique(cell_type))), + contrast = factor(contrast, levels = c("MS-CT", "AD-CT", "ASD-CT", "FTD-CT", "HD-CT")), + gene = factor(gene, levels = genes) + ) %>% + filter(PValue < 0.05) %>% + group_by(gene, cell_type, contrast) %>% + summarise(logFC = mean(logFC, na.rm = TRUE), FDR = min(FDR, na.rm = TRUE), .groups = "drop") %>% + complete(gene, cell_type, contrast, fill = list(logFC = NA_real_, FDR = NA_real_)) + +lo <- floor(min(zebra.df$logFC, na.rm = TRUE)) +up <- ceiling(max(zebra.df$logFC, na.rm = TRUE)) +mid <- (lo + up) / 2 +minsize <- floor(min(-log10(zebra.df$FDR), na.rm = TRUE)) +maxsize <- ceiling(max(-log10(zebra.df$FDR), na.rm = TRUE)) +midsize <- ceiling(quantile(-log10(zebra.df$FDR), 0.5, na.rm = TRUE)) + +pzebra <- ggplot(zebra.df, aes(x = gene, y = cell_type)) + + geom_dice( + aes(dots = contrast, fill = logFC, size = -log10(FDR)), + na.rm = TRUE, + show.legend = TRUE, + ndots = 5, + x_length = length(genes), + y_length = length(unique(zebra.df$cell_type)) + ) + + scale_fill_gradient2( + low = "#40004B", high = "#00441B", mid = "white", + na.value = "white", limit = c(lo, up), midpoint = mid, + name = "Log2FC" + ) + + scale_size_continuous( + limits = c(minsize, maxsize), + breaks = c(minsize, midsize, maxsize), + labels = c(10^minsize, 10^-midsize, 10^-maxsize), + name = "FDR" + ) + + theme_minimal() + + theme( + axis.text.x = element_text(angle = 45, hjust = 1, size = 12), + axis.text.y = element_text(size = 12), + legend.text = element_text(size = 12), + legend.title = element_text(size = 12), + legend.key = element_blank(), + legend.key.size = unit(0.8, "cm") + ) + + labs(x = "Gene", y = "Cell Type", title = "ZEBRA Sex DEGs Domino Plot") + +ggsave("demo_output/ZEBRA_domino_example.png", pzebra, + width = 12, height = 14, dpi = 300) cat("All demonstration plots created successfully!\n") cat("Generated files in demo_output/:\n") -cat("- example1.png\n") -cat("- example2.png\n") -cat("- example_large.png\n") \ No newline at end of file +cat("- example1.png\n- example2.png\n- example_large.png\n- example4_fill_only.png\n- ZEBRA_domino_example.png\n") diff --git a/demo_output/example1.png b/demo_output/example1.png index 6939851..da9ca18 100644 Binary files a/demo_output/example1.png and b/demo_output/example1.png differ diff --git a/demo_output/example2.png b/demo_output/example2.png index 5a97e74..d3d45cf 100644 Binary files a/demo_output/example2.png and b/demo_output/example2.png differ diff --git a/demo_output/example4_fill_only.png b/demo_output/example4_fill_only.png new file mode 100644 index 0000000..e579c44 Binary files /dev/null and b/demo_output/example4_fill_only.png differ diff --git a/demo_output/example_large.png b/demo_output/example_large.png index 87ed25a..e28a190 100644 Binary files a/demo_output/example_large.png and b/demo_output/example_large.png differ diff --git a/demo_output/example_miRNA.png b/demo_output/example_miRNA.png new file mode 100644 index 0000000..375a313 Binary files /dev/null and b/demo_output/example_miRNA.png differ diff --git a/demo_output/ndots_comparison.png b/demo_output/ndots_comparison.png new file mode 100644 index 0000000..add36b0 Binary files /dev/null and b/demo_output/ndots_comparison.png differ diff --git a/demo_output/pip_scale_comparison.png b/demo_output/pip_scale_comparison.png new file mode 100644 index 0000000..932799a Binary files /dev/null and b/demo_output/pip_scale_comparison.png differ diff --git a/demo_output/size_mapped_example.png b/demo_output/size_mapped_example.png new file mode 100644 index 0000000..a03312f Binary files /dev/null and b/demo_output/size_mapped_example.png differ diff --git a/demo_output/tile_size_comparison.png b/demo_output/tile_size_comparison.png new file mode 100644 index 0000000..a829267 Binary files /dev/null and b/demo_output/tile_size_comparison.png differ diff --git a/examples/pnas_style_example.R b/examples/pnas_style_example.R index 5ecc615..3a5c82b 100644 --- a/examples/pnas_style_example.R +++ b/examples/pnas_style_example.R @@ -226,5 +226,112 @@ print(cell_summary) print("PNAS-style dice plots created successfully!") print("Generated files:") print("- pnas_style_example.png") -print("- pnas_style_example.pdf") -print("- pnas_inflammatory_subset.png") \ No newline at end of file +print("- pnas_style_example.pdf") +print("- pnas_inflammatory_subset.png") + +# --------------------------------------------------------------------------- +# pip_scale demonstration: fill-only version (no size mapping) +# --------------------------------------------------------------------------- +# When size is not mapped to a variable, geom_dice auto-scales each pip to +# fill pip_scale * (available space per pip) at render time. +# Use pip_scale = NULL to revert to the fixed size = 3 mm legacy behaviour. + +# Aggregate to one row per gene/cell_type (collapse demographics) +gene_data_agg <- gene_data %>% + group_by(gene, cell_type) %>% + summarise( + expression_level = mean(expression_level, na.rm = TRUE), + demographic = first(demographic), + .groups = "drop" + ) %>% + mutate( + gene = factor(gene, levels = top_genes), + cell_type = factor(cell_type, levels = unname(cell_type_names)) + ) + +# -- Auto-scaled (default pip_scale = 0.75) ----------------------------------- +p_auto <- ggplot(gene_data_agg, aes(x = gene, y = cell_type)) + + geom_dice( + aes(dots = cell_type, fill = expression_level, width = 0.85, height = 0.85), + na.rm = TRUE, + show.legend = TRUE, + ndots = length(unique(gene_data_agg$cell_type)), + x_length = length(top_genes), + y_length = length(cell_types) + # pip_scale defaults to 0.75 + ) + + scale_dots_discrete(guide = "none") + + scale_fill_gradient2( + low = "#2166AC", high = "#762A83", mid = "white", + na.value = "grey90", limit = c(lo, up), midpoint = mid, + name = "Expression\nLevel" + ) + + theme_minimal() + + theme( + axis.text.x = element_text(angle = 45, hjust = 1, size = 9), + axis.text.y = element_text(size = 10), + legend.text = element_text(size = 9), + legend.title = element_text(size = 10), + panel.grid = element_blank() + ) + + labs( + x = "Gene", + y = "Cell Type", + title = "pip_scale = 0.75 (auto-scaled, default)", + subtitle = "No size mapping — pip diameter adapts to figure size" + ) + +# -- Fixed legacy size (pip_scale = NULL) ------------------------------------- +p_fixed <- p_auto + + geom_dice( + aes(dots = cell_type, fill = expression_level, width = 0.85, height = 0.85), + na.rm = TRUE, + show.legend = FALSE, + ndots = length(unique(gene_data_agg$cell_type)), + x_length = length(top_genes), + y_length = length(cell_types), + pip_scale = NULL # disables auto-scaling; falls back to size = 3 mm + ) + + labs( + title = "pip_scale = NULL (fixed size = 3 mm)", + subtitle = "Legacy behaviour — may leave excess whitespace at small figure sizes" + ) + +# Actually rebuild separately so they render independently +p_fixed <- ggplot(gene_data_agg, aes(x = gene, y = cell_type)) + + geom_dice( + aes(dots = cell_type, fill = expression_level, width = 0.85, height = 0.85), + na.rm = TRUE, + show.legend = TRUE, + ndots = length(unique(gene_data_agg$cell_type)), + x_length = length(top_genes), + y_length = length(cell_types), + pip_scale = NULL + ) + + scale_dots_discrete(guide = "none") + + scale_fill_gradient2( + low = "#2166AC", high = "#762A83", mid = "white", + na.value = "grey90", limit = c(lo, up), midpoint = mid, + name = "Expression\nLevel" + ) + + theme_minimal() + + theme( + axis.text.x = element_text(angle = 45, hjust = 1, size = 9), + axis.text.y = element_text(size = 10), + legend.text = element_text(size = 9), + legend.title = element_text(size = 10), + panel.grid = element_blank() + ) + + labs( + x = "Gene", + y = "Cell Type", + title = "pip_scale = NULL (fixed size = 3 mm)", + subtitle = "Legacy behaviour — may leave excess whitespace at small figure sizes" + ) + +ggsave("pnas_pip_scale_auto.png", p_auto, width = 14, height = 5, dpi = 300) +ggsave("pnas_pip_scale_fixed.png", p_fixed, width = 14, height = 5, dpi = 300) + +print("pip_scale comparison plots created:") +print("- pnas_pip_scale_auto.png (pip_scale = 0.75, auto-scaled)") +print("- pnas_pip_scale_fixed.png (pip_scale = NULL, fixed size = 3 mm)") \ No newline at end of file diff --git a/man/geom_dice.Rd b/man/geom_dice.Rd index 23639ee..feebec8 100644 --- a/man/geom_dice.Rd +++ b/man/geom_dice.Rd @@ -14,6 +14,7 @@ geom_dice( ndots = NULL, x_length = NULL, y_length = NULL, + pip_scale = 0.75, na.rm = FALSE, show.legend = TRUE, inherit.aes = TRUE, @@ -36,9 +37,16 @@ Must include: \item{ndots}{Integer (1–6): number of positions shown per dice.} -\item{x_length, }{x_length Numeric: used for aspect ratio.} +\item{x_length}{Numeric: number of x categories (used for aspect ratio).} -\item{y_length, }{y_length Numeric: used for aspect ratio.} +\item{y_length}{Numeric: number of y categories (used for aspect ratio).} + +\item{pip_scale}{Numeric (0–1): controls pip diameter relative to the +maximum available space. When \code{size} is constant (not mapped), all pips +are drawn at \code{pip_scale} fraction of the die face. When \code{size} is mapped +to a variable, pips scale between 0.25 (smallest value) and \code{pip_scale} +(largest value) of the maximum pip diameter. Default is \code{0.75}. Set to +\code{NULL} to disable auto-scaling and use the raw \code{size} aesthetic.} \item{na.rm}{Remove missing values if \code{TRUE}.} diff --git a/man/sample_dice_data1.Rd b/man/sample_dice_data1.Rd index 96a1b70..7967f2d 100644 --- a/man/sample_dice_data1.Rd +++ b/man/sample_dice_data1.Rd @@ -5,13 +5,13 @@ \alias{sample_dice_data1} \title{Sample Dice Dataset for Visualization} \format{ -A data frame with 48 rows and 5 columns: +A data frame with 160 rows and 5 columns: \describe{ -\item{taxon}{Character. Microbial taxon name.} -\item{disease}{Character. Disease condition (e.g., Caries, Periodontitis, etc.).} -\item{specimen}{Character. Body site specimen (e.g., Saliva, Plaque).} -\item{lfc}{Numeric. Simulated log2 fold change value.} -\item{q}{Numeric. Simulated adjusted p-value (q-value).} +\item{taxon}{Character. Microbial taxon name (8 taxa).} +\item{disease}{Character. Disease condition (Caries, Periodontitis, Healthy, Gingivitis).} +\item{specimen}{Character. Body site specimen (Saliva, Plaque, Tongue, Buccal, Gingival).} +\item{lfc}{Numeric. Simulated log2 fold change value; may contain NA.} +\item{q}{Numeric. Simulated adjusted p-value (q-value); may contain NA.} } } \usage{ diff --git a/man/sample_dice_data2.Rd b/man/sample_dice_data2.Rd index 815616a..f918ab6 100644 --- a/man/sample_dice_data2.Rd +++ b/man/sample_dice_data2.Rd @@ -3,14 +3,13 @@ \docType{data} \name{sample_dice_data2} \alias{sample_dice_data2} -\title{Sample Dice Dataset 2 for Visualization with Replicates} +\title{Sample Dice Dataset 2 for Visualization} \format{ -A data frame with 48 rows and 6 columns: +A data frame with 160 rows and 5 columns: \describe{ -\item{taxon}{Character. Microbial taxon name.} -\item{disease}{Character. Disease condition (e.g., Caries, Periodontitis).} -\item{specimen}{Character. Body site specimen (e.g., Saliva, Plaque).} -\item{replicate}{Integer. Experimental replicate ID. Only replicate 1 is included here.} +\item{taxon}{Character. Microbial taxon name (8 taxa).} +\item{disease}{Character. Disease condition (Caries, Periodontitis, Healthy, Gingivitis).} +\item{specimen}{Character. Body site specimen (Saliva, Plaque, Tongue, Buccal, Gingival).} \item{lfc}{Numeric. Simulated log2 fold change; may contain NA.} \item{q}{Numeric. Simulated adjusted p-value (q-value); may contain NA.} } @@ -19,14 +18,10 @@ A data frame with 48 rows and 6 columns: data(sample_dice_data2) } \description{ -\code{sample_dice_data2} is a toy dataset designed to demonstrate the usage of \code{geom_dice()} -in more advanced scenarios. It simulates log2 fold-change (LFC) and adjusted p-values -(q-values) for common oral taxa across disease conditions and specimen types, -including replicates and missing values. - -This version filters for \code{replicate == 1} but retains structure from a more complex -design, making it useful for testing visualizations that account for filtering, -grouping, or handling of \code{NA} values. +\code{sample_dice_data2} is a toy dataset designed to demonstrate \code{geom_dice()} +with multiple specimen types. It simulates log2 fold-change (LFC) and +adjusted p-values (q-values) for oral taxa across disease conditions and +specimen sites, with some missing values. } \examples{ data(sample_dice_data2) diff --git a/man/sample_dice_large.Rd b/man/sample_dice_large.Rd new file mode 100644 index 0000000..016f67a --- /dev/null +++ b/man/sample_dice_large.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/sample_dice_large.R +\docType{data} +\name{sample_dice_large} +\alias{sample_dice_large} +\title{Large Sample Dice Dataset} +\format{ +A data frame with 480 rows and 6 columns: +\describe{ +\item{taxon}{Character. Taxon name (Taxon_1 through Taxon_60).} +\item{disease}{Character. Disease condition (Caries, Periodontitis, Healthy, Gingivitis).} +\item{specimen}{Character. Specimen type (Saliva, Plaque).} +\item{replicate}{Integer. Replicate identifier.} +\item{lfc}{Numeric. Simulated log2 fold change; may contain NA.} +\item{q}{Numeric. Simulated adjusted p-value; may contain NA.} +} +} +\usage{ +data(sample_dice_large) +} +\description{ +\code{sample_dice_large} is a larger toy dataset with 60 taxa, designed to test +\code{geom_dice()} at higher density. It simulates log2 fold-change and q-values +with approximately 50\\% missing data. +} +\examples{ +data(sample_dice_large) +head(sample_dice_large) +} +\keyword{datasets} diff --git a/man/sample_dice_miRNA.Rd b/man/sample_dice_miRNA.Rd new file mode 100644 index 0000000..d4a93c5 --- /dev/null +++ b/man/sample_dice_miRNA.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/sample_dice_miRNA.R +\docType{data} +\name{sample_dice_miRNA} +\alias{sample_dice_miRNA} +\title{Sample miRNA Dice Dataset} +\format{ +A data frame with approximately 90 rows and 5 columns: +\describe{ +\item{miRNA}{Factor. miRNA identifier (miR-1 through miR-5).} +\item{Compound}{Factor. Treatment compound (Control, Compound_1 through Compound_4).} +\item{Organ}{Factor. Target organ (Lung, Liver, Brain, Kidney).} +\item{log2FC}{Numeric. Simulated log2 fold change.} +\item{direction}{Factor. Regulation direction (Down, Unchanged, Up).} +} +} +\usage{ +data(sample_dice_miRNA) +} +\description{ +\code{sample_dice_miRNA} is a toy dataset for demonstrating \code{geom_dice()} with +categorical fill mapping. It simulates miRNA dysregulation across compounds +and organs, with direction (Up, Down, Unchanged) as the fill variable. +} +\examples{ +data(sample_dice_miRNA) +head(sample_dice_miRNA) +} +\keyword{datasets} diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 0000000..d94a394 --- /dev/null +++ b/pixi.lock @@ -0,0 +1,2926 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bwidget-1.10.1-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm22_1_hbe26303_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm22_1_hb5e89dc_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm22_1_hbe26303_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22-22.1.0-default_hb52604d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22.1.0-default_cfg_hb78b91e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-22.1.0-default_h17d1ed9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-22.1.0-hec3a5e5_31.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-22.1.0-default_h17d1ed9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-22.1.0-hec3a5e5_31.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-22.1.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt22-22.1.0-hd34ed20_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_osx-arm64-22.1.0-h7e67a1e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-22.1.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.18.0-hd5a2499_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.7-h6e638da_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.3.2-h3103d1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm22_1_h5b97f1b_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm22_1_h692d5aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp22.1-22.1.0-default_hf3020a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcompiler-rt-22.1.0-hd34ed20_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-hd5a2499_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-22.1.0-h6dc3340_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-22.1.0-h707e725_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgit2-1.9.2-had2deda_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.0-h89af1be_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22-22.1.0-hb545844_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22.1.0-hd34ed20_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/make-4.4.1-hc9fafa5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-askpass-1.2.1-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-assertthat-0.2.1-r45hc72bb7e_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-base-4.5.2-haf89817_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-base64enc-0.1_6-r45hbe92478_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-brew-1.0_10-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-brio-1.1.5-r45h6168396_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-bslib-0.10.0-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-cachem-1.1.0-r45h6168396_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-cli-3.6.5-r45hc1cd577_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-clipr-0.8.0-r45hc72bb7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-colorspace-2.1_2-r45h6168396_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-commonmark-2.0.0-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.5.3-r45h785f33e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.3-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-credentials-2.0.3-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-curl-7.0.0-r45hbc3244a_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.3-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-devtools-2.4.6-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-diffobj-0.3.6-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-digest-0.6.39-r45hc1cd577_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-downlit-0.4.5-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-dplyr-1.2.0-r45h1380947_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-ellipsis-0.3.2-r45h6168396_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-evaluate-1.0.5-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-fansi-1.0.7-r45h6168396_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-farver-2.1.2-r45hc1cd577_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-fastmap-1.2.0-r45hc1cd577_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-fontawesome-0.5.3-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-fs-1.6.6-r45hc1cd577_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-generics-0.1.4-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-gert-2.3.1-r45hc9f24b7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-4.0.2-r45h785f33e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-gh-1.5.0-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-gitcreds-0.1.2-r45hc72bb7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-glue-1.8.0-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.6-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-highr-0.12-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-htmltools-0.5.9-r45hc1cd577_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-htmlwidgets-1.6.4-r45h785f33e_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-httpuv-1.6.16-r45h82072fd_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-httr2-1.2.2-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-ini-0.3.1-r45hc72bb7e_1007.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-isoband-0.3.0-r45hc1cd577_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-jquerylib-0.1.4-r45hc72bb7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-jsonlite-2.0.0-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.51-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.3-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-later-1.4.8-r45h1380947_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-legendry-0.2.4-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-lifecycle-1.0.5-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-magrittr-2.0.4-r45h6168396_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-memoise-2.0.1-r45hc72bb7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-mime-0.13-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-miniui-0.1.2-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-munsell-0.5.1-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-openssl-2.3.5-r45h3dca6d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-otel-0.2.0-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-patchwork-1.3.2-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.11.1-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-pkgbuild-1.4.8-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r45hc72bb7e_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-pkgdown-2.2.0-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-pkgload-1.5.0-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-praise-1.0.0-r45hc72bb7e_1009.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-prettyunits-1.2.0-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-processx-3.8.6-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-profvis-0.4.0-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-promises-1.5.0-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-ps-1.9.1-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-purrr-1.2.1-r45hbe92478_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-r6-2.6.1-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-ragg-1.5.0-r45hf65f6a8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-rappdirs-0.3.4-r45hbe92478_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-rcmdcheck-1.4.0-r45h785f33e_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-rcolorbrewer-1.1_3-r45h785f33e_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-rcpp-1.1.1-r45h1380947_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r45hc72bb7e_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-remotes-2.5.0-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-rlang-1.1.7-r45h1380947_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-rmarkdown-2.30-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-roxygen2-7.3.3-r45hc1cd577_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-rprojroot-2.1.1-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-rstudioapi-0.18.0-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-rversions-3.0.0-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-s7-0.2.1-r45h6168396_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-sass-0.4.10-r45hc1cd577_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-scales-1.4.0-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-sessioninfo-1.2.3-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-shiny-1.13.0-r45h785f33e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-sourcetools-0.1.7_1-r45hc1cd577_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-stringi-1.8.7-r45h76ca873_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-stringr-1.6.0-r45h785f33e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-sys-3.4.3-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-systemfonts-1.3.1-r45h288a467_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-testthat-3.3.1-r45hc1cd577_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-textshaping-1.0.4-r45h288a467_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-tibble-3.3.1-r45hbe92478_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-tidyr-1.3.2-r45h1380947_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-tidyselect-1.2.1-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-tinytex-0.58-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-urlchecker-1.0.1-r45hc72bb7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-usethis-3.2.1-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-utf8-1.2.6-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-vctrs-0.7.1-r45h1380947_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-viridislite-0.4.3-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-waldo-0.6.2-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-whisker-0.4.1-r45hc72bb7e_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.2-r45hc72bb7e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-xfun-0.56-r45h1380947_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-xml2-1.5.2-r45h46c16c0_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-xopen-1.0.1-r45hc72bb7e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/r-xtable-1.8_8-r45hc72bb7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-yaml-2.3.12-r45h6168396_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-zip-2.3.3-r45h6168396_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tktable-2.10-h3c7de25_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + build_number: 7 + sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd + md5: a44032f282e7d2acdeb1c240308052dd + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + size: 8325 + timestamp: 1764092507920 +- conda: https://conda.anaconda.org/conda-forge/noarch/_r-mutex-1.0.1-anacondar_1.tar.bz2 + sha256: e58f9eeb416b92b550e824bcb1b9fb1958dee69abfe3089dfd1a9173e3a0528a + md5: 19f9db5f4f1b7f5ef5f6d67207f25f38 + license: BSD + size: 3566 + timestamp: 1562343890778 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bwidget-1.10.1-hce30654_1.conda + sha256: 66ccefd46364f1ef536c42e7ee24d0377c2ece073734df614c6509b08e2bdf62 + md5: c42706e35f3bb26537b065a5f9ae764d + depends: + - tk + license: TCL + size: 129989 + timestamp: 1750261536876 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 + md5: bcb3cba70cf1eec964a03b4ba7775f01 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 180327 + timestamp: 1765215064054 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc + md5: 4492fd26db29495f0ba23f146cd5638d + depends: + - __unix + license: ISC + size: 147413 + timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + sha256: cde9b79ee206fe3ba6ca2dc5906593fb7a1350515f85b2a1135a4ce8ec1539e3 + md5: 36200ecfbbfbcb82063c87725434161f + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libcxx >=19 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.3,<3.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.46.4,<1.0a0 + license: LGPL-2.1-only or MPL-1.1 + size: 900035 + timestamp: 1766416416791 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm22_1_hbe26303_4.conda + sha256: a8d8f9a6ae4c149d2174f8f52c61da079cc793b87e2f76441a43daf7f394631f + md5: aea08dd508f71d6ca3cfa4e8694e7953 + depends: + - cctools_impl_osx-arm64 1030.6.3 llvm22_1_hb5e89dc_4 + - ld64 956.6 llvm22_1_h5b97f1b_4 + - libllvm22 >=22.1.0,<22.2.0a0 + license: APSL-2.0 + license_family: Other + size: 24551 + timestamp: 1772019751097 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm22_1_hb5e89dc_4.conda + sha256: 97075a1afeac8a7a4dca258ac10efb70638e3c734cbf5a6328ca1e0718e09c41 + md5: 97768bb89683757d7e535f9b7dcba39d + depends: + - __osx >=11.0 + - ld64_osx-arm64 >=956.6,<956.7.0a0 + - libcxx + - libllvm22 >=22.1.0,<22.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 22.1.* + - sigtool-codesign + constrains: + - clang 22.1.* + - ld64 956.6.* + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + size: 749166 + timestamp: 1772019681419 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_osx-arm64-1030.6.3-llvm22_1_hbe26303_4.conda + sha256: c90c927dd77afb7d8115a3777b567d9ab84169ab797436d79789d75d0bd1a399 + md5: a08c9f61e81b5d4a0a653495545ec2b8 + depends: + - cctools_impl_osx-arm64 1030.6.3 llvm22_1_hb5e89dc_4 + - ld64_osx-arm64 956.6 llvm22_1_h692d5aa_4 + constrains: + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + size: 23468 + timestamp: 1772019757885 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22.1.0-default_cfg_hb78b91e_0.conda + sha256: 3325092de9cfeceec1e317ed34caf068f1861c8fd5a1f770ad46dab080e37989 + md5: 3e7bd9f85d36cc70074e866cca4f389d + depends: + - cctools + - clang-22 22.1.0 default_hb52604d_0 + - clang_impl_osx-arm64 22.1.0 default_h17d1ed9_0 + - ld64 + - ld64_osx-arm64 * llvm22_1_* + - llvm-openmp >=22.1.0 + - llvm-tools 22.1.0.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 28344 + timestamp: 1772098206487 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-22-22.1.0-default_hb52604d_0.conda + sha256: 1ddb3174cf5ef28d8c572baf94d678304b96a9cb402e174198baa8cd73b144fe + md5: b66137f75711d76e55e96800a34f6c94 + depends: + - __osx >=11.0 + - compiler-rt22 22.1.0.* + - libclang-cpp22.1 22.1.0 default_hf3020a7_0 + - libcxx >=22.1.0 + - libllvm22 >=22.1.0,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 819994 + timestamp: 1772097931030 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-22.1.0-default_h17d1ed9_0.conda + sha256: 393632a170e60e5a977cb832e1adbf283e98ef008fe7210f6604c98dedd67a4b + md5: b574304dee3b4b6411866159c2a77a86 + depends: + - cctools_impl_osx-arm64 + - clang-22 22.1.0 default_hb52604d_0 + - compiler-rt 22.1.0.* + - compiler-rt_osx-arm64 + - ld64_osx-arm64 * llvm22_1_* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 27718 + timestamp: 1772098160125 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_osx-arm64-22.1.0-hec3a5e5_31.conda + sha256: 9a1deefa50cc320c65ba659fa481c56e4124a55c636e288b258b021c6cb42be6 + md5: 0fa64073626e71b596f6f346595a8060 + depends: + - cctools_osx-arm64 + - clang_impl_osx-arm64 22.1.0.* + - sdkroot_env_osx-arm64 + license: BSD-3-Clause + license_family: BSD + size: 20937 + timestamp: 1772108825552 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-22.1.0-default_h17d1ed9_0.conda + sha256: 4420500c11975ef5544271e75c009ea39dbf43cfb1a4a5fa577d1b2f19f8b53e + md5: 306e2bdad83788593ff973e34bcdfebe + depends: + - clang-22 22.1.0 default_hb52604d_0 + - clang_impl_osx-arm64 22.1.0 default_h17d1ed9_0 + - libcxx-devel 22.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 27687 + timestamp: 1772098246448 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_osx-arm64-22.1.0-hec3a5e5_31.conda + sha256: a15d91f430ddb41b58f76d85bbe048f077bac57c1344e6920e8d2c9e32b84b09 + md5: a2aa3d5dd982773be752f980986af066 + depends: + - cctools_osx-arm64 + - clang_osx-arm64 22.1.0 hec3a5e5_31 + - clangxx_impl_osx-arm64 22.1.0.* + - sdkroot_env_osx-arm64 + license: BSD-3-Clause + license_family: BSD + size: 19734 + timestamp: 1772108835239 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-22.1.0-hce30654_0.conda + sha256: 118f1e097963595a59c8eb37de91630c8c054506f622d14868eba03411a8cd48 + md5: 47de28daf7e77015627f8246fc51b93b + depends: + - compiler-rt22 22.1.0 hd34ed20_0 + - libcompiler-rt 22.1.0 hd34ed20_0 + constrains: + - clang 22.1.0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 16406 + timestamp: 1772019647121 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt22-22.1.0-hd34ed20_0.conda + sha256: 17308db182a4658e3d8710c174b5d017d8672dae2f79c606f85b6f1bd2f5fad7 + md5: 68393fcc06d1b85d290da5baa0dc19c0 + depends: + - __osx >=11.0 + - compiler-rt22_osx-arm64 22.1.0.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 99273 + timestamp: 1772019641057 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_osx-arm64-22.1.0-h7e67a1e_0.conda + sha256: dba44345ee2ddcd08582c7cc829304171e43e4dc0b89b92ee3cd6ecebc9cb1c4 + md5: 967cc614311d9b563ee948cc014ed27a + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 10835385 + timestamp: 1772019517770 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-22.1.0-hce30654_0.conda + sha256: f5045a00ad82e0150eeba2c3e9bdcafca7b759a6656cfc5b8111bf0c3fca65e3 + md5: 00a38308b4aab3f97ee95ede2146ba5c + depends: + - compiler-rt22_osx-arm64 22.1.0 h7e67a1e_0 + constrains: + - clang 22.1.0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 16573 + timestamp: 1772019644740 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.18.0-hd5a2499_1.conda + sha256: 02dfeeafde40f0305f817ab0dd98432453383f376b72302b491539283b27a6ce + md5: 1c31070994c1896ec110846f2ab57747 + depends: + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libcurl 8.18.0 hd5a2499_1 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 176523 + timestamp: 1770893204600 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.17.1-h2b252f5_0.conda + sha256: 851e9c778bfc54645dcab7038c0383445cbebf16f6bb2d3f62ce422b1605385a + md5: d06ae1a11b46cc4c74177ecd28de7c7a + depends: + - __osx >=11.0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 237308 + timestamp: 1771382999247 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 + md5: a7970cd949a077b7cb9696379d338681 + depends: + - font-ttf-ubuntu + - font-ttf-inconsolata + - font-ttf-dejavu-sans-mono + - font-ttf-source-code-pro + license: BSD-3-Clause + license_family: BSD + size: 4059 + timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + sha256: d856dc6744ecfba78c5f7df3378f03a75c911aadac803fa2b41a583667b4b600 + md5: 04bdce8d93a4ed181d1d726163c2d447 + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + size: 59391 + timestamp: 1757438897523 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_impl_osx-arm64-14.3.0-h6d03799_1.conda + sha256: c05c634388e180f79c70a5989d2b25977716b7f6d5e395119ad0007cf4a7bcbf + md5: 1e9ec88ecc684d92644a45c6df2399d0 + depends: + - __osx >=11.0 + - cctools_osx-arm64 + - clang + - gmp >=6.3.0,<7.0a0 + - isl 0.26.* + - libcxx >=17 + - libgfortran-devel_osx-arm64 14.3.0.* + - libgfortran5 >=14.3.0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - mpc >=1.3.1,<2.0a0 + - mpfr >=4.2.1,<5.0a0 + - zlib + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 20286770 + timestamp: 1759712171482 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gfortran_osx-arm64-14.3.0-h3c33bd0_0.conda + sha256: 2644e5f4b4eed171b12afb299e2413be5877db92f30ec03690621d1ae648502c + md5: 8db8c0061c0f3701444b7b9cc9966511 + depends: + - cctools_osx-arm64 + - clang + - clang_osx-arm64 + - gfortran_impl_osx-arm64 14.3.0 + - ld64_osx-arm64 + - libgfortran + - libgfortran-devel_osx-arm64 14.3.0 + - libgfortran5 >=14.3.0 + license: GPL-3.0-or-later WITH GCC-exception-3.1 + license_family: GPL + size: 35951 + timestamp: 1751220424258 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gmp-6.3.0-h7bae524_2.conda + sha256: 76e222e072d61c840f64a44e0580c2503562b009090f55aa45053bf1ccb385dd + md5: eed7278dfbab727b56f2c0b64330814b + depends: + - __osx >=11.0 + - libcxx >=16 + license: GPL-2.0-or-later OR LGPL-3.0-or-later + size: 365188 + timestamp: 1718981343258 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.14-hec049ff_2.conda + sha256: c507ae9989dbea7024aa6feaebb16cbf271faac67ac3f0342ef1ab747c20475d + md5: 0fc46fee39e88bbcf5835f71a9d9a209 + depends: + - __osx >=11.0 + - libcxx >=19 + license: LGPL-2.0-or-later + license_family: LGPL + size: 81202 + timestamp: 1755102333712 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsl-2.7-h6e638da_0.tar.bz2 + sha256: 979c2976adcfc70be997abeab2ed8395f9ac2b836bdcd25ed5d2efbf1fed226b + md5: 2a2126a940e033e7225a5dc7215eea9a + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 2734398 + timestamp: 1626369562748 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-12.3.2-h3103d1b_0.conda + sha256: f68c6704610396012124a3d86b087581174c2cf7968a46b6d95ba84cd87063c7 + md5: d0af4858d81c0c7abddc6b71fd8c0340 + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.14,<2.0a0 + - icu >=78.2,<79.0a0 + - libcxx >=19 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.3,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 1441619 + timestamp: 1769446246348 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-hef89b57_0.conda + sha256: 24bc62335106c30fecbcc1dba62c5eba06d18b90ea1061abd111af7b9c89c2d7 + md5: 114e6bfe7c5ad2525eb3597acdbf2300 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 12389400 + timestamp: 1772209104304 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/isl-0.26-imath32_h347afa1_101.conda + sha256: fc9272371750c56908b8e535755b1e23cf7803a2cc4a7d9ae539347baa14f740 + md5: e80e44a3f4862b1da870dc0557f8cf3b + depends: + - libcxx >=14.0.6 + track_features: + - isl_imath-32 + license: MIT + license_family: MIT + size: 819937 + timestamp: 1680649567633 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed + md5: e446e1822f4da8e5080a9de93474184d + depends: + - __osx >=11.0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + size: 1160828 + timestamp: 1769770119811 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm22_1_h5b97f1b_4.conda + sha256: 405f08540aedb58fa070b097143b3fe0fcb2b92e3b4aca723780e2f3d754803b + md5: 8254e40b35e6c3159de53275801a6ebc + depends: + - ld64_osx-arm64 956.6 llvm22_1_h692d5aa_4 + - libllvm22 >=22.1.0,<22.2.0a0 + constrains: + - cctools_osx-arm64 1030.6.3.* + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + size: 21907 + timestamp: 1772019717408 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm22_1_h692d5aa_4.conda + sha256: e4ae2ef85672c094aa3467d466f932ccdc1dda9bd4adac64f4252cc796149091 + md5: 4c2255bf859bff6c52ed38960e3bc963 + depends: + - __osx >=11.0 + - libcxx + - libllvm22 >=22.1.0,<22.2.0a0 + - sigtool-codesign + - tapi >=1600.0.11.8,<1601.0a0 + constrains: + - clang 22.1.* + - ld64 956.6.* + - cctools_impl_osx-arm64 1030.6.3.* + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + size: 1038027 + timestamp: 1772019602406 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda + sha256: 12361697f8ffc9968907d1a7b5830e34c670e4a59b638117a2cdfed8f63a38f8 + md5: a74332d9b60b62905e3d30709df08bf1 + depends: + - __osx >=11.0 + - libcxx >=18 + license: Apache-2.0 + license_family: Apache + size: 188306 + timestamp: 1745264362794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.25.1-h493aca8_0.conda + sha256: 7265547424e978ea596f51cc8e7b81638fb1c660b743e98cc4deb690d9d524ab + md5: 0deb80a2d6097c5fb98b495370b2435b + depends: + - __osx >=11.0 + - libcxx >=18 + license: LGPL-2.1-or-later + size: 52316 + timestamp: 1751558366611 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda + build_number: 5 + sha256: 620a6278f194dcabc7962277da6835b1e968e46ad0c8e757736255f5ddbfca8d + md5: bcc025e2bbaf8a92982d20863fe1fb69 + depends: + - libopenblas >=0.3.30,<0.3.31.0a0 + - libopenblas >=0.3.30,<1.0a0 + constrains: + - libcblas 3.11.0 5*_openblas + - liblapack 3.11.0 5*_openblas + - liblapacke 3.11.0 5*_openblas + - blas 2.305 openblas + - mkl <2026 + license: BSD-3-Clause + license_family: BSD + size: 18546 + timestamp: 1765819094137 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda + build_number: 5 + sha256: 38809c361bbd165ecf83f7f05fae9b791e1baa11e4447367f38ae1327f402fc0 + md5: efd8bd15ca56e9d01748a3beab8404eb + depends: + - libblas 3.11.0 5_h51639a9_openblas + constrains: + - liblapacke 3.11.0 5*_openblas + - liblapack 3.11.0 5*_openblas + - blas 2.305 openblas + license: BSD-3-Clause + license_family: BSD + size: 18548 + timestamp: 1765819108956 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp22.1-22.1.0-default_hf3020a7_0.conda + sha256: 87028410f716ce686e06f10294a3f3093a3c378af8d934bf2b2be156f052ec2f + md5: eafb2adb22cd13c6821f1e967bbbb774 + depends: + - __osx >=11.0 + - libcxx >=22.1.0 + - libllvm22 >=22.1.0,<22.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 14185830 + timestamp: 1772097754373 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcompiler-rt-22.1.0-hd34ed20_0.conda + sha256: a97799a22737d57cacb6307a4928e9a06b4a9b696cbdc17fa211741574cfe9fb + md5: bd58c622babec344e90e35eb4eb2cfb4 + depends: + - __osx >=11.0 + constrains: + - compiler-rt >=9.0.1 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 1375369 + timestamp: 1772019616868 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-hd5a2499_1.conda + sha256: dbc34552fc6f040bbcd52b4246ec068ce8d82be0e76bfe45c6984097758d37c2 + md5: 2742a933ef07e91f38e3d33ad6fe937c + depends: + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libnghttp2 >=1.67.0,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + size: 402616 + timestamp: 1770893178846 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.0-h55c6f16_1.conda + sha256: ce1049fa6fda9cf08ff1c50fb39573b5b0ea6958375d8ea7ccd8456ab81a0bcb + md5: e9c56daea841013e7774b5cd46f41564 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 568910 + timestamp: 1772001095642 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-22.1.0-h6dc3340_1.conda + sha256: 9c52ed7dab0c8d07b85d0c614c2456ffeb4aee8b589df8e168ea6af09f46e1c0 + md5: 86cdff71c7db6c96183dd753cc1e3d78 + depends: + - libcxx >=22.1.0 + - libcxx-headers >=22.1.0,<22.1.1.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 22005 + timestamp: 1772001125069 +- conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-22.1.0-h707e725_1.conda + sha256: 8ed1f482fdf17853c6792b6033227a7ace1b95c3c6db8b854d98c58dc7034ada + md5: 9e9a087146e448a54d7e0fdf52275cc4 + depends: + - __unix + constrains: + - gxx_linux-64 >=14 + - gxx_osx-64 >=14 + - libcxx-devel 22.1.0 + - clangxx >=19 + - gxx_osx-arm64 >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 1148297 + timestamp: 1772001025395 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c + md5: a6130c709305cd9828b4e1bd9ba0000c + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 55420 + timestamp: 1761980066242 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.7.4-hf6b4638_0.conda + sha256: 03887d8080d6a8fe02d75b80929271b39697ecca7628f0657d7afaea87761edf + md5: a92e310ae8dfc206ff449f362fc4217f + depends: + - __osx >=11.0 + constrains: + - expat 2.7.4.* + license: MIT + license_family: MIT + size: 68199 + timestamp: 1771260020767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 40979 + timestamp: 1769456747661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.1-hce30654_0.conda + sha256: 9de25a86066f078822d8dd95a83048d7dc2897d5d655c0e04a8a54fca13ef1ef + md5: f35fb38e89e2776994131fbf961fa44b + depends: + - libfreetype6 >=2.14.1 + license: GPL-2.0-only OR FTL + size: 7810 + timestamp: 1757947168537 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.1-h6da58f4_0.conda + sha256: cc4aec4c490123c0f248c1acd1aeab592afb6a44b1536734e20937cda748f7cd + md5: 6d4ede03e2a8e20eb51f7f681d2a2550 + depends: + - __osx >=11.0 + - libpng >=1.6.50,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - freetype >=2.14.1 + license: GPL-2.0-only OR FTL + size: 346703 + timestamp: 1757947166116 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_18.conda + sha256: 1d9c4f35586adb71bcd23e31b68b7f3e4c4ab89914c26bed5f2859290be5560e + md5: 92df6107310b1fff92c4cc84f0de247b + depends: + - _openmp_mutex + constrains: + - libgcc-ng ==15.2.0=*_18 + - libgomp 15.2.0 18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 401974 + timestamp: 1771378877463 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.25.1-h493aca8_0.conda + sha256: 3ba35ff26b3b9573b5df5b9bbec5c61476157ec3a9f12c698e2a9350cd4338fd + md5: 98acd9989d0d8d5914ccc86dceb6c6c2 + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + - libintl 0.25.1 h493aca8_0 + license: GPL-3.0-or-later + license_family: GPL + size: 183091 + timestamp: 1751558452316 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_18.conda + sha256: 63f89087c3f0c8621c5c89ecceec1e56e5e1c84f65fc9c5feca33a07c570a836 + md5: 26981599908ed2205366e8fc91b37fc6 + depends: + - libgfortran5 15.2.0 hdae7583_18 + constrains: + - libgfortran-ng ==15.2.0=*_18 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 138973 + timestamp: 1771379054939 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgfortran-devel_osx-arm64-14.3.0-hc965647_1.conda + sha256: f6ecc12e02a30ab7ee7a8b7285e4ffe3c2452e43885ce324b85827b97659a8c8 + md5: c1b69e537b3031d0f5af780b432ce511 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 2035634 + timestamp: 1756233109102 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_18.conda + sha256: 91033978ba25e6a60fb86843cf7e1f7dc8ad513f9689f991c9ddabfaf0361e7e + md5: c4a6f7989cffb0544bfd9207b6789971 + depends: + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 598634 + timestamp: 1771378886363 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgit2-1.9.2-had2deda_0.conda + sha256: 6b76739857b9d71973e8772b1852b4f1e22057b724afe0d5a0d0a308ed2ae453 + md5: 4a775dfb52b123de99036b590090b205 + depends: + - __osx >=11.0 + - libcxx >=19 + - libssh2 >=1.11.1,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.4,<4.0a0 + license: GPL-2.0-only WITH GCC-exception-2.0 + license_family: GPL + size: 841204 + timestamp: 1765030797714 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.86.4-he378b5c_1.conda + sha256: a4254a241a96198e019ced2e0d2967e4c0ef64fac32077a45c065b32dc2b15d2 + md5: 673069f6725ed7b1073f9b96094294d1 + depends: + - __osx >=11.0 + - libffi >=3.5.2,<3.6.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + constrains: + - glib 2.86.4 *_1 + license: LGPL-2.1-or-later + size: 4108927 + timestamp: 1771864169970 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + size: 750379 + timestamp: 1754909073836 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + size: 90957 + timestamp: 1751558394144 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda + sha256: 6c061c56058bb10374daaef50e81b39cf43e8aee21f0037022c0c39c4f31872f + md5: f0695fbecf1006f27f4395d64bd0c4b8 + depends: + - __osx >=11.0 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 551197 + timestamp: 1762095054358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda + build_number: 5 + sha256: 735a6e6f7d7da6f718b6690b7c0a8ae4815afb89138aa5793abe78128e951dbb + md5: ca9d752201b7fa1225bca036ee300f2b + depends: + - libblas 3.11.0 5_h51639a9_openblas + constrains: + - libcblas 3.11.0 5*_openblas + - blas 2.305 openblas + - liblapacke 3.11.0 5*_openblas + license: BSD-3-Clause + license_family: BSD + size: 18551 + timestamp: 1765819121855 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm22-22.1.0-h89af1be_0.conda + sha256: 19e2c69bd90cffc66a9fd9feff2bfe6093cda8bf69aa01a6e1c41cbc0a5c24a0 + md5: 620fe27ebf89177446fb7cc3c26c9cc0 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 30060199 + timestamp: 1771978789197 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.2-h8088a28_0.conda + sha256: 7bfc7ffb2d6a9629357a70d4eadeadb6f88fa26ebc28f606b1c1e5e5ed99dc7e + md5: 009f0d956d7bfb00de86901d16e486c7 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.2.* + license: 0BSD + size: 92242 + timestamp: 1768752982486 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda + sha256: a07cb53b5ffa2d5a18afc6fd5a526a5a53dd9523fbc022148bd2f9395697c46d + md5: a4b4dd73c67df470d091312ab87bf6ae + depends: + - __osx >=11.0 + - c-ares >=1.34.5,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.2,<4.0a0 + license: MIT + license_family: MIT + size: 575454 + timestamp: 1756835746393 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_4.conda + sha256: ebbbc089b70bcde87c4121a083c724330f02a690fb9d7c6cd18c30f1b12504fa + md5: a6f6d3a31bb29e48d37ce65de54e2df0 + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.30,<0.3.31.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4284132 + timestamp: 1768547079205 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.55-h132b30e_0.conda + sha256: 7a4fd29a6ee2d7f7a6e610754dfdf7410ed08f40d8d8b488a27bc0f9981d5abb + md5: 871dc88b0192ac49b6a5509932c31377 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + size: 288950 + timestamp: 1770691485950 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + sha256: 421f7bd7caaa945d9cd5d374cc3f01e75637ca7372a32d5e7695c825a48a30d1 + md5: c08557d00807785decafb932b5be7ef5 + depends: + - __osx >=11.0 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + size: 36416 + timestamp: 1767045062496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a + md5: b68e8f66b94b44aaa8de4583d3d4cc40 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 279193 + timestamp: 1745608793272 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda + sha256: e9248077b3fa63db94caca42c8dbc6949c6f32f94d1cafad127f9005d9b1507f + md5: e2a72ab2fa54ecb6abab2b26cde93500 + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=19 + - libdeflate >=1.25,<1.26.0a0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - liblzma >=5.8.1,<6.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + size: 373892 + timestamp: 1762022345545 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + sha256: 042c7488ad97a5629ec0a991a8b2a3345599401ecc75ad6a5af73b60e6db9689 + md5: c0d87c3c8e075daf1daf6c31b53e8083 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 421195 + timestamp: 1753948426421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + sha256: a4de3f371bb7ada325e1f27a4ef7bcc81b2b6a330e46fac9c2f78ac0755ea3dd + md5: e5e7d467f80da752be17796b87fe6385 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + size: 294974 + timestamp: 1752159906788 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.2-h8d039ee_0.conda + sha256: 99cb32dd06a2e58c12981b71a84b052293f27b5ab042e3f21d895f5d7ee13eff + md5: e476ba84e57f2bd2004a27381812ad4e + depends: + - __osx >=11.0 + - icu >=78.2,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libxml2-16 2.15.2 h5ef1a60_0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 41206 + timestamp: 1772704982288 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.2-h5ef1a60_0.conda + sha256: 6432259204e78c8a8a815afae987fbf60bd722605fe2c4b022e65196b17d4537 + md5: b284e2b02d53ef7981613839fb86beee + depends: + - __osx >=11.0 + - icu >=78.2,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.2 + license: MIT + license_family: MIT + size: 466220 + timestamp: 1772704950232 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.0-hc7d1edf_0.conda + sha256: 0daeedb3872ad0fdd6f0d7e7165c63488e8a315d7057907434145fba0c1e7b3d + md5: ff0820b5588b20be3b858552ecf8ffae + depends: + - __osx >=11.0 + constrains: + - openmp 22.1.0|22.1.0.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 285558 + timestamp: 1772028716784 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22.1.0-hd34ed20_0.conda + sha256: 13540d63bf2615ec4dfea40f311c2c4a96bf8bea63fcfb25f20e8054a03920e6 + md5: 2e8bcdb32582101601c13078e22c98fa + depends: + - __osx >=11.0 + - libllvm22 22.1.0 h89af1be_0 + - llvm-tools-22 22.1.0 hb545844_0 + constrains: + - llvm 22.1.0 + - llvmdev 22.1.0 + - clang 22.1.0 + - clang-tools 22.1.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 51193 + timestamp: 1771979258364 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-22-22.1.0-hb545844_0.conda + sha256: 307c71f3185383ce1239b8b0314dfc4f87c7acd8c6214671ecf57d68175977e8 + md5: 6fdadfcb14107a0c3917c059c8c40b51 + depends: + - __osx >=11.0 + - libcxx >=19 + - libllvm22 22.1.0 h89af1be_0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 17838140 + timestamp: 1771979103964 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/make-4.4.1-hc9fafa5_2.conda + sha256: 90ca65e788406d9029ae23ad4bd944a8b5353ad5f59bd6ce326f980cde46f37e + md5: 9f44ef1fea0a25d6a3491c58f3af8460 + depends: + - __osx >=11.0 + license: GPL-3.0-or-later + license_family: GPL + size: 274048 + timestamp: 1727801725384 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpc-1.3.1-h8f1351a_1.conda + sha256: 2700899ad03302a1751dbf2bca135407e470dd83ac897ab91dd8675d4300f158 + md5: a5635df796b71f6ca400fc7026f50701 + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + - mpfr >=4.2.1,<5.0a0 + license: LGPL-3.0-or-later + license_family: LGPL + size: 104766 + timestamp: 1725629165420 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/mpfr-4.2.1-hb693164_3.conda + sha256: 4463e4e2aba7668e37a1b8532859191b4477a6f3602a5d6b4d64ad4c4baaeac5 + md5: 4e4ea852d54cc2b869842de5044662fb + depends: + - __osx >=11.0 + - gmp >=6.3.0,<7.0a0 + license: LGPL-3.0-only + license_family: LGPL + size: 345517 + timestamp: 1725746730583 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + sha256: 2827ada40e8d9ca69a153a45f7fd14f32b2ead7045d3bbb5d10964898fe65733 + md5: 068d497125e4bf8a66bf707254fff5ae + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + size: 797030 + timestamp: 1738196177597 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.1-hd24854e_1.conda + sha256: 361f5c5e60052abc12bdd1b50d7a1a43e6a6653aab99a2263bf2288d709dcf67 + md5: f4f6ad63f98f64191c3e77c5f5f29d76 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + size: 3104268 + timestamp: 1769556384749 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9-hce30654_0.conda + sha256: 91469ebcc33309a5212a6c1d5a8947f4333303518e3575bc12c9ed98bee11733 + md5: e1dc425f8fd8290f2953e746e46a026d + license: GPL-2.0-or-later + license_family: GPL + size: 28164336 + timestamp: 1770211707334 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-h875632e_0.conda + sha256: 705484ad60adee86cab1aad3d2d8def03a699ece438c864e8ac995f6f66401a6 + md5: 7d57f8b4b7acfc75c777bc231f0d31be + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=11.0.1 + - libexpat >=2.7.0,<3.0a0 + - libfreetype >=2.13.3 + - libfreetype6 >=2.13.3 + - libglib >=2.84.2,<3.0a0 + - libpng >=1.6.49,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + license: LGPL-2.1-or-later + size: 426931 + timestamp: 1751292636271 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + sha256: 5e2e443f796f2fd92adf7978286a525fb768c34e12b1ee9ded4000a41b2894ba + md5: 9b4190c4055435ca3502070186eba53a + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 850231 + timestamp: 1763655726735 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + sha256: 29c9b08a9b8b7810f9d4f159aecfd205fce051633169040005c0b7efad4bc718 + md5: 17c3d745db6ea72ae2fce17e7338547f + depends: + - __osx >=11.0 + - libcxx >=19 + license: MIT + license_family: MIT + size: 248045 + timestamp: 1754665282033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-askpass-1.2.1-r45h6168396_1.conda + sha256: 6447059ddf3e1bcb7f680d78e4afe089cd17fb95978410a0753f7414fe43b965 + md5: 795fc9184553e27be2531731052e34b4 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + - r-sys >=2.1 + license: MIT + license_family: MIT + size: 32267 + timestamp: 1758383827532 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-assertthat-0.2.1-r45hc72bb7e_6.conda + sha256: 90e7ae8aa427274d7d2e510060b68925e60e897ecaa5ea135bb33afa7eb12134 + md5: b5291c60f52b43108a2973ba6f5885d1 + depends: + - r-base >=4.5,<4.6.0a0 + license: GPL-3.0-only + license_family: GPL3 + size: 72543 + timestamp: 1757447376176 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-base-4.5.2-haf89817_4.conda + sha256: 026ccf916205f45861b97e5c34defe590f9d445591320143cf7efdde725a4e26 + md5: a23247d015080ee8d7645222137f2c39 + depends: + - __osx >=11.0 + - _r-mutex 1.* anacondar_1 + - bwidget + - bzip2 >=1.0.8,<2.0a0 + - cairo >=1.18.4,<2.0a0 + - clang_osx-arm64 >=19 + - clangxx_osx-arm64 >=19 + - curl + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - gfortran_osx-arm64 14.* + - gsl >=2.7,<2.8.0a0 + - icu >=78.2,<79.0a0 + - libasprintf >=0.25.1,<1.0a0 + - libblas >=3.9.0,<4.0a0 + - libcurl >=8.18.0,<9.0a0 + - libcxx >=19 + - libdeflate >=1.25,<1.26.0a0 + - libexpat >=2.7.4,<3.0a0 + - libgettextpo >=0.25.1,<1.0a0 + - libgfortran + - libgfortran5 >=14.3.0 + - libglib >=2.86.4,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - liblzma >=5.8.2,<6.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-openmp >=19.1.7 + - make + - pango >=1.56.4,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tktable + - tzdata >=2024a + license: GPL-2.0-or-later + license_family: GPL + size: 27939077 + timestamp: 1771899801296 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-base64enc-0.1_6-r45hbe92478_0.conda + sha256: 9f807a81ed7db9c0679f77c940b7f99dd4dcea48a11eedaf1fc56475f7790f36 + md5: b813ab383126268f375504b4f017dfce + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: GPL-2.0-or-later + license_family: GPL3 + size: 48581 + timestamp: 1770028450555 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-brew-1.0_10-r45hc72bb7e_2.conda + sha256: 9324cbb93b6c3a2903b5f12c57eb7f03355b35ca1f1db15becf57f15fc40b796 + md5: 91c64b596d193d6ea30fc491ec9ae50f + depends: + - r-base >=4.5,<4.6.0a0 + license: GPL-2.0-only + license_family: GPL2 + size: 68849 + timestamp: 1757447876801 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-brio-1.1.5-r45h6168396_2.conda + sha256: 40cc8b948953cb0ae9b867b85955b455ea3a59f3a7446f9c5c28af8adaa49ff5 + md5: 3341446dae806068d67a0a3c9ef3ab35 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 44264 + timestamp: 1757421952235 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-bslib-0.10.0-r45hc72bb7e_0.conda + sha256: a4e8329b0891190fa4fd11a79db95a81e1f6e23a0c780ba67d92dbe40f5bbd37 + md5: b0ab5d18eec0343aaa4790dd78087a87 + depends: + - r-base >=4.5,<4.6.0a0 + - r-base64enc + - r-cachem + - r-htmltools >=0.5.7 + - r-jquerylib >=0.1.3 + - r-jsonlite + - r-lifecycle + - r-memoise >=2.0.1 + - r-mime + - r-rlang + - r-sass >=0.4.0 + license: MIT + license_family: MIT + size: 5484359 + timestamp: 1769433938691 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-cachem-1.1.0-r45h6168396_2.conda + sha256: 61866a0ca1ef3ab70294bcb63dae03ee4ffae0e4f60d07c98a770fdda1ae4957 + md5: bea2527cc3dcef07ad7f7ce24c6acd78 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + - r-fastmap + - r-rlang + license: MIT + license_family: MIT + size: 76813 + timestamp: 1757441988720 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-callr-3.7.6-r45hc72bb7e_2.conda + sha256: f9f49b2b845f279af84a33c8af19a915b2731c0bd892c608205cbad8a34f423d + md5: a5cc8a8d0dc08dc769c65a13b3573739 + depends: + - r-base >=4.5,<4.6.0a0 + - r-processx >=3.4.0 + - r-r6 + license: MIT + license_family: MIT + size: 454090 + timestamp: 1757475635573 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-cli-3.6.5-r45hc1cd577_1.conda + sha256: 4d58ccadb13ff7610d232f58cf9e507edcc73b0d499a4c003afbe8fd8bf2bbac + md5: a63804cecb81211738ce703a961efdc6 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 1311342 + timestamp: 1757415394144 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-clipr-0.8.0-r45hc72bb7e_4.conda + sha256: df9c2315dcc8e271947d6fee8d805f1723ce1f41be4369aa820f572d272c042d + md5: 5deda37b255bc9dc837d00b89dbf2a21 + depends: + - r-base >=4.5,<4.6.0a0 + license: GPL-3.0-only + license_family: GPL3 + size: 70829 + timestamp: 1757460210204 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-colorspace-2.1_2-r45h6168396_0.conda + sha256: 7246f7f5bed3541fb304176d3686e4e1d964d8365c0283e7afa352728dd3d367 + md5: 0bff944f8eb258188c9a003763f6a38c + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 2542698 + timestamp: 1758590846187 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-commonmark-2.0.0-r45h6168396_1.conda + sha256: b882804f682eabd69293b529101f009565526c393afa8be2bd0c2a0ef5a08bee + md5: 51251b84d98fb5c8b4f9ca012a7aacac + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: BSD-2-Clause + license_family: BSD + size: 118007 + timestamp: 1757422494607 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-cpp11-0.5.3-r45h785f33e_0.conda + sha256: b1e78668d9022919767ef4d18f5a4d72698c5c1f7a0e3e1ec6b80ef41965bc2c + md5: 7af22463e03fc80fb0da52672f296ea2 + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 243012 + timestamp: 1769011262793 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-crayon-1.5.3-r45hc72bb7e_2.conda + sha256: 9126a0408696133893e674549ca7aef317768dba503765a7ed032616aabe5b49 + md5: 4f111ce078b9690abaad6248b831a370 + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 168201 + timestamp: 1757452410374 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-credentials-2.0.3-r45hc72bb7e_1.conda + sha256: 5db8dc6e14ab6ff3dc79292184c079b5492f6125193e05a99f0714792d3bdc4a + md5: a94730bc5fa7197875f58d4b092a541a + depends: + - r-askpass + - r-base >=4.5,<4.6.0a0 + - r-curl + - r-jsonlite + - r-openssl >=1.3 + - r-sys >=2.1 + license: MIT + license_family: MIT + size: 226814 + timestamp: 1758405193327 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-curl-7.0.0-r45hbc3244a_1.conda + sha256: d80d2fd1ed68507832449870f5c4bdd6d1511ec16425b85c15b80a84ac75851a + md5: 7715042495e118e046d6f063e83e9e77 + depends: + - __osx >=11.0 + - libcurl >=8.14.1,<9.0a0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 476488 + timestamp: 1757582121786 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-desc-1.4.3-r45hc72bb7e_2.conda + sha256: b54c00d2ab9cca150f92120664a8a24cd63213d28c3e951c19575b24d9b57b61 + md5: 2428c825ae5b2fc162edaeb3fa76b486 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-r6 + - r-rprojroot + license: MIT + license_family: MIT + size: 339976 + timestamp: 1757463164006 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-devtools-2.4.6-r45hc72bb7e_0.conda + sha256: 466f690f5dc221d551db91feb6f20b2b7cbfb79297a8962edbaca63473cab5fe + md5: fc430a20ebb7d08c5f319bab04106a04 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.3.0 + - r-desc >=1.4.1 + - r-ellipsis >=0.3.2 + - r-fs >=1.5.2 + - r-lifecycle >=1.0.1 + - r-memoise >=2.0.1 + - r-miniui >=0.1.1.1 + - r-pkgbuild >=1.3.1 + - r-pkgdown >=2.0.6 + - r-pkgload >=1.3.0 + - r-profvis >=0.3.7 + - r-rcmdcheck >=1.4.0 + - r-remotes >=2.4.2 + - r-rlang >=1.0.4 + - r-roxygen2 >=7.2.1 + - r-rversions >=2.1.1 + - r-sessioninfo >=1.2.2 + - r-testthat >=3.1.4 + - r-urlchecker >=1.0.1 + - r-usethis >=2.1.6 + - r-withr >=2.5.0 + license: MIT + license_family: MIT + size: 454124 + timestamp: 1759496014222 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-diffobj-0.3.6-r45h6168396_1.conda + sha256: 379e7bba323e3c1176cf9cf51c607828a6e9fba51d014e9cc30a4365da065aa0 + md5: 792924ec188b780c69077fdf2fac8b44 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + - r-crayon >=1.3.2 + license: GPL-2.0-or-later + license_family: GPL2 + size: 1001442 + timestamp: 1757459652251 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-digest-0.6.39-r45hc1cd577_0.conda + sha256: 507bd9f5d407aa8d744066d7629985040f9f9c9adc200f1b9a279e4730213c15 + md5: 7f7d936d7653327ab8b53f6d85c95178 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: GPL-2.0-or-later + license_family: GPL2 + size: 208862 + timestamp: 1763567044192 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-downlit-0.4.5-r45hc72bb7e_0.conda + sha256: 73396f3432df8aac38aeb15f27ebdecb216d3b63bfa3c87fc6b996acf27b82f8 + md5: 49850c61c12fbd8dd19b30d9bc81833f + depends: + - r-base >=4.5,<4.6.0a0 + - r-brio + - r-desc + - r-digest + - r-evaluate + - r-fansi + - r-memoise + - r-rlang + - r-vctrs + - r-withr + - r-yaml + license: MIT + license_family: MIT + size: 121741 + timestamp: 1763113559895 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-dplyr-1.2.0-r45h1380947_0.conda + sha256: f66a34ee13eb97b003f9a05e4482eb18b8ed937c5be8035266f49f0938115673 + md5: 9ff303d89f7dda9757173365d729ef2d + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-ellipsis + - r-generics + - r-glue >=1.3.2 + - r-lifecycle >=1.0.0 + - r-magrittr >=1.5 + - r-pillar >=1.5.1 + - r-r6 + - r-rlang >=0.4.10 + - r-tibble >=2.1.3 + - r-tidyselect >=1.1.0 + - r-vctrs >=0.3.5 + license: MIT + license_family: MIT + size: 1444966 + timestamp: 1770120035780 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-ellipsis-0.3.2-r45h6168396_4.conda + sha256: d1018838d175133286840aa3f092f4cf127cfeec6f505056d7287872c464bdc0 + md5: 86adf0b732fd4c40ce6f5c1d89c0c4d6 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + - r-rlang >=0.3.0 + license: MIT + license_family: MIT + size: 43914 + timestamp: 1757441323465 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-evaluate-1.0.5-r45hc72bb7e_1.conda + sha256: d3accfeab1416151515c37e5edc94b18868998db4936183459f8040117d5c83c + md5: 4e0c71ab78d7292372a89d4daecb49af + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 111914 + timestamp: 1757447684244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-fansi-1.0.7-r45h6168396_0.conda + sha256: 8112dd835a6c5e52b40dd19cb339c29c29464f7f01cc47a841ce3ac54456af93 + md5: 6b8605f97d9e95528160a84bfb70c99e + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: GPL-2.0-or-later + license_family: GPL3 + size: 322546 + timestamp: 1763566692815 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-farver-2.1.2-r45hc1cd577_2.conda + sha256: ec89dc51963a9ddcd15bb348efdbe6350182a774fd2a0a88f928b3f31ebde1a4 + md5: 89f9a5e9c39a9c2397834bd1c0570c84 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 1366069 + timestamp: 1757441478962 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-fastmap-1.2.0-r45hc1cd577_2.conda + sha256: 53bbf12d1b47e618c15d4e19a478e5b5d0d25e1dfe43366b67d58bc157929301 + md5: 0ac8272c2d15122bf543dfd8c72654c1 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 72957 + timestamp: 1757421937392 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-fontawesome-0.5.3-r45hc72bb7e_1.conda + sha256: 865df12d8cdd8cf577abc8f785a0aa4ee50b4f8751256dffe4676a350943d591 + md5: e9fccb3617ec9776569c6496fa254e64 + depends: + - r-base >=4.5,<4.6.0a0 + - r-htmltools >=0.5.1.1 + - r-rlang >=0.4.10 + license: MIT + license_family: MIT + size: 1335664 + timestamp: 1757461248044 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-fs-1.6.6-r45hc1cd577_1.conda + sha256: a6cfec273f1910ca3d7cf6735a66cd38ef8a16c1d06d4c5a6d7213d6cf0934f0 + md5: 3dfd3cc7d22cdac895eb0c155143cb60 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 295598 + timestamp: 1757422996461 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-generics-0.1.4-r45hc72bb7e_1.conda + sha256: 88a5cf4bac0a553943996bc930b1ea28f2635c262c1b2c5a42b026b69f227f02 + md5: f19c9493b80f63a41fa017ec3b27bc2e + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 88225 + timestamp: 1757455977192 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-gert-2.3.1-r45hc9f24b7_0.conda + sha256: 9adc1d59f1bf5cf35b9db51d5d194432ef450ce3506c041bcc05847ecf1a72f5 + md5: 9716816457cb4bdfb8328b6fb911f78e + depends: + - __osx >=11.0 + - libgit2 >=1.9.2,<1.10.0a0 + - r-askpass + - r-base >=4.5,<4.6.0a0 + - r-credentials >=1.2.1 + - r-openssl >=2.0.3 + - r-rstudioapi >=0.11 + - r-zip >=2.1.0 + license: MIT + license_family: MIT + size: 278045 + timestamp: 1768194302939 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-ggplot2-4.0.2-r45h785f33e_0.conda + sha256: 54b1fd62a41549452d4be61f26f999f0aaeda863e2ffcde5bfb4d6422207b8fd + md5: c707ec20fc03a712b525bb975367a1fb + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-glue + - r-gtable >=0.3.6 + - r-isoband + - r-lifecycle >=1.0.1 + - r-rlang >=1.1.0 + - r-s7 + - r-scales >=1.4.0 + - r-vctrs >=0.6.0 + - r-withr >=2.5.0 + license: MIT + license_family: MIT + size: 7843556 + timestamp: 1770120207776 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-gh-1.5.0-r45hc72bb7e_1.conda + sha256: 192cd751680077e36e7d4e2d7dd56bc479f1755652e0850d6467c148bfe93781 + md5: 63ad70a28896e7a2bb3c3d06c143c358 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.0.1 + - r-gitcreds + - r-httr2 + - r-ini + - r-jsonlite + - r-rlang >=1.0.0 + license: MIT + license_family: MIT + size: 129562 + timestamp: 1758411443631 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-gitcreds-0.1.2-r45hc72bb7e_4.conda + sha256: 8a2619d16e1148cd712446f47c39e53aa09708071f9fc46e9b8dd31a28fbf0ad + md5: 8864884cea757c51580b45be5c362068 + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 96405 + timestamp: 1757482244466 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-glue-1.8.0-r45h6168396_1.conda + sha256: 8a3ead9cecc8e047a4e2add7f46ed44a6d6b18c37fc00e05105c4e64f9160a6f + md5: 874661b260e65e59afc78fcb6042e06d + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 165246 + timestamp: 1757421503482 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-gtable-0.3.6-r45hc72bb7e_1.conda + sha256: fcd2601af8213f39af6f720e22c8f858b3451f8e3d93cbc9e6aedb2d6f88483e + md5: f686123cfba49e6299fae7e029a40266 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-glue + - r-lifecycle + - r-rlang + license: MIT + license_family: MIT + size: 228864 + timestamp: 1757463478042 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-highr-0.12-r45hc72bb7e_0.conda + sha256: e676112aac0dbfe123fcb3108cce376782211a096c898a3af46fdf32a37e12e9 + md5: 0b5902d6af02a23bda1794d46090db42 + depends: + - r-base >=4.5,<4.6.0a0 + - r-xfun >=0.18 + license: GPL-2.0-or-later + license_family: GPL + size: 57308 + timestamp: 1772794436225 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-htmltools-0.5.9-r45hc1cd577_0.conda + sha256: 3a03c1a57aefc54ba046d070e232958f7af8c13066c878a29b857e41dc601694 + md5: eaaf5ce4bf4665bccd96bb3006f5fd87 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-base64enc + - r-digest + - r-ellipsis + - r-fastmap >=1.1.0 + - r-rlang >=0.4.10 + license: GPL-2.0-or-later + license_family: GPL3 + size: 366381 + timestamp: 1764860872591 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-htmlwidgets-1.6.4-r45h785f33e_4.conda + sha256: 4c3998ce4b4882429e52eed5c6c53d59056814d8fbc34a41ba79b990fdec1441 + md5: 6f767715f90e7caf17af72959bfcb11e + depends: + - r-base >=4.5,<4.6.0a0 + - r-htmltools >=0.5.7 + - r-jsonlite >=0.9.16 + - r-knitr >=1.8 + - r-rmarkdown + - r-yaml + license: MIT + license_family: MIT + size: 426023 + timestamp: 1757552859817 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-httpuv-1.6.16-r45h82072fd_1.conda + sha256: a141b3ec94f0ceea94b6a28856b63a1c68152135c2aa722f378212fd3aee56ec + md5: f4161504fd898175367daf9c53ef0e0b + depends: + - __osx >=11.0 + - libcxx >=19 + - libuv >=1.51.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - r-base >=4.5,<4.6.0a0 + - r-later >=0.8.0 + - r-promises + - r-r6 + - r-rcpp >=1.0.7 + license: GPL-2.0-or-later + license_family: GPL3 + size: 556343 + timestamp: 1757632039742 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-httr2-1.2.2-r45hc72bb7e_0.conda + sha256: b7a0dce6bbc69d504ac4398d7d7d4831c59389fcd193d5eaa77ba81169abe80d + md5: 37b687ccc11cd808f45e2efbc6e8e78a + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.0.0 + - r-curl >=5.1.0 + - r-glue + - r-lifecycle + - r-magrittr + - r-openssl + - r-r6 + - r-rappdirs + - r-rlang >=1.1.0 + - r-vctrs >=0.6.3 + - r-withr + license: MIT + license_family: MIT + size: 786857 + timestamp: 1765189940950 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-ini-0.3.1-r45hc72bb7e_1007.conda + sha256: 72ee2282467c148463ba8e8a8af4b5a6fdccd98e38b0820f442af187fcabbb13 + md5: e680ce2dae5ccc37ed94fc0696e6f10d + depends: + - r-base >=4.5,<4.6.0a0 + license: GPL-3.0-only + license_family: GPL3 + size: 33444 + timestamp: 1757482041715 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-isoband-0.3.0-r45hc1cd577_0.conda + sha256: 159d50fb9518b421f3e68df500e000a1283089643e409bd51bcbedb18788f6ff + md5: 32a70f240b21aea1366f13912eb83e4b + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-cpp11 + - r-rlang + license: MIT + license_family: MIT + size: 1637705 + timestamp: 1766530758311 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-jquerylib-0.1.4-r45hc72bb7e_4.conda + sha256: 3b98f72bb32d4758854805b664b4404602a583da32c9b96026536f5676f41812 + md5: 49a9ed6ed01f4ae6067ead552795bfce + depends: + - r-base >=4.5,<4.6.0a0 + - r-htmltools + license: MIT + license_family: MIT + size: 307113 + timestamp: 1757459485295 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-jsonlite-2.0.0-r45h6168396_1.conda + sha256: 7cc98177682b34e33f3fe4f216694f04f1b519928ea5ead7876dc1b12858f49f + md5: 16f0458678d7fd9d7237e9e330a35ad1 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 634332 + timestamp: 1757419931615 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-knitr-1.51-r45hc72bb7e_0.conda + sha256: e2184f1cb58aedacd94d1dbe6e8b5dfa3508151f454e80f6bd49486bdb90625c + md5: 35b31b96aa7bc052ad6347322a1481f1 + depends: + - r-base >=4.5,<4.6.0a0 + - r-evaluate >=0.15 + - r-highr >=0.11 + - r-xfun >=0.52 + - r-yaml >=2.1.19 + license: GPL-2.0-or-later + license_family: GPL + size: 988526 + timestamp: 1766309267127 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-labeling-0.4.3-r45hc72bb7e_2.conda + sha256: 42a06b7c346d6e4550dca1024bbf89e3c22962d568cfe4e8b8be824dea326110 + md5: a41490fdf607381035aa0304c21407c9 + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 70182 + timestamp: 1757456007088 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-later-1.4.8-r45h1380947_0.conda + sha256: 9f98ca2f7e7a7cb3740ff3534ab3d6e18f3eb20f87696da2adba843fd355ecad + md5: 02bc8fb7d58933172df874043ec219d1 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-rcpp >=0.12.9 + - r-rlang + license: MIT + license_family: MIT + size: 134167 + timestamp: 1772707890783 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-legendry-0.2.4-r45hc72bb7e_1.conda + sha256: ad03e817477a6f66d2390ab5546707fa13989ec7eb5c4fd05b2e6e93f38ed46a + md5: 231a7d2d3b47e5f982cee8eb304e67e5 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-ggplot2 >=3.5.2 + - r-gtable + - r-lifecycle + - r-rlang >=1.1.0 + - r-scales >=1.1.1 + - r-vctrs >=0.6.0 + license: MIT + license_family: MIT + size: 1040227 + timestamp: 1758757829077 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-lifecycle-1.0.5-r45hc72bb7e_0.conda + sha256: b7a4d8d98a96d17d18c80fb7e1c8e6cb09b9bd2542e74d91a7f483afccb30ee6 + md5: 5f8369dfbdff08878e58bf15529fca3a + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.4.0 + - r-glue + - r-rlang >=1.0.6 + license: MIT + license_family: GPL3 + size: 132636 + timestamp: 1767865665455 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-magrittr-2.0.4-r45h6168396_0.conda + sha256: f1743ca28f31b598002f5001ef31691ad1cebcc9f6e3d23116bb978442456af8 + md5: 67f39ff25ed88c8a5850d917e2fddc7a + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 210517 + timestamp: 1757678362724 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-memoise-2.0.1-r45hc72bb7e_4.conda + sha256: 91b0eedec5cf5de195b442b97eda508f22fdedbdbc487f74e3868d3e95380fdd + md5: 2b04206ff6ea5a92e8e36bdaa5feb3cc + depends: + - r-base >=4.5,<4.6.0a0 + - r-cachem + - r-rlang >=0.4.10 + license: MIT + license_family: MIT + size: 57750 + timestamp: 1757456335587 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-mime-0.13-r45h6168396_1.conda + sha256: 41626219ebb7b50c406db748e215c74bef5475653e04453d9650b0595dce2ccf + md5: a9833ab9170b98ec7652017c4dbc8864 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 65192 + timestamp: 1757441870891 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-miniui-0.1.2-r45hc72bb7e_1.conda + sha256: 0e63708e94f3848e7212db1bd8e0b7f4b72084d2d96a523a63ddb3c3102135a8 + md5: 4940389ec03eea86358108ec4bb222a0 + depends: + - r-base >=4.5,<4.6.0a0 + - r-htmltools >=0.3 + - r-shiny >=0.13 + license: GPL-3.0-only + license_family: GPL3 + size: 55283 + timestamp: 1757517043723 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-munsell-0.5.1-r45hc72bb7e_2.conda + sha256: 97d463c2146c483992a25fe497755e9cf714f95ca611a93d8adbb41c068e9e74 + md5: c78bd534986cde8fc0cb08cc9a1a2cc6 + depends: + - r-base >=4.5,<4.6.0a0 + - r-colorspace + license: MIT + license_family: MIT + size: 247241 + timestamp: 1757455926748 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-openssl-2.3.5-r45h3dca6d3_0.conda + sha256: 6c57c44e0573cf6641b995f52cf9f45558635a02135ed092809418b11d4777d6 + md5: 3a02e3d46bbac1a3c10db06ebd980b48 + depends: + - __osx >=11.0 + - openssl >=3.5.5,<4.0a0 + - r-askpass + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 679569 + timestamp: 1772127306726 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-otel-0.2.0-r45hc72bb7e_1.conda + sha256: f5de9737f59e1965db2de11c90cf1fdd426db322a7205c935a3e55150287b02f + md5: 560abd550c097e0d0af2e201b335f53d + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 286342 + timestamp: 1761151056217 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-patchwork-1.3.2-r45hc72bb7e_1.conda + sha256: a293119dea80dd983e9ba70af286f4d3c96d8c8223ff9d261078a1ce5f7534f5 + md5: 18c39db2636c08991a21d2e1ec0f5ee8 + depends: + - r-base >=4.5,<4.6.0a0 + - r-ggplot2 >=3.0.0 + - r-gtable + license: MIT + license_family: MIT + size: 3304812 + timestamp: 1757516903732 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-pillar-1.11.1-r45hc72bb7e_0.conda + sha256: b3f281041ecff2d4a9f40073ad5e7ec6fa7e0c841068ce85c550bcce0ff8938d + md5: 807ef77a70fc5156f830d6c683d07a29 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-crayon >=1.3.4 + - r-ellipsis + - r-fansi + - r-lifecycle + - r-rlang >=0.3.0 + - r-utf8 >=1.1.0 + - r-vctrs >=0.2.0 + license: GPL-3.0-only + license_family: GPL3 + size: 629867 + timestamp: 1758149763203 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-pkgbuild-1.4.8-r45hc72bb7e_1.conda + sha256: 3d1b97a5616663fabcb165968e2d1ad3732d316a0d38be259ca84533986a0093 + md5: daea93b32bab57062ab586c9b6e3896e + depends: + - r-base >=4.5,<4.6.0a0 + - r-callr >=3.2.0 + - r-cli + - r-crayon + - r-desc + - r-prettyunits + - r-r6 + - r-rprojroot + - r-withr >=2.1.2 + license: GPL-3.0-only + license_family: GPL3 + size: 221277 + timestamp: 1757496221 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-pkgconfig-2.0.3-r45hc72bb7e_5.conda + sha256: fda425435a533e86da5f0fc89cf45c9f889a4e6f1e2ed536ca23662a8461602c + md5: 40a5fdd06c7e7880758a021cf2df6c12 + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 27236 + timestamp: 1757447537447 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-pkgdown-2.2.0-r45hc72bb7e_0.conda + sha256: e33f7255808935799a2bde0b7f19a66711b2abed5ad351d17fb2233e3e7879dd + md5: ac92b5648ff1ed7028576f00e8e30c57 + depends: + - r-base >=4.5,<4.6.0a0 + - r-bslib >=0.5.1 + - r-callr >=3.7.3 + - r-cli >=3.6.1 + - r-desc >=1.4.0 + - r-downlit >=0.4.4 + - r-fontawesome + - r-fs >=1.4.0 + - r-httr2 >=1.0.2 + - r-jsonlite + - r-openssl + - r-purrr >=1.0.0 + - r-ragg >=1.4.0 + - r-rlang >=1.1.4 + - r-rmarkdown >=2.27 + - r-tibble + - r-whisker + - r-withr >=2.4.3 + - r-xml2 >=1.3.1 + - r-yaml + license: MIT + license_family: MIT + size: 907520 + timestamp: 1762414187272 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-pkgload-1.5.0-r45hc72bb7e_0.conda + sha256: 7d9a1ffc9b5c2c8c8b5cb69e8e79fad348cb7687503cf5d153b65966ab931d13 + md5: 66b42aecf1900e02b7d2eaf913980f18 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.3.0 + - r-desc + - r-fs + - r-glue + - r-lifecycle + - r-pkgbuild + - r-processx + - r-rlang >=1.1.1 + - r-rprojroot + - r-withr >=2.4.3 + license: GPL-3.0-only + license_family: GPL3 + size: 241326 + timestamp: 1770110557741 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-praise-1.0.0-r45hc72bb7e_1009.conda + sha256: 2f4b33c16d01df7d3a65cbb7a75989a2e3a1e068a354430da225d01d50870732 + md5: d9f7dfa06871712aaf768674dea06a0b + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 25995 + timestamp: 1757447352187 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-prettyunits-1.2.0-r45hc72bb7e_2.conda + sha256: 0306580de6e867b9060595f5eedde4dbf531ee89c16dd3738dde995b30f3fe14 + md5: 07465728b1fd99d28b286156dac895a3 + depends: + - r-assertthat + - r-base >=4.5,<4.6.0a0 + - r-magrittr + license: MIT + license_family: MIT + size: 161043 + timestamp: 1757463130831 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-processx-3.8.6-r45h6168396_1.conda + sha256: 3a2c2e0778ef2af5377ee701161ac4f6ea39f03da6e07d6ebee8b434bafe7658 + md5: dc435cc4b847546e37879898c48bc6e2 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + - r-ps >=1.2.0 + - r-r6 + license: MIT + license_family: MIT + size: 329958 + timestamp: 1757460470182 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-profvis-0.4.0-r45h6168396_1.conda + sha256: b1c2ab381ce08d66a660016b7e39c071057dae3a1f20ef4ccb5d0c9f0b571fcd + md5: 909f1820b876b2999c9175c60d38733e + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + - r-htmlwidgets >=0.3.2 + - r-purrr + - r-rlang >=0.4.9 + - r-stringr + - r-vctrs + license: GPL-3.0-only + license_family: GPL3 + size: 229626 + timestamp: 1757585958821 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-promises-1.5.0-r45hc72bb7e_1.conda + sha256: 684dba5d20aae8da37868d603b662014e1944f5568e5f737e42d9d485892a26e + md5: b2c1b6ef8f12894fd2694b285fe8989a + depends: + - r-base >=4.5,<4.6.0a0 + - r-fastmap >=1.1.0 + - r-later + - r-lifecycle + - r-magrittr >=1.5 + - r-otel >=0.2.0 + - r-r6 + - r-rlang + license: MIT + license_family: MIT + size: 1597704 + timestamp: 1762426228446 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-ps-1.9.1-r45h6168396_1.conda + sha256: 10d6a78df0649b8baad3db4f606d67b330dc8051938bd749bb0b42cb12c4ec4c + md5: 736e5fc87416cf1d73f7dd2171d6659f + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 402364 + timestamp: 1757421500255 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-purrr-1.2.1-r45hbe92478_0.conda + sha256: d0140efe7541bad0f1907b2d0f563a6effc489e197fce863a00f92094273c890 + md5: 91896158338361999414433a849d78cb + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.4 + - r-lifecycle >=1.0.3 + - r-magrittr >=1.5 + - r-rlang >=0.4.10 + - r-vctrs >=0.5 + license: MIT + license_family: MIT + size: 547896 + timestamp: 1768061319108 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-r6-2.6.1-r45hc72bb7e_1.conda + sha256: bd92e91332eba5f0c689583e80adec85ef272c4e0d0b36ee17cb7c11b5693cf2 + md5: 750802806d7d640c286ed8491bb395dc + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 95073 + timestamp: 1757447661037 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-ragg-1.5.0-r45hf65f6a8_1.conda + sha256: 92711f1e83915e8d5b1f282679724cb2683370d9836bcc092ff4ebfd97ec7b80 + md5: 352fb8cf8a3b1fb9644b115bf31058ae + depends: + - __osx >=11.0 + - libcxx >=19 + - libfreetype >=2.14.0 + - libfreetype6 >=2.14.0 + - libjpeg-turbo >=3.1.0,<4.0a0 + - libpng >=1.6.50,<1.7.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - r-base >=4.5,<4.6.0a0 + - r-systemfonts >=1.0.3 + - r-textshaping >=0.3.0 + license: MIT + license_family: MIT + size: 525299 + timestamp: 1757536174771 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-rappdirs-0.3.4-r45hbe92478_0.conda + sha256: af655563c213c977a6be7b537647e6096d6147e82cd5b02b30a82b59c7faf357 + md5: 667294a150ce70d4fa47e7599faa58b3 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 54631 + timestamp: 1768747667733 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-rcmdcheck-1.4.0-r45h785f33e_4.conda + sha256: 2511fd3049244f26c9bfee1f58823c6e9f200eded58fa893c928700b05271e9a + md5: 46cd08beb113bab9a16bc2a35ca9ea89 + depends: + - r-base >=4.5,<4.6.0a0 + - r-callr >=3.1.1.9000 + - r-cli >=3.0.0 + - r-curl + - r-desc >=1.2.0 + - r-digest + - r-pkgbuild + - r-prettyunits + - r-r6 + - r-rprojroot + - r-sessioninfo >=1.1.1 + - r-withr + - r-xopen + license: MIT + license_family: MIT + size: 179210 + timestamp: 1758407851979 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-rcolorbrewer-1.1_3-r45h785f33e_4.conda + sha256: ddd4e63616ee475bdf9dc63a0b16a89017237121e927d83fbdee07d5a5ccc890 + md5: d8fa238420cb6de47d463b7345a761eb + depends: + - r-base >=4.5,<4.6.0a0 + license: Apache-2.0 + license_family: APACHE + size: 68005 + timestamp: 1757452462302 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-rcpp-1.1.1-r45h1380947_0.conda + sha256: 2cdb03c696bbd2df85d198b56cb446af5922fd8e7a759d71e59e314683120603 + md5: e721f64ff162a3cc4f8b6d279047d4a4 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: GPL-2.0-or-later + license_family: GPL2 + size: 2122327 + timestamp: 1768071215181 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-rematch2-2.1.2-r45hc72bb7e_5.conda + sha256: 20ec2130c80ac4b9f5488ea5b1d207b932e99b8a41beae62a58a3fcb98480025 + md5: 9190c3379d369e61841fe1bad6dc91e2 + depends: + - r-base >=4.5,<4.6.0a0 + - r-tibble + license: MIT + license_family: MIT + size: 56155 + timestamp: 1757496154915 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-remotes-2.5.0-r45hc72bb7e_2.conda + sha256: d0ffd9ce29b45dc3cbf3a49359feddc884cf404236c89dc0a9f0b704e542a406 + md5: 2587026beb4e8e8dc9aa0f39ad3f197e + depends: + - r-base >=4.5,<4.6.0a0 + license: GPL-2.0-or-later + license_family: GPL3 + size: 437047 + timestamp: 1757451645190 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-rlang-1.1.7-r45h1380947_0.conda + sha256: d2b7a28a83dbbddad8bdbc601dc9a25957a76a025944f09904c6ec8cd3e54f6d + md5: 5888472d33eb5be5a7fb783584944741 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: GPL-3.0-only + license_family: GPL3 + size: 1566810 + timestamp: 1767972959414 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-rmarkdown-2.30-r45hc72bb7e_0.conda + sha256: f570ba9370e4d1a7ae0e423cd9faa21fca5c7f50818c2e270faaf2dadd41fdc6 + md5: 80cf6b03ed3e25ef9c2e4421cad9bee3 + depends: + - pandoc >=1.14 + - r-base >=4.5,<4.6.0a0 + - r-bslib >=0.2.5.1 + - r-evaluate >=0.13 + - r-fontawesome >=0.5.0 + - r-htmltools >=0.5.1 + - r-jquerylib + - r-jsonlite + - r-knitr >=1.43 + - r-tinytex >=0.31 + - r-xfun >=0.36 + - r-yaml >=2.1.19 + license: GPL-3.0-only + license_family: GPL3 + size: 2084939 + timestamp: 1759149840804 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-roxygen2-7.3.3-r45hc1cd577_1.conda + sha256: 7bc98048e14b427ec443f63c18f20381ff8ed9d19ff791879c84f13e860e84bd + md5: 207247d02515b28af8912ec075b22b7a + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-brew + - r-commonmark + - r-cpp11 + - r-desc >=1.2.0 + - r-digest + - r-knitr + - r-pkgload >=1.0.2 + - r-purrr >=0.3.3 + - r-r6 >=2.1.2 + - r-rlang + - r-stringi + - r-stringr >=1.0.0 + - r-xml2 + license: MIT + license_family: GPL3 + size: 847840 + timestamp: 1757564096901 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-rprojroot-2.1.1-r45hc72bb7e_1.conda + sha256: 9e359973b9433ffaef7a65a1f3483723048427aee4a3208512863c4c70c409a4 + md5: e1b7c51411ad3dd2a95aea6d466b12f7 + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 117773 + timestamp: 1757447613700 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-rstudioapi-0.18.0-r45hc72bb7e_0.conda + sha256: f5a35d4b7dfc17d7ae6eb92210906ccb1fbcc93acacb6d7b392e83bf15702fba + md5: e70e87e097876186fdac23d1a01faede + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 345783 + timestamp: 1768620480911 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-rversions-3.0.0-r45hc72bb7e_0.conda + sha256: ce6e20e0836735760c76ea66393c3f5d3447834cc8b2c064247a1ca238821d30 + md5: 3154fa3ece90604a48de42393bd6f7b0 + depends: + - r-base >=4.5,<4.6.0a0 + - r-curl + - r-xml2 >=1.0.0 + license: MIT + license_family: MIT + size: 145145 + timestamp: 1760025497442 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-s7-0.2.1-r45h6168396_0.conda + sha256: fe58429ef53115f6e9e907954b0d1bc1dd4f4da42a721bd76c63e9dd56c2cfc9 + md5: d9dd29ff13e55c1cc7259da91a603383 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 309756 + timestamp: 1763155175659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-sass-0.4.10-r45hc1cd577_1.conda + sha256: 93a2defc3743f200405114f45a9cfa97683f84a177dbc761a0253432234aafc5 + md5: 1990fe8bc0490e71fda361caebb2614b + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-digest + - r-fs + - r-htmltools + - r-r6 + - r-rappdirs + - r-rlang + license: MIT + license_family: MIT + size: 2087025 + timestamp: 1757465277551 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-scales-1.4.0-r45hc72bb7e_1.conda + sha256: 260c384e952e5bd4d2c2de77b9e09b24ff1c1f680acd917c4657ab8c9e4e9a2f + md5: 8bc81cc6fd130cef963bc9e082726a14 + depends: + - r-base >=4.5,<4.6.0a0 + - r-farver >=2.0.0 + - r-labeling + - r-lifecycle + - r-munsell >=0.5 + - r-r6 + - r-rcolorbrewer + - r-viridislite + license: MIT + license_family: MIT + size: 777793 + timestamp: 1757487539496 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-sessioninfo-1.2.3-r45hc72bb7e_1.conda + sha256: 83749d9ea9422d89e8e59e93dfee6423297e83a1fab325b03d412700784773bc + md5: e2d98358063814d40bcb9150b45fb6e9 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-withr + license: GPL-2.0-only + license_family: GPL2 + size: 210056 + timestamp: 1757547994444 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-shiny-1.13.0-r45h785f33e_0.conda + sha256: 10515a454fe45fcadcb5e954fcebd59b8014a32d3d73e28b942fea64ecb54d97 + md5: 1f431e9c637e0e271d0f347829e09fa6 + depends: + - r-base >=4.5,<4.6.0a0 + - r-bslib >=0.6.0 + - r-cachem >=1.1.0 + - r-commonmark >=1.7 + - r-crayon + - r-fastmap >=1.1.1 + - r-fontawesome >=0.4.0 + - r-glue >=1.3.2 + - r-htmltools >=0.5.4 + - r-httpuv >=1.5.2 + - r-jsonlite >=0.9.16 + - r-later >=1.0.0 + - r-lifecycle >=0.2.0 + - r-mime >=0.3 + - r-promises >=1.1.0 + - r-r6 >=2.0 + - r-rlang >=0.4.10 + - r-sourcetools + - r-withr + - r-xtable + license: GPL-3.0-only + license_family: GPL3 + size: 3738931 + timestamp: 1771613508103 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-sourcetools-0.1.7_1-r45hc1cd577_3.conda + sha256: 4d42d40682f417e1210fe56b725b7836fafcd5e8d5880b79e9046eba52810261 + md5: cf9b8c6eb5553bdaa488bfc1fd82f812 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 52352 + timestamp: 1757442272828 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-stringi-1.8.7-r45h76ca873_2.conda + sha256: c2af6bee873500ee617eb220631eb312c1727da28a17daf2d6a3e95869c8f4da + md5: 6c0cf4a913061e89d52170681cfaed9e + depends: + - __osx >=11.0 + - icu >=78.2,<79.0a0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: FOSS + license_family: OTHER + size: 868166 + timestamp: 1772032967067 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-stringr-1.6.0-r45h785f33e_0.conda + sha256: dea2a7676dd03ed93fa0ec961883c5075c361c8522659a1bc1e6b5c16525cb24 + md5: 8db438d8aa370726ee1ce8bf458f2e6d + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-glue >=1.6.1 + - r-lifecycle >=1.0.3 + - r-magrittr + - r-rlang >=1.0.0 + - r-stringi >=1.5.3 + - r-vctrs + license: MIT + license_family: MIT + size: 319328 + timestamp: 1762269757617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-sys-3.4.3-r45h6168396_1.conda + sha256: 0c4d094ff6ffbbb06bd56e5bcfc1bbed4f3da93ee4cd6b92dba892e3b2795862 + md5: b7876a5fa31ef5b7041d2e9805cf31f2 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 50006 + timestamp: 1757442171543 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-systemfonts-1.3.1-r45h288a467_0.conda + sha256: a9d3cc7bc5416a6b7e8216959a93dcae6648d2b7882f6f3f49549c51ea9ff766 + md5: 241914a53d06c83d42c2bd10a0657918 + depends: + - __osx >=11.0 + - libcxx >=19 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - r-base >=4.5,<4.6.0a0 + - r-base64enc + - r-cpp11 >=0.2.1 + - r-jsonlite + - r-lifecycle + license: MIT + license_family: MIT + size: 659346 + timestamp: 1759353850246 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-testthat-3.3.1-r45hc1cd577_0.conda + sha256: 53c0d7957c9380f7b6fa58e36b626cf4729e16373ce2c9f358e239a7029503b8 + md5: 0464490263947ef9c5525adbc93a47da + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-brio >=1.1.3 + - r-callr >=3.7.3 + - r-cli >=3.6.1 + - r-desc >=1.4.2 + - r-digest >=0.6.33 + - r-evaluate >=1.0.1 + - r-jsonlite >=1.8.7 + - r-lifecycle >=1.0.3 + - r-magrittr >=2.0.3 + - r-pkgload >=1.3.2.1 + - r-praise >=1.0.0 + - r-processx >=3.8.2 + - r-ps >=1.7.5 + - r-r6 >=2.5.1 + - r-rlang >=1.1.1 + - r-waldo >=0.6.0 + - r-withr >=3.0.2 + license: MIT + license_family: MIT + size: 1803977 + timestamp: 1764089106063 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-textshaping-1.0.4-r45h288a467_0.conda + sha256: d53966bc8ff795942adc56c43b318455e1afb71d86358c041ee4eb5ae95a04a3 + md5: b8fa447b3e1217b2527cbdfa78e180bb + depends: + - __osx >=11.0 + - fribidi >=1.0.16,<2.0a0 + - harfbuzz >=12.1.0 + - libcxx >=19 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - r-base >=4.5,<4.6.0a0 + - r-cpp11 >=0.2.1 + - r-lifecycle + - r-stringi + - r-systemfonts >=1.3.0 + license: MIT + license_family: MIT + size: 166959 + timestamp: 1760177263563 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-tibble-3.3.1-r45hbe92478_0.conda + sha256: 664ce8c10e7102374a422cfec2897e469bdd5576f2b5670933a33365b6f81f50 + md5: e998c11872a46c0d8262a50ff02e7ac3 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + - r-fansi >=0.4.0 + - r-lifecycle >=1.0.0 + - r-magrittr + - r-pillar >=1.8.1 + - r-pkgconfig + - r-rlang >=1.0.2 + - r-vctrs >=0.4.2 + license: MIT + license_family: MIT + size: 589952 + timestamp: 1768139402062 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-tidyr-1.3.2-r45h1380947_0.conda + sha256: 7846c1772f417d6ae06a79cfcf6cfcbb9dc9998052a485987b144b3d02960291 + md5: 6acbcd70079ec83782d1fe54058702a3 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.4.1 + - r-dplyr >=1.0.10 + - r-glue + - r-lifecycle >=1.0.3 + - r-magrittr + - r-purrr >=1.0.1 + - r-rlang >=1.0.4 + - r-stringr >=1.5.0 + - r-tibble >=2.1.1 + - r-tidyselect >=1.2.0 + - r-vctrs >=0.5.2 + license: MIT + license_family: MIT + size: 1117995 + timestamp: 1766142499565 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-tidyselect-1.2.1-r45hc72bb7e_2.conda + sha256: fca09d6b9940f1e1cda0425a0f55716bba202d6f55d6bd25fedec391006c7dc7 + md5: 15aa0f323385403fe182e46a1d095e1b + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.3.0 + - r-glue >=1.3.0 + - r-lifecycle >=1.0.3 + - r-rlang >=1.0.4 + - r-vctrs >=0.5.2 + - r-withr + license: MIT + license_family: MIT + size: 220192 + timestamp: 1757475791328 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-tinytex-0.58-r45hc72bb7e_0.conda + sha256: 65949b54c32059e6141b35499b8b574ac484c184aabfab907c6e1733b98cc756 + md5: 119e2b033f2a31aa2b53b490f6fc4c24 + depends: + - r-base >=4.5,<4.6.0a0 + - r-xfun >=0.5 + license: MIT + license_family: MIT + size: 153328 + timestamp: 1763537045699 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-urlchecker-1.0.1-r45hc72bb7e_4.conda + sha256: 3c1ac479352099400b82b866db5a49b6c2f9802451e5ecf42385abaf4db73f4f + md5: d8603dd91958a841382fdced991aba9a + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-curl + - r-xml2 + license: GPL-3.0-only + license_family: GPL3 + size: 52246 + timestamp: 1758409118952 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-usethis-3.2.1-r45hc72bb7e_1.conda + sha256: 3c8dc056e071d002dfde20f14cd8b1bad4b210f6e7e2d26cfc5eaf8f1342b1b2 + md5: dcbfbae5c448a2e54f37457f16075468 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-clipr >=0.3.0 + - r-crayon + - r-curl >=2.7 + - r-desc + - r-ellipsis + - r-fs >=1.3.0 + - r-gert >=1.0.2 + - r-gh >=1.2.0 + - r-glue >=1.3.0 + - r-jsonlite + - r-lifecycle + - r-purrr + - r-rappdirs + - r-rlang >=0.4.3 + - r-rprojroot >=1.2 + - r-rstudioapi + - r-whisker + - r-withr >=2.3.0 + - r-yaml + license: MIT + license_family: MIT + size: 915479 + timestamp: 1758433263601 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-utf8-1.2.6-r45h6168396_1.conda + sha256: bb4223a470fba4fddea1d8daf3b4997a7fa76979418529750a4cb90139c1c3c7 + md5: 7f3d77dd38b1228dadadc00a7f01fa79 + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: Apache-2.0 + license_family: APACHE + size: 144448 + timestamp: 1757424920480 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-vctrs-0.7.1-r45h1380947_0.conda + sha256: 74cb465d631125cca9132effd9a6657688abce3cf56a24b8645561b2fa7d3c6e + md5: 670ea22da241071150e2b65f43dfead5 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + - r-cli >=3.4.0 + - r-glue + - r-lifecycle >=1.0.3 + - r-rlang >=1.0.6 + license: MIT + license_family: MIT + size: 1341659 + timestamp: 1769236146910 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-viridislite-0.4.3-r45hc72bb7e_0.conda + sha256: b9ec9606562f0f6bdefc237bbc6163eb1cb022f9d699c80771bc84af0ae37269 + md5: bcadc0a3726e2191e51449f67fa5e0a9 + depends: + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 1305542 + timestamp: 1770191459321 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-waldo-0.6.2-r45hc72bb7e_1.conda + sha256: 57eb80cb919524dde77b4c19f257ac9b327aba900e28298d990fa622f30b6f09 + md5: 86406bcc46061e27fe7ec24f73eb6676 + depends: + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-diffobj >=0.3.4 + - r-fansi + - r-glue + - r-rematch2 + - r-rlang >=1.0.0 + - r-tibble + license: MIT + license_family: MIT + size: 144204 + timestamp: 1757501656298 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-whisker-0.4.1-r45hc72bb7e_3.conda + sha256: f61bc764a85693d28dfc9dba60bc13acd89c3fd8fe85aa212530a3558bfecec0 + md5: 5cd861608ecbeab0574d59a7754deba7 + depends: + - r-base >=4.5,<4.6.0a0 + license: GPL-3.0-only + license_family: GPL3 + size: 83008 + timestamp: 1757468282426 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-withr-3.0.2-r45hc72bb7e_1.conda + sha256: ce2d02905f29ae7e9e18a44d1985896628f6bb1ae6348a67e9534d5b8779485b + md5: 56c45a76870f89e39aeca8ba4d4e911a + depends: + - r-base >=4.5,<4.6.0a0 + license: GPL-2.0-or-later + license_family: GPL2 + size: 235156 + timestamp: 1757447242401 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-xfun-0.56-r45h1380947_0.conda + sha256: 5f857057bddb92cadca082b0af401484e1ab8191a6c5f840210b18c287f7fc2e + md5: 0c355397d89df146afb7e65f637d1299 + depends: + - __osx >=11.0 + - libcxx >=19 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: MIT + size: 596085 + timestamp: 1768794728181 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-xml2-1.5.2-r45h46c16c0_0.conda + sha256: f53b87df21c5974a39bd25809e97e704048ace863070dfb53969f67c3f095412 + md5: 21a8540df5ec9f20fc2d56552a655ab3 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + - r-base >=4.5,<4.6.0a0 + - r-cli + - r-rlang >=1.1.0 + license: GPL-2.0-or-later + license_family: GPL2 + size: 202477 + timestamp: 1768765335690 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-xopen-1.0.1-r45hc72bb7e_2.conda + sha256: af8aecc4a3fe0bf7936ca178a3280ac5dcdcfe385c8337b9a29630cb96aa9bda + md5: c2a6b820f0a9d1ed0cf0e134933d0f84 + depends: + - r-base >=4.5,<4.6.0a0 + - r-processx + license: MIT + license_family: MIT + size: 33290 + timestamp: 1757570912406 +- conda: https://conda.anaconda.org/conda-forge/noarch/r-xtable-1.8_8-r45hc72bb7e_0.conda + sha256: 972923364cfd616ccf38768477c435677cfe1ea18a72016f90344ea920e4fea5 + md5: e18fda0821f0fdc1c34276c5e0acdc92 + depends: + - r-base >=4.5,<4.6.0a0 + license: GPL (>= 2) + license_family: GPL3 + size: 744345 + timestamp: 1771859982217 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-yaml-2.3.12-r45h6168396_0.conda + sha256: fe177c37159af3bc28dbeff13f22df3a66ab022f134696fbdac282b8fb00588d + md5: c4f28e09a7a80da7ab1924ad2eff716d + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 110699 + timestamp: 1765373056338 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/r-zip-2.3.3-r45h6168396_1.conda + sha256: 122f4e4ae61b488936a5a43fff210a643bd3c8af569b41d80a6783b942f22ac0 + md5: f3ce6093fb49872e017afd1ff15f0eec + depends: + - __osx >=11.0 + - r-base >=4.5,<4.6.0a0 + license: MIT + license_family: CC + size: 144014 + timestamp: 1757448111169 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/noarch/sdkroot_env_osx-arm64-26.0-ha3f98da_7.conda + sha256: fabfe031ede99898cb2b0b805f6c0d64fcc24ecdb444de3a83002d8135bf4804 + md5: 5f0ebbfea12d8e5bddff157e271fdb2f + license: BSD-3-Clause + license_family: BSD + size: 4971 + timestamp: 1771434195389 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + sha256: f3d006e2441f110160a684744d90921bbedbffa247d7599d7e76b5cd048116dc + md5: ade77ad7513177297b1d75e351e136ce + depends: + - __osx >=11.0 + - libsigtool 0.1.3 h98dc951_0 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + size: 114331 + timestamp: 1767045086274 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_0.conda + sha256: dcb678fa77f448fa981bf3783902afe09b8838436f3092e9ecaf6a718c87f642 + md5: 347261d575a245cb6111fb2cb5a79fc7 + depends: + - libcxx >=19.0.0.a0 + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: NCSA + size: 199699 + timestamp: 1762535277608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 + md5: a9d86bc62f39b94c4661716624eb21b0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + size: 3127137 + timestamp: 1769460817696 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tktable-2.10-h3c7de25_7.conda + sha256: af0be0e8a391a4c2269e8a2eeee711955368d01f53b69a4b05c9ea4094c31dd5 + md5: 7c2e2e25a80f1538b0dcee34026bec42 + depends: + - __osx >=11.0 + - tk >=8.6.13,<8.7.0a0 + license: TCL + size: 79744 + timestamp: 1750266680133 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + size: 119135 + timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 + depends: + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + license: Zlib + license_family: Other + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 433413 + timestamp: 1764777166076 diff --git a/pixi.toml b/pixi.toml new file mode 100644 index 0000000..855fe53 --- /dev/null +++ b/pixi.toml @@ -0,0 +1,21 @@ +[workspace] +name = "ggdiceplot" +version = "1.0.0" +description = "DicePlot Visualization for ggplot2" +channels = ["conda-forge"] +platforms = ["osx-arm64"] + +[dependencies] +r-base = ">=4.5" +r-ggplot2 = ">=3.4.0" +r-dplyr = "*" +r-tibble = "*" +r-scales = "*" +r-legendry = "*" +r-patchwork = "*" +r-tidyr = "*" +r-devtools = "*" +r-rcmdcheck = "*" + +[tasks] +demo = "Rscript test_simple_dice.R" diff --git a/test_simple_dice.R b/test_simple_dice.R index ebae758..ea6900c 100644 --- a/test_simple_dice.R +++ b/test_simple_dice.R @@ -1,40 +1,168 @@ #!/usr/bin/env Rscript -# Simple test of geom_dice +# Demonstration of pip_scale auto-scaling in geom_dice library(ggplot2) library(dplyr) library(legendry) library(scales) library(grid) +library(patchwork) -# Load ggdiceplot functions source("R/utils.R") source("R/geom-dice-ggprotto.R") source("R/geom-dice.R") -# Create simple test data +# ---- shared toy data ------------------------------------------------------- + +set.seed(42) test_data <- data.frame( - x = rep(1:3, each = 4), - y = rep(1:2, times = 6), - category = rep(c("A", "B", "C", "D"), times = 3), - value = runif(12, -2, 2), - size_val = runif(12, 0.1, 1) + x = rep(1:4, each = 4), + y = rep(1:2, times = 8), + category = rep(c("A", "B", "C", "D"), times = 4), + value = runif(16, -2, 2) ) -print("Test data:") -print(test_data) +# ---- Plot 1: pip_scale comparison (0.5 / 0.75 / 0.9 / 1.0 / NULL) ---------- + +make_base_plot <- function(pip_scale_val, title_label) { + ggplot(test_data, aes(x = x, y = y)) + + geom_dice( + aes(dots = category, fill = value), + ndots = 4, + x_length = 4, + y_length = 2, + pip_scale = pip_scale_val + ) + + scale_fill_gradient2( + low = "#2166AC", high = "#762A83", mid = "white", + midpoint = 0, name = "value" + ) + + labs(title = title_label) + + theme(plot.title = element_text(size = 10)) +} + +p_050 <- make_base_plot(0.50, "pip_scale = 0.50") +p_075 <- make_base_plot(0.75, "pip_scale = 0.75 (default)") +p_090 <- make_base_plot(0.90, "pip_scale = 0.90") +p_100 <- make_base_plot(1.00, "pip_scale = 1.00 (tight)") +p_off <- make_base_plot(NULL, "pip_scale = NULL (fixed 3 mm)") + +comparison <- (p_050 + p_075 + p_090) / (p_100 + p_off + plot_spacer()) + + plot_annotation( + title = "pip_scale comparison", + subtitle = "pip_scale scales both pip size and positions; NULL = legacy fixed size" + ) + +ggsave("demo_output/pip_scale_comparison.png", comparison, width = 14, height = 9, dpi = 300) + +# ---- Plot 2: tile size vs pip_scale = 0.75 and 1.0 ------------------------- + +make_tile_size_plot <- function(tile_w, title_label, pip_scale_val = 0.75) { + ggplot(test_data, aes(x = x, y = y)) + + geom_dice( + aes(dots = category, fill = value, width = tile_w, height = tile_w), + ndots = 4, + x_length = 4, + y_length = 2, + pip_scale = pip_scale_val + ) + + scale_fill_gradient2( + low = "#2166AC", high = "#762A83", mid = "white", + midpoint = 0, name = "value" + ) + + labs(title = title_label) + + theme(plot.title = element_text(size = 9)) +} + +# row 1: pip_scale = 0.75 +p_75_04 <- make_tile_size_plot(0.40, "pf=0.75, tile=0.40", 0.75) +p_75_07 <- make_tile_size_plot(0.70, "pf=0.75, tile=0.70", 0.75) +p_75_095 <- make_tile_size_plot(0.95, "pf=0.75, tile=0.95", 0.75) + +# row 2: pip_scale = 1.0 +p_10_04 <- make_tile_size_plot(0.40, "pf=1.00, tile=0.40", 1.00) +p_10_07 <- make_tile_size_plot(0.70, "pf=1.00, tile=0.70", 1.00) +p_10_095 <- make_tile_size_plot(0.95, "pf=1.00, tile=0.95", 1.00) + +tile_comparison <- (p_75_04 + p_75_07 + p_75_095) / + (p_10_04 + p_10_07 + p_10_095) + + plot_annotation( + title = "Auto-scaling adapts to tile width", + subtitle = "Row 1: pip_scale=0.75 | Row 2: pip_scale=1.00 (tight packing)" + ) -# Create simple plot -p <- ggplot(test_data, aes(x = x, y = y)) + +ggsave("demo_output/tile_size_comparison.png", tile_comparison, width = 14, height = 9, dpi = 300) + +# ---- Plot 3: ndots 2 to 6 at pip_scale = 0.75 and 1.0 --------------------- + +make_single_tile <- function(n, pip_scale_val) { + d <- data.frame( + x = rep(1, n), + y = rep(1, n), + category = LETTERS[1:n], + value = rep(c(-1, 1, -0.6, 0.6, -0.8, 0.8), length.out = n) # no zeros + ) + ggplot(d, aes(x = x, y = y)) + + geom_dice( + aes(dots = category, fill = value), + ndots = n, + x_length = 1, + y_length = 1, + pip_scale = pip_scale_val + ) + + scale_fill_gradient2( + low = "#2166AC", high = "#762A83", mid = "white", + midpoint = 0, guide = "none" + ) + + labs(title = paste0("n=", n)) + + theme_minimal() + + theme( + axis.text = element_blank(), + axis.title = element_blank(), + axis.ticks = element_blank(), + panel.grid = element_blank(), + plot.title = element_text(size = 10, hjust = 0.5) + ) +} + +row_75 <- lapply(2:6, make_single_tile, pip_scale_val = 0.75) +row_10 <- lapply(2:6, make_single_tile, pip_scale_val = 1.00) + +ndots_comparison <- wrap_plots(c(row_75, row_10), nrow = 2) + + plot_annotation( + title = "ndots 2–6: pip positioning and sizing", + subtitle = "Top row: pip_scale=0.75 | Bottom row: pip_scale=1.00" + ) + +ggsave("demo_output/ndots_comparison.png", ndots_comparison, width = 14, height = 6, dpi = 300) + +# ---- Plot 4: size mapping bypasses auto-scale (existing use case) ---------- + +set.seed(1) +test_data_sized <- test_data +test_data_sized$sig <- runif(16, 0.5, 4) + +p_size_mapped <- ggplot(test_data_sized, aes(x = x, y = y)) + geom_dice( - aes( - dots = category, - fill = value, - size = size_val - ), - ndots = 4, # 4 categories - x_length = 3, + aes(dots = category, fill = value, size = sig), + ndots = 4, + x_length = 4, y_length = 2 + ) + + scale_fill_gradient2( + low = "#2166AC", high = "#762A83", mid = "white", + midpoint = 0, name = "value" + ) + + scale_size_continuous(range = c(1, 5), name = "size") + + labs( + title = "aes(size = ...) bypasses auto-scaling", + subtitle = "pip_scale is ignored; user-mapped sizes are respected" ) -print(p) \ No newline at end of file +ggsave("demo_output/size_mapped_example.png", p_size_mapped, width = 8, height = 5, dpi = 300) + +cat("Generated files:\n") +cat("- demo_output/pip_scale_comparison.png\n") +cat("- demo_output/tile_size_comparison.png\n") +cat("- demo_output/ndots_comparison.png\n") +cat("- demo_output/size_mapped_example.png\n")