From 9e0d29c9781fa719104104dbb08c21418a8567f4 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 14 Aug 2026 15:10:42 +0000 Subject: [PATCH 01/46] initial push --- ratio-analysis/ratio-analysis.qmd | 597 ++++++++++++ ratio-analysis/ratio-analysis.sql | 67 ++ ratio-analysis/renv/activate.R | 1438 +++++++++++++++++++++++++++++ 3 files changed, 2102 insertions(+) create mode 100644 ratio-analysis/ratio-analysis.qmd create mode 100644 ratio-analysis/ratio-analysis.sql create mode 100644 ratio-analysis/renv/activate.R diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd new file mode 100644 index 0000000..61acf50 --- /dev/null +++ b/ratio-analysis/ratio-analysis.qmd @@ -0,0 +1,597 @@ +--- +title: "Ratio Analysis for `r paste0(tools::toTitleCase(gsub('-', ' ', sub('^[0-9]+-', '', sub('\\.xlsx$', '', basename(params$input_file))))), ', ', basename(dirname(params$input_file)))`" +subtitle: "Prepared `r format(Sys.Date(), '%B %d, %Y')`" +format: + pdf: + documentclass: article + geometry: margin=1in + fontsize: 11pt + fig-pos: H + tbl-pos: H + include-in-header: + text: | + \usepackage{colortbl} + \usepackage{xcolor} + \usepackage{booktabs} + \usepackage{longtable} + \usepackage{float} + \usepackage{caption} + \captionsetup[table]{position=top} + \setlength{\aboverulesep}{0pt} + \setlength{\belowrulesep}{0pt} +params: + input_file: "" +execute: + echo: false + warning: false + message: false +--- + +```{r setup} +library(DBI) +library(noctua) +library(openxlsx) +library(dplyr) +library(tidyr) +library(ggplot2) +library(ggspatial) +library(sf) +library(scales) +library(ccao) +library(assessr) +library(readr) +library(knitr) +library(glue) +library(rosm) +library(grid) + +set_default_cachedir("rosm.cache") + +input_file <- params$input_file +file_base <- sub("\\.xlsx$", "", basename(input_file)) +town_code <- substr(file_base, 1, 2) +year_val <- basename(dirname(input_file)) + +town_name <- ccao::town_dict |> + filter(township_code == town_code) |> + pull(township_name) |> + first() + +cap_tbl1 <- glue( + "Town-Level IAAO Statistics — {town_name} Township, {year_val}.", + " Green shading meets IAAO standard; orange shading does not." +) +cap_tbl2 <- glue( + "Ratio Curve by Sale Price Decile — {town_name} Township, {year_val}" +) +cap_tbl3 <- glue( + "Neighborhood-Level Median Ratios — {town_name} Township, {year_val}.", + " Warm colors (red–yellow) indicate under-assessment;", + " green (0.95–1.05) indicates near-standard;", + " cool colors (blue) indicate over-assessment." +) +cap_fig1 <- glue( + "IAAO Metrics: Model vs. Desk Review — {town_name} Township, {year_val}.", + " Green shaded band shows the IAAO acceptable range for each metric." +) +cap_fig2 <- glue( + "Sale Price Ratio Curve — {town_name} Township, {year_val}.", + " Each labeled point is the median ratio within that sale price decile.", + " Dotted lines show the IAAO acceptable range (0.9–1.1)." +) +cap_fig3 <- glue( + "Neighborhood Median Assessment Ratios — {town_name} Township, {year_val}.", + " Green (0.95–1.05) meets the ±5% threshold;", + " warm colors indicate under-assessment;", + " cool colors indicate over-assessment.", + " The right panel shows the change that desk review made." +) + +# --------------------------------------------------------------------------- +# Read desk review inputs +# --------------------------------------------------------------------------- +dr_wb <- loadWorkbook(input_file) +dr_vals <- read.xlsx(dr_wb, sheet = 1) |> + tibble(.name_repair = "unique") |> + select(pin = PIN, desk_review_value = Desk.Review.Value) + +# --------------------------------------------------------------------------- +# Athena: pull model values and the residential PIN universe +# --------------------------------------------------------------------------- +noctua_options(unload = TRUE) +conn <- dbConnect(noctua::athena(), rstudio_conn_tab = FALSE) + +dr_towns <- town_code + +model_vals <- dbGetQuery( + conn = conn, + glue_sql( + read_file("ratio-analysis.sql"), + .con = conn + ) +) + +dbDisconnect(conn) + +# --------------------------------------------------------------------------- +# Join and compute ratios / price deciles +# --------------------------------------------------------------------------- +all_parcels <- dr_vals |> + inner_join(select(model_vals, pin), by = "pin") |> + full_join(model_vals, by = "pin") |> + filter(township_name == town_name) |> + mutate( + sale_date = as.Date(sale_date), + sale_excluded = if_else(is.na(sale_price), NA, is.na(desk_review_value)), + price_decile = ntile( + if_else(sale_excluded %in% TRUE, NA_real_, sale_price), 10 + ), + model_sale_ratio = model_value / sale_price, + desk_review_sale_ratio = desk_review_value / sale_price + ) + +# --------------------------------------------------------------------------- +# Compute statistics +# --------------------------------------------------------------------------- +sales_df <- all_parcels |> + filter(!is.na(sale_price), !sale_excluded %in% TRUE) + +town_stats <- tibble( + model_ratio = median(sales_df$model_sale_ratio, na.rm = TRUE), + model_cod = assessr::cod(sales_df$model_sale_ratio), + model_prd = assessr::prd(sales_df$model_value, sales_df$sale_price), + model_prb = assessr::prb(sales_df$model_value, sales_df$sale_price), + model_mki = assessr::mki(sales_df$model_value, sales_df$sale_price), + desk_review_ratio = median(sales_df$desk_review_sale_ratio, na.rm = TRUE), + desk_review_cod = assessr::cod(sales_df$desk_review_sale_ratio), + desk_review_prd = assessr::prd( + sales_df$desk_review_value, sales_df$sale_price + ), + desk_review_prb = assessr::prb( + sales_df$desk_review_value, sales_df$sale_price + ), + desk_review_mki = assessr::mki( + sales_df$desk_review_value, sales_df$sale_price + ), + price_range = paste( + scales::dollar(min(sales_df$sale_price)), + scales::dollar(max(sales_df$sale_price)), + sep = "–" + ), + number_of_sales = nrow(sales_df) +) + +decile_stats <- sales_df |> + summarize( + model_ratio = median(model_sale_ratio, na.rm = TRUE), + model_cod = assessr::cod(model_sale_ratio), + desk_review_ratio = median(desk_review_sale_ratio, na.rm = TRUE), + desk_review_cod = assessr::cod(desk_review_sale_ratio), + price_range = paste( + scales::dollar(min(sale_price)), + scales::dollar(max(sale_price)), + sep = "–" + ), + number_of_sales = n(), + .by = price_decile + ) |> + arrange(price_decile) + +# --------------------------------------------------------------------------- +# Methods summary values +# --------------------------------------------------------------------------- +n_original_sales <- sum(!is.na(all_parcels$sale_price)) +n_final_sales <- nrow(sales_df) +n_excluded_sales <- n_original_sales - n_final_sales +n_total_pins <- nrow(all_parcels) +pct_with_sale <- round(n_final_sales / n_total_pins * 100, 1) + +sale_dates <- all_parcels$sale_date[!is.na(all_parcels$sale_date)] +min_sale_date <- format(min(sale_dates), "%B %d, %Y") +max_sale_date <- format(max(sale_dates), "%B %d, %Y") + +# --------------------------------------------------------------------------- +# IAAO helpers +# --------------------------------------------------------------------------- +iaao_check <- function(metric, value) { + switch(metric, + "Median Ratio" = value >= 0.90 & value <= 1.10, + "COD" = value <= 15.0, + "PRD" = value >= 0.98 & value <= 1.03, + "PRB" = value >= -0.05 & value <= 0.05, + "MKI" = value >= 0.90 & value <= 1.10, + NA + ) +} + +iaao_color_cell <- function(metric, value, digits = 4) { + v <- round(value, digits) + passes <- iaao_check(metric, value) + if (is.na(passes)) { + return(as.character(v)) + } + hex <- if (passes) "A8DDB5" else "FDBB84" + paste0("\\cellcolor[HTML]{", hex, "} ", v) +} + +ratio_to_hex <- function(ratio) { + case_when( + is.na(ratio) ~ "EEEEEE", + ratio < 0.80 ~ "D73027", + ratio < 0.90 ~ "FC8D59", + ratio < 0.95 ~ "FEE08B", + ratio <= 1.05 ~ "66BD63", + ratio <= 1.10 ~ "ABD9E9", + ratio <= 1.15 ~ "74ADD1", + TRUE ~ "4575B4" + ) +} + +color_ratio_cell <- function(ratio, digits = 3) { + v <- round(ratio, digits) + hex <- ratio_to_hex(ratio) + paste0("\\cellcolor[HTML]{", hex, "} ", v) +} + +ratio_fill_scale <- function(name = "Median\nRatio") { + scale_fill_gradientn( + colors = c( + "#D73027", "#FC8D59", "#FEE08B", + "#66BD63", "#66BD63", "#66BD63", + "#ABD9E9", "#74ADD1", "#4575B4" + ), + values = scales::rescale( + c(0.70, 0.80, 0.90, 0.9499, 0.95, 1.0499, 1.05, 1.15, 1.30) + ), + limits = c(0.70, 1.30), + oob = scales::squish, + na.value = "gray90", + breaks = c(0.80, 0.90, 0.95, 1.00, 1.05, 1.10, 1.20), + labels = c("0.80", "0.90", "0.95", "1.00", "1.05", "1.10", "1.20"), + name = name + ) +} +``` + +## Methods + +This analysis covers **`r town_name` Township** for the `r year_val` assessment cycle. CCAO Data's original sale sample included **`r format(n_original_sales, big.mark = ",")`** arm's-length sales occurring between `r min_sale_date` and `r max_sale_date`, with sale prices ranging from `r town_stats$price_range`. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded at desk review, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales** used throughout this analysis. The township contains **`r format(n_total_pins, big.mark = ",")` residential parcels**; the final sale sample covers **`r pct_with_sale`%** of all residential parcels, indicating the degree to which these sales represent the full assessment universe. + +Two sets of assessments are compared: (1) **Model** values, produced by the model, and (2) **Desk Review** values, reflecting adjustment by CCAO staff. + +## Results + +```{r tbl-1} +#| tbl-cap: !expr 'cap_tbl1' + +ts <- town_stats + +iaao_table <- data.frame( + Metric = c("Median Ratio", "COD", "PRD", "PRB", "MKI", "N Sales"), + `IAAO Standard` = c( + "0.90 -- 1.10", + "$\\leq$ 15.0", + "0.98 -- 1.03", + "$\\pm$0.05", + "0.90 -- 1.10", + "---" + ), + Model = c( + iaao_color_cell("Median Ratio", ts$model_ratio, digits = 3), + iaao_color_cell("COD", ts$model_cod, digits = 1), + iaao_color_cell("PRD", ts$model_prd, digits = 4), + iaao_color_cell("PRB", ts$model_prb, digits = 4), + iaao_color_cell("MKI", ts$model_mki, digits = 4), + format(ts$number_of_sales, big.mark = ",") + ), + `Desk Review` = c( + iaao_color_cell("Median Ratio", ts$desk_review_ratio, digits = 3), + iaao_color_cell("COD", ts$desk_review_cod, digits = 1), + iaao_color_cell("PRD", ts$desk_review_prd, digits = 4), + iaao_color_cell("PRB", ts$desk_review_prb, digits = 4), + iaao_color_cell("MKI", ts$desk_review_mki, digits = 4), + format(ts$number_of_sales, big.mark = ",") + ), + check.names = FALSE +) + +knitr::kable( + iaao_table, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + col.names = c("Metric", "IAAO Standard", "Model", "Desk Review"), + align = c("l", "c", "r", "r") +) +``` + +```{r nbhd-ratios-prep} +nbhd_ratios <- all_parcels |> + filter(!is.na(sale_price), !sale_excluded %in% TRUE) |> + mutate(neighborhood_number = gsub("-", "", neighborhood_number)) |> + summarize( + model_ratio = median(model_sale_ratio, na.rm = TRUE), + dr_ratio = median(desk_review_sale_ratio, na.rm = TRUE), + n_sales = n(), + .by = neighborhood_number + ) +``` + +```{r tbl-3} +#| tbl-cap: !expr 'cap_tbl3' + +all_nbhds <- all_parcels |> + distinct(neighborhood_number) |> + arrange(neighborhood_number) + +nbhd_table_data <- all_nbhds |> + left_join(nbhd_ratios, by = "neighborhood_number") |> + mutate( + `NBHD` = neighborhood_number, + `Model Ratio` = ifelse( + is.na(model_ratio), "---", color_ratio_cell(model_ratio, digits = 3) + ), + `DR Ratio` = ifelse( + is.na(dr_ratio), "---", color_ratio_cell(dr_ratio, digits = 3) + ), + `N Sales` = ifelse(is.na(n_sales), 0L, n_sales) + ) |> + select(`NBHD`, `Model Ratio`, `DR Ratio`, `N Sales`) + +knitr::kable( + nbhd_table_data, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + longtable = TRUE, + align = c("l", "r", "r", "r"), + col.names = c("NBHD", "Model Ratio", "DR Ratio", "N Sales") +) +``` + +```{r fig-1} +#| fig-cap: !expr 'cap_fig1' +#| fig-height: 7 +#| fig-width: 7 + +metric_order <- c("Median Ratio", "COD", "PRD", "PRB", "MKI") + +ts_wide <- tibble( + Metric = factor(metric_order, levels = metric_order), + Model = c( + ts$model_ratio, ts$model_cod, ts$model_prd, + ts$model_prb, ts$model_mki + ), + `Desk Review` = c( + ts$desk_review_ratio, ts$desk_review_cod, ts$desk_review_prd, + ts$desk_review_prb, ts$desk_review_mki + ) +) + +ts_long <- ts_wide |> + pivot_longer( + c(Model, `Desk Review`), + names_to = "Stage", values_to = "Value" + ) |> + mutate(Stage = factor(Stage, levels = c("Model", "Desk Review"))) + +iaao_bands <- tibble( + Metric = factor(metric_order, levels = metric_order), + xmin = c(0.90, 0, 0.98, -0.05, 0.90), + xmax = c(1.10, 15.0, 1.03, 0.05, 1.10) +) + +ggplot() + + geom_rect( + data = iaao_bands, + aes(xmin = xmin, xmax = xmax, ymin = 0.1, ymax = 1.9), + fill = "#A8DDB5", alpha = 0.45 + ) + + geom_segment( + data = ts_wide, + aes(x = Model, xend = `Desk Review`, y = 1, yend = 1), + color = "gray40", linewidth = 2, lineend = "round" + ) + + geom_point( + data = ts_long, + aes(x = Value, y = 1, color = Stage, shape = Stage), + size = 5 + ) + + geom_text( + data = ts_long, + aes(x = Value, y = 1, label = round(Value, 3), color = Stage), + vjust = -1.6, size = 3, fontface = "bold" + ) + + facet_wrap(~Metric, scales = "free_x", ncol = 1) + + scale_color_manual( + values = c("Model" = "#4575B4", "Desk Review" = "#D73027") + ) + + scale_shape_manual(values = c("Model" = 16, "Desk Review" = 17)) + + scale_y_continuous(limits = c(0, 2)) + + theme_minimal(base_size = 11) + + theme( + axis.text.y = element_blank(), + axis.ticks.y = element_blank(), + panel.grid.major.y = element_blank(), + panel.grid.minor.y = element_blank(), + strip.text = element_text(face = "bold", size = 11), + legend.position = "bottom" + ) + + labs(x = NULL, y = NULL, color = "Stage", shape = "Stage") +``` + +```{r fig-2} +#| fig-cap: !expr 'cap_fig2' +#| fig-height: 5 +#| fig-width: 7 + +decile_long <- decile_stats |> + select(price_decile, model_ratio, desk_review_ratio) |> + pivot_longer( + cols = c(model_ratio, desk_review_ratio), + names_to = "Stage", + values_to = "Sale Ratio" + ) |> + mutate( + Stage = case_when( + Stage == "model_ratio" ~ "Model", + Stage == "desk_review_ratio" ~ "Desk Review" + ), + Stage = factor(Stage, levels = c("Model", "Desk Review")) + ) + +axis_labels <- all_parcels |> + filter(!is.na(sale_price), !sale_excluded %in% TRUE, !is.na(price_decile)) |> + summarize( + min_price = min(sale_price), + max_price = max(sale_price), + .by = price_decile + ) |> + arrange(price_decile) |> + mutate(label = paste0( + price_decile, "\n", + scales::dollar(min_price, scale_cut = scales::cut_short_scale()), + "–\n", + scales::dollar(max_price, scale_cut = scales::cut_short_scale()) + )) |> + (\(df) setNames(df$label, df$price_decile))() + +y_min <- min(decile_long$`Sale Ratio`, 0.7, na.rm = TRUE) +y_max <- max(decile_long$`Sale Ratio`, 1.3, na.rm = TRUE) + +ggplot( + decile_long, + aes( + x = price_decile, + y = `Sale Ratio`, + group = Stage, + color = Stage, + label = round(`Sale Ratio`, 2) + ) +) + + geom_hline(yintercept = 1, color = "darkgreen", linewidth = 1) + + geom_hline( + yintercept = 0.9, linetype = "dotted", color = "black", linewidth = 0.8 + ) + + geom_hline( + yintercept = 1.1, linetype = "dotted", color = "black", linewidth = 0.8 + ) + + annotate("text", + x = 1, y = 1.11, + label = "IAAO Range (0.9–1.1)", hjust = 0, vjust = -0.4, size = 3.5 + ) + + geom_line(linewidth = 1) + + geom_label(show.legend = FALSE, size = 3) + + scale_color_manual( + values = c("Model" = "#4575B4", "Desk Review" = "#D73027") + ) + + scale_x_continuous(breaks = 1:10, labels = axis_labels) + + scale_y_continuous( + breaks = seq(floor(y_min * 10) / 10, ceiling(y_max * 10) / 10, by = 0.1) + ) + + coord_cartesian(ylim = c(y_min, y_max)) + + theme_minimal(base_size = 11) + + theme(axis.text.x = element_text(size = 7.5)) + + labs(x = "Sale Price Decile", y = "Median Sale Ratio", color = "Stage") +``` + +```{r tbl-2} +#| tbl-cap: !expr 'cap_tbl2' + +decile_display <- decile_stats |> + select( + Decile = price_decile, + `Price Range` = price_range, + `N Sales` = number_of_sales, + `Model Ratio` = model_ratio, + `DR Ratio` = desk_review_ratio + ) |> + mutate( + `Model Ratio` = round(`Model Ratio`, 3), + `DR Ratio` = round(`DR Ratio`, 3) + ) + +knitr::kable( + decile_display, + format = "latex", + booktabs = TRUE, + linesep = "", + align = c("c", "l", "r", "r", "r") +) +``` + +```{r fig-3-prep} +neighborhoods <- ccao::nbhd_shp |> + filter(township_name == town_name) |> + select(town_nbhd, geometry) + +map_data <- neighborhoods |> + left_join(nbhd_ratios, by = c("town_nbhd" = "neighborhood_number")) |> + mutate(diff = dr_ratio - model_ratio) + +map_theme <- theme_void(base_size = 9) + + theme( + legend.position = "right", + plot.title = element_text(face = "bold", size = 10) + ) + +map_model <- ggplot() + + annotation_map_tile(type = "cartolight", zoomin = 0) + + geom_sf( + data = map_data, aes(fill = model_ratio), alpha = 0.85, linewidth = 0.1 + ) + + ratio_fill_scale() + + map_theme + + labs(title = "Model") + +map_dr <- ggplot() + + annotation_map_tile(type = "cartolight", zoomin = 0) + + geom_sf( + data = map_data, aes(fill = dr_ratio), alpha = 0.85, linewidth = 0.1 + ) + + ratio_fill_scale() + + map_theme + + labs(title = "Desk Review") + +diff_limit <- max(abs(map_data$diff), na.rm = TRUE) +diff_limit <- ceiling(diff_limit * 10) / 10 + +map_diff <- ggplot() + + annotation_map_tile(type = "cartolight", zoomin = 0) + + geom_sf(data = map_data, aes(fill = diff), alpha = 0.85, linewidth = 0.1) + + scale_fill_gradient2( + low = "#D73027", + mid = "white", + high = "#4575B4", + midpoint = 0, + limits = c(-diff_limit, diff_limit), + oob = scales::squish, + na.value = "gray90", + name = "Model −\nDesk Review" + ) + + map_theme + + labs(title = "Model − Desk Review") +``` + +```{r fig-3} +#| fig-cap: !expr 'cap_fig3' +#| fig-height: 5.5 +#| fig-width: 8.5 + +grid.newpage() +print(map_model, vp = viewport( + x = 0, y = 0, width = 1 / 3, height = 1, + just = c("left", "bottom") +)) +print(map_dr, vp = viewport( + x = 1 / 3, y = 0, width = 1 / 3, height = 1, + just = c("left", "bottom") +)) +print(map_diff, vp = viewport( + x = 2 / 3, y = 0, width = 1 / 3, height = 1, + just = c("left", "bottom") +)) +``` + diff --git a/ratio-analysis/ratio-analysis.sql b/ratio-analysis/ratio-analysis.sql new file mode 100644 index 0000000..9476dea --- /dev/null +++ b/ratio-analysis/ratio-analysis.sql @@ -0,0 +1,67 @@ +-- Final model run IDs by township and year +WITH final_models AS ( + SELECT + final_model.run_id, + towns.township_code + FROM model.final_model + CROSS JOIN + UNNEST(final_model.township_code_coverage) AS towns (township_code) + -- Year will need to be adjusted so that desk review to model values join in + -- R script is 1 to 1. + WHERE final_model.year = CAST(YEAR(CURRENT_DATE) AS VARCHAR) + AND final_model.type = 'res' +), + +-- Use final model run IDs to grab the model values we need to compare Res Val's +-- desk review values against +model_vals AS ( + SELECT + assessment_pin.meta_pin AS pin, + assessment_pin.pred_pin_final_fmv_round AS model_value, + assessment_pin.sale_ratio_study_price AS sale_price, + assessment_pin.sale_ratio_study_date AS sale_date, + assessment_pin.sale_ratio_study_document_num AS sale_document_number + FROM model.assessment_pin + INNER JOIN final_models + ON assessment_pin.run_id = final_models.run_id + AND assessment_pin.township_code = final_models.township_code +), + +-- Res Val provides PINs that sometimes only appear in 2025 or 2026 in +-- default.vw_pin_universe. Make sure we grab one and only one row for every PIN +-- that appears in either year, regardless of whether they have a model value. +most_recent_pin AS ( + SELECT + uni.pin, + uni.township_name, + uni.nbhd_code AS neighborhood_number, + ROW_NUMBER() OVER ( + PARTITION BY + uni.pin + ORDER BY uni.year DESC + ) AS rank + FROM default.vw_pin_universe AS uni + -- Make sure we only grab parcels valued by the res avm, for the towns we're + -- processing. + INNER JOIN ccao.class_dict + ON uni.class = class_dict.class_code + AND class_dict.modeling_group IN ('SF', 'MF', 'BB') + WHERE uni.year IN ( + CAST(YEAR(CURRENT_DATE) - 1 AS VARCHAR), + CAST(YEAR(CURRENT_DATE) AS VARCHAR) + ) + AND uni.township_code IN ({dr_towns*}) -- noqa +) + +SELECT + vpu.pin, + vpu.township_name, + vpu.neighborhood_number, + model_vals.model_value, + model_vals.sale_price, + model_vals.sale_date, + model_vals.sale_document_number +FROM most_recent_pin AS vpu +LEFT JOIN model_vals + ON vpu.pin = model_vals.pin +WHERE vpu.rank = 1 diff --git a/ratio-analysis/renv/activate.R b/ratio-analysis/renv/activate.R new file mode 100644 index 0000000..abd9432 --- /dev/null +++ b/ratio-analysis/renv/activate.R @@ -0,0 +1,1438 @@ + +local({ + + # the requested version of renv + version <- "1.1.5" + attr(version, "md5") <- "770fcbc2c4616e8fbcb187cccd46a6b1" + attr(version, "sha") <- NULL + + # the project directory + project <- Sys.getenv("RENV_PROJECT") + if (!nzchar(project)) + project <- getwd() + + # use start-up diagnostics if enabled + diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE") + if (diagnostics) { + start <- Sys.time() + profile <- tempfile("renv-startup-", fileext = ".Rprof") + utils::Rprof(profile) + on.exit({ + utils::Rprof(NULL) + elapsed <- signif(difftime(Sys.time(), start, units = "auto"), digits = 2L) + writeLines(sprintf("- renv took %s to run the autoloader.", format(elapsed))) + writeLines(sprintf("- Profile: %s", profile)) + print(utils::summaryRprof(profile)) + }, add = TRUE) + } + + # figure out whether the autoloader is enabled + enabled <- local({ + + # first, check config option + override <- getOption("renv.config.autoloader.enabled") + if (!is.null(override)) + return(override) + + # if we're being run in a context where R_LIBS is already set, + # don't load -- presumably we're being run as a sub-process and + # the parent process has already set up library paths for us + rcmd <- Sys.getenv("R_CMD", unset = NA) + rlibs <- Sys.getenv("R_LIBS", unset = NA) + if (!is.na(rlibs) && !is.na(rcmd)) + return(FALSE) + + # next, check environment variables + # prefer using the configuration one in the future + envvars <- c( + "RENV_CONFIG_AUTOLOADER_ENABLED", + "RENV_AUTOLOADER_ENABLED", + "RENV_ACTIVATE_PROJECT" + ) + + for (envvar in envvars) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) + return(tolower(envval) %in% c("true", "t", "1")) + } + + # enable by default + TRUE + + }) + + # bail if we're not enabled + if (!enabled) { + + # if we're not enabled, we might still need to manually load + # the user profile here + profile <- Sys.getenv("R_PROFILE_USER", unset = "~/.Rprofile") + if (file.exists(profile)) { + cfg <- Sys.getenv("RENV_CONFIG_USER_PROFILE", unset = "TRUE") + if (tolower(cfg) %in% c("true", "t", "1")) + sys.source(profile, envir = globalenv()) + } + + return(FALSE) + + } + + # avoid recursion + if (identical(getOption("renv.autoloader.running"), TRUE)) { + warning("ignoring recursive attempt to run renv autoloader") + return(invisible(TRUE)) + } + + # signal that we're loading renv during R startup + options(renv.autoloader.running = TRUE) + on.exit(options(renv.autoloader.running = NULL), add = TRUE) + + # signal that we've consented to use renv + options(renv.consent = TRUE) + + # load the 'utils' package eagerly -- this ensures that renv shims, which + # mask 'utils' packages, will come first on the search path + library(utils, lib.loc = .Library) + + # unload renv if it's already been loaded + if ("renv" %in% loadedNamespaces()) + unloadNamespace("renv") + + # load bootstrap tools + ansify <- function(text) { + if (renv_ansify_enabled()) + renv_ansify_enhanced(text) + else + renv_ansify_default(text) + } + + renv_ansify_enabled <- function() { + + override <- Sys.getenv("RENV_ANSIFY_ENABLED", unset = NA) + if (!is.na(override)) + return(as.logical(override)) + + pane <- Sys.getenv("RSTUDIO_CHILD_PROCESS_PANE", unset = NA) + if (identical(pane, "build")) + return(FALSE) + + testthat <- Sys.getenv("TESTTHAT", unset = "false") + if (tolower(testthat) %in% "true") + return(FALSE) + + iderun <- Sys.getenv("R_CLI_HAS_HYPERLINK_IDE_RUN", unset = "false") + if (tolower(iderun) %in% "false") + return(FALSE) + + TRUE + + } + + renv_ansify_default <- function(text) { + text + } + + renv_ansify_enhanced <- function(text) { + + # R help links + pattern <- "`\\?(renv::(?:[^`])+)`" + replacement <- "`\033]8;;x-r-help:\\1\a?\\1\033]8;;\a`" + text <- gsub(pattern, replacement, text, perl = TRUE) + + # runnable code + pattern <- "`(renv::(?:[^`])+)`" + replacement <- "`\033]8;;x-r-run:\\1\a\\1\033]8;;\a`" + text <- gsub(pattern, replacement, text, perl = TRUE) + + # return ansified text + text + + } + + renv_ansify_init <- function() { + + envir <- renv_envir_self() + if (renv_ansify_enabled()) + assign("ansify", renv_ansify_enhanced, envir = envir) + else + assign("ansify", renv_ansify_default, envir = envir) + + } + + `%||%` <- function(x, y) { + if (is.null(x)) y else x + } + + catf <- function(fmt, ..., appendLF = TRUE) { + + quiet <- getOption("renv.bootstrap.quiet", default = FALSE) + if (quiet) + return(invisible()) + + # also check for config environment variables that should suppress messages + # https://github.com/rstudio/renv/issues/2214 + enabled <- Sys.getenv("RENV_CONFIG_STARTUP_QUIET", unset = NA) + if (!is.na(enabled) && tolower(enabled) %in% c("true", "1")) + return(invisible()) + + enabled <- Sys.getenv("RENV_CONFIG_SYNCHRONIZED_CHECK", unset = NA) + if (!is.na(enabled) && tolower(enabled) %in% c("false", "0")) + return(invisible()) + + msg <- sprintf(fmt, ...) + cat(msg, file = stdout(), sep = if (appendLF) "\n" else "") + + invisible(msg) + + } + + header <- function(label, + ..., + prefix = "#", + suffix = "-", + n = min(getOption("width"), 78)) + { + label <- sprintf(label, ...) + n <- max(n - nchar(label) - nchar(prefix) - 2L, 8L) + if (n <= 0) + return(paste(prefix, label)) + + tail <- paste(rep.int(suffix, n), collapse = "") + paste0(prefix, " ", label, " ", tail) + + } + + heredoc <- function(text, leave = 0) { + + # remove leading, trailing whitespace + trimmed <- gsub("^\\s*\\n|\\n\\s*$", "", text) + + # split into lines + lines <- strsplit(trimmed, "\n", fixed = TRUE)[[1L]] + + # compute common indent + indent <- regexpr("[^[:space:]]", lines) + common <- min(setdiff(indent, -1L)) - leave + text <- paste(substring(lines, common), collapse = "\n") + + # substitute in ANSI links for executable renv code + ansify(text) + + } + + bootstrap <- function(version, library) { + + friendly <- renv_bootstrap_version_friendly(version) + section <- header(sprintf("Bootstrapping renv %s", friendly)) + catf(section) + + # ensure the target library path exists; required for file.copy(..., recursive = TRUE) + dir.create(library, showWarnings = FALSE, recursive = TRUE) + + # try to install renv from cache + md5 <- attr(version, "md5", exact = TRUE) + if (length(md5)) { + pkgpath <- renv_bootstrap_find(version) + if (length(pkgpath) && file.exists(pkgpath)) { + ok <- file.copy(pkgpath, library, recursive = TRUE) + if (isTRUE(ok)) + return(invisible()) + } + } + + # attempt to download renv + catf("- Downloading renv ... ", appendLF = FALSE) + withCallingHandlers( + tarball <- renv_bootstrap_download(version), + error = function(err) { + catf("FAILED") + stop("failed to download:\n", conditionMessage(err)) + } + ) + catf("OK") + on.exit(unlink(tarball), add = TRUE) + + # now attempt to install + catf("- Installing renv ... ", appendLF = FALSE) + withCallingHandlers( + status <- renv_bootstrap_install(version, tarball, library), + error = function(err) { + catf("FAILED") + stop("failed to install:\n", conditionMessage(err)) + } + ) + catf("OK") + + # add empty line to break up bootstrapping from normal output + catf("") + return(invisible()) + } + + renv_bootstrap_tests_running <- function() { + getOption("renv.tests.running", default = FALSE) + } + + renv_bootstrap_repos <- function() { + + # get CRAN repository + cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") + + # check for repos override + repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) + if (!is.na(repos)) { + + # split on ';' if present + parts <- strsplit(repos, ";", fixed = TRUE)[[1L]] + + # split into named repositories if present + idx <- regexpr("=", parts, fixed = TRUE) + keys <- substring(parts, 1L, idx - 1L) + vals <- substring(parts, idx + 1L) + names(vals) <- keys + + # if we have a single unnamed repository, call it CRAN + if (length(vals) == 1L && identical(keys, "")) + names(vals) <- "CRAN" + + return(vals) + + } + + # check for lockfile repositories + repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) + if (!inherits(repos, "error") && length(repos)) + return(repos) + + # retrieve current repos + repos <- getOption("repos") + + # ensure @CRAN@ entries are resolved + repos[repos == "@CRAN@"] <- cran + + # add in renv.bootstrap.repos if set + default <- c(FALLBACK = "https://cloud.r-project.org") + extra <- getOption("renv.bootstrap.repos", default = default) + repos <- c(repos, extra) + + # remove duplicates that might've snuck in + dupes <- duplicated(repos) | duplicated(names(repos)) + repos[!dupes] + + } + + renv_bootstrap_repos_lockfile <- function() { + + lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") + if (!file.exists(lockpath)) + return(NULL) + + lockfile <- tryCatch(renv_json_read(lockpath), error = identity) + if (inherits(lockfile, "error")) { + warning(lockfile) + return(NULL) + } + + repos <- lockfile$R$Repositories + if (length(repos) == 0) + return(NULL) + + keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) + vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) + names(vals) <- keys + + return(vals) + + } + + renv_bootstrap_download <- function(version) { + + sha <- attr(version, "sha", exact = TRUE) + + methods <- if (!is.null(sha)) { + + # attempting to bootstrap a development version of renv + c( + function() renv_bootstrap_download_tarball(sha), + function() renv_bootstrap_download_github(sha) + ) + + } else { + + # attempting to bootstrap a release version of renv + c( + function() renv_bootstrap_download_tarball(version), + function() renv_bootstrap_download_cran_latest(version), + function() renv_bootstrap_download_cran_archive(version) + ) + + } + + for (method in methods) { + path <- tryCatch(method(), error = identity) + if (is.character(path) && file.exists(path)) + return(path) + } + + stop("All download methods failed") + + } + + renv_bootstrap_download_impl <- function(url, destfile) { + + mode <- "wb" + + # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715 + fixup <- + Sys.info()[["sysname"]] == "Windows" && + substring(url, 1L, 5L) == "file:" + + if (fixup) + mode <- "w+b" + + args <- list( + url = url, + destfile = destfile, + mode = mode, + quiet = TRUE + ) + + if ("headers" %in% names(formals(utils::download.file))) { + headers <- renv_bootstrap_download_custom_headers(url) + if (length(headers) && is.character(headers)) + args$headers <- headers + } + + do.call(utils::download.file, args) + + } + + renv_bootstrap_download_custom_headers <- function(url) { + + headers <- getOption("renv.download.headers") + if (is.null(headers)) + return(character()) + + if (!is.function(headers)) + stopf("'renv.download.headers' is not a function") + + headers <- headers(url) + if (length(headers) == 0L) + return(character()) + + if (is.list(headers)) + headers <- unlist(headers, recursive = FALSE, use.names = TRUE) + + ok <- + is.character(headers) && + is.character(names(headers)) && + all(nzchar(names(headers))) + + if (!ok) + stop("invocation of 'renv.download.headers' did not return a named character vector") + + headers + + } + + renv_bootstrap_download_cran_latest <- function(version) { + + spec <- renv_bootstrap_download_cran_latest_find(version) + type <- spec$type + repos <- spec$repos + + baseurl <- utils::contrib.url(repos = repos, type = type) + ext <- if (identical(type, "source")) + ".tar.gz" + else if (Sys.info()[["sysname"]] == "Windows") + ".zip" + else + ".tgz" + name <- sprintf("renv_%s%s", version, ext) + url <- paste(baseurl, name, sep = "/") + + destfile <- file.path(tempdir(), name) + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (inherits(status, "condition")) + return(FALSE) + + # report success and return + destfile + + } + + renv_bootstrap_download_cran_latest_find <- function(version) { + + # check whether binaries are supported on this system + binary <- + getOption("renv.bootstrap.binary", default = TRUE) && + !identical(.Platform$pkgType, "source") && + !identical(getOption("pkgType"), "source") && + Sys.info()[["sysname"]] %in% c("Darwin", "Windows") + + types <- c(if (binary) "binary", "source") + + # iterate over types + repositories + for (type in types) { + for (repos in renv_bootstrap_repos()) { + + # build arguments for utils::available.packages() call + args <- list(type = type, repos = repos) + + # add custom headers if available -- note that + # utils::available.packages() will pass this to download.file() + if ("headers" %in% names(formals(utils::download.file))) { + headers <- renv_bootstrap_download_custom_headers(repos) + if (length(headers) && is.character(headers)) + args$headers <- headers + } + + # retrieve package database + db <- tryCatch( + as.data.frame( + do.call(utils::available.packages, args), + stringsAsFactors = FALSE + ), + error = identity + ) + + if (inherits(db, "error")) + next + + # check for compatible entry + entry <- db[db$Package %in% "renv" & db$Version %in% version, ] + if (nrow(entry) == 0) + next + + # found it; return spec to caller + spec <- list(entry = entry, type = type, repos = repos) + return(spec) + + } + } + + # if we got here, we failed to find renv + fmt <- "renv %s is not available from your declared package repositories" + stop(sprintf(fmt, version)) + + } + + renv_bootstrap_download_cran_archive <- function(version) { + + name <- sprintf("renv_%s.tar.gz", version) + repos <- renv_bootstrap_repos() + urls <- file.path(repos, "src/contrib/Archive/renv", name) + destfile <- file.path(tempdir(), name) + + for (url in urls) { + + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (identical(status, 0L)) + return(destfile) + + } + + return(FALSE) + + } + + renv_bootstrap_find <- function(version) { + + path <- renv_bootstrap_find_cache(version) + if (length(path) && file.exists(path)) { + catf("- Using renv %s from global package cache", version) + return(path) + } + + } + + renv_bootstrap_find_cache <- function(version) { + + md5 <- attr(version, "md5", exact = TRUE) + if (is.null(md5)) + return() + + # infer path to renv cache + cache <- Sys.getenv("RENV_PATHS_CACHE", unset = "") + if (!nzchar(cache)) { + root <- Sys.getenv("RENV_PATHS_ROOT", unset = NA) + if (!is.na(root)) + cache <- file.path(root, "cache") + } + + if (!nzchar(cache)) { + tools <- asNamespace("tools") + if (is.function(tools$R_user_dir)) { + root <- tools$R_user_dir("renv", "cache") + cache <- file.path(root, "cache") + } + } + + # start completing path to cache + file.path( + cache, + renv_bootstrap_cache_version(), + renv_bootstrap_platform_prefix(), + "renv", + version, + md5, + "renv" + ) + + } + + renv_bootstrap_download_tarball <- function(version) { + + # if the user has provided the path to a tarball via + # an environment variable, then use it + tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) + if (is.na(tarball)) + return() + + # allow directories + if (dir.exists(tarball)) { + name <- sprintf("renv_%s.tar.gz", version) + tarball <- file.path(tarball, name) + } + + # bail if it doesn't exist + if (!file.exists(tarball)) { + + # let the user know we weren't able to honour their request + fmt <- "- RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." + msg <- sprintf(fmt, tarball) + warning(msg) + + # bail + return() + + } + + catf("- Using local tarball '%s'.", tarball) + tarball + + } + + renv_bootstrap_github_token <- function() { + for (envvar in c("GITHUB_TOKEN", "GITHUB_PAT", "GH_TOKEN")) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) + return(envval) + } + } + + renv_bootstrap_download_github <- function(version) { + + enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") + if (!identical(enabled, "TRUE")) + return(FALSE) + + # prepare download options + token <- renv_bootstrap_github_token() + if (is.null(token)) + token <- "" + + if (nzchar(Sys.which("curl")) && nzchar(token)) { + fmt <- "--location --fail --header \"Authorization: token %s\"" + extra <- sprintf(fmt, token) + saved <- options("download.file.method", "download.file.extra") + options(download.file.method = "curl", download.file.extra = extra) + on.exit(do.call(base::options, saved), add = TRUE) + } else if (nzchar(Sys.which("wget")) && nzchar(token)) { + fmt <- "--header=\"Authorization: token %s\"" + extra <- sprintf(fmt, token) + saved <- options("download.file.method", "download.file.extra") + options(download.file.method = "wget", download.file.extra = extra) + on.exit(do.call(base::options, saved), add = TRUE) + } + + url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) + name <- sprintf("renv_%s.tar.gz", version) + destfile <- file.path(tempdir(), name) + + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), + condition = identity + ) + + if (!identical(status, 0L)) + return(FALSE) + + renv_bootstrap_download_augment(destfile) + + return(destfile) + + } + + # Add Sha to DESCRIPTION. This is stop gap until #890, after which we + # can use renv::install() to fully capture metadata. + renv_bootstrap_download_augment <- function(destfile) { + sha <- renv_bootstrap_git_extract_sha1_tar(destfile) + if (is.null(sha)) { + return() + } + + # Untar + tempdir <- tempfile("renv-github-") + on.exit(unlink(tempdir, recursive = TRUE), add = TRUE) + untar(destfile, exdir = tempdir) + pkgdir <- dir(tempdir, full.names = TRUE)[[1]] + + # Modify description + desc_path <- file.path(pkgdir, "DESCRIPTION") + desc_lines <- readLines(desc_path) + remotes_fields <- c( + "RemoteType: github", + "RemoteHost: api.github.com", + "RemoteRepo: renv", + "RemoteUsername: rstudio", + "RemotePkgRef: rstudio/renv", + paste("RemoteRef: ", sha), + paste("RemoteSha: ", sha) + ) + writeLines(c(desc_lines[desc_lines != ""], remotes_fields), con = desc_path) + + # Re-tar + local({ + old <- setwd(tempdir) + on.exit(setwd(old), add = TRUE) + + tar(destfile, compression = "gzip") + }) + invisible() + } + + # Extract the commit hash from a git archive. Git archives include the SHA1 + # hash as the comment field of the tarball pax extended header + # (see https://www.kernel.org/pub/software/scm/git/docs/git-archive.html) + # For GitHub archives this should be the first header after the default one + # (512 byte) header. + renv_bootstrap_git_extract_sha1_tar <- function(bundle) { + + # open the bundle for reading + # We use gzcon for everything because (from ?gzcon) + # > Reading from a connection which does not supply a 'gzip' magic + # > header is equivalent to reading from the original connection + conn <- gzcon(file(bundle, open = "rb", raw = TRUE)) + on.exit(close(conn)) + + # The default pax header is 512 bytes long and the first pax extended header + # with the comment should be 51 bytes long + # `52 comment=` (11 chars) + 40 byte SHA1 hash + len <- 0x200 + 0x33 + res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len]) + + if (grepl("^52 comment=", res)) { + sub("52 comment=", "", res) + } else { + NULL + } + } + + renv_bootstrap_install <- function(version, tarball, library) { + + # attempt to install it into project library + dir.create(library, showWarnings = FALSE, recursive = TRUE) + output <- renv_bootstrap_install_impl(library, tarball) + + # check for successful install + status <- attr(output, "status") + if (is.null(status) || identical(status, 0L)) + return(status) + + # an error occurred; report it + header <- "installation of renv failed" + lines <- paste(rep.int("=", nchar(header)), collapse = "") + text <- paste(c(header, lines, output), collapse = "\n") + stop(text) + + } + + renv_bootstrap_install_impl <- function(library, tarball) { + + # invoke using system2 so we can capture and report output + bin <- R.home("bin") + exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" + R <- file.path(bin, exe) + + args <- c( + "--vanilla", "CMD", "INSTALL", "--no-multiarch", + "-l", shQuote(path.expand(library)), + shQuote(path.expand(tarball)) + ) + + system2(R, args, stdout = TRUE, stderr = TRUE) + + } + + renv_bootstrap_platform_prefix_default <- function() { + + # read version component + version <- Sys.getenv("RENV_PATHS_VERSION", unset = "R-%v") + + # expand placeholders + placeholders <- list( + list("%v", format(getRversion()[1, 1:2])), + list("%V", format(getRversion()[1, 1:3])) + ) + + for (placeholder in placeholders) + version <- gsub(placeholder[[1L]], placeholder[[2L]], version, fixed = TRUE) + + # include SVN revision for development versions of R + # (to avoid sharing platform-specific artefacts with released versions of R) + devel <- + identical(R.version[["status"]], "Under development (unstable)") || + identical(R.version[["nickname"]], "Unsuffered Consequences") + + if (devel) + version <- paste(version, R.version[["svn rev"]], sep = "-r") + + version + + } + + renv_bootstrap_platform_prefix <- function() { + + # construct version prefix + version <- renv_bootstrap_platform_prefix_default() + + # build list of path components + components <- c(version, R.version$platform) + + # include prefix if provided by user + prefix <- renv_bootstrap_platform_prefix_impl() + if (!is.na(prefix) && nzchar(prefix)) + components <- c(prefix, components) + + # build prefix + paste(components, collapse = "/") + + } + + renv_bootstrap_platform_prefix_impl <- function() { + + # if an explicit prefix has been supplied, use it + prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA) + if (!is.na(prefix)) + return(prefix) + + # if the user has requested an automatic prefix, generate it + auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) + if (is.na(auto) && getRversion() >= "4.4.0") + auto <- "TRUE" + + if (auto %in% c("TRUE", "True", "true", "1")) + return(renv_bootstrap_platform_prefix_auto()) + + # empty string on failure + "" + + } + + renv_bootstrap_platform_prefix_auto <- function() { + + prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity) + if (inherits(prefix, "error") || prefix %in% "unknown") { + + msg <- paste( + "failed to infer current operating system", + "please file a bug report at https://github.com/rstudio/renv/issues", + sep = "; " + ) + + warning(msg) + + } + + prefix + + } + + renv_bootstrap_platform_os <- function() { + + sysinfo <- Sys.info() + sysname <- sysinfo[["sysname"]] + + # handle Windows + macOS up front + if (sysname == "Windows") + return("windows") + else if (sysname == "Darwin") + return("macos") + + # check for os-release files + for (file in c("/etc/os-release", "/usr/lib/os-release")) + if (file.exists(file)) + return(renv_bootstrap_platform_os_via_os_release(file, sysinfo)) + + # check for redhat-release files + if (file.exists("/etc/redhat-release")) + return(renv_bootstrap_platform_os_via_redhat_release()) + + "unknown" + + } + + renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) { + + # read /etc/os-release + release <- utils::read.table( + file = file, + sep = "=", + quote = c("\"", "'"), + col.names = c("Key", "Value"), + comment.char = "#", + stringsAsFactors = FALSE + ) + + vars <- as.list(release$Value) + names(vars) <- release$Key + + # get os name + os <- tolower(sysinfo[["sysname"]]) + + # read id + id <- "unknown" + for (field in c("ID", "ID_LIKE")) { + if (field %in% names(vars) && nzchar(vars[[field]])) { + id <- vars[[field]] + break + } + } + + # read version + version <- "unknown" + for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) { + if (field %in% names(vars) && nzchar(vars[[field]])) { + version <- vars[[field]] + break + } + } + + # join together + paste(c(os, id, version), collapse = "-") + + } + + renv_bootstrap_platform_os_via_redhat_release <- function() { + + # read /etc/redhat-release + contents <- readLines("/etc/redhat-release", warn = FALSE) + + # infer id + id <- if (grepl("centos", contents, ignore.case = TRUE)) + "centos" + else if (grepl("redhat", contents, ignore.case = TRUE)) + "redhat" + else + "unknown" + + # try to find a version component (very hacky) + version <- "unknown" + + parts <- strsplit(contents, "[[:space:]]")[[1L]] + for (part in parts) { + + nv <- tryCatch(numeric_version(part), error = identity) + if (inherits(nv, "error")) + next + + version <- nv[1, 1] + break + + } + + paste(c("linux", id, version), collapse = "-") + + } + + renv_bootstrap_library_root_name <- function(project) { + + # use project name as-is if requested + asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE") + if (asis) + return(basename(project)) + + # otherwise, disambiguate based on project's path + id <- substring(renv_bootstrap_hash_text(project), 1L, 8L) + paste(basename(project), id, sep = "-") + + } + + renv_bootstrap_library_root <- function(project) { + + prefix <- renv_bootstrap_profile_prefix() + + path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) + if (!is.na(path)) + return(paste(c(path, prefix), collapse = "/")) + + path <- renv_bootstrap_library_root_impl(project) + if (!is.null(path)) { + name <- renv_bootstrap_library_root_name(project) + return(paste(c(path, prefix, name), collapse = "/")) + } + + renv_bootstrap_paths_renv("library", project = project) + + } + + renv_bootstrap_library_root_impl <- function(project) { + + root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) + if (!is.na(root)) + return(root) + + type <- renv_bootstrap_project_type(project) + if (identical(type, "package")) { + userdir <- renv_bootstrap_user_dir() + return(file.path(userdir, "library")) + } + + } + + renv_bootstrap_validate_version <- function(version, description = NULL) { + + # resolve description file + # + # avoid passing lib.loc to `packageDescription()` below, since R will + # use the loaded version of the package by default anyhow. note that + # this function should only be called after 'renv' is loaded + # https://github.com/rstudio/renv/issues/1625 + description <- description %||% packageDescription("renv") + + # check whether requested version 'version' matches loaded version of renv + sha <- attr(version, "sha", exact = TRUE) + valid <- if (!is.null(sha)) + renv_bootstrap_validate_version_dev(sha, description) + else + renv_bootstrap_validate_version_release(version, description) + + if (valid) + return(TRUE) + + # the loaded version of renv doesn't match the requested version; + # give the user instructions on how to proceed + dev <- identical(description[["RemoteType"]], "github") + remote <- if (dev) + paste("rstudio/renv", description[["RemoteSha"]], sep = "@") + else + paste("renv", description[["Version"]], sep = "@") + + # display both loaded version + sha if available + friendly <- renv_bootstrap_version_friendly( + version = description[["Version"]], + sha = if (dev) description[["RemoteSha"]] + ) + + fmt <- heredoc(" + renv %1$s was loaded from project library, but this project is configured to use renv %2$s. + - Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile. + - Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library. + ") + catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) + + FALSE + + } + + renv_bootstrap_validate_version_dev <- function(version, description) { + + expected <- description[["RemoteSha"]] + if (!is.character(expected)) + return(FALSE) + + pattern <- sprintf("^\\Q%s\\E", version) + grepl(pattern, expected, perl = TRUE) + + } + + renv_bootstrap_validate_version_release <- function(version, description) { + expected <- description[["Version"]] + is.character(expected) && identical(c(expected), c(version)) + } + + renv_bootstrap_hash_text <- function(text) { + + hashfile <- tempfile("renv-hash-") + on.exit(unlink(hashfile), add = TRUE) + + writeLines(text, con = hashfile) + tools::md5sum(hashfile) + + } + + renv_bootstrap_load <- function(project, libpath, version) { + + # try to load renv from the project library + if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) + return(FALSE) + + # warn if the version of renv loaded does not match + renv_bootstrap_validate_version(version) + + # execute renv load hooks, if any + hooks <- getHook("renv::autoload") + for (hook in hooks) + if (is.function(hook)) + tryCatch(hook(), error = warnify) + + # load the project + renv::load(project) + + TRUE + + } + + renv_bootstrap_profile_load <- function(project) { + + # if RENV_PROFILE is already set, just use that + profile <- Sys.getenv("RENV_PROFILE", unset = NA) + if (!is.na(profile) && nzchar(profile)) + return(profile) + + # check for a profile file (nothing to do if it doesn't exist) + path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) + if (!file.exists(path)) + return(NULL) + + # read the profile, and set it if it exists + contents <- readLines(path, warn = FALSE) + if (length(contents) == 0L) + return(NULL) + + # set RENV_PROFILE + profile <- contents[[1L]] + if (!profile %in% c("", "default")) + Sys.setenv(RENV_PROFILE = profile) + + profile + + } + + renv_bootstrap_profile_prefix <- function() { + profile <- renv_bootstrap_profile_get() + if (!is.null(profile)) + return(file.path("profiles", profile, "renv")) + } + + renv_bootstrap_profile_get <- function() { + profile <- Sys.getenv("RENV_PROFILE", unset = "") + renv_bootstrap_profile_normalize(profile) + } + + renv_bootstrap_profile_set <- function(profile) { + profile <- renv_bootstrap_profile_normalize(profile) + if (is.null(profile)) + Sys.unsetenv("RENV_PROFILE") + else + Sys.setenv(RENV_PROFILE = profile) + } + + renv_bootstrap_profile_normalize <- function(profile) { + + if (is.null(profile) || profile %in% c("", "default")) + return(NULL) + + profile + + } + + renv_bootstrap_path_absolute <- function(path) { + + substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( + substr(path, 1L, 1L) %in% c(letters, LETTERS) && + substr(path, 2L, 3L) %in% c(":/", ":\\") + ) + + } + + renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { + renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") + root <- if (renv_bootstrap_path_absolute(renv)) NULL else project + prefix <- if (profile) renv_bootstrap_profile_prefix() + components <- c(root, renv, prefix, ...) + paste(components, collapse = "/") + } + + renv_bootstrap_project_type <- function(path) { + + descpath <- file.path(path, "DESCRIPTION") + if (!file.exists(descpath)) + return("unknown") + + desc <- tryCatch( + read.dcf(descpath, all = TRUE), + error = identity + ) + + if (inherits(desc, "error")) + return("unknown") + + type <- desc$Type + if (!is.null(type)) + return(tolower(type)) + + package <- desc$Package + if (!is.null(package)) + return("package") + + "unknown" + + } + + renv_bootstrap_user_dir <- function() { + dir <- renv_bootstrap_user_dir_impl() + path.expand(chartr("\\", "/", dir)) + } + + renv_bootstrap_user_dir_impl <- function() { + + # use local override if set + override <- getOption("renv.userdir.override") + if (!is.null(override)) + return(override) + + # use R_user_dir if available + tools <- asNamespace("tools") + if (is.function(tools$R_user_dir)) + return(tools$R_user_dir("renv", "cache")) + + # try using our own backfill for older versions of R + envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") + for (envvar in envvars) { + root <- Sys.getenv(envvar, unset = NA) + if (!is.na(root)) + return(file.path(root, "R/renv")) + } + + # use platform-specific default fallbacks + if (Sys.info()[["sysname"]] == "Windows") + file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") + else if (Sys.info()[["sysname"]] == "Darwin") + "~/Library/Caches/org.R-project.R/R/renv" + else + "~/.cache/R/renv" + + } + + renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) { + sha <- sha %||% attr(version, "sha", exact = TRUE) + parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L))) + paste(parts, collapse = "") + } + + renv_bootstrap_exec <- function(project, libpath, version) { + if (!renv_bootstrap_load(project, libpath, version)) + renv_bootstrap_run(project, libpath, version) + } + + renv_bootstrap_run <- function(project, libpath, version) { + tryCatch( + renv_bootstrap_run_impl(project, libpath, version), + error = function(e) { + msg <- paste( + "failed to bootstrap renv: the project will not be loaded.", + paste("Reason:", conditionMessage(e)), + "Use `renv::activate()` to re-initialize the project.", + sep = "\n" + ) + warning(msg, call. = FALSE) + } + ) + } + + renv_bootstrap_run_impl <- function(project, libpath, version) { + + # perform bootstrap + bootstrap(version, libpath) + + # exit early if we're just testing bootstrap + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) + return(TRUE) + + # try again to load + if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + return(renv::load(project = project)) + } + + # failed to download or load renv; warn the user + msg <- c( + "Failed to find an renv installation: the project will not be loaded.", + "Use `renv::activate()` to re-initialize the project." + ) + + warning(paste(msg, collapse = "\n"), call. = FALSE) + + } + + renv_bootstrap_cache_version <- function() { + # NOTE: users should normally not override the cache version; + # this is provided just to make testing easier + Sys.getenv("RENV_CACHE_VERSION", unset = "v5") + } + + renv_bootstrap_cache_version_previous <- function() { + version <- renv_bootstrap_cache_version() + number <- as.integer(substring(version, 2L)) + paste("v", number - 1L, sep = "") + } + + renv_json_read <- function(file = NULL, text = NULL) { + + jlerr <- NULL + + # if jsonlite is loaded, use that instead + if ("jsonlite" %in% loadedNamespaces()) { + + json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) + if (!inherits(json, "error")) + return(json) + + jlerr <- json + + } + + # otherwise, fall back to the default JSON reader + json <- tryCatch(renv_json_read_default(file, text), error = identity) + if (!inherits(json, "error")) + return(json) + + # report an error + if (!is.null(jlerr)) + stop(jlerr) + else + stop(json) + + } + + renv_json_read_jsonlite <- function(file = NULL, text = NULL) { + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + jsonlite::fromJSON(txt = text, simplifyVector = FALSE) + } + + renv_json_read_patterns <- function() { + + list( + + # objects + list("{", "\t\n\tobject(\t\n\t", TRUE), + list("}", "\t\n\t)\t\n\t", TRUE), + + # arrays + list("[", "\t\n\tarray(\t\n\t", TRUE), + list("]", "\n\t\n)\n\t\n", TRUE), + + # maps + list(":", "\t\n\t=\t\n\t", TRUE), + + # newlines + list("\\u000a", "\n", FALSE) + + ) + + } + + renv_json_read_envir <- function() { + + envir <- new.env(parent = emptyenv()) + + envir[["+"]] <- `+` + envir[["-"]] <- `-` + + envir[["object"]] <- function(...) { + result <- list(...) + names(result) <- as.character(names(result)) + result + } + + envir[["array"]] <- list + + envir[["true"]] <- TRUE + envir[["false"]] <- FALSE + envir[["null"]] <- NULL + + envir + + } + + renv_json_read_remap <- function(object, patterns) { + + # repair names if necessary + if (!is.null(names(object))) { + + nms <- names(object) + for (pattern in patterns) + nms <- gsub(pattern[[2L]], pattern[[1L]], nms, fixed = TRUE) + names(object) <- nms + + } + + # repair strings if necessary + if (is.character(object)) { + for (pattern in patterns) + object <- gsub(pattern[[2L]], pattern[[1L]], object, fixed = TRUE) + } + + # recurse for other objects + if (is.recursive(object)) + for (i in seq_along(object)) + object[i] <- list(renv_json_read_remap(object[[i]], patterns)) + + # return remapped object + object + + } + + renv_json_read_default <- function(file = NULL, text = NULL) { + + # read json text + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + + # convert into something the R parser will understand + patterns <- renv_json_read_patterns() + transformed <- text + for (pattern in patterns) + transformed <- gsub(pattern[[1L]], pattern[[2L]], transformed, fixed = TRUE) + + # parse it + rfile <- tempfile("renv-json-", fileext = ".R") + on.exit(unlink(rfile), add = TRUE) + writeLines(transformed, con = rfile) + json <- parse(rfile, keep.source = FALSE, srcfile = NULL)[[1L]] + + # evaluate in safe environment + result <- eval(json, envir = renv_json_read_envir()) + + # fix up strings if necessary -- do so only with reversible patterns + patterns <- Filter(function(pattern) pattern[[3L]], patterns) + renv_json_read_remap(result, patterns) + + } + + + # load the renv profile, if any + renv_bootstrap_profile_load(project) + + # construct path to library root + root <- renv_bootstrap_library_root(project) + + # construct library prefix for platform + prefix <- renv_bootstrap_platform_prefix() + + # construct full libpath + libpath <- file.path(root, prefix) + + # run bootstrap code + renv_bootstrap_exec(project, libpath, version) + + invisible() + +}) From 27c5429ce291b8f95bfbab6bdb3a3a37deaf573c Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Mon, 24 Aug 2026 17:19:01 +0000 Subject: [PATCH 02/46] post-Nicole updates --- ratio-analysis/.Rprofile | 1 + ratio-analysis/ratio-analysis.qmd | 398 +++++--- ratio-analysis/renv.lock | 1547 +++++++++++++++++++++++++++++ ratio-analysis/renv/.gitignore | 7 + ratio-analysis/renv/activate.R | 4 +- 5 files changed, 1833 insertions(+), 124 deletions(-) create mode 100644 ratio-analysis/.Rprofile create mode 100644 ratio-analysis/renv.lock create mode 100644 ratio-analysis/renv/.gitignore diff --git a/ratio-analysis/.Rprofile b/ratio-analysis/.Rprofile new file mode 100644 index 0000000..81b960f --- /dev/null +++ b/ratio-analysis/.Rprofile @@ -0,0 +1 @@ +source("renv/activate.R") diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 61acf50..699676c 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -6,19 +6,7 @@ format: documentclass: article geometry: margin=1in fontsize: 11pt - fig-pos: H - tbl-pos: H - include-in-header: - text: | - \usepackage{colortbl} - \usepackage{xcolor} - \usepackage{booktabs} - \usepackage{longtable} - \usepackage{float} - \usepackage{caption} - \captionsetup[table]{position=top} - \setlength{\aboverulesep}{0pt} - \setlength{\belowrulesep}{0pt} + include-in-header: preamble.tex params: input_file: "" execute: @@ -52,52 +40,22 @@ file_base <- sub("\\.xlsx$", "", basename(input_file)) town_code <- substr(file_base, 1, 2) year_val <- basename(dirname(input_file)) -town_name <- ccao::town_dict |> - filter(township_code == town_code) |> - pull(township_name) |> +town_name <- ccao::town_dict %>% + filter(township_code == town_code) %>% + pull(township_name) %>% first() -cap_tbl1 <- glue( - "Town-Level IAAO Statistics — {town_name} Township, {year_val}.", - " Green shading meets IAAO standard; orange shading does not." -) -cap_tbl2 <- glue( - "Ratio Curve by Sale Price Decile — {town_name} Township, {year_val}" -) -cap_tbl3 <- glue( - "Neighborhood-Level Median Ratios — {town_name} Township, {year_val}.", - " Warm colors (red–yellow) indicate under-assessment;", - " green (0.95–1.05) indicates near-standard;", - " cool colors (blue) indicate over-assessment." -) -cap_fig1 <- glue( - "IAAO Metrics: Model vs. Desk Review — {town_name} Township, {year_val}.", - " Green shaded band shows the IAAO acceptable range for each metric." -) -cap_fig2 <- glue( - "Sale Price Ratio Curve — {town_name} Township, {year_val}.", - " Each labeled point is the median ratio within that sale price decile.", - " Dotted lines show the IAAO acceptable range (0.9–1.1)." -) -cap_fig3 <- glue( - "Neighborhood Median Assessment Ratios — {town_name} Township, {year_val}.", - " Green (0.95–1.05) meets the ±5% threshold;", - " warm colors indicate under-assessment;", - " cool colors indicate over-assessment.", - " The right panel shows the change that desk review made." -) -# --------------------------------------------------------------------------- # Read desk review inputs -# --------------------------------------------------------------------------- + dr_wb <- loadWorkbook(input_file) -dr_vals <- read.xlsx(dr_wb, sheet = 1) |> - tibble(.name_repair = "unique") |> +dr_vals <- read.xlsx(dr_wb, sheet = 1) %>% + tibble(.name_repair = "unique") %>% select(pin = PIN, desk_review_value = Desk.Review.Value) -# --------------------------------------------------------------------------- + # Athena: pull model values and the residential PIN universe -# --------------------------------------------------------------------------- + noctua_options(unload = TRUE) conn <- dbConnect(noctua::athena(), rstudio_conn_tab = FALSE) @@ -113,13 +71,11 @@ model_vals <- dbGetQuery( dbDisconnect(conn) -# --------------------------------------------------------------------------- # Join and compute ratios / price deciles -# --------------------------------------------------------------------------- -all_parcels <- dr_vals |> - inner_join(select(model_vals, pin), by = "pin") |> - full_join(model_vals, by = "pin") |> - filter(township_name == town_name) |> +all_parcels <- dr_vals %>% + inner_join(select(model_vals, pin), by = "pin") %>% + full_join(model_vals, by = "pin") %>% + filter(township_name == town_name) %>% mutate( sale_date = as.Date(sale_date), sale_excluded = if_else(is.na(sale_price), NA, is.na(desk_review_value)), @@ -130,10 +86,8 @@ all_parcels <- dr_vals |> desk_review_sale_ratio = desk_review_value / sale_price ) -# --------------------------------------------------------------------------- # Compute statistics -# --------------------------------------------------------------------------- -sales_df <- all_parcels |> +sales_df <- all_parcels %>% filter(!is.na(sale_price), !sale_excluded %in% TRUE) town_stats <- tibble( @@ -161,7 +115,7 @@ town_stats <- tibble( number_of_sales = nrow(sales_df) ) -decile_stats <- sales_df |> +decile_stats <- sales_df %>% summarize( model_ratio = median(model_sale_ratio, na.rm = TRUE), model_cod = assessr::cod(model_sale_ratio), @@ -174,12 +128,10 @@ decile_stats <- sales_df |> ), number_of_sales = n(), .by = price_decile - ) |> + ) %>% arrange(price_decile) -# --------------------------------------------------------------------------- # Methods summary values -# --------------------------------------------------------------------------- n_original_sales <- sum(!is.na(all_parcels$sale_price)) n_final_sales <- nrow(sales_df) n_excluded_sales <- n_original_sales - n_final_sales @@ -190,13 +142,13 @@ sale_dates <- all_parcels$sale_date[!is.na(all_parcels$sale_date)] min_sale_date <- format(min(sale_dates), "%B %d, %Y") max_sale_date <- format(max(sale_dates), "%B %d, %Y") -# --------------------------------------------------------------------------- -# IAAO helpers -# --------------------------------------------------------------------------- + +# Calculate Stats + iaao_check <- function(metric, value) { switch(metric, "Median Ratio" = value >= 0.90 & value <= 1.10, - "COD" = value <= 15.0, + "COD" = value >= 5.0 & value <= 15.0, "PRD" = value >= 0.98 & value <= 1.03, "PRB" = value >= -0.05 & value <= 0.05, "MKI" = value >= 0.90 & value <= 1.10, @@ -217,13 +169,13 @@ iaao_color_cell <- function(metric, value, digits = 4) { ratio_to_hex <- function(ratio) { case_when( is.na(ratio) ~ "EEEEEE", - ratio < 0.80 ~ "D73027", - ratio < 0.90 ~ "FC8D59", - ratio < 0.95 ~ "FEE08B", + ratio < 0.80 ~ "4575B4", + ratio < 0.90 ~ "74ADD1", + ratio < 0.95 ~ "ABD9E9", ratio <= 1.05 ~ "66BD63", - ratio <= 1.10 ~ "ABD9E9", - ratio <= 1.15 ~ "74ADD1", - TRUE ~ "4575B4" + ratio <= 1.10 ~ "FEE08B", + ratio <= 1.15 ~ "FC8D59", + TRUE ~ "D73027" ) } @@ -236,9 +188,9 @@ color_ratio_cell <- function(ratio, digits = 3) { ratio_fill_scale <- function(name = "Median\nRatio") { scale_fill_gradientn( colors = c( - "#D73027", "#FC8D59", "#FEE08B", + "#4575B4", "#74ADD1", "#ABD9E9", "#66BD63", "#66BD63", "#66BD63", - "#ABD9E9", "#74ADD1", "#4575B4" + "#FEE08B", "#FC8D59", "#D73027" ), values = scales::rescale( c(0.70, 0.80, 0.90, 0.9499, 0.95, 1.0499, 1.05, 1.15, 1.30) @@ -255,14 +207,118 @@ ratio_fill_scale <- function(name = "Median\nRatio") { ## Methods -This analysis covers **`r town_name` Township** for the `r year_val` assessment cycle. CCAO Data's original sale sample included **`r format(n_original_sales, big.mark = ",")`** arm's-length sales occurring between `r min_sale_date` and `r max_sale_date`, with sale prices ranging from `r town_stats$price_range`. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded at desk review, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales** used throughout this analysis. The township contains **`r format(n_total_pins, big.mark = ",")` residential parcels**; the final sale sample covers **`r pct_with_sale`%** of all residential parcels, indicating the degree to which these sales represent the full assessment universe. - -Two sets of assessments are compared: (1) **Model** values, produced by the model, and (2) **Desk Review** values, reflecting adjustment by CCAO staff. +This analysis covers **`r town_name` Township** for the `r year_val` +assessment cycle. CCAO Data's original sale sample included +**`r format(n_original_sales, big.mark = ",")`** arm's-length sales +occurring between `r min_sale_date` and `r max_sale_date`, with sale +prices ranging from `r town_stats$price_range`. Of these, +**`r format(n_excluded_sales, big.mark = ",")`** sales were excluded +at desk review, leaving a **final sample of +`r format(n_final_sales, big.mark = ",")` sales**. The township +contains **`r format(n_total_pins, big.mark = ",")` residential +parcels**. + +Two sets of values are compared: (1) **Model** values, which are the +output of the model, and (2) **Desk Review** values, which reflect +CCAO staff adjustments. ## Results +```{r cap-desc} +cap_desc <- glue( + "Descriptive Statistics.", + "\\newline Summary of model and desk review assessed values and sale prices", + " across all properties, properties with arm's-length sales used in the", + " ratio analysis, and properties without qualifying sales.", + " Note: Some sales are excluded as non-arm's-length transactions,", + " so 'Sales Used' and 'No Sales' do not sum to 'All Properties'." +) +``` + +```{r tbl-desc} +#| tbl-cap: !expr 'cap_desc' +#| tbl-pos: H + +no_sale <- all_parcels %>% filter(is.na(sale_price)) + +fmt_n <- function(x) format(x, big.mark = ",") +fmt_dol <- function(x) paste0("\\$", format(round(x), big.mark = ",")) +fmt_pct <- function(changed, total) { + paste0(round(changed / total * 100, 1), "\\%") +} + +n_changed <- function(df) { + sum(!is.na(df$model_value) & !is.na(df$desk_review_value) & + df$model_value != df$desk_review_value) # nolint: indentation_linter. +} + +desc_table <- tibble( + Statistic = c( + "N", + "N DR Changes", + "\\% DR Changes", + "Median Model AV", + "Mean Model AV", + "Median DR AV", + "Mean DR AV", + "Median Sale Price", + "Mean Sale Price" + ), + `Sales Used` = c( + fmt_n(nrow(sales_df)), + fmt_n(n_changed(sales_df)), + fmt_pct(n_changed(sales_df), nrow(sales_df)), + fmt_dol(median(sales_df$model_value, na.rm = TRUE)), + fmt_dol(mean(sales_df$model_value, na.rm = TRUE)), + fmt_dol(median(sales_df$desk_review_value, na.rm = TRUE)), + fmt_dol(mean(sales_df$desk_review_value, na.rm = TRUE)), + fmt_dol(median(sales_df$sale_price, na.rm = TRUE)), + fmt_dol(mean(sales_df$sale_price, na.rm = TRUE)) + ), + `All Properties` = c( + fmt_n(nrow(all_parcels)), + fmt_n(n_changed(all_parcels)), + fmt_pct(n_changed(all_parcels), nrow(all_parcels)), + fmt_dol(median(all_parcels$model_value, na.rm = TRUE)), + fmt_dol(mean(all_parcels$model_value, na.rm = TRUE)), + fmt_dol(median(all_parcels$desk_review_value, na.rm = TRUE)), + fmt_dol(mean(all_parcels$desk_review_value, na.rm = TRUE)), + "---", + "---" + ), + `No Sales` = c( + fmt_n(nrow(no_sale)), + "---", + "---", + fmt_dol(median(no_sale$model_value, na.rm = TRUE)), + fmt_dol(mean(no_sale$model_value, na.rm = TRUE)), + fmt_dol(median(no_sale$desk_review_value, na.rm = TRUE)), + fmt_dol(mean(no_sale$desk_review_value, na.rm = TRUE)), + "---", + "---" + ) +) + +knitr::kable( + desc_table, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + align = c("l", "r", "r", "r") +) +``` + +```{r cap-1} +cap_fig1 <- glue( + "Town-Level IAAO Statistics.", + "\\newline Green shading meets IAAO standard; orange shading does not." +) +``` + ```{r tbl-1} -#| tbl-cap: !expr 'cap_tbl1' +#| tbl-cap: !expr 'cap_fig1' +#| tbl-pos: H ts <- town_stats @@ -270,7 +326,7 @@ iaao_table <- data.frame( Metric = c("Median Ratio", "COD", "PRD", "PRB", "MKI", "N Sales"), `IAAO Standard` = c( "0.90 -- 1.10", - "$\\leq$ 15.0", + "5.0 -- 15.0", "0.98 -- 1.03", "$\\pm$0.05", "0.90 -- 1.10", @@ -307,9 +363,9 @@ knitr::kable( ``` ```{r nbhd-ratios-prep} -nbhd_ratios <- all_parcels |> - filter(!is.na(sale_price), !sale_excluded %in% TRUE) |> - mutate(neighborhood_number = gsub("-", "", neighborhood_number)) |> +nbhd_ratios <- all_parcels %>% + filter(!is.na(sale_price), !sale_excluded %in% TRUE) %>% + mutate(neighborhood_number = gsub("-", "", neighborhood_number)) %>% summarize( model_ratio = median(model_sale_ratio, na.rm = TRUE), dr_ratio = median(desk_review_sale_ratio, na.rm = TRUE), @@ -318,15 +374,26 @@ nbhd_ratios <- all_parcels |> ) ``` -```{r tbl-3} -#| tbl-cap: !expr 'cap_tbl3' +{{< pagebreak >}} + +```{r cap-2} +cap_fig2 <- glue( + "Neighborhood-Level Median Ratios.", + "\\newline Blue indicates under-assessment;", + " Green (0.95–1.05) indicates near-standard;", + " Red indicates over-assessment." +) +``` + +```{r tbl-2} +#| tbl-cap: !expr 'cap_fig2' -all_nbhds <- all_parcels |> - distinct(neighborhood_number) |> +all_nbhds <- all_parcels %>% + distinct(neighborhood_number) %>% arrange(neighborhood_number) -nbhd_table_data <- all_nbhds |> - left_join(nbhd_ratios, by = "neighborhood_number") |> +nbhd_table_data <- all_nbhds %>% + left_join(nbhd_ratios, by = "neighborhood_number") %>% mutate( `NBHD` = neighborhood_number, `Model Ratio` = ifelse( @@ -336,7 +403,7 @@ nbhd_table_data <- all_nbhds |> is.na(dr_ratio), "---", color_ratio_cell(dr_ratio, digits = 3) ), `N Sales` = ifelse(is.na(n_sales), 0L, n_sales) - ) |> + ) %>% select(`NBHD`, `Model Ratio`, `DR Ratio`, `N Sales`) knitr::kable( @@ -351,8 +418,17 @@ knitr::kable( ) ``` -```{r fig-1} -#| fig-cap: !expr 'cap_fig1' +```{r cap-3} +cap_fig3 <- glue( + "IAAO Metrics: Model vs. Desk Review.", + "\\newline Green shaded band shows the IAAO acceptable range for each metric." +) +``` + +```{r fig-3} +#| fig-cap: !expr 'cap_fig3' +#| fig-pos: H +#| fig-cap-location: top #| fig-height: 7 #| fig-width: 7 @@ -370,20 +446,59 @@ ts_wide <- tibble( ) ) -ts_long <- ts_wide |> +ts_long <- ts_wide %>% pivot_longer( c(Model, `Desk Review`), names_to = "Stage", values_to = "Value" - ) |> + ) %>% mutate(Stage = factor(Stage, levels = c("Model", "Desk Review"))) iaao_bands <- tibble( Metric = factor(metric_order, levels = metric_order), - xmin = c(0.90, 0, 0.98, -0.05, 0.90), + xmin = c(0.90, 5.0, 0.98, -0.05, 0.90), xmax = c(1.10, 15.0, 1.03, 0.05, 1.10) ) +iaao_meta <- tibble( + Metric = factor(metric_order, levels = metric_order), + mid = c(1.000, 10.0, 1.005, 0.00, 1.000), + half_span = c(0.100, 5.0, 0.025, 0.05, 0.100) +) + +sym_anchors <- ts_long %>% + left_join(iaao_meta, by = "Metric") %>% + mutate(dev = abs(Value - mid)) %>% + group_by(Metric, mid, half_span) %>% + summarize( + max_dev = max(dev, na.rm = TRUE), + out_of_range = any(dev > half_span, na.rm = TRUE), + .groups = "drop" + ) %>% + filter(out_of_range) %>% + mutate( + half_ax = pmax(half_span, max_dev) * 1.15, + x_lo = mid - half_ax, + x_hi = mid + half_ax + ) %>% + select(Metric, x_lo, x_hi) %>% + pivot_longer( + c(x_lo, x_hi), + names_to = "side", values_to = "x" + ) %>% + select(Metric, x) + +scale_anchors <- bind_rows( + sym_anchors, + tibble(Metric = factor("COD", levels = metric_order), x = 0) +) + ggplot() + + geom_point( + data = scale_anchors, + aes(x = x, y = 1), + size = 0, + alpha = 0 + ) + geom_rect( data = iaao_bands, aes(xmin = xmin, xmax = xmax, ymin = 0.1, ymax = 1.9), @@ -406,7 +521,7 @@ ggplot() + ) + facet_wrap(~Metric, scales = "free_x", ncol = 1) + scale_color_manual( - values = c("Model" = "#4575B4", "Desk Review" = "#D73027") + values = c("Model" = "#A569BD", "Desk Review" = "#2C2C2C") ) + scale_shape_manual(values = c("Model" = 16, "Desk Review" = 17)) + scale_y_continuous(limits = c(0, 2)) + @@ -422,18 +537,29 @@ ggplot() + labs(x = NULL, y = NULL, color = "Stage", shape = "Stage") ``` -```{r fig-2} -#| fig-cap: !expr 'cap_fig2' +```{r cap-4} +cap_fig4 <- glue( + "Sale Price Ratio Curve.", + "\\newline Each labeled point is the median ratio within that", + " sale price decile.", + " Dotted lines show the IAAO acceptable range (0.9–1.1)." +) +``` + +```{r fig-4} +#| fig-cap: !expr 'cap_fig4' +#| fig-pos: H +#| fig-cap-location: top #| fig-height: 5 #| fig-width: 7 -decile_long <- decile_stats |> - select(price_decile, model_ratio, desk_review_ratio) |> +decile_long <- decile_stats %>% + select(price_decile, model_ratio, desk_review_ratio) %>% pivot_longer( cols = c(model_ratio, desk_review_ratio), names_to = "Stage", values_to = "Sale Ratio" - ) |> + ) %>% mutate( Stage = case_when( Stage == "model_ratio" ~ "Model", @@ -442,20 +568,20 @@ decile_long <- decile_stats |> Stage = factor(Stage, levels = c("Model", "Desk Review")) ) -axis_labels <- all_parcels |> - filter(!is.na(sale_price), !sale_excluded %in% TRUE, !is.na(price_decile)) |> +axis_labels <- all_parcels %>% + filter(!is.na(sale_price), !sale_excluded %in% TRUE, !is.na(price_decile)) %>% summarize( min_price = min(sale_price), max_price = max(sale_price), .by = price_decile - ) |> - arrange(price_decile) |> + ) %>% + arrange(price_decile) %>% mutate(label = paste0( price_decile, "\n", scales::dollar(min_price, scale_cut = scales::cut_short_scale()), "–\n", scales::dollar(max_price, scale_cut = scales::cut_short_scale()) - )) |> + )) %>% (\(df) setNames(df$label, df$price_decile))() y_min <- min(decile_long$`Sale Ratio`, 0.7, na.rm = TRUE) @@ -471,6 +597,10 @@ ggplot( label = round(`Sale Ratio`, 2) ) ) + + annotate("rect", + xmin = -Inf, xmax = Inf, ymin = 0.9, ymax = 1.1, + fill = "#66BD63", alpha = 0.12 + ) + geom_hline(yintercept = 1, color = "darkgreen", linewidth = 1) + geom_hline( yintercept = 0.9, linetype = "dotted", color = "black", linewidth = 0.8 @@ -485,7 +615,7 @@ ggplot( geom_line(linewidth = 1) + geom_label(show.legend = FALSE, size = 3) + scale_color_manual( - values = c("Model" = "#4575B4", "Desk Review" = "#D73027") + values = c("Model" = "#A569BD", "Desk Review" = "#2C2C2C") ) + scale_x_continuous(breaks = 1:10, labels = axis_labels) + scale_y_continuous( @@ -497,17 +627,26 @@ ggplot( labs(x = "Sale Price Decile", y = "Median Sale Ratio", color = "Stage") ``` -```{r tbl-2} -#| tbl-cap: !expr 'cap_tbl2' +{{< pagebreak >}} + +```{r cap-5} +cap_fig5 <- glue( + "Ratio Curve by Sale Price Decile" +) +``` + +```{r tbl-5} +#| tbl-cap: !expr 'cap_fig5' +#| tbl-pos: H -decile_display <- decile_stats |> +decile_display <- decile_stats %>% select( Decile = price_decile, `Price Range` = price_range, `N Sales` = number_of_sales, `Model Ratio` = model_ratio, `DR Ratio` = desk_review_ratio - ) |> + ) %>% mutate( `Model Ratio` = round(`Model Ratio`, 3), `DR Ratio` = round(`DR Ratio`, 3) @@ -522,14 +661,14 @@ knitr::kable( ) ``` -```{r fig-3-prep} -neighborhoods <- ccao::nbhd_shp |> - filter(township_name == town_name) |> +```{r fig-6-prep} +neighborhoods <- ccao::nbhd_shp %>% + filter(township_name == town_name) %>% select(town_nbhd, geometry) -map_data <- neighborhoods |> - left_join(nbhd_ratios, by = c("town_nbhd" = "neighborhood_number")) |> - mutate(diff = dr_ratio - model_ratio) +map_data <- neighborhoods %>% + left_join(nbhd_ratios, by = c("town_nbhd" = "neighborhood_number")) %>% + mutate(diff = abs(model_ratio - 1) - abs(dr_ratio - 1)) map_theme <- theme_void(base_size = 9) + theme( @@ -569,16 +708,31 @@ map_diff <- ggplot() + limits = c(-diff_limit, diff_limit), oob = scales::squish, na.value = "gray90", - name = "Model −\nDesk Review" + name = "Improvement" ) + map_theme + - labs(title = "Model − Desk Review") + labs(title = "Desk Review Improvement") ``` -```{r fig-3} -#| fig-cap: !expr 'cap_fig3' +```{r cap-6} +cap_fig6 <- glue( + "Neighborhood Median Assessment Ratios.", + "\\newline Green (0.95–1.05) meets the ±5% threshold;", + " Blue indicates under-assessment;", + " Red indicates over-assessment.", + " The right panel shows desk review improvement:", + " Blue indicates an improved ratio (closer to 1)", + " and red indicates it moved further away." +) +``` + +```{r fig-6} +#| fig-cap: !expr 'cap_fig6' +#| fig-pos: H +#| fig-cap-location: top #| fig-height: 5.5 #| fig-width: 8.5 +#| results: 'hide' grid.newpage() print(map_model, vp = viewport( diff --git a/ratio-analysis/renv.lock b/ratio-analysis/renv.lock new file mode 100644 index 0000000..112ba76 --- /dev/null +++ b/ratio-analysis/renv.lock @@ -0,0 +1,1547 @@ +{ + "R": { + "Version": "4.6.1", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cloud.r-project.org" + } + ] + }, + "Packages": { + "DBI": { + "Package": "DBI", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "dbfa2adb83f8063640982459e153f650" + }, + "KernSmooth": { + "Package": "KernSmooth", + "Version": "2.23-26", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "stats" + ], + "Hash": "2fb39782c07b5ad422b0448ae83f64c4" + }, + "MASS": { + "Package": "MASS", + "Version": "7.3-65", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics", + "methods", + "stats", + "utils" + ], + "Hash": "a41d0fc833ea756a1136b60a437efe26" + }, + "R6": { + "Package": "R6", + "Version": "2.6.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "d4335fe7207f1c01ab8c41762f5840d4" + }, + "RColorBrewer": { + "Package": "RColorBrewer", + "Version": "1.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "45f0398006e83a5b10b72a90663d8d8c" + }, + "Rcpp": { + "Package": "Rcpp", + "Version": "1.1.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods", + "utils" + ], + "Hash": "f481f89daa906a34eab8ef8658c8a89c" + }, + "S7": { + "Package": "S7", + "Version": "0.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "6a72e94a8c9be4ef719af3aa3628f2dc" + }, + "abind": { + "Package": "abind", + "Version": "1.4-8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods", + "utils" + ], + "Hash": "2288423bb0f20a457800d7fc47f6aa54" + }, + "arrow": { + "Package": "arrow", + "Version": "25.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "assertthat", + "bit64", + "cpp11", + "glue", + "methods", + "purrr", + "rlang", + "stats", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "d8c220599be46a5d07f6837e715bfe13" + }, + "askpass": { + "Package": "askpass", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "sys" + ], + "Hash": "c39f4155b3ceb1a9a2799d700fbd4b6a" + }, + "assertthat": { + "Package": "assertthat", + "Version": "0.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "tools" + ], + "Hash": "50c838a310445e954bc13f26f26a6ecf" + }, + "assessr": { + "Package": "assessr", + "Version": "0.6.0", + "Source": "GitHub", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteUsername": "ccao-data", + "RemoteRepo": "assessr", + "RemoteRef": "master", + "RemoteSha": "f1b2cdaa4fd5bc9d1597b9fe9537dc48d34e4a80", + "Requirements": [ + "R", + "stats" + ], + "Hash": "e533ff8176cf00d0fec973ae645098a4" + }, + "base64enc": { + "Package": "base64enc", + "Version": "0.1-6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "5edb675b7baa6e9a0d86dd2c28de1676" + }, + "bit": { + "Package": "bit", + "Version": "4.6.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "ebe86ffd194564abdc895d87742d5a29" + }, + "bit64": { + "Package": "bit64", + "Version": "4.8.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit", + "graphics", + "methods", + "stats", + "utils" + ], + "Hash": "71778c0b60bbf439ac64e6a8be695917" + }, + "bslib": { + "Package": "bslib", + "Version": "0.12.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "base64enc", + "cachem", + "fastmap", + "grDevices", + "htmltools", + "jquerylib", + "jsonlite", + "lifecycle", + "memoise", + "mime", + "rlang", + "sass" + ], + "Hash": "b2d0b0a17142ed4858f252d88eb56223" + }, + "cachem": { + "Package": "cachem", + "Version": "1.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "fastmap", + "rlang" + ], + "Hash": "cd9a672193789068eb5a2aad65a0dedf" + }, + "ccao": { + "Package": "ccao", + "Version": "1.3.1", + "Source": "GitHub", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteUsername": "ccao-data", + "RemoteRepo": "ccao", + "RemoteRef": "master", + "RemoteSha": "419b67731a1aeb1fa1d2b47b0ed6c3391f5c653a", + "Requirements": [ + "R", + "arrow", + "assessr", + "dplyr", + "glue", + "magrittr", + "noctua", + "rlang", + "tidyr" + ], + "Hash": "f05c4f99a56189cac0a30f11cc05dbf3" + }, + "class": { + "Package": "class", + "Version": "7.3-23", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "MASS", + "R", + "stats", + "utils" + ], + "Hash": "d0cb9cc838c3b43560bd958fc4317fdc" + }, + "classInt": { + "Package": "classInt", + "Version": "0.4-11", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "KernSmooth", + "R", + "class", + "e1071", + "grDevices", + "graphics", + "stats" + ], + "Hash": "f2af70314a63d7f025ae668f08bd933a" + }, + "cli": { + "Package": "cli", + "Version": "3.6.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "a73d822b669d443ff8de6928f9c49850" + }, + "clipr": { + "Package": "clipr", + "Version": "0.8.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "cc6e507cf89f11ffc44b32519e0198da" + }, + "commonmark": { + "Package": "commonmark", + "Version": "2.0.0", + "Source": "Repository", + "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/2026-07-10", + "Hash": "8cba62334c1088d21689d353a7e87663" + }, + "cpp11": { + "Package": "cpp11", + "Version": "0.5.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "20ecb9105a3fb48a8390919abc3b7e90" + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "methods", + "utils" + ], + "Hash": "859d96e65ef198fd43e82b9628d593ef" + }, + "curl": { + "Package": "curl", + "Version": "7.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "2e004ed19964915a8faf48a574439be9" + }, + "data.table": { + "Package": "data.table", + "Version": "1.18.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "da9ddede68a6f6e5d3098c0ab81b6e1f" + }, + "digest": { + "Package": "digest", + "Version": "0.6.39", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "d18028e978a88b2b16ef8d400cb49adf" + }, + "dplyr": { + "Package": "dplyr", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "generics", + "glue", + "lifecycle", + "magrittr", + "methods", + "pillar", + "rlang", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "d71f190466b9496cf8543c76641be5cf" + }, + "e1071": { + "Package": "e1071", + "Version": "1.7-17", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "class", + "grDevices", + "graphics", + "methods", + "proxy", + "stats", + "utils" + ], + "Hash": "9d516dde384526d4784166f888cd2c6c" + }, + "evaluate": { + "Package": "evaluate", + "Version": "1.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "94cf2c54237f6841cee68e3ba4ab5a14" + }, + "farver": { + "Package": "farver", + "Version": "2.1.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "680887028577f3fa2a81e410ed0d6e42" + }, + "fastmap": { + "Package": "fastmap", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" + }, + "fontawesome": { + "Package": "fontawesome", + "Version": "0.5.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "htmltools", + "rlang" + ], + "Hash": "bd1297f9b5b1fc1372d19e2c4cd82215" + }, + "fs": { + "Package": "fs", + "Version": "2.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "09278623bca442bc53b0940ffa2f6d87" + }, + "generics": { + "Package": "generics", + "Version": "0.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "4b29bf698d0c7bdb9f1e4976e7ade41d" + }, + "ggplot2": { + "Package": "ggplot2", + "Version": "4.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "S7", + "cli", + "grDevices", + "grid", + "gtable", + "isoband", + "lifecycle", + "rlang", + "scales", + "stats", + "vctrs", + "withr" + ], + "Hash": "98520fe6b2745c466dca8e46aaa86242" + }, + "ggspatial": { + "Package": "ggspatial", + "Version": "1.1.10", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "abind", + "ggplot2", + "glue", + "grid", + "methods", + "rlang", + "rosm", + "scales", + "sf", + "tibble", + "tidyr" + ], + "Hash": "a065e21174bbce1866deff1e30d26ca5" + }, + "glue": { + "Package": "glue", + "Version": "1.8.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "f8122473e9a49e00d0642f78235ca5e3" + }, + "gtable": { + "Package": "gtable", + "Version": "0.3.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "grid", + "lifecycle", + "rlang", + "stats" + ], + "Hash": "de949855009e2d4d0e52a844e30617ae" + }, + "highr": { + "Package": "highr", + "Version": "0.12", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "xfun" + ], + "Hash": "2a2f862ade01a56dcbcd60944de11255" + }, + "hms": { + "Package": "hms", + "Version": "1.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "lifecycle", + "methods", + "pkgconfig", + "rlang", + "vctrs" + ], + "Hash": "2799ac720626cec589478b191e48b88b" + }, + "htmltools": { + "Package": "htmltools", + "Version": "0.5.9", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "base64enc", + "digest", + "fastmap", + "grDevices", + "rlang", + "utils" + ], + "Hash": "102298e238c14eb830cc4b5edd23c3e8" + }, + "httpuv": { + "Package": "httpuv", + "Version": "1.6.17", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "Rcpp", + "later", + "promises", + "utils" + ], + "Hash": "4ff0297ad1cd631d57f0d30172972754" + }, + "httr2": { + "Package": "httr2", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "curl", + "glue", + "lifecycle", + "magrittr", + "openssl", + "rlang", + "vctrs", + "withr" + ], + "Hash": "f4d796ba71b073f7bc95da858caded00" + }, + "isoband": { + "Package": "isoband", + "Version": "0.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "cpp11", + "grid", + "rlang", + "utils" + ], + "Hash": "0f9a864bbd7ce0232ad05cb76249cc1a" + }, + "jpeg": { + "Package": "jpeg", + "Version": "0.1-11", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "c23ab23c370d1ce3a7a80d8c0bdfa105" + }, + "jquerylib": { + "Package": "jquerylib", + "Version": "0.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "htmltools" + ], + "Hash": "5aab57a3bd297eee1c1d862735972182" + }, + "jsonlite": { + "Package": "jsonlite", + "Version": "2.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods" + ], + "Hash": "b0776f526d36d8bd4a3344a88fe165c4" + }, + "knitr": { + "Package": "knitr", + "Version": "1.51", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "evaluate", + "highr", + "methods", + "tools", + "xfun", + "yaml" + ], + "Hash": "27682babb50f03b6eb7939ea69ec79ca" + }, + "labeling": { + "Package": "labeling", + "Version": "0.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "graphics", + "stats" + ], + "Hash": "b64ec208ac5bc1852b285f665d6368b3" + }, + "later": { + "Package": "later", + "Version": "1.4.8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "Rcpp", + "rlang" + ], + "Hash": "824c180e69b9be79ab96a985e233c470" + }, + "lifecycle": { + "Package": "lifecycle", + "Version": "1.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "rlang" + ], + "Hash": "36dbfe4fba6c064db50a671a90297c85" + }, + "magrittr": { + "Package": "magrittr", + "Version": "2.0.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "665e77ab6e5f37a7913226d40b324e37" + }, + "memoise": { + "Package": "memoise", + "Version": "2.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cachem", + "rlang" + ], + "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" + }, + "mime": { + "Package": "mime", + "Version": "0.13", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "tools" + ], + "Hash": "0ec19f34c72fab674d8f2b4b1c6410e1" + }, + "noctua": { + "Package": "noctua", + "Version": "2.6.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DBI", + "R", + "data.table", + "methods", + "paws", + "stats", + "utils", + "uuid" + ], + "Hash": "15471c0eaafcb7f2a4dabc983ea71112" + }, + "openssl": { + "Package": "openssl", + "Version": "2.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "askpass" + ], + "Hash": "6994d1c3ea954f29de6aeca5da95c99d" + }, + "openxlsx": { + "Package": "openxlsx", + "Version": "4.2.8.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "Rcpp", + "grDevices", + "methods", + "stats", + "stringi", + "utils", + "zip" + ], + "Hash": "a1565bd9ee11620aeea591cc037b3aa1" + }, + "otel": { + "Package": "otel", + "Version": "0.2.0", + "Source": "Repository", + "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/2026-07-10", + "Requirements": [ + "R" + ], + "Hash": "627d6993db1043703c0b084fa432f21f" + }, + "paws": { + "Package": "paws", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.analytics", + "paws.application.integration", + "paws.common", + "paws.compute", + "paws.cost.management", + "paws.customer.engagement", + "paws.database", + "paws.developer.tools", + "paws.end.user.computing", + "paws.machine.learning", + "paws.management", + "paws.networking", + "paws.security.identity", + "paws.storage" + ], + "Hash": "f840835e93f287e6bf79d95f536cdb2f" + }, + "paws.analytics": { + "Package": "paws.analytics", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "7d181b30d14ef34589ca20bbb7361fde" + }, + "paws.application.integration": { + "Package": "paws.application.integration", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "6cde06aeae9f2a6f193886a7756afa7f" + }, + "paws.common": { + "Package": "paws.common", + "Version": "0.8.10", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "Rcpp", + "base64enc", + "curl", + "digest", + "httr2", + "jsonlite", + "methods", + "stats", + "utils", + "xml2" + ], + "Hash": "39e4ac3a7ca67421d5f6b6f5ed2340b9" + }, + "paws.compute": { + "Package": "paws.compute", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "ae63fc9e22e25b5f7d69bf6a62c6a2bb" + }, + "paws.cost.management": { + "Package": "paws.cost.management", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "f239556e7261d7e6036d882ae6cf1c39" + }, + "paws.customer.engagement": { + "Package": "paws.customer.engagement", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "07280ba6a6878f004297a1e00ad7a26f" + }, + "paws.database": { + "Package": "paws.database", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "bdf105fa60f5705a47643ee8fd897500" + }, + "paws.developer.tools": { + "Package": "paws.developer.tools", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "ec39a93b14e132a19dd50ff439f821de" + }, + "paws.end.user.computing": { + "Package": "paws.end.user.computing", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "92a5c132a8a378e98028fdaf0cd71a27" + }, + "paws.machine.learning": { + "Package": "paws.machine.learning", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "9cb6408161e048927bbbdff3d8765d62" + }, + "paws.management": { + "Package": "paws.management", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "b114e36c4090bb299408958c785856a8" + }, + "paws.networking": { + "Package": "paws.networking", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "92bea219331b4cbfe790ac56dd92ec0a" + }, + "paws.security.identity": { + "Package": "paws.security.identity", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "0667aa70df94a5d303440420ca56c0f8" + }, + "paws.storage": { + "Package": "paws.storage", + "Version": "0.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "paws.common" + ], + "Hash": "7dc3b787d34451ee84b1e1d60f245fe4" + }, + "pillar": { + "Package": "pillar", + "Version": "1.11.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "glue", + "lifecycle", + "rlang", + "utf8", + "utils", + "vctrs" + ], + "Hash": "1395e64f2689ffd503657778e810cee2" + }, + "pkgconfig": { + "Package": "pkgconfig", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "01f28d4278f15c76cddbea05899c5d6f" + }, + "png": { + "Package": "png", + "Version": "0.1-9", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "961c433971606243a724eb19b1075e60" + }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + }, + "progress": { + "Package": "progress", + "Version": "1.2.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "crayon", + "hms", + "prettyunits" + ], + "Hash": "f4625e061cb2865f111b47ff163a5ca6" + }, + "promises": { + "Package": "promises", + "Version": "1.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "fastmap", + "later", + "lifecycle", + "magrittr", + "otel", + "rlang" + ], + "Hash": "62cb899ed5fff70d4e918ec1b762bf7c" + }, + "proxy": { + "Package": "proxy", + "Version": "0.4-29", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "stats", + "utils" + ], + "Hash": "b6c826e897b46b163c51a3b990113a21" + }, + "purrr": { + "Package": "purrr", + "Version": "1.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "lifecycle", + "magrittr", + "rlang", + "vctrs" + ], + "Hash": "0a35605539b085a4828ec55ad973fe60" + }, + "rappdirs": { + "Package": "rappdirs", + "Version": "0.3.4", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "f146a5bfc94db048309712535d4d0aee" + }, + "readr": { + "Package": "readr", + "Version": "2.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "clipr", + "cpp11", + "crayon", + "glue", + "hms", + "lifecycle", + "methods", + "rlang", + "tibble", + "tzdb", + "utils", + "vroom", + "withr" + ], + "Hash": "4425ad9e28b8e3351184ca2739995b87" + }, + "renv": { + "Package": "renv", + "Version": "1.2.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "1bd9f58e1cfe27ce035933937c6f03de" + }, + "rlang": { + "Package": "rlang", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "8d05afdb0b0dd5ef01b306db289fe21f" + }, + "rmarkdown": { + "Package": "rmarkdown", + "Version": "2.31", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bslib", + "evaluate", + "fontawesome", + "htmltools", + "jquerylib", + "jsonlite", + "knitr", + "methods", + "tinytex", + "tools", + "utils", + "xfun", + "yaml" + ], + "Hash": "f34039d57d861d2869cbf9be813ed08e" + }, + "rosm": { + "Package": "rosm", + "Version": "0.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "curl", + "glue", + "jpeg", + "png", + "progress", + "rlang", + "wk" + ], + "Hash": "14c0023fdb16dddf88fd43b321dd1948" + }, + "s2": { + "Package": "s2", + "Version": "1.1.11", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "Rcpp", + "wk" + ], + "Hash": "54b09824b3ac78eb4fa44f76c0616131" + }, + "sass": { + "Package": "sass", + "Version": "0.4.10", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R6", + "fs", + "htmltools", + "rappdirs", + "rlang" + ], + "Hash": "3fb78d066fb92299b1d13f6a7c9a90a8" + }, + "scales": { + "Package": "scales", + "Version": "1.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "RColorBrewer", + "cli", + "farver", + "glue", + "labeling", + "lifecycle", + "rlang", + "viridisLite" + ], + "Hash": "c5bba8f0d1df8c4b9538a40570798d9b" + }, + "sf": { + "Package": "sf", + "Version": "1.1-2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "DBI", + "R", + "Rcpp", + "classInt", + "grDevices", + "graphics", + "grid", + "methods", + "s2", + "stats", + "tools", + "units", + "utils" + ], + "Hash": "02483c8ee4115581472646cd5d5984d9" + }, + "shiny": { + "Package": "shiny", + "Version": "1.14.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "bslib", + "cachem", + "cli", + "commonmark", + "fastmap", + "fontawesome", + "glue", + "grDevices", + "htmltools", + "httpuv", + "jsonlite", + "later", + "lifecycle", + "methods", + "mime", + "otel", + "promises", + "rlang", + "sourcetools", + "tools", + "utils", + "withr", + "xtable" + ], + "Hash": "e71fb3fcf73db153eccd8afed293984f" + }, + "sourcetools": { + "Package": "sourcetools", + "Version": "0.1.7-2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "e716e13bfbfe8acb6182a05f4b367772" + }, + "stringi": { + "Package": "stringi", + "Version": "1.8.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "stats", + "tools", + "utils" + ], + "Hash": "2b56088e23bdd58f89aebf43a0913457" + }, + "stringr": { + "Package": "stringr", + "Version": "1.6.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "magrittr", + "rlang", + "stringi", + "vctrs" + ], + "Hash": "d47392652eedc68bf916657347ff2526" + }, + "sys": { + "Package": "sys", + "Version": "3.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "de342ebfebdbf40477d0758d05426646" + }, + "tibble": { + "Package": "tibble", + "Version": "3.3.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "lifecycle", + "magrittr", + "methods", + "pillar", + "pkgconfig", + "rlang", + "utils", + "vctrs" + ], + "Hash": "c55df870972551cac674b50cadb2d51f" + }, + "tidyr": { + "Package": "tidyr", + "Version": "1.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "cpp11", + "dplyr", + "glue", + "lifecycle", + "magrittr", + "purrr", + "rlang", + "stringr", + "tibble", + "tidyselect", + "utils", + "vctrs" + ], + "Hash": "a4fa2f5876396f04814cb9d8d9ab89e9" + }, + "tidyselect": { + "Package": "tidyselect", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang", + "vctrs", + "withr" + ], + "Hash": "829f27b9c4919c16b593794a6344d6c0" + }, + "tinytex": { + "Package": "tinytex", + "Version": "0.60", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "xfun" + ], + "Hash": "263651b52279eaa7835e44aa32f9b754" + }, + "tzdb": { + "Package": "tzdb", + "Version": "0.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cpp11" + ], + "Hash": "09e3961e87b7bafa4a9340bbb34aeda8" + }, + "units": { + "Package": "units", + "Version": "1.0-1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "Rcpp" + ], + "Hash": "14743a941151a12449e8af67497c7b96" + }, + "utf8": { + "Package": "utf8", + "Version": "1.2.6", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "d526d558be176e9ceb68c3d1e83479b7" + }, + "uuid": { + "Package": "uuid", + "Version": "1.2-2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "528fc9e90d70a6a115e21164f37b2c64" + }, + "vctrs": { + "Package": "vctrs", + "Version": "0.7.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "glue", + "lifecycle", + "rlang" + ], + "Hash": "2dcde2d30d3ad67bf1d3a37177457b87" + }, + "viridisLite": { + "Package": "viridisLite", + "Version": "0.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "9380d36888b72faf5ae6c22b44703867" + }, + "vroom": { + "Package": "vroom", + "Version": "1.7.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "bit64", + "cli", + "cpp11", + "crayon", + "glue", + "hms", + "lifecycle", + "methods", + "progress", + "rlang", + "stats", + "tibble", + "tidyselect", + "tzdb", + "vctrs", + "withr" + ], + "Hash": "1e9494eda38f3418f71474363293da2a" + }, + "withr": { + "Package": "withr", + "Version": "3.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "graphics" + ], + "Hash": "d979712ec72df779bc2d30bcc5d0d541" + }, + "wk": { + "Package": "wk", + "Version": "0.9.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "10fb21ed42dbd4ed9162aaab818146e3" + }, + "xfun": { + "Package": "xfun", + "Version": "0.60", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "grDevices", + "stats", + "tools" + ], + "Hash": "8304c2894061f6ae062996f09dd1528e" + }, + "xml2": { + "Package": "xml2", + "Version": "1.6.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "methods", + "rlang" + ], + "Hash": "568fe669c645b2007e4e8fcf5cde40e7" + }, + "xtable": { + "Package": "xtable", + "Version": "1.8-8", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods", + "stats", + "utils" + ], + "Hash": "93b19c064862d315a828c7170d806453" + }, + "yaml": { + "Package": "yaml", + "Version": "2.3.12", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "7cd77cb32abd9220d744307e9fc94ffb" + }, + "zip": { + "Package": "zip", + "Version": "3.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli" + ], + "Hash": "2c4eff2acdb28a05588a5fee7b35921c" + } + } +} diff --git a/ratio-analysis/renv/.gitignore b/ratio-analysis/renv/.gitignore new file mode 100644 index 0000000..0ec0cbb --- /dev/null +++ b/ratio-analysis/renv/.gitignore @@ -0,0 +1,7 @@ +library/ +local/ +cellar/ +lock/ +python/ +sandbox/ +staging/ diff --git a/ratio-analysis/renv/activate.R b/ratio-analysis/renv/activate.R index abd9432..20ffd44 100644 --- a/ratio-analysis/renv/activate.R +++ b/ratio-analysis/renv/activate.R @@ -2,8 +2,8 @@ local({ # the requested version of renv - version <- "1.1.5" - attr(version, "md5") <- "770fcbc2c4616e8fbcb187cccd46a6b1" + version <- "1.2.3" + attr(version, "md5") <- "1bd9f58e1cfe27ce035933937c6f03de" attr(version, "sha") <- NULL # the project directory From bc0265f370d78854bdbdf9329c4e883d8ddd1267 Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:22:38 -0500 Subject: [PATCH 03/46] Update ratio-analysis/ratio-analysis.qmd Co-authored-by: Nicole Jardine <138712135+ccao-jardine@users.noreply.github.com> --- ratio-analysis/ratio-analysis.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 699676c..f16ccb2 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -213,7 +213,7 @@ assessment cycle. CCAO Data's original sale sample included occurring between `r min_sale_date` and `r max_sale_date`, with sale prices ranging from `r town_stats$price_range`. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded -at desk review, leaving a **final sample of +as outliers by Valuations analysts, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales**. The township contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. From e1b5ad08f57c29f9927f06ad1d4414ebb5ae31cf Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:23:59 -0500 Subject: [PATCH 04/46] Apply suggestions from code review Co-authored-by: Nicole Jardine <138712135+ccao-jardine@users.noreply.github.com> --- ratio-analysis/ratio-analysis.qmd | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index f16ccb2..898a86b 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -207,10 +207,11 @@ ratio_fill_scale <- function(name = "Median\nRatio") { ## Methods -This analysis covers **`r town_name` Township** for the `r year_val` -assessment cycle. CCAO Data's original sale sample included +This is a ratio analysis for **`r town_name` Township** for the `r year_val` +assessment cycle. The original sale sample included **`r format(n_original_sales, big.mark = ",")`** arm's-length sales -occurring between `r min_sale_date` and `r max_sale_date`, with sale +after outliers were excluded. These sales +occurred between `r min_sale_date` and `r max_sale_date`, with sale prices ranging from `r town_stats$price_range`. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded as outliers by Valuations analysts, leaving a **final sample of @@ -218,9 +219,9 @@ as outliers by Valuations analysts, leaving a **final sample of contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. -Two sets of values are compared: (1) **Model** values, which are the -output of the model, and (2) **Desk Review** values, which reflect -CCAO staff adjustments. +This analysis compares ratio statistics from two stages: +(1) **Model** values, which are the output of the model, and +(2) **Desk Review** values, which reflect manual adjustments by staff. ## Results @@ -338,7 +339,6 @@ iaao_table <- data.frame( iaao_color_cell("PRD", ts$model_prd, digits = 4), iaao_color_cell("PRB", ts$model_prb, digits = 4), iaao_color_cell("MKI", ts$model_mki, digits = 4), - format(ts$number_of_sales, big.mark = ",") ), `Desk Review` = c( iaao_color_cell("Median Ratio", ts$desk_review_ratio, digits = 3), @@ -380,7 +380,7 @@ nbhd_ratios <- all_parcels %>% cap_fig2 <- glue( "Neighborhood-Level Median Ratios.", "\\newline Blue indicates under-assessment;", - " Green (0.95–1.05) indicates near-standard;", + " Green (0.90–1.1) indicates within standard;", " Red indicates over-assessment." ) ``` From f99714c073be7f380e28d54d247f13054974efb3 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 25 Aug 2026 17:13:03 +0000 Subject: [PATCH 05/46] ordering updates --- ratio-analysis/ratio-analysis.qmd | 191 +++++++++++++++--------------- 1 file changed, 95 insertions(+), 96 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 898a86b..248e858 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -225,6 +225,58 @@ This analysis compares ratio statistics from two stages: ## Results +```{r cap-1} +cap_fig1 <- glue( + "Town-Level IAAO Statistics.", + "\\newline Green shading meets IAAO standard; orange shading does not." +) +``` + +```{r tbl-1} +#| tbl-cap: !expr 'cap_fig1' +#| tbl-pos: H + +ts <- town_stats + +iaao_table <- data.frame( + Metric = c("Median Ratio", "COD", "PRD", "PRB", "MKI", "N Sales"), + `IAAO Standard` = c( + "0.90 -- 1.10", + "5.0 -- 15.0", + "0.98 -- 1.03", + "$\\pm$0.05", + "0.90 -- 1.10", + "---" + ), + Model = c( + iaao_color_cell("Median Ratio", ts$model_ratio, digits = 3), + iaao_color_cell("COD", ts$model_cod, digits = 1), + iaao_color_cell("PRD", ts$model_prd, digits = 4), + iaao_color_cell("PRB", ts$model_prb, digits = 4), + iaao_color_cell("MKI", ts$model_mki, digits = 4), + ), + `Desk Review` = c( + iaao_color_cell("Median Ratio", ts$desk_review_ratio, digits = 3), + iaao_color_cell("COD", ts$desk_review_cod, digits = 1), + iaao_color_cell("PRD", ts$desk_review_prd, digits = 4), + iaao_color_cell("PRB", ts$desk_review_prb, digits = 4), + iaao_color_cell("MKI", ts$desk_review_mki, digits = 4), + format(ts$number_of_sales, big.mark = ",") + ), + check.names = FALSE +) + +knitr::kable( + iaao_table, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + col.names = c("Metric", "IAAO Standard", "Model", "Desk Review"), + align = c("l", "c", "r", "r") +) +``` + ```{r cap-desc} cap_desc <- glue( "Descriptive Statistics.", @@ -310,58 +362,6 @@ knitr::kable( ) ``` -```{r cap-1} -cap_fig1 <- glue( - "Town-Level IAAO Statistics.", - "\\newline Green shading meets IAAO standard; orange shading does not." -) -``` - -```{r tbl-1} -#| tbl-cap: !expr 'cap_fig1' -#| tbl-pos: H - -ts <- town_stats - -iaao_table <- data.frame( - Metric = c("Median Ratio", "COD", "PRD", "PRB", "MKI", "N Sales"), - `IAAO Standard` = c( - "0.90 -- 1.10", - "5.0 -- 15.0", - "0.98 -- 1.03", - "$\\pm$0.05", - "0.90 -- 1.10", - "---" - ), - Model = c( - iaao_color_cell("Median Ratio", ts$model_ratio, digits = 3), - iaao_color_cell("COD", ts$model_cod, digits = 1), - iaao_color_cell("PRD", ts$model_prd, digits = 4), - iaao_color_cell("PRB", ts$model_prb, digits = 4), - iaao_color_cell("MKI", ts$model_mki, digits = 4), - ), - `Desk Review` = c( - iaao_color_cell("Median Ratio", ts$desk_review_ratio, digits = 3), - iaao_color_cell("COD", ts$desk_review_cod, digits = 1), - iaao_color_cell("PRD", ts$desk_review_prd, digits = 4), - iaao_color_cell("PRB", ts$desk_review_prb, digits = 4), - iaao_color_cell("MKI", ts$desk_review_mki, digits = 4), - format(ts$number_of_sales, big.mark = ",") - ), - check.names = FALSE -) - -knitr::kable( - iaao_table, - format = "latex", - escape = FALSE, - booktabs = FALSE, - linesep = "", - col.names = c("Metric", "IAAO Standard", "Model", "Desk Review"), - align = c("l", "c", "r", "r") -) -``` - ```{r nbhd-ratios-prep} nbhd_ratios <- all_parcels %>% filter(!is.na(sale_price), !sale_excluded %in% TRUE) %>% @@ -374,50 +374,6 @@ nbhd_ratios <- all_parcels %>% ) ``` -{{< pagebreak >}} - -```{r cap-2} -cap_fig2 <- glue( - "Neighborhood-Level Median Ratios.", - "\\newline Blue indicates under-assessment;", - " Green (0.90–1.1) indicates within standard;", - " Red indicates over-assessment." -) -``` - -```{r tbl-2} -#| tbl-cap: !expr 'cap_fig2' - -all_nbhds <- all_parcels %>% - distinct(neighborhood_number) %>% - arrange(neighborhood_number) - -nbhd_table_data <- all_nbhds %>% - left_join(nbhd_ratios, by = "neighborhood_number") %>% - mutate( - `NBHD` = neighborhood_number, - `Model Ratio` = ifelse( - is.na(model_ratio), "---", color_ratio_cell(model_ratio, digits = 3) - ), - `DR Ratio` = ifelse( - is.na(dr_ratio), "---", color_ratio_cell(dr_ratio, digits = 3) - ), - `N Sales` = ifelse(is.na(n_sales), 0L, n_sales) - ) %>% - select(`NBHD`, `Model Ratio`, `DR Ratio`, `N Sales`) - -knitr::kable( - nbhd_table_data, - format = "latex", - escape = FALSE, - booktabs = FALSE, - linesep = "", - longtable = TRUE, - align = c("l", "r", "r", "r"), - col.names = c("NBHD", "Model Ratio", "DR Ratio", "N Sales") -) -``` - ```{r cap-3} cap_fig3 <- glue( "IAAO Metrics: Model vs. Desk Review.", @@ -749,3 +705,46 @@ print(map_diff, vp = viewport( )) ``` +{{< pagebreak >}} + +```{r cap-2} +cap_fig2 <- glue( + "Neighborhood-Level Median Ratios.", + "\\newline Blue indicates under-assessment;", + " Green (0.90–1.1) indicates within standard;", + " Red indicates over-assessment." +) +``` + +```{r tbl-2} +#| tbl-cap: !expr 'cap_fig2' + +all_nbhds <- all_parcels %>% + distinct(neighborhood_number) %>% + arrange(neighborhood_number) + +nbhd_table_data <- all_nbhds %>% + left_join(nbhd_ratios, by = "neighborhood_number") %>% + mutate( + `NBHD` = neighborhood_number, + `Model Ratio` = ifelse( + is.na(model_ratio), "---", color_ratio_cell(model_ratio, digits = 3) + ), + `DR Ratio` = ifelse( + is.na(dr_ratio), "---", color_ratio_cell(dr_ratio, digits = 3) + ), + `N Sales` = ifelse(is.na(n_sales), 0L, n_sales) + ) %>% + select(`NBHD`, `Model Ratio`, `DR Ratio`, `N Sales`) + +knitr::kable( + nbhd_table_data, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + longtable = TRUE, + align = c("l", "r", "r", "r"), + col.names = c("NBHD", "Model Ratio", "DR Ratio", "N Sales") +) +``` From 80943a55dc248a6763187e03635a346aef33c739 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 25 Aug 2026 17:39:16 +0000 Subject: [PATCH 06/46] sepearate tables --- ratio-analysis/ratio-analysis.qmd | 139 +++++++++++++++++------------- 1 file changed, 79 insertions(+), 60 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 248e858..d39f09a 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -277,21 +277,7 @@ knitr::kable( ) ``` -```{r cap-desc} -cap_desc <- glue( - "Descriptive Statistics.", - "\\newline Summary of model and desk review assessed values and sale prices", - " across all properties, properties with arm's-length sales used in the", - " ratio analysis, and properties without qualifying sales.", - " Note: Some sales are excluded as non-arm's-length transactions,", - " so 'Sales Used' and 'No Sales' do not sum to 'All Properties'." -) -``` - -```{r tbl-desc} -#| tbl-cap: !expr 'cap_desc' -#| tbl-pos: H - +```{r desc-helpers} no_sale <- all_parcels %>% filter(is.na(sale_price)) fmt_n <- function(x) format(x, big.mark = ",") @@ -299,66 +285,99 @@ fmt_dol <- function(x) paste0("\\$", format(round(x), big.mark = ",")) fmt_pct <- function(changed, total) { paste0(round(changed / total * 100, 1), "\\%") } - n_changed <- function(df) { sum(!is.na(df$model_value) & !is.na(df$desk_review_value) & df$model_value != df$desk_review_value) # nolint: indentation_linter. } +``` -desc_table <- tibble( - Statistic = c( - "N", - "N DR Changes", - "\\% DR Changes", - "Median Model AV", - "Mean Model AV", - "Median DR AV", - "Mean DR AV", - "Median Sale Price", - "Mean Sale Price" - ), - `Sales Used` = c( - fmt_n(nrow(sales_df)), - fmt_n(n_changed(sales_df)), - fmt_pct(n_changed(sales_df), nrow(sales_df)), +```{r cap-desc-av} +cap_desc_av <- glue( + "Assessed Values by Group.", + "\\newline Model and desk review assessed values for properties", + " with qualifying arm's-length sales (Sold), properties without", + " a recorded sale (Unsold), and all residential parcels (All)." +) +``` + +```{r tbl-desc-av} +#| tbl-cap: !expr 'cap_desc_av' +#| tbl-pos: H + +av_table <- tibble( + Group = c("Sold", "Unsold", "All"), + `Median Model AV` = c( fmt_dol(median(sales_df$model_value, na.rm = TRUE)), + fmt_dol(median(no_sale$model_value, na.rm = TRUE)), + fmt_dol(median(all_parcels$model_value, na.rm = TRUE)) + ), + `Mean Model AV` = c( fmt_dol(mean(sales_df$model_value, na.rm = TRUE)), + fmt_dol(mean(no_sale$model_value, na.rm = TRUE)), + fmt_dol(mean(all_parcels$model_value, na.rm = TRUE)) + ), + `Median DR AV` = c( fmt_dol(median(sales_df$desk_review_value, na.rm = TRUE)), + fmt_dol(median(no_sale$desk_review_value, na.rm = TRUE)), + fmt_dol(median(all_parcels$desk_review_value, na.rm = TRUE)) + ), + `Mean DR AV` = c( fmt_dol(mean(sales_df$desk_review_value, na.rm = TRUE)), - fmt_dol(median(sales_df$sale_price, na.rm = TRUE)), - fmt_dol(mean(sales_df$sale_price, na.rm = TRUE)) + fmt_dol(mean(no_sale$desk_review_value, na.rm = TRUE)), + fmt_dol(mean(all_parcels$desk_review_value, na.rm = TRUE)) + ) +) + +knitr::kable( + av_table, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + align = c("l", "r", "r", "r", "r") +) +``` + +```{r cap-desc-changes} +cap_desc_changes <- glue( + "Desk Review Changes by Group.", + "\\newline Number and share of properties whose assessed value was", + " changed by desk review. Sold and Unsold do not sum to All because", + " properties with non-arm's-length sales are counted in All but", + " neither in Sold nor Unsold." +) +``` + +```{r tbl-desc-changes} +#| tbl-cap: !expr 'cap_desc_changes' +#| tbl-pos: H + +changes_table <- tibble( + Group = c("Sold", "Unsold", "All"), + N = c( + fmt_n(nrow(sales_df)), + fmt_n(nrow(no_sale)), + fmt_n(nrow(all_parcels)) ), - `All Properties` = c( - fmt_n(nrow(all_parcels)), - fmt_n(n_changed(all_parcels)), - fmt_pct(n_changed(all_parcels), nrow(all_parcels)), - fmt_dol(median(all_parcels$model_value, na.rm = TRUE)), - fmt_dol(mean(all_parcels$model_value, na.rm = TRUE)), - fmt_dol(median(all_parcels$desk_review_value, na.rm = TRUE)), - fmt_dol(mean(all_parcels$desk_review_value, na.rm = TRUE)), - "---", - "---" + `N DR Changes` = c( + fmt_n(n_changed(sales_df)), + fmt_n(n_changed(no_sale)), + fmt_n(n_changed(all_parcels)) ), - `No Sales` = c( - fmt_n(nrow(no_sale)), - "---", - "---", - fmt_dol(median(no_sale$model_value, na.rm = TRUE)), - fmt_dol(mean(no_sale$model_value, na.rm = TRUE)), - fmt_dol(median(no_sale$desk_review_value, na.rm = TRUE)), - fmt_dol(mean(no_sale$desk_review_value, na.rm = TRUE)), - "---", - "---" + `\\% DR Changes` = c( + fmt_pct(n_changed(sales_df), nrow(sales_df)), + fmt_pct(n_changed(no_sale), nrow(no_sale)), + fmt_pct(n_changed(all_parcels), nrow(all_parcels)) ) ) knitr::kable( - desc_table, - format = "latex", - escape = FALSE, - booktabs = FALSE, - linesep = "", - align = c("l", "r", "r", "r") + changes_table, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + align = c("l", "r", "r", "r") ) ``` From b114b325e8666bd0416aab11f88beae845b14be3 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 25 Aug 2026 18:14:27 +0000 Subject: [PATCH 07/46] add total av --- ratio-analysis/preamble.tex | 7 +++++++ ratio-analysis/ratio-analysis.qmd | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 ratio-analysis/preamble.tex diff --git a/ratio-analysis/preamble.tex b/ratio-analysis/preamble.tex new file mode 100644 index 0000000..7ebbf4c --- /dev/null +++ b/ratio-analysis/preamble.tex @@ -0,0 +1,7 @@ +\usepackage{colortbl} +\usepackage{caption} +\captionsetup{position=top, labelfont=bf} +\setlength{\aboverulesep}{0pt} +\setlength{\belowrulesep}{0pt} +\renewcommand{\tablename}{Figure} +\makeatletter\let\c@table\c@figure\makeatother diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index d39f09a..bc3efdb 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -254,6 +254,7 @@ iaao_table <- data.frame( iaao_color_cell("PRD", ts$model_prd, digits = 4), iaao_color_cell("PRB", ts$model_prb, digits = 4), iaao_color_cell("MKI", ts$model_mki, digits = 4), + format(ts$number_of_sales, big.mark = ",") ), `Desk Review` = c( iaao_color_cell("Median Ratio", ts$desk_review_ratio, digits = 3), @@ -289,6 +290,11 @@ n_changed <- function(df) { sum(!is.na(df$model_value) & !is.na(df$desk_review_value) & df$model_value != df$desk_review_value) # nolint: indentation_linter. } +total_shift <- function(df) { + changed <- !is.na(df$model_value) & !is.na(df$desk_review_value) & + df$model_value != df$desk_review_value # nolint: indentation_linter. + sum(df$desk_review_value[changed] - df$model_value[changed], na.rm = TRUE) +} ``` ```{r cap-desc-av} @@ -368,6 +374,11 @@ changes_table <- tibble( fmt_pct(n_changed(sales_df), nrow(sales_df)), fmt_pct(n_changed(no_sale), nrow(no_sale)), fmt_pct(n_changed(all_parcels), nrow(all_parcels)) + ), + `Total AV Shift` = c( + fmt_dol(total_shift(sales_df)), + fmt_dol(total_shift(no_sale)), + fmt_dol(total_shift(all_parcels)) ) ) @@ -377,7 +388,7 @@ knitr::kable( escape = FALSE, booktabs = FALSE, linesep = "", - align = c("l", "r", "r", "r") + align = c("l", "r", "r", "r", "r") ) ``` From 74407310f4d189cdc15db8aac3b2658d4d89490b Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Thu, 27 Aug 2026 10:02:41 -0500 Subject: [PATCH 08/46] Update ratio-analysis/ratio-analysis.qmd Co-authored-by: Nicole Jardine <138712135+ccao-jardine@users.noreply.github.com> --- ratio-analysis/ratio-analysis.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index bc3efdb..49752cd 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -703,7 +703,7 @@ map_diff <- ggplot() + ```{r cap-6} cap_fig6 <- glue( "Neighborhood Median Assessment Ratios.", - "\\newline Green (0.95–1.05) meets the ±5% threshold;", + "\\newline Green (0.90–1.10) meets the ±10% threshold;", " Blue indicates under-assessment;", " Red indicates over-assessment.", " The right panel shows desk review improvement:", From c365d9639501d60e6bf5490846a456944a47a78c Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Thu, 27 Aug 2026 18:35:42 +0000 Subject: [PATCH 09/46] Nicole V2 edits --- ratio-analysis/ratio-analysis.qmd | 452 ++++++++++++++---------------- 1 file changed, 213 insertions(+), 239 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index bc3efdb..864110e 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -51,7 +51,7 @@ town_name <- ccao::town_dict %>% dr_wb <- loadWorkbook(input_file) dr_vals <- read.xlsx(dr_wb, sheet = 1) %>% tibble(.name_repair = "unique") %>% - select(pin = PIN, desk_review_value = Desk.Review.Value) + select(pin = PIN, desk_review_FMV = Desk.Review.Value) # Athena: pull model values and the residential PIN universe @@ -75,15 +75,16 @@ dbDisconnect(conn) all_parcels <- dr_vals %>% inner_join(select(model_vals, pin), by = "pin") %>% full_join(model_vals, by = "pin") %>% + rename(model_FMV = model_value) %>% filter(township_name == town_name) %>% mutate( sale_date = as.Date(sale_date), - sale_excluded = if_else(is.na(sale_price), NA, is.na(desk_review_value)), + sale_excluded = if_else(is.na(sale_price), NA, is.na(desk_review_FMV)), price_decile = ntile( if_else(sale_excluded %in% TRUE, NA_real_, sale_price), 10 ), - model_sale_ratio = model_value / sale_price, - desk_review_sale_ratio = desk_review_value / sale_price + model_sale_ratio = model_FMV / sale_price, + desk_review_sale_ratio = desk_review_FMV / sale_price ) # Compute statistics @@ -93,19 +94,19 @@ sales_df <- all_parcels %>% town_stats <- tibble( model_ratio = median(sales_df$model_sale_ratio, na.rm = TRUE), model_cod = assessr::cod(sales_df$model_sale_ratio), - model_prd = assessr::prd(sales_df$model_value, sales_df$sale_price), - model_prb = assessr::prb(sales_df$model_value, sales_df$sale_price), - model_mki = assessr::mki(sales_df$model_value, sales_df$sale_price), + model_prd = assessr::prd(sales_df$model_FMV, sales_df$sale_price), + model_prb = assessr::prb(sales_df$model_FMV, sales_df$sale_price), + model_mki = assessr::mki(sales_df$model_FMV, sales_df$sale_price), desk_review_ratio = median(sales_df$desk_review_sale_ratio, na.rm = TRUE), desk_review_cod = assessr::cod(sales_df$desk_review_sale_ratio), desk_review_prd = assessr::prd( - sales_df$desk_review_value, sales_df$sale_price + sales_df$desk_review_FMV, sales_df$sale_price ), desk_review_prb = assessr::prb( - sales_df$desk_review_value, sales_df$sale_price + sales_df$desk_review_FMV, sales_df$sale_price ), desk_review_mki = assessr::mki( - sales_df$desk_review_value, sales_df$sale_price + sales_df$desk_review_FMV, sales_df$sale_price ), price_range = paste( scales::dollar(min(sales_df$sale_price)), @@ -143,39 +144,62 @@ min_sale_date <- format(min(sale_dates), "%B %d, %Y") max_sale_date <- format(max(sale_dates), "%B %d, %Y") -# Calculate Stats +# Metric definitions: name, digits, IAAO lo/hi bounds, band mid and half-span +metric_meta <- tibble( + name = c("Median Ratio", "COD", "PRD", "PRB", "MKI"), + digits = c(3, 1, 4, 4, 4), + lo = c(0.90, 5.0, 0.98, -0.05, 0.90), + hi = c(1.10, 15.0, 1.03, 0.05, 1.10), + mid = c(1.000, 10.0, 1.005, 0.00, 1.000), + half_span = c(0.100, 5.0, 0.025, 0.05, 0.100), + standard_label = c( + "0.90 -- 1.10", "5.0 -- 15.0", "0.98 -- 1.03", "$\\pm$0.05", "0.90 -- 1.10" + ) +) + +# Color palette +pal <- list( + pass = "A8DDB5", + fail = "FDBB84", + model = "#A569BD", + desk_review = "#2C2C2C", + ratio_na = "EEEEEE", + ratio_colors = c("4575B4", "74ADD1", "66BD63", "FC8D59", "D73027"), + ratio_values = c(0.70, 0.8999, 0.9001, 1.0999, 1.1001, 1.30), + ratio_limits = c(0.70, 1.30), + ratio_breaks = c(0.80, 0.90, 1.00, 1.10, 1.20), + iaao_band = "#A8DDB5" +) iaao_check <- function(metric, value) { - switch(metric, - "Median Ratio" = value >= 0.90 & value <= 1.10, - "COD" = value >= 5.0 & value <= 15.0, - "PRD" = value >= 0.98 & value <= 1.03, - "PRB" = value >= -0.05 & value <= 0.05, - "MKI" = value >= 0.90 & value <= 1.10, - NA - ) + m <- metric_meta[metric_meta$name == metric, ] + if (nrow(m) == 0) { + return(NA) + } + value >= m$lo & value <= m$hi } -iaao_color_cell <- function(metric, value, digits = 4) { +iaao_color_cell <- function(metric, value) { + m <- metric_meta[metric_meta$name == metric, ] + digits <- if (nrow(m) > 0) m$digits else 4 v <- round(value, digits) passes <- iaao_check(metric, value) if (is.na(passes)) { return(as.character(v)) } - hex <- if (passes) "A8DDB5" else "FDBB84" + hex <- if (passes) pal$pass else pal$fail paste0("\\cellcolor[HTML]{", hex, "} ", v) } ratio_to_hex <- function(ratio) { + rc <- pal$ratio_colors case_when( - is.na(ratio) ~ "EEEEEE", - ratio < 0.80 ~ "4575B4", - ratio < 0.90 ~ "74ADD1", - ratio < 0.95 ~ "ABD9E9", - ratio <= 1.05 ~ "66BD63", - ratio <= 1.10 ~ "FEE08B", - ratio <= 1.15 ~ "FC8D59", - TRUE ~ "D73027" + is.na(ratio) ~ pal$ratio_na, + ratio < 0.80 ~ rc[1], + ratio < 0.90 ~ rc[2], + ratio <= 1.10 ~ rc[3], + ratio <= 1.20 ~ rc[4], + TRUE ~ rc[5] ) } @@ -186,21 +210,16 @@ color_ratio_cell <- function(ratio, digits = 3) { } ratio_fill_scale <- function(name = "Median\nRatio") { + rc <- paste0("#", pal$ratio_colors) scale_fill_gradientn( - colors = c( - "#4575B4", "#74ADD1", "#ABD9E9", - "#66BD63", "#66BD63", "#66BD63", - "#FEE08B", "#FC8D59", "#D73027" - ), - values = scales::rescale( - c(0.70, 0.80, 0.90, 0.9499, 0.95, 1.0499, 1.05, 1.15, 1.30) - ), - limits = c(0.70, 1.30), - oob = scales::squish, - na.value = "gray90", - breaks = c(0.80, 0.90, 0.95, 1.00, 1.05, 1.10, 1.20), - labels = c("0.80", "0.90", "0.95", "1.00", "1.05", "1.10", "1.20"), - name = name + colors = c(rc[1], rc[2], rc[3], rc[3], rc[4], rc[5]), + values = scales::rescale(pal$ratio_values), + limits = pal$ratio_limits, + oob = scales::squish, + na.value = paste0("#", pal$ratio_na), + breaks = pal$ratio_breaks, + labels = sprintf("%.2f", pal$ratio_breaks), + name = name ) } ``` @@ -239,29 +258,22 @@ cap_fig1 <- glue( ts <- town_stats iaao_table <- data.frame( - Metric = c("Median Ratio", "COD", "PRD", "PRB", "MKI", "N Sales"), - `IAAO Standard` = c( - "0.90 -- 1.10", - "5.0 -- 15.0", - "0.98 -- 1.03", - "$\\pm$0.05", - "0.90 -- 1.10", - "---" - ), + Metric = c(metric_meta$name, "N Sales"), + `IAAO Standard` = c(metric_meta$standard_label, "---"), Model = c( - iaao_color_cell("Median Ratio", ts$model_ratio, digits = 3), - iaao_color_cell("COD", ts$model_cod, digits = 1), - iaao_color_cell("PRD", ts$model_prd, digits = 4), - iaao_color_cell("PRB", ts$model_prb, digits = 4), - iaao_color_cell("MKI", ts$model_mki, digits = 4), + iaao_color_cell("Median Ratio", ts$model_ratio), + iaao_color_cell("COD", ts$model_cod), + iaao_color_cell("PRD", ts$model_prd), + iaao_color_cell("PRB", ts$model_prb), + iaao_color_cell("MKI", ts$model_mki), format(ts$number_of_sales, big.mark = ",") ), `Desk Review` = c( - iaao_color_cell("Median Ratio", ts$desk_review_ratio, digits = 3), - iaao_color_cell("COD", ts$desk_review_cod, digits = 1), - iaao_color_cell("PRD", ts$desk_review_prd, digits = 4), - iaao_color_cell("PRB", ts$desk_review_prb, digits = 4), - iaao_color_cell("MKI", ts$desk_review_mki, digits = 4), + iaao_color_cell("Median Ratio", ts$desk_review_ratio), + iaao_color_cell("COD", ts$desk_review_cod), + iaao_color_cell("PRD", ts$desk_review_prd), + iaao_color_cell("PRB", ts$desk_review_prb), + iaao_color_cell("MKI", ts$desk_review_mki), format(ts$number_of_sales, big.mark = ",") ), check.names = FALSE @@ -278,132 +290,6 @@ knitr::kable( ) ``` -```{r desc-helpers} -no_sale <- all_parcels %>% filter(is.na(sale_price)) - -fmt_n <- function(x) format(x, big.mark = ",") -fmt_dol <- function(x) paste0("\\$", format(round(x), big.mark = ",")) -fmt_pct <- function(changed, total) { - paste0(round(changed / total * 100, 1), "\\%") -} -n_changed <- function(df) { - sum(!is.na(df$model_value) & !is.na(df$desk_review_value) & - df$model_value != df$desk_review_value) # nolint: indentation_linter. -} -total_shift <- function(df) { - changed <- !is.na(df$model_value) & !is.na(df$desk_review_value) & - df$model_value != df$desk_review_value # nolint: indentation_linter. - sum(df$desk_review_value[changed] - df$model_value[changed], na.rm = TRUE) -} -``` - -```{r cap-desc-av} -cap_desc_av <- glue( - "Assessed Values by Group.", - "\\newline Model and desk review assessed values for properties", - " with qualifying arm's-length sales (Sold), properties without", - " a recorded sale (Unsold), and all residential parcels (All)." -) -``` - -```{r tbl-desc-av} -#| tbl-cap: !expr 'cap_desc_av' -#| tbl-pos: H - -av_table <- tibble( - Group = c("Sold", "Unsold", "All"), - `Median Model AV` = c( - fmt_dol(median(sales_df$model_value, na.rm = TRUE)), - fmt_dol(median(no_sale$model_value, na.rm = TRUE)), - fmt_dol(median(all_parcels$model_value, na.rm = TRUE)) - ), - `Mean Model AV` = c( - fmt_dol(mean(sales_df$model_value, na.rm = TRUE)), - fmt_dol(mean(no_sale$model_value, na.rm = TRUE)), - fmt_dol(mean(all_parcels$model_value, na.rm = TRUE)) - ), - `Median DR AV` = c( - fmt_dol(median(sales_df$desk_review_value, na.rm = TRUE)), - fmt_dol(median(no_sale$desk_review_value, na.rm = TRUE)), - fmt_dol(median(all_parcels$desk_review_value, na.rm = TRUE)) - ), - `Mean DR AV` = c( - fmt_dol(mean(sales_df$desk_review_value, na.rm = TRUE)), - fmt_dol(mean(no_sale$desk_review_value, na.rm = TRUE)), - fmt_dol(mean(all_parcels$desk_review_value, na.rm = TRUE)) - ) -) - -knitr::kable( - av_table, - format = "latex", - escape = FALSE, - booktabs = FALSE, - linesep = "", - align = c("l", "r", "r", "r", "r") -) -``` - -```{r cap-desc-changes} -cap_desc_changes <- glue( - "Desk Review Changes by Group.", - "\\newline Number and share of properties whose assessed value was", - " changed by desk review. Sold and Unsold do not sum to All because", - " properties with non-arm's-length sales are counted in All but", - " neither in Sold nor Unsold." -) -``` - -```{r tbl-desc-changes} -#| tbl-cap: !expr 'cap_desc_changes' -#| tbl-pos: H - -changes_table <- tibble( - Group = c("Sold", "Unsold", "All"), - N = c( - fmt_n(nrow(sales_df)), - fmt_n(nrow(no_sale)), - fmt_n(nrow(all_parcels)) - ), - `N DR Changes` = c( - fmt_n(n_changed(sales_df)), - fmt_n(n_changed(no_sale)), - fmt_n(n_changed(all_parcels)) - ), - `\\% DR Changes` = c( - fmt_pct(n_changed(sales_df), nrow(sales_df)), - fmt_pct(n_changed(no_sale), nrow(no_sale)), - fmt_pct(n_changed(all_parcels), nrow(all_parcels)) - ), - `Total AV Shift` = c( - fmt_dol(total_shift(sales_df)), - fmt_dol(total_shift(no_sale)), - fmt_dol(total_shift(all_parcels)) - ) -) - -knitr::kable( - changes_table, - format = "latex", - escape = FALSE, - booktabs = FALSE, - linesep = "", - align = c("l", "r", "r", "r", "r") -) -``` - -```{r nbhd-ratios-prep} -nbhd_ratios <- all_parcels %>% - filter(!is.na(sale_price), !sale_excluded %in% TRUE) %>% - mutate(neighborhood_number = gsub("-", "", neighborhood_number)) %>% - summarize( - model_ratio = median(model_sale_ratio, na.rm = TRUE), - dr_ratio = median(desk_review_sale_ratio, na.rm = TRUE), - n_sales = n(), - .by = neighborhood_number - ) -``` - ```{r cap-3} cap_fig3 <- glue( "IAAO Metrics: Model vs. Desk Review.", @@ -415,10 +301,10 @@ cap_fig3 <- glue( #| fig-cap: !expr 'cap_fig3' #| fig-pos: H #| fig-cap-location: top -#| fig-height: 7 -#| fig-width: 7 +#| fig-height: 5 +#| fig-width: 6.5 -metric_order <- c("Median Ratio", "COD", "PRD", "PRB", "MKI") +metric_order <- metric_meta$name ts_wide <- tibble( Metric = factor(metric_order, levels = metric_order), @@ -437,19 +323,17 @@ ts_long <- ts_wide %>% c(Model, `Desk Review`), names_to = "Stage", values_to = "Value" ) %>% - mutate(Stage = factor(Stage, levels = c("Model", "Desk Review"))) + mutate(Stage = factor(Stage, levels = c("Model", "Desk Review"))) %>% + left_join(select(metric_meta, Metric = name, digits), by = "Metric") %>% + mutate(label = round(Value, pmin(digits, 2))) -iaao_bands <- tibble( - Metric = factor(metric_order, levels = metric_order), - xmin = c(0.90, 5.0, 0.98, -0.05, 0.90), - xmax = c(1.10, 15.0, 1.03, 0.05, 1.10) -) +iaao_bands <- metric_meta %>% + mutate(Metric = factor(name, levels = metric_order)) %>% + select(Metric, xmin = lo, xmax = hi) -iaao_meta <- tibble( - Metric = factor(metric_order, levels = metric_order), - mid = c(1.000, 10.0, 1.005, 0.00, 1.000), - half_span = c(0.100, 5.0, 0.025, 0.05, 0.100) -) +iaao_meta <- metric_meta %>% + mutate(Metric = factor(name, levels = metric_order)) %>% + select(Metric, mid, half_span) sym_anchors <- ts_long %>% left_join(iaao_meta, by = "Metric") %>% @@ -488,7 +372,7 @@ ggplot() + geom_rect( data = iaao_bands, aes(xmin = xmin, xmax = xmax, ymin = 0.1, ymax = 1.9), - fill = "#A8DDB5", alpha = 0.45 + fill = pal$iaao_band, alpha = 0.45 ) + geom_segment( data = ts_wide, @@ -502,15 +386,16 @@ ggplot() + ) + geom_text( data = ts_long, - aes(x = Value, y = 1, label = round(Value, 3), color = Stage), + aes(x = Value, y = 1, label = label, color = Stage), vjust = -1.6, size = 3, fontface = "bold" ) + facet_wrap(~Metric, scales = "free_x", ncol = 1) + scale_color_manual( - values = c("Model" = "#A569BD", "Desk Review" = "#2C2C2C") + values = c("Model" = pal$model, "Desk Review" = pal$desk_review) ) + scale_shape_manual(values = c("Model" = 16, "Desk Review" = 17)) + scale_y_continuous(limits = c(0, 2)) + + coord_cartesian(clip = "off") + theme_minimal(base_size = 11) + theme( axis.text.y = element_blank(), @@ -523,6 +408,122 @@ ggplot() + labs(x = NULL, y = NULL, color = "Stage", shape = "Stage") ``` +```{r desc-helpers} +no_sale <- all_parcels %>% filter(is.na(sale_price)) + +fmt_n <- function(x) format(x, big.mark = ",") +fmt_dol <- function(x) paste0("\\$", format(round(x), big.mark = ",")) +fmt_pct <- function(changed, total) { + paste0(round(changed / total * 100, 1), "\\%") +} +n_changed <- function(df) { + sum(!is.na(df$model_FMV) & !is.na(df$desk_review_FMV) & + df$model_FMV != df$desk_review_FMV) # nolint: indentation_linter. +} +``` + +```{r cap-desc-av} +cap_desc_av <- glue( + "Fair Market Values by Group.", + "\\newline Model and desk review fair market values for properties", + " with qualifying arm's-length sales (Sold), properties without", + " a recorded sale (Unsold), and all residential parcels (All)." +) +``` + +```{r tbl-desc-av} +#| tbl-cap: !expr 'cap_desc_av' +#| tbl-pos: H + +av_table <- tibble( + Group = c("Sold", "Unsold", "All"), + `Median Model FMV` = c( + fmt_dol(median(sales_df$model_FMV, na.rm = TRUE)), + fmt_dol(median(no_sale$model_FMV, na.rm = TRUE)), + fmt_dol(median(all_parcels$model_FMV, na.rm = TRUE)) + ), + `Median DR FMV` = c( + fmt_dol(median(sales_df$desk_review_FMV, na.rm = TRUE)), + fmt_dol(median(no_sale$desk_review_FMV, na.rm = TRUE)), + fmt_dol(median(all_parcels$desk_review_FMV, na.rm = TRUE)) + ), + `Mean Model FMV` = c( + fmt_dol(mean(sales_df$model_FMV, na.rm = TRUE)), + fmt_dol(mean(no_sale$model_FMV, na.rm = TRUE)), + fmt_dol(mean(all_parcels$model_FMV, na.rm = TRUE)) + ), + `Mean DR FMV` = c( + fmt_dol(mean(sales_df$desk_review_FMV, na.rm = TRUE)), + fmt_dol(mean(no_sale$desk_review_FMV, na.rm = TRUE)), + fmt_dol(mean(all_parcels$desk_review_FMV, na.rm = TRUE)) + ) +) + +knitr::kable( + av_table, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + align = c("l", "r", "r", "r", "r") +) +``` + +```{r cap-desc-changes} +cap_desc_changes <- glue( + "Desk Review Changes by Group.", + "\\newline Number and share of properties whose assessed value was", + " changed by desk review. Sold and Unsold do not sum to All because", + " properties with non-arm's-length sales are counted in All but", + " neither in Sold nor Unsold." +) +``` + +```{r tbl-desc-changes} +#| tbl-cap: !expr 'cap_desc_changes' +#| tbl-pos: H + +changes_table <- tibble( + Group = c("Sold", "Unsold", "All"), + N = c( + fmt_n(nrow(sales_df)), + fmt_n(nrow(no_sale)), + fmt_n(nrow(all_parcels)) + ), + `N DR Changes` = c( + fmt_n(n_changed(sales_df)), + fmt_n(n_changed(no_sale)), + fmt_n(n_changed(all_parcels)) + ), + `\\% DR Changes` = c( + fmt_pct(n_changed(sales_df), nrow(sales_df)), + fmt_pct(n_changed(no_sale), nrow(no_sale)), + fmt_pct(n_changed(all_parcels), nrow(all_parcels)) + ) +) + +knitr::kable( + changes_table, + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + align = c("l", "r", "r", "r") +) +``` + +```{r nbhd-ratios-prep} +nbhd_ratios <- all_parcels %>% + filter(!is.na(sale_price), !sale_excluded %in% TRUE) %>% + mutate(neighborhood_number = gsub("-", "", neighborhood_number)) %>% + summarize( + model_ratio = median(model_sale_ratio, na.rm = TRUE), + dr_ratio = median(desk_review_sale_ratio, na.rm = TRUE), + n_sales = n(), + .by = neighborhood_number + ) +``` + ```{r cap-4} cap_fig4 <- glue( "Sale Price Ratio Curve.", @@ -585,7 +586,7 @@ ggplot( ) + annotate("rect", xmin = -Inf, xmax = Inf, ymin = 0.9, ymax = 1.1, - fill = "#66BD63", alpha = 0.12 + fill = pal$iaao_band, alpha = 0.12 ) + geom_hline(yintercept = 1, color = "darkgreen", linewidth = 1) + geom_hline( @@ -601,7 +602,7 @@ ggplot( geom_line(linewidth = 1) + geom_label(show.legend = FALSE, size = 3) + scale_color_manual( - values = c("Model" = "#A569BD", "Desk Review" = "#2C2C2C") + values = c("Model" = pal$model, "Desk Review" = pal$desk_review) ) + scale_x_continuous(breaks = 1:10, labels = axis_labels) + scale_y_continuous( @@ -653,8 +654,7 @@ neighborhoods <- ccao::nbhd_shp %>% select(town_nbhd, geometry) map_data <- neighborhoods %>% - left_join(nbhd_ratios, by = c("town_nbhd" = "neighborhood_number")) %>% - mutate(diff = abs(model_ratio - 1) - abs(dr_ratio - 1)) + left_join(nbhd_ratios, by = c("town_nbhd" = "neighborhood_number")) map_theme <- theme_void(base_size = 9) + theme( @@ -679,36 +679,14 @@ map_dr <- ggplot() + ratio_fill_scale() + map_theme + labs(title = "Desk Review") - -diff_limit <- max(abs(map_data$diff), na.rm = TRUE) -diff_limit <- ceiling(diff_limit * 10) / 10 - -map_diff <- ggplot() + - annotation_map_tile(type = "cartolight", zoomin = 0) + - geom_sf(data = map_data, aes(fill = diff), alpha = 0.85, linewidth = 0.1) + - scale_fill_gradient2( - low = "#D73027", - mid = "white", - high = "#4575B4", - midpoint = 0, - limits = c(-diff_limit, diff_limit), - oob = scales::squish, - na.value = "gray90", - name = "Improvement" - ) + - map_theme + - labs(title = "Desk Review Improvement") ``` ```{r cap-6} cap_fig6 <- glue( "Neighborhood Median Assessment Ratios.", - "\\newline Green (0.95–1.05) meets the ±5% threshold;", + "\\newline Green (0.90–1.10) meets the IAAO standard;", " Blue indicates under-assessment;", - " Red indicates over-assessment.", - " The right panel shows desk review improvement:", - " Blue indicates an improved ratio (closer to 1)", - " and red indicates it moved further away." + " Red indicates over-assessment." ) ``` @@ -722,15 +700,11 @@ cap_fig6 <- glue( grid.newpage() print(map_model, vp = viewport( - x = 0, y = 0, width = 1 / 3, height = 1, + x = 0, y = 0, width = 1 / 2, height = 1, just = c("left", "bottom") )) print(map_dr, vp = viewport( - x = 1 / 3, y = 0, width = 1 / 3, height = 1, - just = c("left", "bottom") -)) -print(map_diff, vp = viewport( - x = 2 / 3, y = 0, width = 1 / 3, height = 1, + x = 1 / 2, y = 0, width = 1 / 2, height = 1, just = c("left", "bottom") )) ``` From aa668090389e046bef6f10d9e0debae2a56786b6 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Thu, 27 Aug 2026 18:44:21 +0000 Subject: [PATCH 10/46] switch more to mv --- ratio-analysis/ratio-analysis.qmd | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 864110e..212b1cd 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -422,8 +422,8 @@ n_changed <- function(df) { } ``` -```{r cap-desc-av} -cap_desc_av <- glue( +```{r cap-desc-mv} +cap_desc_mv <- glue( "Fair Market Values by Group.", "\\newline Model and desk review fair market values for properties", " with qualifying arm's-length sales (Sold), properties without", @@ -431,11 +431,11 @@ cap_desc_av <- glue( ) ``` -```{r tbl-desc-av} -#| tbl-cap: !expr 'cap_desc_av' +```{r tbl-desc-mv} +#| tbl-cap: !expr 'cap_desc_mv' #| tbl-pos: H -av_table <- tibble( +mv_table <- tibble( Group = c("Sold", "Unsold", "All"), `Median Model FMV` = c( fmt_dol(median(sales_df$model_FMV, na.rm = TRUE)), @@ -460,7 +460,7 @@ av_table <- tibble( ) knitr::kable( - av_table, + mv_table, format = "latex", escape = FALSE, booktabs = FALSE, From 219205283d695fb1c23b272a528dc722edcd44b5 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 15:11:38 +0000 Subject: [PATCH 11/46] remove nsales --- ratio-analysis/ratio-analysis.qmd | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 212b1cd..f4037a5 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -53,7 +53,6 @@ dr_vals <- read.xlsx(dr_wb, sheet = 1) %>% tibble(.name_repair = "unique") %>% select(pin = PIN, desk_review_FMV = Desk.Review.Value) - # Athena: pull model values and the residential PIN universe noctua_options(unload = TRUE) @@ -235,8 +234,7 @@ prices ranging from `r town_stats$price_range`. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded as outliers by Valuations analysts, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales**. The township -contains **`r format(n_total_pins, big.mark = ",")` residential -parcels**. +contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. This analysis compares ratio statistics from two stages: (1) **Model** values, which are the output of the model, and @@ -258,23 +256,21 @@ cap_fig1 <- glue( ts <- town_stats iaao_table <- data.frame( - Metric = c(metric_meta$name, "N Sales"), - `IAAO Standard` = c(metric_meta$standard_label, "---"), + Metric = metric_meta$name, + `IAAO Standard` = metric_meta$standard_label, Model = c( iaao_color_cell("Median Ratio", ts$model_ratio), iaao_color_cell("COD", ts$model_cod), iaao_color_cell("PRD", ts$model_prd), iaao_color_cell("PRB", ts$model_prb), - iaao_color_cell("MKI", ts$model_mki), - format(ts$number_of_sales, big.mark = ",") + iaao_color_cell("MKI", ts$model_mki) ), `Desk Review` = c( iaao_color_cell("Median Ratio", ts$desk_review_ratio), iaao_color_cell("COD", ts$desk_review_cod), iaao_color_cell("PRD", ts$desk_review_prd), iaao_color_cell("PRB", ts$desk_review_prb), - iaao_color_cell("MKI", ts$desk_review_mki), - format(ts$number_of_sales, big.mark = ",") + iaao_color_cell("MKI", ts$desk_review_mki) ), check.names = FALSE ) From 1cd8574935d2935cdf60caa53ee24cb3f8573d3b Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 15:23:16 +0000 Subject: [PATCH 12/46] improve text --- ratio-analysis/ratio-analysis.qmd | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index f4037a5..341d93f 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -226,9 +226,8 @@ ratio_fill_scale <- function(name = "Median\nRatio") { ## Methods This is a ratio analysis for **`r town_name` Township** for the `r year_val` -assessment cycle. The original sale sample included -**`r format(n_original_sales, big.mark = ",")`** arm's-length sales -after outliers were excluded. These sales +assessment cycle. The original sale sample included the most recent sales of +**`r format(n_original_sales, big.mark = ",")`** parcels. These sales occurred between `r min_sale_date` and `r max_sale_date`, with sale prices ranging from `r town_stats$price_range`. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded From 9115841763e846cfc82aac97eca5cf3130d4a41d Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 15:38:01 +0000 Subject: [PATCH 13/46] updated text --- ratio-analysis/ratio-analysis.qmd | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 341d93f..dc057ba 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -226,10 +226,8 @@ ratio_fill_scale <- function(name = "Median\nRatio") { ## Methods This is a ratio analysis for **`r town_name` Township** for the `r year_val` -assessment cycle. The original sale sample included the most recent sales of -**`r format(n_original_sales, big.mark = ",")`** parcels. These sales -occurred between `r min_sale_date` and `r max_sale_date`, with sale -prices ranging from `r town_stats$price_range`. Of these, +assessment cycle. It includes the +**`r format(n_original_sales, big.mark = ",")`** most recent sales for each single-card parcel in the past assessment year (between `r min_sale_date` and `r max_sale_date`). Outliers flagged by the data department are removed. Prices range from `r town_stats$price_range`. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded as outliers by Valuations analysts, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales**. The township From e97de6f6f180e95c8fdb549193ca093bab930a8c Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 15:38:38 +0000 Subject: [PATCH 14/46] improve text --- ratio-analysis/ratio-analysis.qmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index dc057ba..91f02df 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -227,11 +227,11 @@ ratio_fill_scale <- function(name = "Median\nRatio") { This is a ratio analysis for **`r town_name` Township** for the `r year_val` assessment cycle. It includes the -**`r format(n_original_sales, big.mark = ",")`** most recent sales for each single-card parcel in the past assessment year (between `r min_sale_date` and `r max_sale_date`). Outliers flagged by the data department are removed. Prices range from `r town_stats$price_range`. Of these, +**`r format(n_original_sales, big.mark = ",")`** most recent sales for each single-card parcel in the past assessment year (between `r min_sale_date` and `r max_sale_date`). Outliers flagged by the data department are removed. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded as outliers by Valuations analysts, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales**. The township -contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. +contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. Prices range from `r town_stats$price_range`. This analysis compares ratio statistics from two stages: (1) **Model** values, which are the output of the model, and From bc6eec105b60e8e3f7160cc3da89d3fb84abc753 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 15:39:52 +0000 Subject: [PATCH 15/46] Add text comment --- ratio-analysis/ratio-analysis.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/ratio-analysis/ratio-analysis.sql b/ratio-analysis/ratio-analysis.sql index 9476dea..d68a7a7 100644 --- a/ratio-analysis/ratio-analysis.sql +++ b/ratio-analysis/ratio-analysis.sql @@ -18,6 +18,7 @@ model_vals AS ( SELECT assessment_pin.meta_pin AS pin, assessment_pin.pred_pin_final_fmv_round AS model_value, + -- Outlier sale prices are already removed in pipeline assessment_pin.sale_ratio_study_price AS sale_price, assessment_pin.sale_ratio_study_date AS sale_date, assessment_pin.sale_ratio_study_document_num AS sale_document_number From 65dc3949058c088ad7c455d82ab1c88802032df9 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 16:04:25 +0000 Subject: [PATCH 16/46] small text change --- ratio-analysis/ratio-analysis.qmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 91f02df..6b95a62 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -227,7 +227,7 @@ ratio_fill_scale <- function(name = "Median\nRatio") { This is a ratio analysis for **`r town_name` Township** for the `r year_val` assessment cycle. It includes the -**`r format(n_original_sales, big.mark = ",")`** most recent sales for each single-card parcel in the past assessment year (between `r min_sale_date` and `r max_sale_date`). Outliers flagged by the data department are removed. Of these, +**`r format(n_original_sales, big.mark = ",")`** most recent sale for each single-card parcel in the past assessment year (between `r min_sale_date` and `r max_sale_date`). Outliers flagged by the data department are removed. Of these, **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded as outliers by Valuations analysts, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales**. The township @@ -467,7 +467,7 @@ cap_desc_changes <- glue( "Desk Review Changes by Group.", "\\newline Number and share of properties whose assessed value was", " changed by desk review. Sold and Unsold do not sum to All because", - " properties with non-arm's-length sales are counted in All but", + " properties removed by desk review as outliers are counted in All but", " neither in Sold nor Unsold." ) ``` From 044843626890ca85e7891865311f6f49212d3a45 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 16:18:24 +0000 Subject: [PATCH 17/46] move all text --- ratio-analysis/ratio-analysis.qmd | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 6b95a62..d25c1b9 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -420,7 +420,10 @@ cap_desc_mv <- glue( "Fair Market Values by Group.", "\\newline Model and desk review fair market values for properties", " with qualifying arm's-length sales (Sold), properties without", - " a recorded sale (Unsold), and all residential parcels (All)." + " a recorded sale (Unsold), and all residential parcels (All).", + " Sold and Unsold do not sum to All because properties removed", + " by desk review as outliers are counted in All but neither in", + " Sold nor Unsold." ) ``` @@ -466,9 +469,7 @@ knitr::kable( cap_desc_changes <- glue( "Desk Review Changes by Group.", "\\newline Number and share of properties whose assessed value was", - " changed by desk review. Sold and Unsold do not sum to All because", - " properties removed by desk review as outliers are counted in All but", - " neither in Sold nor Unsold." + " changed by desk review." ) ``` From 56fad5bcd9e80dd0122b89ce0c52c8bf4d13ed18 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 18:06:10 +0000 Subject: [PATCH 18/46] renaming of headers and cleanup --- ratio-analysis/preamble.tex | 8 +- ratio-analysis/ratio-analysis.qmd | 280 +++++++++++++----------------- 2 files changed, 131 insertions(+), 157 deletions(-) diff --git a/ratio-analysis/preamble.tex b/ratio-analysis/preamble.tex index 7ebbf4c..6b89533 100644 --- a/ratio-analysis/preamble.tex +++ b/ratio-analysis/preamble.tex @@ -1,7 +1,11 @@ \usepackage{colortbl} +\usepackage{titling} +\setlength{\droptitle}{-6em} +\posttitle{\par\end{center}\vspace{-0.5em}} +\postdate{\par\end{center}\vspace{-3em}} \usepackage{caption} -\captionsetup{position=top, labelfont=bf} +\captionsetup{position=top, labelfont=bf, justification=raggedright, singlelinecheck=false} +\captionsetup[table]{name=Figure, position=top, labelfont=bf, justification=raggedright, singlelinecheck=false} \setlength{\aboverulesep}{0pt} \setlength{\belowrulesep}{0pt} -\renewcommand{\tablename}{Figure} \makeatletter\let\c@table\c@figure\makeatother diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index d25c1b9..226a562 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -90,7 +90,7 @@ all_parcels <- dr_vals %>% sales_df <- all_parcels %>% filter(!is.na(sale_price), !sale_excluded %in% TRUE) -town_stats <- tibble( +ts <- tibble( model_ratio = median(sales_df$model_sale_ratio, na.rm = TRUE), model_cod = assessr::cod(sales_df$model_sale_ratio), model_prd = assessr::prd(sales_df$model_FMV, sales_df$sale_price), @@ -221,9 +221,52 @@ ratio_fill_scale <- function(name = "Median\nRatio") { name = name ) } -``` -## Methods +caps <- list( + fig1 = glue( + "Town-Level IAAO Statistics.", + "\\newline Green shading meets IAAO standard; orange shading does not." + ), + fig2 = glue( + "IAAO Metrics: Model vs. Desk Review.", + "\\newline Green shaded band shows the IAAO acceptable range", + " for each metric." + ), + fig3 = glue( + "Fair Market Values by Group.", + "\\newline Model and desk review fair market values for properties", + " with qualifying arm's-length sales (Sold), properties without", + " a recorded sale (Unsold), and all residential parcels (All).", + " Sold and Unsold do not sum to All because properties removed", + " by desk review as outliers are counted in All but neither in", + " Sold nor Unsold." + ), + fig4 = glue( + "Desk Review Changes by Group.", + "\\newline Number and share of properties whose value was", + " changed by desk review." + ), + fig5 = glue( + "Sale Price Ratio Curve.", + "\\newline Each labeled point is the median ratio within that", + " sale price decile.", + " Dotted lines show the IAAO acceptable range (0.9–1.1)." + ), + fig6 = glue("Ratio Curve by Sale Price Decile"), + fig7 = glue( + "Neighborhood Median Assessment Ratios.", + "\\newline Green (0.90–1.10) meets the IAAO standard;", + " Blue indicates under-assessment;", + " Red indicates over-assessment." + ), + fig8 = glue( + "Neighborhood-Level Median Ratios.", + "\\newline Blue indicates under-assessment;", + " Green (0.90–1.1) indicates within standard;", + " Red indicates over-assessment." + ) +) +``` This is a ratio analysis for **`r town_name` Township** for the `r year_val` assessment cycle. It includes the @@ -231,42 +274,35 @@ assessment cycle. It includes the **`r format(n_excluded_sales, big.mark = ",")`** sales were excluded as outliers by Valuations analysts, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales**. The township -contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. Prices range from `r town_stats$price_range`. +contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. Prices range from `r ts$price_range`. This analysis compares ratio statistics from two stages: (1) **Model** values, which are the output of the model, and (2) **Desk Review** values, which reflect manual adjustments by staff. -## Results - -```{r cap-1} -cap_fig1 <- glue( - "Town-Level IAAO Statistics.", - "\\newline Green shading meets IAAO standard; orange shading does not." -) -``` - ```{r tbl-1} -#| tbl-cap: !expr 'cap_fig1' +#| tbl-cap: !expr 'caps$fig1' #| tbl-pos: H -ts <- town_stats +display_order <- c("Median Ratio", "PRB", "PRD", "COD", "MKI") iaao_table <- data.frame( - Metric = metric_meta$name, - `IAAO Standard` = metric_meta$standard_label, + Metric = display_order, + `IAAO Standard` = metric_meta$standard_label[ + match(display_order, metric_meta$name) + ], Model = c( iaao_color_cell("Median Ratio", ts$model_ratio), - iaao_color_cell("COD", ts$model_cod), - iaao_color_cell("PRD", ts$model_prd), iaao_color_cell("PRB", ts$model_prb), + iaao_color_cell("PRD", ts$model_prd), + iaao_color_cell("COD", ts$model_cod), iaao_color_cell("MKI", ts$model_mki) ), `Desk Review` = c( iaao_color_cell("Median Ratio", ts$desk_review_ratio), - iaao_color_cell("COD", ts$desk_review_cod), - iaao_color_cell("PRD", ts$desk_review_prd), iaao_color_cell("PRB", ts$desk_review_prb), + iaao_color_cell("PRD", ts$desk_review_prd), + iaao_color_cell("COD", ts$desk_review_cod), iaao_color_cell("MKI", ts$desk_review_mki) ), check.names = FALSE @@ -283,31 +319,22 @@ knitr::kable( ) ``` -```{r cap-3} -cap_fig3 <- glue( - "IAAO Metrics: Model vs. Desk Review.", - "\\newline Green shaded band shows the IAAO acceptable range for each metric." -) -``` - -```{r fig-3} -#| fig-cap: !expr 'cap_fig3' +```{r fig-2} +#| fig-cap: !expr 'caps$fig2' #| fig-pos: H #| fig-cap-location: top -#| fig-height: 5 +#| fig-height: 3.5 #| fig-width: 6.5 -metric_order <- metric_meta$name - ts_wide <- tibble( - Metric = factor(metric_order, levels = metric_order), + Metric = factor(display_order, levels = display_order), Model = c( - ts$model_ratio, ts$model_cod, ts$model_prd, - ts$model_prb, ts$model_mki + ts$model_ratio, ts$model_prb, ts$model_prd, + ts$model_cod, ts$model_mki ), `Desk Review` = c( - ts$desk_review_ratio, ts$desk_review_cod, ts$desk_review_prd, - ts$desk_review_prb, ts$desk_review_mki + ts$desk_review_ratio, ts$desk_review_prb, ts$desk_review_prd, + ts$desk_review_cod, ts$desk_review_mki ) ) @@ -316,17 +343,15 @@ ts_long <- ts_wide %>% c(Model, `Desk Review`), names_to = "Stage", values_to = "Value" ) %>% - mutate(Stage = factor(Stage, levels = c("Model", "Desk Review"))) %>% - left_join(select(metric_meta, Metric = name, digits), by = "Metric") %>% - mutate(label = round(Value, pmin(digits, 2))) + mutate( + Stage = factor(Stage, levels = c("Model", "Desk Review")), + digits = metric_meta$digits[match(Metric, metric_meta$name)], + label = round(Value, pmin(digits, 2)) + ) -iaao_bands <- metric_meta %>% - mutate(Metric = factor(name, levels = metric_order)) %>% - select(Metric, xmin = lo, xmax = hi) +iaao_bands <- select(metric_meta, Metric = name, xmin = lo, xmax = hi) -iaao_meta <- metric_meta %>% - mutate(Metric = factor(name, levels = metric_order)) %>% - select(Metric, mid, half_span) +iaao_meta <- select(metric_meta, Metric = name, mid, half_span) sym_anchors <- ts_long %>% left_join(iaao_meta, by = "Metric") %>% @@ -352,10 +377,11 @@ sym_anchors <- ts_long %>% scale_anchors <- bind_rows( sym_anchors, - tibble(Metric = factor("COD", levels = metric_order), x = 0) + tibble(Metric = "COD", x = 0) ) ggplot() + + geom_blank(data = ts_long, aes(x = Value, y = 1)) + geom_point( data = scale_anchors, aes(x = x, y = 1), @@ -382,7 +408,7 @@ ggplot() + aes(x = Value, y = 1, label = label, color = Stage), vjust = -1.6, size = 3, fontface = "bold" ) + - facet_wrap(~Metric, scales = "free_x", ncol = 1) + + facet_wrap(~Metric, scales = "free_x", ncol = 1, strip.position = "left") + scale_color_manual( values = c("Model" = pal$model, "Desk Review" = pal$desk_review) ) + @@ -391,12 +417,16 @@ ggplot() + coord_cartesian(clip = "off") + theme_minimal(base_size = 11) + theme( - axis.text.y = element_blank(), - axis.ticks.y = element_blank(), + axis.text.y = element_blank(), + axis.ticks.y = element_blank(), panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank(), - strip.text = element_text(face = "bold", size = 11), - legend.position = "bottom" + strip.text.y.left = element_text( + face = "bold", size = 11, angle = 0, hjust = 1 + ), + strip.placement = "outside", + legend.position = "bottom", + plot.margin = margin(t = 20, r = 5, b = 5, l = 5, unit = "pt") ) + labs(x = NULL, y = NULL, color = "Stage", shape = "Stage") ``` @@ -415,43 +445,27 @@ n_changed <- function(df) { } ``` -```{r cap-desc-mv} -cap_desc_mv <- glue( - "Fair Market Values by Group.", - "\\newline Model and desk review fair market values for properties", - " with qualifying arm's-length sales (Sold), properties without", - " a recorded sale (Unsold), and all residential parcels (All).", - " Sold and Unsold do not sum to All because properties removed", - " by desk review as outliers are counted in All but neither in", - " Sold nor Unsold." -) -``` +{{< pagebreak >}} -```{r tbl-desc-mv} -#| tbl-cap: !expr 'cap_desc_mv' +```{r tbl-3} +#| tbl-cap: !expr 'caps$fig3' #| tbl-pos: H +groups <- list(Sold = sales_df, Unsold = no_sale, All = all_parcels) + mv_table <- tibble( - Group = c("Sold", "Unsold", "All"), - `Median Model FMV` = c( - fmt_dol(median(sales_df$model_FMV, na.rm = TRUE)), - fmt_dol(median(no_sale$model_FMV, na.rm = TRUE)), - fmt_dol(median(all_parcels$model_FMV, na.rm = TRUE)) + Group = names(groups), + `Median Model FMV` = sapply( + groups, \(d) fmt_dol(median(d$model_FMV, na.rm = TRUE)) ), - `Median DR FMV` = c( - fmt_dol(median(sales_df$desk_review_FMV, na.rm = TRUE)), - fmt_dol(median(no_sale$desk_review_FMV, na.rm = TRUE)), - fmt_dol(median(all_parcels$desk_review_FMV, na.rm = TRUE)) + `Median DR FMV` = sapply( + groups, \(d) fmt_dol(median(d$desk_review_FMV, na.rm = TRUE)) ), - `Mean Model FMV` = c( - fmt_dol(mean(sales_df$model_FMV, na.rm = TRUE)), - fmt_dol(mean(no_sale$model_FMV, na.rm = TRUE)), - fmt_dol(mean(all_parcels$model_FMV, na.rm = TRUE)) + `Mean Model FMV` = sapply( + groups, \(d) fmt_dol(mean(d$model_FMV, na.rm = TRUE)) ), - `Mean DR FMV` = c( - fmt_dol(mean(sales_df$desk_review_FMV, na.rm = TRUE)), - fmt_dol(mean(no_sale$desk_review_FMV, na.rm = TRUE)), - fmt_dol(mean(all_parcels$desk_review_FMV, na.rm = TRUE)) + `Mean DR FMV` = sapply( + groups, \(d) fmt_dol(mean(d$desk_review_FMV, na.rm = TRUE)) ) ) @@ -465,16 +479,8 @@ knitr::kable( ) ``` -```{r cap-desc-changes} -cap_desc_changes <- glue( - "Desk Review Changes by Group.", - "\\newline Number and share of properties whose assessed value was", - " changed by desk review." -) -``` - -```{r tbl-desc-changes} -#| tbl-cap: !expr 'cap_desc_changes' +```{r tbl-4} +#| tbl-cap: !expr 'caps$fig4' #| tbl-pos: H changes_table <- tibble( @@ -518,20 +524,13 @@ nbhd_ratios <- all_parcels %>% ) ``` -```{r cap-4} -cap_fig4 <- glue( - "Sale Price Ratio Curve.", - "\\newline Each labeled point is the median ratio within that", - " sale price decile.", - " Dotted lines show the IAAO acceptable range (0.9–1.1)." -) -``` +{{< pagebreak >}} -```{r fig-4} -#| fig-cap: !expr 'cap_fig4' +```{r fig-5} +#| fig-cap: !expr 'caps$fig5' #| fig-pos: H #| fig-cap-location: top -#| fig-height: 5 +#| fig-height: 3.5 #| fig-width: 7 decile_long <- decile_stats %>% @@ -608,17 +607,10 @@ ggplot( labs(x = "Sale Price Decile", y = "Median Sale Ratio", color = "Stage") ``` -{{< pagebreak >}} - -```{r cap-5} -cap_fig5 <- glue( - "Ratio Curve by Sale Price Decile" -) -``` - -```{r tbl-5} -#| tbl-cap: !expr 'cap_fig5' +```{r tbl-6} +#| tbl-cap: !expr 'caps$fig6' #| tbl-pos: H +#| tbl-cap-location: top decile_display <- decile_stats %>% select( @@ -642,7 +634,7 @@ knitr::kable( ) ``` -```{r fig-6-prep} +```{r fig-7-prep} neighborhoods <- ccao::nbhd_shp %>% filter(township_name == town_name) %>% select(town_nbhd, geometry) @@ -656,39 +648,26 @@ map_theme <- theme_void(base_size = 9) + plot.title = element_text(face = "bold", size = 10) ) -map_model <- ggplot() + - annotation_map_tile(type = "cartolight", zoomin = 0) + - geom_sf( - data = map_data, aes(fill = model_ratio), alpha = 0.85, linewidth = 0.1 - ) + - ratio_fill_scale() + - map_theme + - labs(title = "Model") - -map_dr <- ggplot() + - annotation_map_tile(type = "cartolight", zoomin = 0) + - geom_sf( - data = map_data, aes(fill = dr_ratio), alpha = 0.85, linewidth = 0.1 - ) + - ratio_fill_scale() + - map_theme + - labs(title = "Desk Review") -``` +make_map <- function(col, title) { + ggplot() + + annotation_map_tile(type = "cartolight", zoomin = 0) + + geom_sf( + data = map_data, aes(fill = .data[[col]]), alpha = 0.85, linewidth = 0.1 + ) + + ratio_fill_scale() + + map_theme + + labs(title = title) +} -```{r cap-6} -cap_fig6 <- glue( - "Neighborhood Median Assessment Ratios.", - "\\newline Green (0.90–1.10) meets the IAAO standard;", - " Blue indicates under-assessment;", - " Red indicates over-assessment." -) +map_model <- make_map("model_ratio", "Model") +map_dr <- make_map("dr_ratio", "Desk Review") ``` -```{r fig-6} -#| fig-cap: !expr 'cap_fig6' +```{r fig-7} +#| fig-cap: !expr 'caps$fig7' #| fig-pos: H #| fig-cap-location: top -#| fig-height: 5.5 +#| fig-height: 4.5 #| fig-width: 8.5 #| results: 'hide' @@ -703,19 +682,10 @@ print(map_dr, vp = viewport( )) ``` -{{< pagebreak >}} - -```{r cap-2} -cap_fig2 <- glue( - "Neighborhood-Level Median Ratios.", - "\\newline Blue indicates under-assessment;", - " Green (0.90–1.1) indicates within standard;", - " Red indicates over-assessment." -) -``` -```{r tbl-2} -#| tbl-cap: !expr 'cap_fig2' +```{r tbl-8} +#| tbl-cap: !expr 'caps$fig8' +#| tbl-cap-location: top all_nbhds <- all_parcels %>% distinct(neighborhood_number) %>% From fbc64a40ce85768d871514bbb36b8474341e3052 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 18:51:55 +0000 Subject: [PATCH 19/46] Fit onto one page --- ratio-analysis/ratio-analysis.qmd | 38 +++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 226a562..45f117e 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -285,6 +285,7 @@ This analysis compares ratio statistics from two stages: #| tbl-pos: H display_order <- c("Median Ratio", "PRB", "PRD", "COD", "MKI") +met_fac <- function(x) factor(x, levels = display_order) iaao_table <- data.frame( Metric = display_order, @@ -327,7 +328,7 @@ knitr::kable( #| fig-width: 6.5 ts_wide <- tibble( - Metric = factor(display_order, levels = display_order), + Metric = met_fac(display_order), Model = c( ts$model_ratio, ts$model_prb, ts$model_prd, ts$model_cod, ts$model_mki @@ -349,9 +350,11 @@ ts_long <- ts_wide %>% label = round(Value, pmin(digits, 2)) ) -iaao_bands <- select(metric_meta, Metric = name, xmin = lo, xmax = hi) +iaao_bands <- select(metric_meta, Metric = name, xmin = lo, xmax = hi) %>% + mutate(Metric = met_fac(Metric)) -iaao_meta <- select(metric_meta, Metric = name, mid, half_span) +iaao_meta <- select(metric_meta, Metric = name, mid, half_span) %>% + mutate(Metric = met_fac(Metric)) sym_anchors <- ts_long %>% left_join(iaao_meta, by = "Metric") %>% @@ -378,7 +381,8 @@ sym_anchors <- ts_long %>% scale_anchors <- bind_rows( sym_anchors, tibble(Metric = "COD", x = 0) -) +) %>% + mutate(Metric = met_fac(Metric)) ggplot() + geom_blank(data = ts_long, aes(x = Value, y = 1)) + @@ -667,7 +671,7 @@ map_dr <- make_map("dr_ratio", "Desk Review") #| fig-cap: !expr 'caps$fig7' #| fig-pos: H #| fig-cap-location: top -#| fig-height: 4.5 +#| fig-height: 3.5 #| fig-width: 8.5 #| results: 'hide' @@ -686,6 +690,7 @@ print(map_dr, vp = viewport( ```{r tbl-8} #| tbl-cap: !expr 'caps$fig8' #| tbl-cap-location: top +#| tbl-pos: H all_nbhds <- all_parcels %>% distinct(neighborhood_number) %>% @@ -701,18 +706,31 @@ nbhd_table_data <- all_nbhds %>% `DR Ratio` = ifelse( is.na(dr_ratio), "---", color_ratio_cell(dr_ratio, digits = 3) ), - `N Sales` = ifelse(is.na(n_sales), 0L, n_sales) + `N Sales` = as.character(ifelse(is.na(n_sales), 0L, n_sales)) ) %>% select(`NBHD`, `Model Ratio`, `DR Ratio`, `N Sales`) +n <- nrow(nbhd_table_data) +half <- ceiling(n / 2) +pad <- half - (n - half) + +right_half <- bind_rows( + nbhd_table_data[(half + 1):n, ], + if (pad > 0) { + tibble( + NBHD = rep("", pad), `Model Ratio` = rep("", pad), + `DR Ratio` = rep("", pad), `N Sales` = rep("", pad) + ) + } +) + knitr::kable( - nbhd_table_data, + cbind(nbhd_table_data[1:half, ], right_half), format = "latex", escape = FALSE, booktabs = FALSE, linesep = "", - longtable = TRUE, - align = c("l", "r", "r", "r"), - col.names = c("NBHD", "Model Ratio", "DR Ratio", "N Sales") + align = c("l", "r", "r", "r", "l", "r", "r", "r"), + col.names = rep(c("NBHD", "Model Ratio", "DR Ratio", "N Sales"), 2) ) ``` From 688f4f6b7fe028a5e98d3d4a6a5bff76f6bca591 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 28 Aug 2026 18:54:36 +0000 Subject: [PATCH 20/46] add spacer --- ratio-analysis/ratio-analysis.qmd | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 45f117e..dec007b 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -724,13 +724,18 @@ right_half <- bind_rows( } ) +spacer <- tibble(` ` = rep("", half)) + knitr::kable( - cbind(nbhd_table_data[1:half, ], right_half), - format = "latex", - escape = FALSE, - booktabs = FALSE, - linesep = "", - align = c("l", "r", "r", "r", "l", "r", "r", "r"), - col.names = rep(c("NBHD", "Model Ratio", "DR Ratio", "N Sales"), 2) + cbind(nbhd_table_data[1:half, ], spacer, right_half), + format = "latex", + escape = FALSE, + booktabs = FALSE, + linesep = "", + align = c("l", "r", "r", "r", "l", "l", "r", "r", "r"), + col.names = c( + "NBHD", "Model Ratio", "DR Ratio", "N Sales", "", + "NBHD", "Model Ratio", "DR Ratio", "N Sales" + ) ) ``` From 82702dab03f82d2e20bf81d974f5539897d72574 Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Mon, 31 Aug 2026 13:57:16 -0500 Subject: [PATCH 21/46] Update ratio-analysis/ratio-analysis.qmd Co-authored-by: Nicole Jardine <138712135+ccao-jardine@users.noreply.github.com> --- ratio-analysis/ratio-analysis.qmd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index dec007b..2548f81 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -269,12 +269,12 @@ caps <- list( ``` This is a ratio analysis for **`r town_name` Township** for the `r year_val` -assessment cycle. It includes the -**`r format(n_original_sales, big.mark = ",")`** most recent sale for each single-card parcel in the past assessment year (between `r min_sale_date` and `r max_sale_date`). Outliers flagged by the data department are removed. Of these, -**`r format(n_excluded_sales, big.mark = ",")`** sales were excluded +assessment cycle. The initial sale sample had +**`r format(n_original_sales, big.mark = ",")`** sales: this excludes statistical outliers flagged by the Data department, and had transaction dates ranging from `r min_sale_date` to `r max_sale_date`. From these, +**`r format(n_excluded_sales, big.mark = ",")`** additional sales were excluded as outliers by Valuations analysts, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales**. The township -contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. Prices range from `r ts$price_range`. +contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. Prices range from `r ts$price_range` and are not time-adjusted. This analysis compares ratio statistics from two stages: (1) **Model** values, which are the output of the model, and From c2830a5407205fece3fb9a5828ccb3efae869c04 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Mon, 31 Aug 2026 19:55:15 +0000 Subject: [PATCH 22/46] Add commenting and better naming --- ratio-analysis/ratio-analysis.qmd | 206 ++++++++++++++---------------- 1 file changed, 96 insertions(+), 110 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 2548f81..170a3c5 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -1,5 +1,8 @@ --- -title: "Ratio Analysis for `r paste0(tools::toTitleCase(gsub('-', ' ', sub('^[0-9]+-', '', sub('\\.xlsx$', '', basename(params$input_file))))), ', ', basename(dirname(params$input_file)))`" +title: >- + Ratio Analysis for `r paste0(tools::toTitleCase(gsub('-', ' ', + sub('^[0-9]+-', '', sub('\\.xlsx$', '', basename(params$input_file))))), + ', ', basename(dirname(params$input_file)))` subtitle: "Prepared `r format(Sys.Date(), '%B %d, %Y')`" format: pdf: @@ -90,7 +93,7 @@ all_parcels <- dr_vals %>% sales_df <- all_parcels %>% filter(!is.na(sale_price), !sale_excluded %in% TRUE) -ts <- tibble( +township_stats <- tibble( model_ratio = median(sales_df$model_sale_ratio, na.rm = TRUE), model_cod = assessr::cod(sales_df$model_sale_ratio), model_prd = assessr::prd(sales_df$model_FMV, sales_df$sale_price), @@ -170,30 +173,28 @@ pal <- list( iaao_band = "#A8DDB5" ) +# Returns TRUE if value falls within the IAAO acceptable range for the given +# metric, FALSE if it doesn't. iaao_check <- function(metric, value) { - m <- metric_meta[metric_meta$name == metric, ] - if (nrow(m) == 0) { - return(NA) - } - value >= m$lo & value <= m$hi + metric_row <- metric_meta[metric_meta$name == metric, ] + value >= metric_row$lo & value <= metric_row$hi } +# Returns a string that colors the cell green (pass) or orange +# (fail) based on whether value meets the IAAO standard for the given metric. iaao_color_cell <- function(metric, value) { - m <- metric_meta[metric_meta$name == metric, ] - digits <- if (nrow(m) > 0) m$digits else 4 - v <- round(value, digits) + metric_row <- metric_meta[metric_meta$name == metric, ] passes <- iaao_check(metric, value) - if (is.na(passes)) { - return(as.character(v)) - } + value <- round(value, metric_row$digits) hex <- if (passes) pal$pass else pal$fail - paste0("\\cellcolor[HTML]{", hex, "} ", v) + paste0("\\cellcolor[HTML]{", hex, "} ", value) } +# Maps a sale ratio to one of five hex color codes representing assessment +# quality bands: dark blue, light blue, green, orange, or red. ratio_to_hex <- function(ratio) { rc <- pal$ratio_colors case_when( - is.na(ratio) ~ pal$ratio_na, ratio < 0.80 ~ rc[1], ratio < 0.90 ~ rc[2], ratio <= 1.10 ~ rc[3], @@ -202,12 +203,18 @@ ratio_to_hex <- function(ratio) { ) } +# Returns a string for a ratio value in the neighborhood table. +# Uses the same five-color band as ratio_to_hex. color_ratio_cell <- function(ratio, digits = 3) { - v <- round(ratio, digits) + value <- round(ratio, digits) hex <- ratio_to_hex(ratio) - paste0("\\cellcolor[HTML]{", hex, "} ", v) + paste0("\\cellcolor[HTML]{", hex, "} ", value) } +# Shared ggplot fill scale for the ratio map panels. rc[3] is repeated so the +# green "within standard" band (0.90–1.10) gets a flat color rather than a +# gradient. The `squish` maps values outside ratio_limits to the nearest color +# instead of showing them as NA. ratio_fill_scale <- function(name = "Median\nRatio") { rc <- paste0("#", pal$ratio_colors) scale_fill_gradientn( @@ -221,67 +228,29 @@ ratio_fill_scale <- function(name = "Median\nRatio") { name = name ) } - -caps <- list( - fig1 = glue( - "Town-Level IAAO Statistics.", - "\\newline Green shading meets IAAO standard; orange shading does not." - ), - fig2 = glue( - "IAAO Metrics: Model vs. Desk Review.", - "\\newline Green shaded band shows the IAAO acceptable range", - " for each metric." - ), - fig3 = glue( - "Fair Market Values by Group.", - "\\newline Model and desk review fair market values for properties", - " with qualifying arm's-length sales (Sold), properties without", - " a recorded sale (Unsold), and all residential parcels (All).", - " Sold and Unsold do not sum to All because properties removed", - " by desk review as outliers are counted in All but neither in", - " Sold nor Unsold." - ), - fig4 = glue( - "Desk Review Changes by Group.", - "\\newline Number and share of properties whose value was", - " changed by desk review." - ), - fig5 = glue( - "Sale Price Ratio Curve.", - "\\newline Each labeled point is the median ratio within that", - " sale price decile.", - " Dotted lines show the IAAO acceptable range (0.9–1.1)." - ), - fig6 = glue("Ratio Curve by Sale Price Decile"), - fig7 = glue( - "Neighborhood Median Assessment Ratios.", - "\\newline Green (0.90–1.10) meets the IAAO standard;", - " Blue indicates under-assessment;", - " Red indicates over-assessment." - ), - fig8 = glue( - "Neighborhood-Level Median Ratios.", - "\\newline Blue indicates under-assessment;", - " Green (0.90–1.1) indicates within standard;", - " Red indicates over-assessment." - ) -) ``` This is a ratio analysis for **`r town_name` Township** for the `r year_val` assessment cycle. The initial sale sample had -**`r format(n_original_sales, big.mark = ",")`** sales: this excludes statistical outliers flagged by the Data department, and had transaction dates ranging from `r min_sale_date` to `r max_sale_date`. From these, +**`r format(n_original_sales, big.mark = ",")`** sales: this excludes +statistical outliers flagged by the Data department, and had transaction +dates ranging from `r min_sale_date` to `r max_sale_date`. From these, **`r format(n_excluded_sales, big.mark = ",")`** additional sales were excluded as outliers by Valuations analysts, leaving a **final sample of `r format(n_final_sales, big.mark = ",")` sales**. The township -contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. Prices range from `r ts$price_range` and are not time-adjusted. +contains **`r format(n_total_pins, big.mark = ",")` residential +parcels**. This universe includes Single and Multifamily parcels (up to +6 units) and excludes condo units. Prices range from +`r township_stats$price_range` and are not time-adjusted. This analysis compares ratio statistics from two stages: (1) **Model** values, which are the output of the model, and (2) **Desk Review** values, which reflect manual adjustments by staff. ```{r tbl-1} -#| tbl-cap: !expr 'caps$fig1' +#| tbl-cap: >- +#| Town-Level IAAO Statistics.\newline Green shading meets IAAO +#| standard; orange shading does not. #| tbl-pos: H display_order <- c("Median Ratio", "PRB", "PRD", "COD", "MKI") @@ -293,18 +262,18 @@ iaao_table <- data.frame( match(display_order, metric_meta$name) ], Model = c( - iaao_color_cell("Median Ratio", ts$model_ratio), - iaao_color_cell("PRB", ts$model_prb), - iaao_color_cell("PRD", ts$model_prd), - iaao_color_cell("COD", ts$model_cod), - iaao_color_cell("MKI", ts$model_mki) + iaao_color_cell("Median Ratio", township_stats$model_ratio), + iaao_color_cell("PRB", township_stats$model_prb), + iaao_color_cell("PRD", township_stats$model_prd), + iaao_color_cell("COD", township_stats$model_cod), + iaao_color_cell("MKI", township_stats$model_mki) ), `Desk Review` = c( - iaao_color_cell("Median Ratio", ts$desk_review_ratio), - iaao_color_cell("PRB", ts$desk_review_prb), - iaao_color_cell("PRD", ts$desk_review_prd), - iaao_color_cell("COD", ts$desk_review_cod), - iaao_color_cell("MKI", ts$desk_review_mki) + iaao_color_cell("Median Ratio", township_stats$desk_review_ratio), + iaao_color_cell("PRB", township_stats$desk_review_prb), + iaao_color_cell("PRD", township_stats$desk_review_prd), + iaao_color_cell("COD", township_stats$desk_review_cod), + iaao_color_cell("MKI", township_stats$desk_review_mki) ), check.names = FALSE ) @@ -321,25 +290,29 @@ knitr::kable( ``` ```{r fig-2} -#| fig-cap: !expr 'caps$fig2' +#| fig-cap: >- +#| IAAO Metrics: Model vs. Desk Review.\newline Green shaded band +#| shows the IAAO acceptable range for each metric. #| fig-pos: H #| fig-cap-location: top #| fig-height: 3.5 #| fig-width: 6.5 -ts_wide <- tibble( +township_stats_wide <- tibble( Metric = met_fac(display_order), Model = c( - ts$model_ratio, ts$model_prb, ts$model_prd, - ts$model_cod, ts$model_mki + township_stats$model_ratio, township_stats$model_prb, + township_stats$model_prd, township_stats$model_cod, + township_stats$model_mki ), `Desk Review` = c( - ts$desk_review_ratio, ts$desk_review_prb, ts$desk_review_prd, - ts$desk_review_cod, ts$desk_review_mki + township_stats$desk_review_ratio, township_stats$desk_review_prb, + township_stats$desk_review_prd, township_stats$desk_review_cod, + township_stats$desk_review_mki ) ) -ts_long <- ts_wide %>% +township_stats_long <- township_stats_wide %>% pivot_longer( c(Model, `Desk Review`), names_to = "Stage", values_to = "Value" @@ -356,16 +329,14 @@ iaao_bands <- select(metric_meta, Metric = name, xmin = lo, xmax = hi) %>% iaao_meta <- select(metric_meta, Metric = name, mid, half_span) %>% mutate(Metric = met_fac(Metric)) -sym_anchors <- ts_long %>% +sym_anchors <- township_stats_long %>% left_join(iaao_meta, by = "Metric") %>% mutate(dev = abs(Value - mid)) %>% group_by(Metric, mid, half_span) %>% summarize( - max_dev = max(dev, na.rm = TRUE), - out_of_range = any(dev > half_span, na.rm = TRUE), - .groups = "drop" + max_dev = max(dev, na.rm = TRUE), + .groups = "drop" ) %>% - filter(out_of_range) %>% mutate( half_ax = pmax(half_span, max_dev) * 1.15, x_lo = mid - half_ax, @@ -385,7 +356,7 @@ scale_anchors <- bind_rows( mutate(Metric = met_fac(Metric)) ggplot() + - geom_blank(data = ts_long, aes(x = Value, y = 1)) + + geom_blank(data = township_stats_long, aes(x = Value, y = 1)) + geom_point( data = scale_anchors, aes(x = x, y = 1), @@ -398,17 +369,17 @@ ggplot() + fill = pal$iaao_band, alpha = 0.45 ) + geom_segment( - data = ts_wide, + data = township_stats_wide, aes(x = Model, xend = `Desk Review`, y = 1, yend = 1), color = "gray40", linewidth = 2, lineend = "round" ) + geom_point( - data = ts_long, + data = township_stats_long, aes(x = Value, y = 1, color = Stage, shape = Stage), size = 5 ) + geom_text( - data = ts_long, + data = township_stats_long, aes(x = Value, y = 1, label = label, color = Stage), vjust = -1.6, size = 3, fontface = "bold" ) + @@ -452,7 +423,13 @@ n_changed <- function(df) { {{< pagebreak >}} ```{r tbl-3} -#| tbl-cap: !expr 'caps$fig3' +#| tbl-cap: >- +#| Fair Market Values by Group.\newline Model and desk review fair +#| market values for properties with qualifying arm's-length sales +#| (Sold), properties without a recorded sale (Unsold), and all +#| residential parcels (All). Sold and Unsold do not sum to All +#| because properties removed by desk review as outliers are counted +#| in All but neither in Sold nor Unsold. #| tbl-pos: H groups <- list(Sold = sales_df, Unsold = no_sale, All = all_parcels) @@ -460,16 +437,16 @@ groups <- list(Sold = sales_df, Unsold = no_sale, All = all_parcels) mv_table <- tibble( Group = names(groups), `Median Model FMV` = sapply( - groups, \(d) fmt_dol(median(d$model_FMV, na.rm = TRUE)) + groups, \(df) fmt_dol(median(df$model_FMV, na.rm = TRUE)) ), `Median DR FMV` = sapply( - groups, \(d) fmt_dol(median(d$desk_review_FMV, na.rm = TRUE)) + groups, \(df) fmt_dol(median(df$desk_review_FMV, na.rm = TRUE)) ), `Mean Model FMV` = sapply( - groups, \(d) fmt_dol(mean(d$model_FMV, na.rm = TRUE)) + groups, \(df) fmt_dol(mean(df$model_FMV, na.rm = TRUE)) ), `Mean DR FMV` = sapply( - groups, \(d) fmt_dol(mean(d$desk_review_FMV, na.rm = TRUE)) + groups, \(df) fmt_dol(mean(df$desk_review_FMV, na.rm = TRUE)) ) ) @@ -484,7 +461,9 @@ knitr::kable( ``` ```{r tbl-4} -#| tbl-cap: !expr 'caps$fig4' +#| tbl-cap: >- +#| Desk Review Changes by Group.\newline Number and share of +#| properties whose value was changed by desk review. #| tbl-pos: H changes_table <- tibble( @@ -531,7 +510,10 @@ nbhd_ratios <- all_parcels %>% {{< pagebreak >}} ```{r fig-5} -#| fig-cap: !expr 'caps$fig5' +#| fig-cap: >- +#| Sale Price Ratio Curve.\newline Each labeled point is the median +#| ratio within that sale price decile. Dotted lines show the IAAO +#| acceptable range (0.9–1.1). #| fig-pos: H #| fig-cap-location: top #| fig-height: 3.5 @@ -612,7 +594,7 @@ ggplot( ``` ```{r tbl-6} -#| tbl-cap: !expr 'caps$fig6' +#| tbl-cap: 'Ratio Curve by Sale Price Decile' #| tbl-pos: H #| tbl-cap-location: top @@ -638,7 +620,17 @@ knitr::kable( ) ``` -```{r fig-7-prep} +```{r fig-7} +#| fig-cap: >- +#| Neighborhood Median Assessment Ratios.\newline Green (0.90–1.10) +#| meets the IAAO standard; Blue indicates under-assessment; Red +#| indicates over-assessment. +#| fig-pos: H +#| fig-cap-location: top +#| fig-height: 3.5 +#| fig-width: 8.5 +#| results: 'hide' + neighborhoods <- ccao::nbhd_shp %>% filter(township_name == town_name) %>% select(town_nbhd, geometry) @@ -665,15 +657,6 @@ make_map <- function(col, title) { map_model <- make_map("model_ratio", "Model") map_dr <- make_map("dr_ratio", "Desk Review") -``` - -```{r fig-7} -#| fig-cap: !expr 'caps$fig7' -#| fig-pos: H -#| fig-cap-location: top -#| fig-height: 3.5 -#| fig-width: 8.5 -#| results: 'hide' grid.newpage() print(map_model, vp = viewport( @@ -688,7 +671,10 @@ print(map_dr, vp = viewport( ```{r tbl-8} -#| tbl-cap: !expr 'caps$fig8' +#| tbl-cap: >- +#| Neighborhood-Level Median Ratios.\newline Blue indicates +#| under-assessment; Green (0.90–1.1) indicates within standard; +#| Red indicates over-assessment. #| tbl-cap-location: top #| tbl-pos: H From 36464a0d2922a6b83d7420c88939ff19679561e9 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 1 Sep 2026 18:43:07 +0000 Subject: [PATCH 23/46] better commenting --- ratio-analysis/ratio-analysis.qmd | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 170a3c5..552229d 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -159,18 +159,20 @@ metric_meta <- tibble( ) ) -# Color palette +# Color palette that standardizes all color pallettes throughout the text pal <- list( + # Used for metrics pass = "A8DDB5", fail = "FDBB84", + iaao_band = "#A8DDB5", + # Model vs desk review charts model = "#A569BD", desk_review = "#2C2C2C", + # Neighborhods without sales ratio_na = "EEEEEE", + # Gradients for map and nbhd metrics ratio_colors = c("4575B4", "74ADD1", "66BD63", "FC8D59", "D73027"), - ratio_values = c(0.70, 0.8999, 0.9001, 1.0999, 1.1001, 1.30), - ratio_limits = c(0.70, 1.30), - ratio_breaks = c(0.80, 0.90, 1.00, 1.10, 1.20), - iaao_band = "#A8DDB5" + ratio_values = c(0.70, 0.8999, 0.9001, 1.0999, 1.1001, 1.30) ) # Returns TRUE if value falls within the IAAO acceptable range for the given @@ -196,6 +198,7 @@ ratio_to_hex <- function(ratio) { rc <- pal$ratio_colors case_when( ratio < 0.80 ~ rc[1], + # Passing between .9 and 1.1 ratio < 0.90 ~ rc[2], ratio <= 1.10 ~ rc[3], ratio <= 1.20 ~ rc[4], @@ -204,7 +207,6 @@ ratio_to_hex <- function(ratio) { } # Returns a string for a ratio value in the neighborhood table. -# Uses the same five-color band as ratio_to_hex. color_ratio_cell <- function(ratio, digits = 3) { value <- round(ratio, digits) hex <- ratio_to_hex(ratio) @@ -220,11 +222,11 @@ ratio_fill_scale <- function(name = "Median\nRatio") { scale_fill_gradientn( colors = c(rc[1], rc[2], rc[3], rc[3], rc[4], rc[5]), values = scales::rescale(pal$ratio_values), - limits = pal$ratio_limits, + limits = range(pal$ratio_values), oob = scales::squish, na.value = paste0("#", pal$ratio_na), - breaks = pal$ratio_breaks, - labels = sprintf("%.2f", pal$ratio_breaks), + breaks = pal$ratio_values, + labels = c("0.70", "0.90", "0.90", "1.10", "1.10", "1.30"), name = name ) } @@ -236,12 +238,12 @@ assessment cycle. The initial sale sample had statistical outliers flagged by the Data department, and had transaction dates ranging from `r min_sale_date` to `r max_sale_date`. From these, **`r format(n_excluded_sales, big.mark = ",")`** additional sales were excluded -as outliers by Valuations analysts, leaving a **final sample of -`r format(n_final_sales, big.mark = ",")` sales**. The township +as outliers by Valuations analysts.The township contains **`r format(n_total_pins, big.mark = ",")` residential parcels**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. Prices range from -`r township_stats$price_range` and are not time-adjusted. +`r township_stats$price_range` and are not time-adjusted. This leaves a **final sample of +`r format(n_final_sales, big.mark = ",")` sales**. This analysis compares ratio statistics from two stages: (1) **Model** values, which are the output of the model, and @@ -696,6 +698,9 @@ nbhd_table_data <- all_nbhds %>% ) %>% select(`NBHD`, `Model Ratio`, `DR Ratio`, `N Sales`) +# This allows us to separate the table in two halves, +# ideally keeping it on one final page for larger +# townships n <- nrow(nbhd_table_data) half <- ceiling(n / 2) pad <- half - (n - half) From 96e9b0c54c5b3c95e964ac078b868d7d4ac8c989 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 1 Sep 2026 18:54:55 +0000 Subject: [PATCH 24/46] add commenting and simplify --- ratio-analysis/ratio-analysis.qmd | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 552229d..8e1ab1e 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -50,7 +50,6 @@ town_name <- ccao::town_dict %>% # Read desk review inputs - dr_wb <- loadWorkbook(input_file) dr_vals <- read.xlsx(dr_wb, sheet = 1) %>% tibble(.name_repair = "unique") %>% @@ -111,8 +110,8 @@ township_stats <- tibble( sales_df$desk_review_FMV, sales_df$sale_price ), price_range = paste( - scales::dollar(min(sales_df$sale_price)), - scales::dollar(max(sales_df$sale_price)), + dollar(min(sales_df$sale_price)), + dollar(max(sales_df$sale_price)), sep = "–" ), number_of_sales = nrow(sales_df) @@ -125,8 +124,8 @@ decile_stats <- sales_df %>% desk_review_ratio = median(desk_review_sale_ratio, na.rm = TRUE), desk_review_cod = assessr::cod(desk_review_sale_ratio), price_range = paste( - scales::dollar(min(sale_price)), - scales::dollar(max(sale_price)), + dollar(min(sale_price)), + dollar(max(sale_price)), sep = "–" ), number_of_sales = n(), @@ -221,9 +220,9 @@ ratio_fill_scale <- function(name = "Median\nRatio") { rc <- paste0("#", pal$ratio_colors) scale_fill_gradientn( colors = c(rc[1], rc[2], rc[3], rc[3], rc[4], rc[5]), - values = scales::rescale(pal$ratio_values), + values = rescale(pal$ratio_values), limits = range(pal$ratio_values), - oob = scales::squish, + oob = squish, na.value = paste0("#", pal$ratio_na), breaks = pal$ratio_values, labels = c("0.70", "0.90", "0.90", "1.10", "1.10", "1.30"), @@ -280,7 +279,7 @@ iaao_table <- data.frame( check.names = FALSE ) -knitr::kable( +kable( iaao_table, format = "latex", escape = FALSE, @@ -452,7 +451,7 @@ mv_table <- tibble( ) ) -knitr::kable( +kable( mv_table, format = "latex", escape = FALSE, @@ -487,7 +486,7 @@ changes_table <- tibble( ) ) -knitr::kable( +kable( changes_table, format = "latex", escape = FALSE, @@ -546,9 +545,9 @@ axis_labels <- all_parcels %>% arrange(price_decile) %>% mutate(label = paste0( price_decile, "\n", - scales::dollar(min_price, scale_cut = scales::cut_short_scale()), + dollar(min_price, scale_cut = cut_short_scale()), "–\n", - scales::dollar(max_price, scale_cut = scales::cut_short_scale()) + dollar(max_price, scale_cut = cut_short_scale()) )) %>% (\(df) setNames(df$label, df$price_decile))() @@ -613,9 +612,10 @@ decile_display <- decile_stats %>% `DR Ratio` = round(`DR Ratio`, 3) ) -knitr::kable( +kable( decile_display, format = "latex", + escape = FALSE, booktabs = TRUE, linesep = "", align = c("c", "l", "r", "r", "r") @@ -717,7 +717,7 @@ right_half <- bind_rows( spacer <- tibble(` ` = rep("", half)) -knitr::kable( +kable( cbind(nbhd_table_data[1:half, ], spacer, right_half), format = "latex", escape = FALSE, From 4a1e7e4b2f80058c09f742556a7901a30fd6edd1 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 1 Sep 2026 19:08:26 +0000 Subject: [PATCH 25/46] commenting --- ratio-analysis/ratio-analysis.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 8e1ab1e..b7d9c67 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -158,7 +158,7 @@ metric_meta <- tibble( ) ) -# Color palette that standardizes all color pallettes throughout the text +# Color palette that standardizes colors throughout the text pal <- list( # Used for metrics pass = "A8DDB5", From 4f841fe42d2d9655c2bb3ae0d37500e6be0828da Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 8 Sep 2026 18:36:10 +0000 Subject: [PATCH 26/46] update to locations and use assessr for met metrics --- ratio-analysis/.gitignore | 1 + ratio-analysis/_quarto.yml | 2 + ratio-analysis/post-render.R | 4 + ratio-analysis/quarto/renv.lock | 23 +++++ ratio-analysis/ratio-analysis.qmd | 149 +++++++++++++++++++----------- ratio-analysis/ratio-analysis.sql | 2 +- ratio-analysis/render_all_files.R | 16 ++++ ratio-analysis/renv.lock | 55 +++++++++++ 8 files changed, 195 insertions(+), 57 deletions(-) create mode 100644 ratio-analysis/.gitignore create mode 100644 ratio-analysis/_quarto.yml create mode 100644 ratio-analysis/post-render.R create mode 100644 ratio-analysis/quarto/renv.lock create mode 100644 ratio-analysis/render_all_files.R diff --git a/ratio-analysis/.gitignore b/ratio-analysis/.gitignore new file mode 100644 index 0000000..075b254 --- /dev/null +++ b/ratio-analysis/.gitignore @@ -0,0 +1 @@ +/.quarto/ diff --git a/ratio-analysis/_quarto.yml b/ratio-analysis/_quarto.yml new file mode 100644 index 0000000..6e78c18 --- /dev/null +++ b/ratio-analysis/_quarto.yml @@ -0,0 +1,2 @@ +project: + post-render: post-render.R diff --git a/ratio-analysis/post-render.R b/ratio-analysis/post-render.R new file mode 100644 index 0000000..3af55a9 --- /dev/null +++ b/ratio-analysis/post-render.R @@ -0,0 +1,4 @@ +target_path <- readLines(".pdf-target-path") +dir.create(dirname(target_path), recursive = TRUE, showWarnings = FALSE) +file.copy("ratio-analysis.pdf", target_path, overwrite = TRUE) +file.remove(".pdf-target-path") diff --git a/ratio-analysis/quarto/renv.lock b/ratio-analysis/quarto/renv.lock new file mode 100644 index 0000000..4b97c0c --- /dev/null +++ b/ratio-analysis/quarto/renv.lock @@ -0,0 +1,23 @@ +{ + "R": { + "Version": "4.6.1", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cloud.r-project.org" + } + ] + }, + "Packages": { + "renv": { + "Package": "renv", + "Version": "1.2.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "utils" + ], + "Hash": "1bd9f58e1cfe27ce035933937c6f03de" + } + } +} diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index b7d9c67..0b3d147 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -11,7 +11,7 @@ format: fontsize: 11pt include-in-header: preamble.tex params: - input_file: "" + input_file: "inputs/2026/39-Worth.xlsx" execute: echo: false warning: false @@ -38,10 +38,13 @@ library(grid) set_default_cachedir("rosm.cache") +if (!exists("params")) { + params <- rmarkdown::yaml_front_matter("ratio-analysis.qmd")$params +} input_file <- params$input_file file_base <- sub("\\.xlsx$", "", basename(input_file)) town_code <- substr(file_base, 1, 2) -year_val <- basename(dirname(input_file)) +year_val <- format(Sys.Date(), "%Y") town_name <- ccao::town_dict %>% filter(township_code == town_code) %>% @@ -56,12 +59,9 @@ dr_vals <- read.xlsx(dr_wb, sheet = 1) %>% select(pin = PIN, desk_review_FMV = Desk.Review.Value) # Athena: pull model values and the residential PIN universe - noctua_options(unload = TRUE) conn <- dbConnect(noctua::athena(), rstudio_conn_tab = FALSE) -dr_towns <- town_code - model_vals <- dbGetQuery( conn = conn, glue_sql( @@ -113,16 +113,13 @@ township_stats <- tibble( dollar(min(sales_df$sale_price)), dollar(max(sales_df$sale_price)), sep = "–" - ), - number_of_sales = nrow(sales_df) + ) ) decile_stats <- sales_df %>% summarize( model_ratio = median(model_sale_ratio, na.rm = TRUE), - model_cod = assessr::cod(model_sale_ratio), desk_review_ratio = median(desk_review_sale_ratio, na.rm = TRUE), - desk_review_cod = assessr::cod(desk_review_sale_ratio), price_range = paste( dollar(min(sale_price)), dollar(max(sale_price)), @@ -138,54 +135,78 @@ n_original_sales <- sum(!is.na(all_parcels$sale_price)) n_final_sales <- nrow(sales_df) n_excluded_sales <- n_original_sales - n_final_sales n_total_pins <- nrow(all_parcels) -pct_with_sale <- round(n_final_sales / n_total_pins * 100, 1) sale_dates <- all_parcels$sale_date[!is.na(all_parcels$sale_date)] min_sale_date <- format(min(sale_dates), "%B %d, %Y") max_sale_date <- format(max(sale_dates), "%B %d, %Y") -# Metric definitions: name, digits, IAAO lo/hi bounds, band mid and half-span +# Extracts low and high bounds from each assessr *_met function body +met_bounds <- function(fn) { + b <- body(fn) + c(low = eval(b[[2]][[3]]), high = eval(b[[3]][[3]])) +} + +# Metric definitions: low/high derived from assessr functions. +# Mid, half_span, and standard_label computed from those bounds metric_meta <- tibble( name = c("Median Ratio", "COD", "PRD", "PRB", "MKI"), digits = c(3, 1, 4, 4, 4), - lo = c(0.90, 5.0, 0.98, -0.05, 0.90), - hi = c(1.10, 15.0, 1.03, 0.05, 1.10), - mid = c(1.000, 10.0, 1.005, 0.00, 1.000), - half_span = c(0.100, 5.0, 0.025, 0.05, 0.100), - standard_label = c( - "0.90 -- 1.10", "5.0 -- 15.0", "0.98 -- 1.03", "$\\pm$0.05", "0.90 -- 1.10" + low = c( + met_bounds(med_ratio_met)[["low"]], met_bounds(cod_met)[["low"]], + met_bounds(prd_met)[["low"]], met_bounds(prb_met)[["low"]], + met_bounds(mki_met)[["low"]] + ), + high = c( + met_bounds(med_ratio_met)[["high"]], met_bounds(cod_met)[["high"]], + met_bounds(prd_met)[["high"]], met_bounds(prb_met)[["high"]], + met_bounds(mki_met)[["high"]] + ) +) %>% + mutate( + mid = (low + high) / 2, + half_span = (high - low) / 2, + standard_label = case_when( + name == "PRB" ~ sprintf("$\\pm$%.2f", high), + name == "COD" ~ sprintf("%.1f -- %.1f", low, high), + TRUE ~ sprintf("%.2f -- %.2f", low, high) + ) ) -) # Color palette that standardizes colors throughout the text pal <- list( # Used for metrics - pass = "A8DDB5", - fail = "FDBB84", - iaao_band = "#A8DDB5", + pass = "A8DDB5", + fail = "FDBB84", + iaao_band = "#A8DDB5", # Model vs desk review charts - model = "#A569BD", - desk_review = "#2C2C2C", + model = "#A569BD", + desk_review = "#2C2C2C", # Neighborhods without sales - ratio_na = "EEEEEE", + ratio_na = "EEEEEE", # Gradients for map and nbhd metrics ratio_colors = c("4575B4", "74ADD1", "66BD63", "FC8D59", "D73027"), - ratio_values = c(0.70, 0.8999, 0.9001, 1.0999, 1.1001, 1.30) + ratio_values = local({ + low <- met_bounds(med_ratio_met)[["low"]] + high <- met_bounds(med_ratio_met)[["high"]] + # EPS provides a small offset which creates + # an unseen gradient. + eps <- 0.0001 + c(low - 0.20, low - eps, low + eps, high - eps, high + eps, high + 0.20) + }) ) -# Returns TRUE if value falls within the IAAO acceptable range for the given -# metric, FALSE if it doesn't. -iaao_check <- function(metric, value) { - metric_row <- metric_meta[metric_meta$name == metric, ] - value >= metric_row$lo & value <= metric_row$hi -} - -# Returns a string that colors the cell green (pass) or orange -# (fail) based on whether value meets the IAAO standard for the given metric. +# Colors the cell green (pass) or orange (fail) based on whether +# value meets the IAAO standard for the given metric. iaao_color_cell <- function(metric, value) { metric_row <- metric_meta[metric_meta$name == metric, ] - passes <- iaao_check(metric, value) + passes <- switch(metric, + `Median Ratio` = med_ratio_met(value), + COD = cod_met(value), + PRD = prd_met(value), + PRB = prb_met(value), + MKI = mki_met(value) + ) value <- round(value, metric_row$digits) hex <- if (passes) pal$pass else pal$fail paste0("\\cellcolor[HTML]{", hex, "} ", value) @@ -197,8 +218,8 @@ ratio_to_hex <- function(ratio) { rc <- pal$ratio_colors case_when( ratio < 0.80 ~ rc[1], - # Passing between .9 and 1.1 ratio < 0.90 ~ rc[2], + # Passing between .9 and 1.1 ratio <= 1.10 ~ rc[3], ratio <= 1.20 ~ rc[4], TRUE ~ rc[5] @@ -213,36 +234,50 @@ color_ratio_cell <- function(ratio, digits = 3) { } # Shared ggplot fill scale for the ratio map panels. rc[3] is repeated so the -# green "within standard" band (0.90–1.10) gets a flat color rather than a -# gradient. The `squish` maps values outside ratio_limits to the nearest color -# instead of showing them as NA. +# green "within standard" band gets a flat color rather than a gradient. The +# `squish` maps values outside ratio_limits to the nearest color instead of NA. ratio_fill_scale <- function(name = "Median\nRatio") { rc <- paste0("#", pal$ratio_colors) + low_lbl <- sprintf("%.2f", met_bounds(med_ratio_met)[["low"]]) + high_lbl <- sprintf("%.2f", met_bounds(med_ratio_met)[["high"]]) scale_fill_gradientn( - colors = c(rc[1], rc[2], rc[3], rc[3], rc[4], rc[5]), - values = rescale(pal$ratio_values), - limits = range(pal$ratio_values), - oob = squish, + colors = c(rc[1], rc[2], rc[3], rc[3], rc[4], rc[5]), + values = rescale(pal$ratio_values), + limits = range(pal$ratio_values), + oob = squish, na.value = paste0("#", pal$ratio_na), - breaks = pal$ratio_values, - labels = c("0.70", "0.90", "0.90", "1.10", "1.10", "1.30"), - name = name + breaks = pal$ratio_values, + labels = c( + sprintf("%.2f", pal$ratio_values[1]), + low_lbl, low_lbl, high_lbl, high_lbl, + sprintf("%.2f", pal$ratio_values[6]) + ), + name = name ) } ``` +```{r write-pdf-path} +#| include: false +# +out_dir <- file.path("output", year_val) +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) +pdf_name <- paste0(gsub(" ", "_", town_name), "_ratio_analysis.pdf") +writeLines(file.path(out_dir, pdf_name), ".pdf-target-path") +``` + This is a ratio analysis for **`r town_name` Township** for the `r year_val` assessment cycle. The initial sale sample had **`r format(n_original_sales, big.mark = ",")`** sales: this excludes statistical outliers flagged by the Data department, and had transaction dates ranging from `r min_sale_date` to `r max_sale_date`. From these, **`r format(n_excluded_sales, big.mark = ",")`** additional sales were excluded -as outliers by Valuations analysts.The township -contains **`r format(n_total_pins, big.mark = ",")` residential -parcels**. This universe includes Single and Multifamily parcels (up to +as outliers by Valuations analysts.This leaves a **final sample of +`r format(n_final_sales, big.mark = ",")` sales**. This universe includes Single and Multifamily parcels (up to 6 units) and excludes condo units. Prices range from -`r township_stats$price_range` and are not time-adjusted. This leaves a **final sample of -`r format(n_final_sales, big.mark = ",")` sales**. +`r township_stats$price_range` and are not time-adjusted. The township +contains **`r format(n_total_pins, big.mark = ",")` residential +parcels**. This analysis compares ratio statistics from two stages: (1) **Model** values, which are the output of the model, and @@ -254,6 +289,8 @@ This analysis compares ratio statistics from two stages: #| standard; orange shading does not. #| tbl-pos: H +# Outputs were sometimes being placed in alphabetical +# vs stated order so this just standardizes it. display_order <- c("Median Ratio", "PRB", "PRD", "COD", "MKI") met_fac <- function(x) factor(x, levels = display_order) @@ -324,7 +361,7 @@ township_stats_long <- township_stats_wide %>% label = round(Value, pmin(digits, 2)) ) -iaao_bands <- select(metric_meta, Metric = name, xmin = lo, xmax = hi) %>% +iaao_bands <- select(metric_meta, Metric = name, xmin = low, xmax = high) %>% mutate(Metric = met_fac(Metric)) iaao_meta <- select(metric_meta, Metric = name, mid, half_span) %>% @@ -340,12 +377,12 @@ sym_anchors <- township_stats_long %>% ) %>% mutate( half_ax = pmax(half_span, max_dev) * 1.15, - x_lo = mid - half_ax, - x_hi = mid + half_ax + x_low = mid - half_ax, + x_high = mid + half_ax ) %>% - select(Metric, x_lo, x_hi) %>% + select(Metric, x_low, x_high) %>% pivot_longer( - c(x_lo, x_hi), + c(x_low, x_high), names_to = "side", values_to = "x" ) %>% select(Metric, x) diff --git a/ratio-analysis/ratio-analysis.sql b/ratio-analysis/ratio-analysis.sql index d68a7a7..a16e6fc 100644 --- a/ratio-analysis/ratio-analysis.sql +++ b/ratio-analysis/ratio-analysis.sql @@ -51,7 +51,7 @@ most_recent_pin AS ( CAST(YEAR(CURRENT_DATE) - 1 AS VARCHAR), CAST(YEAR(CURRENT_DATE) AS VARCHAR) ) - AND uni.township_code IN ({dr_towns*}) -- noqa + AND uni.township_code IN ({town_code*}) -- noqa ) SELECT diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R new file mode 100644 index 0000000..e9a70a2 --- /dev/null +++ b/ratio-analysis/render_all_files.R @@ -0,0 +1,16 @@ +library(quarto) + +input_files <- list.files( + "inputs", + pattern = "\\.xlsx$", + recursive = TRUE, + full.names = TRUE +) + +for (f in input_files) { + message("Rendering: ", f) + quarto_render( + "ratio-analysis.qmd", + execute_params = list(input_file = f) + ) +} diff --git a/ratio-analysis/renv.lock b/ratio-analysis/renv.lock index 112ba76..ae49acb 100644 --- a/ratio-analysis/renv.lock +++ b/ratio-analysis/renv.lock @@ -1004,6 +1004,19 @@ ], "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" }, + "processx": { + "Package": "processx", + "Version": "3.9.0", + "Source": "Repository", + "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/2026-07-10", + "Requirements": [ + "R", + "R6", + "ps", + "utils" + ], + "Hash": "188d6caf38e81bf15b5e918726a6fd3d" + }, "progress": { "Package": "progress", "Version": "1.2.3", @@ -1047,6 +1060,17 @@ ], "Hash": "b6c826e897b46b163c51a3b990113a21" }, + "ps": { + "Package": "ps", + "Version": "1.9.3", + "Source": "Repository", + "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/2026-07-10", + "Requirements": [ + "R", + "utils" + ], + "Hash": "83e7e486c434e7acc71766dfc20adf2b" + }, "purrr": { "Package": "purrr", "Version": "1.2.2", @@ -1062,6 +1086,30 @@ ], "Hash": "0a35605539b085a4828ec55ad973fe60" }, + "quarto": { + "Package": "quarto", + "Version": "1.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "cli", + "fs", + "htmltools", + "jsonlite", + "later", + "lifecycle", + "processx", + "rlang", + "rmarkdown", + "rstudioapi", + "tools", + "utils", + "xfun", + "yaml" + ], + "Hash": "c948476ae43811c74888f0d4534832a3" + }, "rappdirs": { "Package": "rappdirs", "Version": "0.3.4", @@ -1157,6 +1205,13 @@ ], "Hash": "14c0023fdb16dddf88fd43b321dd1948" }, + "rstudioapi": { + "Package": "rstudioapi", + "Version": "0.19.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "db86914207e4e0f112b60ebbc3e1793c" + }, "s2": { "Package": "s2", "Version": "1.1.11", From 336582939f9d1ca5e07c6f6dbb6871b47af1820d Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 8 Sep 2026 19:00:03 +0000 Subject: [PATCH 27/46] round to 2 digits --- ratio-analysis/ratio-analysis.qmd | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 0b3d147..3a6258f 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -151,7 +151,7 @@ met_bounds <- function(fn) { # Mid, half_span, and standard_label computed from those bounds metric_meta <- tibble( name = c("Median Ratio", "COD", "PRD", "PRB", "MKI"), - digits = c(3, 1, 4, 4, 4), + digits = c(2, 2, 2, 2, 2), low = c( met_bounds(med_ratio_met)[["low"]], met_bounds(cod_met)[["low"]], met_bounds(prd_met)[["low"]], met_bounds(prb_met)[["low"]], @@ -227,7 +227,7 @@ ratio_to_hex <- function(ratio) { } # Returns a string for a ratio value in the neighborhood table. -color_ratio_cell <- function(ratio, digits = 3) { +color_ratio_cell <- function(ratio, digits = 2) { value <- round(ratio, digits) hex <- ratio_to_hex(ratio) paste0("\\cellcolor[HTML]{", hex, "} ", value) @@ -357,8 +357,7 @@ township_stats_long <- township_stats_wide %>% ) %>% mutate( Stage = factor(Stage, levels = c("Model", "Desk Review")), - digits = metric_meta$digits[match(Metric, metric_meta$name)], - label = round(Value, pmin(digits, 2)) + label = round(Value, 2) ) iaao_bands <- select(metric_meta, Metric = name, xmin = low, xmax = high) %>% @@ -602,19 +601,28 @@ ggplot( ) ) + annotate("rect", - xmin = -Inf, xmax = Inf, ymin = 0.9, ymax = 1.1, + xmin = -Inf, xmax = Inf, + ymin = met_bounds(med_ratio_met)[["low"]], + ymax = met_bounds(med_ratio_met)[["high"]], fill = pal$iaao_band, alpha = 0.12 ) + geom_hline(yintercept = 1, color = "darkgreen", linewidth = 1) + geom_hline( - yintercept = 0.9, linetype = "dotted", color = "black", linewidth = 0.8 + yintercept = met_bounds(med_ratio_met)[["low"]], + linetype = "dotted", color = "black", linewidth = 0.8 ) + geom_hline( - yintercept = 1.1, linetype = "dotted", color = "black", linewidth = 0.8 + yintercept = met_bounds(med_ratio_met)[["high"]], + linetype = "dotted", color = "black", linewidth = 0.8 ) + annotate("text", - x = 1, y = 1.11, - label = "IAAO Range (0.9–1.1)", hjust = 0, vjust = -0.4, size = 3.5 + x = 1, y = met_bounds(med_ratio_met)[["high"]] + 0.01, + label = sprintf( + "IAAO Range (%.2f–%.2f)", + met_bounds(med_ratio_met)[["low"]], + met_bounds(med_ratio_met)[["high"]] + ), + hjust = 0, vjust = -0.4, size = 3.5 ) + geom_line(linewidth = 1) + geom_label(show.legend = FALSE, size = 3) + @@ -726,10 +734,10 @@ nbhd_table_data <- all_nbhds %>% mutate( `NBHD` = neighborhood_number, `Model Ratio` = ifelse( - is.na(model_ratio), "---", color_ratio_cell(model_ratio, digits = 3) + is.na(model_ratio), "---", color_ratio_cell(model_ratio) ), `DR Ratio` = ifelse( - is.na(dr_ratio), "---", color_ratio_cell(dr_ratio, digits = 3) + is.na(dr_ratio), "---", color_ratio_cell(dr_ratio) ), `N Sales` = as.character(ifelse(is.na(n_sales), 0L, n_sales)) ) %>% From 52e827762c05cc5d68b7ef4793b8bb085987f53f Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 8 Sep 2026 19:15:50 +0000 Subject: [PATCH 28/46] remove post-render file --- ratio-analysis/_quarto.yml | 3 +-- ratio-analysis/post-render.R | 4 ---- ratio-analysis/ratio-analysis.qmd | 12 ++---------- ratio-analysis/render_all_files.R | 9 ++++++++- 4 files changed, 11 insertions(+), 17 deletions(-) delete mode 100644 ratio-analysis/post-render.R diff --git a/ratio-analysis/_quarto.yml b/ratio-analysis/_quarto.yml index 6e78c18..e3cd2e4 100644 --- a/ratio-analysis/_quarto.yml +++ b/ratio-analysis/_quarto.yml @@ -1,2 +1 @@ -project: - post-render: post-render.R +project: {} diff --git a/ratio-analysis/post-render.R b/ratio-analysis/post-render.R deleted file mode 100644 index 3af55a9..0000000 --- a/ratio-analysis/post-render.R +++ /dev/null @@ -1,4 +0,0 @@ -target_path <- readLines(".pdf-target-path") -dir.create(dirname(target_path), recursive = TRUE, showWarnings = FALSE) -file.copy("ratio-analysis.pdf", target_path, overwrite = TRUE) -file.remove(".pdf-target-path") diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 3a6258f..403ba96 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -11,7 +11,7 @@ format: fontsize: 11pt include-in-header: preamble.tex params: - input_file: "inputs/2026/39-Worth.xlsx" + input_file: "" execute: echo: false warning: false @@ -44,7 +44,7 @@ if (!exists("params")) { input_file <- params$input_file file_base <- sub("\\.xlsx$", "", basename(input_file)) town_code <- substr(file_base, 1, 2) -year_val <- format(Sys.Date(), "%Y") +year_val <- basename(dirname(input_file)) town_name <- ccao::town_dict %>% filter(township_code == town_code) %>% @@ -257,14 +257,6 @@ ratio_fill_scale <- function(name = "Median\nRatio") { } ``` -```{r write-pdf-path} -#| include: false -# -out_dir <- file.path("output", year_val) -dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) -pdf_name <- paste0(gsub(" ", "_", town_name), "_ratio_analysis.pdf") -writeLines(file.path(out_dir, pdf_name), ".pdf-target-path") -``` This is a ratio analysis for **`r town_name` Township** for the `r year_val` assessment cycle. The initial sale sample had diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index e9a70a2..849f87d 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -8,9 +8,16 @@ input_files <- list.files( ) for (f in input_files) { + year <- basename(dirname(f)) + town_name <- sub("^[0-9]+-", "", sub("\\.xlsx$", "", basename(f))) + out_name <- paste0(town_name, "_ratio_analysis.pdf") + out_dir <- file.path("output", year) + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) message("Rendering: ", f) quarto_render( "ratio-analysis.qmd", - execute_params = list(input_file = f) + execute_params = list(input_file = f), + output_file = out_name ) + file.rename(out_name, file.path(out_dir, out_name)) } From 84c1edbb9598936376c0df45b3fcf0d49db0beae Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 8 Sep 2026 19:26:32 +0000 Subject: [PATCH 29/46] remove post-render file --- ratio-analysis/ratio-analysis.qmd | 3 +-- ratio-analysis/render_all_files.R | 19 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 403ba96..b6ff13c 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -44,7 +44,6 @@ if (!exists("params")) { input_file <- params$input_file file_base <- sub("\\.xlsx$", "", basename(input_file)) town_code <- substr(file_base, 1, 2) -year_val <- basename(dirname(input_file)) town_name <- ccao::town_dict %>% filter(township_code == town_code) %>% @@ -258,7 +257,7 @@ ratio_fill_scale <- function(name = "Median\nRatio") { ``` -This is a ratio analysis for **`r town_name` Township** for the `r year_val` +This is a ratio analysis for **`r town_name` Township** for the `r format(Sys.Date(), "%Y")` assessment cycle. The initial sale sample had **`r format(n_original_sales, big.mark = ",")`** sales: this excludes statistical outliers flagged by the Data department, and had transaction diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index 849f87d..cf0f827 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -1,23 +1,22 @@ library(quarto) -input_files <- list.files( - "inputs", - pattern = "\\.xlsx$", - recursive = TRUE, - full.names = TRUE -) +data_path <- "." +year <- format(Sys.Date(), "%Y") +input_path <- file.path(data_path, "input", year) +output_path <- file.path(data_path, "output", year) + +input_files <- list.files(input_path, pattern = "\\.xlsx$", full.names = TRUE) + +dir.create(output_path, recursive = TRUE, showWarnings = FALSE) for (f in input_files) { - year <- basename(dirname(f)) town_name <- sub("^[0-9]+-", "", sub("\\.xlsx$", "", basename(f))) out_name <- paste0(town_name, "_ratio_analysis.pdf") - out_dir <- file.path("output", year) - dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) message("Rendering: ", f) quarto_render( "ratio-analysis.qmd", execute_params = list(input_file = f), output_file = out_name ) - file.rename(out_name, file.path(out_dir, out_name)) + file.rename(out_name, file.path(output_path, out_name)) } From 67f00ea67cb9a0af38d5d8faa4674786e631673f Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Tue, 8 Sep 2026 14:29:47 -0500 Subject: [PATCH 30/46] Delete ratio-analysis/quarto/renv.lock --- ratio-analysis/quarto/renv.lock | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 ratio-analysis/quarto/renv.lock diff --git a/ratio-analysis/quarto/renv.lock b/ratio-analysis/quarto/renv.lock deleted file mode 100644 index 4b97c0c..0000000 --- a/ratio-analysis/quarto/renv.lock +++ /dev/null @@ -1,23 +0,0 @@ -{ - "R": { - "Version": "4.6.1", - "Repositories": [ - { - "Name": "CRAN", - "URL": "https://cloud.r-project.org" - } - ] - }, - "Packages": { - "renv": { - "Package": "renv", - "Version": "1.2.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "1bd9f58e1cfe27ce035933937c6f03de" - } - } -} From 1e05de7b9c881070edeba5901c55d32872a985ad Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Tue, 8 Sep 2026 19:30:22 +0000 Subject: [PATCH 31/46] add to gitignore --- ratio-analysis/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/ratio-analysis/.gitignore b/ratio-analysis/.gitignore index 075b254..21da21e 100644 --- a/ratio-analysis/.gitignore +++ b/ratio-analysis/.gitignore @@ -1 +1,2 @@ /.quarto/ +/quarto/ From f566e61767f928dd2da2e055497b8d8d40b209f3 Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Tue, 8 Sep 2026 14:33:45 -0500 Subject: [PATCH 32/46] Update ratio-analysis.qmd --- ratio-analysis/ratio-analysis.qmd | 3 --- 1 file changed, 3 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index b6ff13c..0079094 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -38,9 +38,6 @@ library(grid) set_default_cachedir("rosm.cache") -if (!exists("params")) { - params <- rmarkdown::yaml_front_matter("ratio-analysis.qmd")$params -} input_file <- params$input_file file_base <- sub("\\.xlsx$", "", basename(input_file)) town_code <- substr(file_base, 1, 2) From aabf0f27206d897768a280ebe2a0f4b1c5ff14d7 Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Wed, 9 Sep 2026 16:21:57 -0500 Subject: [PATCH 33/46] Update ratio-analysis/render_all_files.R Co-authored-by: William Ridgeway <10358980+wrridgeway@users.noreply.github.com> --- ratio-analysis/render_all_files.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index cf0f827..a44ba70 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -10,7 +10,8 @@ input_files <- list.files(input_path, pattern = "\\.xlsx$", full.names = TRUE) dir.create(output_path, recursive = TRUE, showWarnings = FALSE) for (f in input_files) { - town_name <- sub("^[0-9]+-", "", sub("\\.xlsx$", "", basename(f))) + town_code <- substr(basename(f), 1, 2)) + town_name <- tolower(town_convert(town_code)) out_name <- paste0(town_name, "_ratio_analysis.pdf") message("Rendering: ", f) quarto_render( From 39ae04db30781177b60d2fdf6100db1f90ec1390 Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Wed, 9 Sep 2026 16:22:11 -0500 Subject: [PATCH 34/46] Update ratio-analysis/ratio-analysis.qmd Co-authored-by: William Ridgeway <10358980+wrridgeway@users.noreply.github.com> --- ratio-analysis/ratio-analysis.qmd | 1 + 1 file changed, 1 insertion(+) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 0079094..1a5827c 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -35,6 +35,7 @@ library(knitr) library(glue) library(rosm) library(grid) +library(prettymapr) set_default_cachedir("rosm.cache") From 0f515110c8c722c26d04f48c24c29f1bb84e7d65 Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Wed, 9 Sep 2026 16:22:29 -0500 Subject: [PATCH 35/46] Update ratio-analysis/ratio-analysis.qmd Co-authored-by: William Ridgeway <10358980+wrridgeway@users.noreply.github.com> --- ratio-analysis/ratio-analysis.qmd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 1a5827c..66c3bcd 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -133,7 +133,9 @@ n_final_sales <- nrow(sales_df) n_excluded_sales <- n_original_sales - n_final_sales n_total_pins <- nrow(all_parcels) -sale_dates <- all_parcels$sale_date[!is.na(all_parcels$sale_date)] +sale_dates <- all_parcels %>% + filter(!is.na(sale_date)) %>% + pull(sale_date) min_sale_date <- format(min(sale_dates), "%B %d, %Y") max_sale_date <- format(max(sale_dates), "%B %d, %Y") From 6079cdece137ea0994e21fb6516e26d9c585c10a Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Thu, 10 Sep 2026 21:14:48 +0000 Subject: [PATCH 36/46] Billy edits --- ratio-analysis/.gitignore | 1 + ratio-analysis/ratio-analysis.qmd | 177 ++++++++++++++++++------------ ratio-analysis/ratio-analysis.sql | 11 +- ratio-analysis/render_all_files.R | 30 ++++- ratio-analysis/renv.lock | 19 ++++ 5 files changed, 161 insertions(+), 77 deletions(-) diff --git a/ratio-analysis/.gitignore b/ratio-analysis/.gitignore index 21da21e..5f27234 100644 --- a/ratio-analysis/.gitignore +++ b/ratio-analysis/.gitignore @@ -1,2 +1,3 @@ /.quarto/ /quarto/ +.Renviron diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 66c3bcd..6fa02d2 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -19,29 +19,29 @@ execute: --- ```{r setup} +library(assessr) +library(ccao) library(DBI) -library(noctua) -library(openxlsx) library(dplyr) -library(tidyr) library(ggplot2) library(ggspatial) -library(sf) -library(scales) -library(ccao) -library(assessr) -library(readr) -library(knitr) library(glue) -library(rosm) library(grid) -library(prettymapr) +library(knitr) +library(noctua) +library(openxlsx) +library(patchwork) +library(readr) +library(scales) +library(sf) +library(tidyr) -set_default_cachedir("rosm.cache") input_file <- params$input_file file_base <- sub("\\.xlsx$", "", basename(input_file)) town_code <- substr(file_base, 1, 2) +analysis_year <- Sys.getenv("ANALYSIS_YEAR") +prior_year <- as.character(as.integer(analysis_year) - 1) town_name <- ccao::town_dict %>% filter(township_code == town_code) %>% @@ -140,27 +140,11 @@ min_sale_date <- format(min(sale_dates), "%B %d, %Y") max_sale_date <- format(max(sale_dates), "%B %d, %Y") -# Extracts low and high bounds from each assessr *_met function body -met_bounds <- function(fn) { - b <- body(fn) - c(low = eval(b[[2]][[3]]), high = eval(b[[3]][[3]])) -} - -# Metric definitions: low/high derived from assessr functions. -# Mid, half_span, and standard_label computed from those bounds metric_meta <- tibble( - name = c("Median Ratio", "COD", "PRD", "PRB", "MKI"), + name = c("Median Ratio", "COD", "PRD", "PRB", "MKI"), digits = c(2, 2, 2, 2, 2), - low = c( - met_bounds(med_ratio_met)[["low"]], met_bounds(cod_met)[["low"]], - met_bounds(prd_met)[["low"]], met_bounds(prb_met)[["low"]], - met_bounds(mki_met)[["low"]] - ), - high = c( - met_bounds(med_ratio_met)[["high"]], met_bounds(cod_met)[["high"]], - met_bounds(prd_met)[["high"]], met_bounds(prb_met)[["high"]], - met_bounds(mki_met)[["high"]] - ) + low = c(0.90, 5, 0.98, -0.05, 0.95), + high = c(1.10, 15, 1.03, 0.05, 1.05) ) %>% mutate( mid = (low + high) / 2, @@ -186,10 +170,9 @@ pal <- list( # Gradients for map and nbhd metrics ratio_colors = c("4575B4", "74ADD1", "66BD63", "FC8D59", "D73027"), ratio_values = local({ - low <- met_bounds(med_ratio_met)[["low"]] - high <- met_bounds(med_ratio_met)[["high"]] - # EPS provides a small offset which creates - # an unseen gradient. + low <- 0.90 + high <- 1.10 + # EPS provides a small offset which creates an unseen gradient. eps <- 0.0001 c(low - 0.20, low - eps, low + eps, high - eps, high + eps, high + 0.20) }) @@ -237,8 +220,9 @@ color_ratio_cell <- function(ratio, digits = 2) { # `squish` maps values outside ratio_limits to the nearest color instead of NA. ratio_fill_scale <- function(name = "Median\nRatio") { rc <- paste0("#", pal$ratio_colors) - low_lbl <- sprintf("%.2f", met_bounds(med_ratio_met)[["low"]]) - high_lbl <- sprintf("%.2f", met_bounds(med_ratio_met)[["high"]]) + med_ratio <- metric_meta[metric_meta$name == "Median Ratio", ] + low_lbl <- sprintf("%.2f", med_ratio$low) + high_lbl <- sprintf("%.2f", med_ratio$high) scale_fill_gradientn( colors = c(rc[1], rc[2], rc[3], rc[3], rc[4], rc[5]), values = rescale(pal$ratio_values), @@ -257,7 +241,7 @@ ratio_fill_scale <- function(name = "Median\nRatio") { ``` -This is a ratio analysis for **`r town_name` Township** for the `r format(Sys.Date(), "%Y")` +This is a ratio analysis for **`r town_name` Township** for the `r analysis_year` assessment cycle. The initial sale sample had **`r format(n_original_sales, big.mark = ",")`** sales: this excludes statistical outliers flagged by the Data department, and had transaction @@ -339,17 +323,15 @@ township_stats_wide <- tibble( township_stats$desk_review_prd, township_stats$desk_review_cod, township_stats$desk_review_mki ) -) +) %>% + mutate(gap = `Desk Review` - Model) township_stats_long <- township_stats_wide %>% pivot_longer( c(Model, `Desk Review`), names_to = "Stage", values_to = "Value" ) %>% - mutate( - Stage = factor(Stage, levels = c("Model", "Desk Review")), - label = round(Value, 2) - ) + mutate(Stage = factor(Stage, levels = c("Model", "Desk Review"))) iaao_bands <- select(metric_meta, Metric = name, xmin = low, xmax = high) %>% mutate(Metric = met_fac(Metric)) @@ -383,7 +365,7 @@ scale_anchors <- bind_rows( ) %>% mutate(Metric = met_fac(Metric)) -ggplot() + +p_main <- ggplot() + geom_blank(data = township_stats_long, aes(x = Value, y = 1)) + geom_point( data = scale_anchors, @@ -406,11 +388,6 @@ ggplot() + aes(x = Value, y = 1, color = Stage, shape = Stage), size = 5 ) + - geom_text( - data = township_stats_long, - aes(x = Value, y = 1, label = label, color = Stage), - vjust = -1.6, size = 3, fontface = "bold" - ) + facet_wrap(~Metric, scales = "free_x", ncol = 1, strip.position = "left") + scale_color_manual( values = c("Model" = pal$model, "Desk Review" = pal$desk_review) @@ -429,9 +406,39 @@ ggplot() + ), strip.placement = "outside", legend.position = "bottom", - plot.margin = margin(t = 20, r = 5, b = 5, l = 5, unit = "pt") + plot.margin = margin(t = 20, r = 0, b = 5, l = 5, unit = "pt") ) + labs(x = NULL, y = NULL, color = "Stage", shape = "Stage") + +gap_data <- township_stats_wide %>% + mutate( + lhs = sprintf("%.2f", Model), + rhs = sprintf("→ %.2f (%+.2f)", `Desk Review`, gap) + ) + +p_gap <- ggplot(gap_data, aes(y = 1)) + + geom_text( + aes(x = 0, label = lhs), + color = pal$model, fontface = "bold", size = 3, hjust = 1 + ) + + geom_text( + aes(x = 0, label = rhs), + color = "#000000", fontface = "bold", size = 3, hjust = 0 + ) + + facet_wrap(~Metric, ncol = 1) + + scale_y_continuous(limits = c(0, 2)) + + coord_cartesian(xlim = c(-0.3, 0.9)) + + theme_void() + + theme( + strip.text = element_blank(), + legend.position = "none", + panel.background = element_rect(fill = "#EFEFE3", color = NA), + plot.margin = margin(t = 20, r = 5, b = 5, l = 0, unit = "pt"), + plot.title = element_text(size = 9, hjust = 0.5, face = "bold") + ) + + labs(title = "Change") + +p_main + p_gap + plot_layout(widths = c(7, 3)) ``` ```{r desc-helpers} @@ -454,16 +461,22 @@ n_changed <- function(df) { #| tbl-cap: >- #| Fair Market Values by Group.\newline Model and desk review fair #| market values for properties with qualifying arm's-length sales -#| (Sold), properties without a recorded sale (Unsold), and all -#| residential parcels (All). Sold and Unsold do not sum to All -#| because properties removed by desk review as outliers are counted -#| in All but neither in Sold nor Unsold. +#| (Sold), sales excluded as outliers by desk review (Excluded), +#| properties without a recorded sale (Unsold), and all residential +#| parcels (All). Sold + Excluded + Unsold sums to All. #| tbl-pos: H -groups <- list(Sold = sales_df, Unsold = no_sale, All = all_parcels) +excluded <- all_parcels %>% filter(sale_excluded %in% TRUE) +groups <- list( + Sold = sales_df, + Excluded = excluded, + Unsold = no_sale, + All = all_parcels +) mv_table <- tibble( Group = names(groups), + N = sapply(groups, \(df) fmt_n(nrow(df))), `Median Model FMV` = sapply( groups, \(df) fmt_dol(median(df$model_FMV, na.rm = TRUE)) ), @@ -476,7 +489,11 @@ mv_table <- tibble( `Mean DR FMV` = sapply( groups, \(df) fmt_dol(mean(df$desk_review_FMV, na.rm = TRUE)) ) -) +) %>% + mutate(across( + c(`Median DR FMV`, `Mean DR FMV`), + \(x) if_else(Group == "Excluded", "---", x) + )) kable( mv_table, @@ -484,7 +501,7 @@ kable( escape = FALSE, booktabs = FALSE, linesep = "", - align = c("l", "r", "r", "r", "r") + align = c("l", "r", "r", "r", "r", "r") ) ``` @@ -495,19 +512,22 @@ kable( #| tbl-pos: H changes_table <- tibble( - Group = c("Sold", "Unsold", "All"), - N = c( + Group = c("Sold", "Excluded", "Unsold", "All"), + Properties = c( fmt_n(nrow(sales_df)), + fmt_n(nrow(excluded)), fmt_n(nrow(no_sale)), fmt_n(nrow(all_parcels)) ), - `N DR Changes` = c( + `Desk Review Changes` = c( fmt_n(n_changed(sales_df)), + fmt_n(n_changed(excluded)), fmt_n(n_changed(no_sale)), fmt_n(n_changed(all_parcels)) ), - `\\% DR Changes` = c( + `\\% Changed` = c( fmt_pct(n_changed(sales_df), nrow(sales_df)), + fmt_pct(n_changed(excluded), nrow(excluded)), fmt_pct(n_changed(no_sale), nrow(no_sale)), fmt_pct(n_changed(all_parcels), nrow(all_parcels)) ) @@ -593,25 +613,25 @@ ggplot( ) + annotate("rect", xmin = -Inf, xmax = Inf, - ymin = met_bounds(med_ratio_met)[["low"]], - ymax = met_bounds(med_ratio_met)[["high"]], + ymin = metric_meta$low[metric_meta$name == "Median Ratio"], + ymax = metric_meta$high[metric_meta$name == "Median Ratio"], fill = pal$iaao_band, alpha = 0.12 ) + geom_hline(yintercept = 1, color = "darkgreen", linewidth = 1) + geom_hline( - yintercept = met_bounds(med_ratio_met)[["low"]], + yintercept = metric_meta$low[metric_meta$name == "Median Ratio"], linetype = "dotted", color = "black", linewidth = 0.8 ) + geom_hline( - yintercept = met_bounds(med_ratio_met)[["high"]], + yintercept = metric_meta$high[metric_meta$name == "Median Ratio"], linetype = "dotted", color = "black", linewidth = 0.8 ) + annotate("text", - x = 1, y = met_bounds(med_ratio_met)[["high"]] + 0.01, + x = 1, y = metric_meta$high[metric_meta$name == "Median Ratio"] + 0.01, label = sprintf( "IAAO Range (%.2f–%.2f)", - met_bounds(med_ratio_met)[["low"]], - met_bounds(med_ratio_met)[["high"]] + metric_meta$low[metric_meta$name == "Median Ratio"], + metric_meta$high[metric_meta$name == "Median Ratio"] ), hjust = 0, vjust = -0.4, size = 3.5 ) + @@ -766,3 +786,24 @@ kable( ) ) ``` + +```{r export-excel} +#| include: false + +export_df <- all_parcels %>% + select( + PIN = pin, + Class = class, + `Neighborhood Code` = neighborhood_number, + `Model Value` = model_FMV, + `Sale Price` = sale_price, + `Sale Date` = sale_date, + `Sale Document Number` = sale_document_number, + `Sale Excluded` = sale_excluded, + `Price Decile` = price_decile, + `Model Sale Ratio` = model_sale_ratio, + `Desk Review Sale Ratio` = desk_review_sale_ratio + ) + +write.xlsx(export_df, paste0(tolower(town_name), ".xlsx"), overwrite = TRUE) +``` diff --git a/ratio-analysis/ratio-analysis.sql b/ratio-analysis/ratio-analysis.sql index a16e6fc..f007b25 100644 --- a/ratio-analysis/ratio-analysis.sql +++ b/ratio-analysis/ratio-analysis.sql @@ -8,7 +8,7 @@ WITH final_models AS ( UNNEST(final_model.township_code_coverage) AS towns (township_code) -- Year will need to be adjusted so that desk review to model values join in -- R script is 1 to 1. - WHERE final_model.year = CAST(YEAR(CURRENT_DATE) AS VARCHAR) + WHERE final_model.year = {analysis_year} -- noqa AND final_model.type = 'res' ), @@ -35,6 +35,7 @@ most_recent_pin AS ( SELECT uni.pin, uni.township_name, + uni.class, uni.nbhd_code AS neighborhood_number, ROW_NUMBER() OVER ( PARTITION BY @@ -47,15 +48,13 @@ most_recent_pin AS ( INNER JOIN ccao.class_dict ON uni.class = class_dict.class_code AND class_dict.modeling_group IN ('SF', 'MF', 'BB') - WHERE uni.year IN ( - CAST(YEAR(CURRENT_DATE) - 1 AS VARCHAR), - CAST(YEAR(CURRENT_DATE) AS VARCHAR) - ) - AND uni.township_code IN ({town_code*}) -- noqa + WHERE uni.year IN ({prior_year}, {analysis_year}) -- noqa + AND uni.township_code IN ({town_code}) -- noqa ) SELECT vpu.pin, + vpu.class, vpu.township_name, vpu.neighborhood_number, model_vals.model_value, diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index a44ba70..bc143a1 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -1,23 +1,47 @@ library(quarto) +library(assessr) +library(ccao) +library(DBI) +library(dplyr) +library(ggplot2) +library(ggspatial) +library(glue) +library(grid) +library(knitr) +library(noctua) +library(openxlsx) +library(patchwork) +library(readr) +library(scales) +library(sf) +library(tidyr) + data_path <- "." -year <- format(Sys.Date(), "%Y") +year <- Sys.getenv("ANALYSIS_YEAR") input_path <- file.path(data_path, "input", year) output_path <- file.path(data_path, "output", year) input_files <- list.files(input_path, pattern = "\\.xlsx$", full.names = TRUE) +town_codes <- substr(basename(input_files), 1, 2) +if (!all(town_codes %in% ccao::town_dict$township_code)) { + stop("One or more township codes in the input files are not valid.") +} + dir.create(output_path, recursive = TRUE, showWarnings = FALSE) for (f in input_files) { - town_code <- substr(basename(f), 1, 2)) + town_code <- substr(basename(f), 1, 2) town_name <- tolower(town_convert(town_code)) out_name <- paste0(town_name, "_ratio_analysis.pdf") - message("Rendering: ", f) + message("Rendering PDF report for ", town_name) quarto_render( "ratio-analysis.qmd", execute_params = list(input_file = f), output_file = out_name ) file.rename(out_name, file.path(output_path, out_name)) + xlsx_name <- paste0(town_name, ".xlsx") + file.rename(xlsx_name, file.path(output_path, xlsx_name)) } diff --git a/ratio-analysis/renv.lock b/ratio-analysis/renv.lock index ae49acb..b488d6a 100644 --- a/ratio-analysis/renv.lock +++ b/ratio-analysis/renv.lock @@ -785,6 +785,25 @@ ], "Hash": "627d6993db1043703c0b084fa432f21f" }, + "patchwork": { + "Package": "patchwork", + "Version": "1.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "cli", + "farver", + "ggplot2", + "grDevices", + "graphics", + "grid", + "gtable", + "rlang", + "stats", + "utils" + ], + "Hash": "97fc0338dd42af55d170478dfc4c0c03" + }, "paws": { "Package": "paws", "Version": "0.10.0", From 706541ace1a5a2b4bf2e012e6f93d81b03ed5d4d Mon Sep 17 00:00:00 2001 From: Damonamajor <56321109+Damonamajor@users.noreply.github.com> Date: Fri, 11 Sep 2026 11:20:31 -0500 Subject: [PATCH 37/46] Apply suggestion from @wrridgeway Co-authored-by: William Ridgeway <10358980+wrridgeway@users.noreply.github.com> --- ratio-analysis/ratio-analysis.qmd | 39 ++++++++++++++----------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index 6fa02d2..cbe8157 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -89,29 +89,24 @@ all_parcels <- dr_vals %>% sales_df <- all_parcels %>% filter(!is.na(sale_price), !sale_excluded %in% TRUE) -township_stats <- tibble( - model_ratio = median(sales_df$model_sale_ratio, na.rm = TRUE), - model_cod = assessr::cod(sales_df$model_sale_ratio), - model_prd = assessr::prd(sales_df$model_FMV, sales_df$sale_price), - model_prb = assessr::prb(sales_df$model_FMV, sales_df$sale_price), - model_mki = assessr::mki(sales_df$model_FMV, sales_df$sale_price), - desk_review_ratio = median(sales_df$desk_review_sale_ratio, na.rm = TRUE), - desk_review_cod = assessr::cod(sales_df$desk_review_sale_ratio), - desk_review_prd = assessr::prd( - sales_df$desk_review_FMV, sales_df$sale_price - ), - desk_review_prb = assessr::prb( - sales_df$desk_review_FMV, sales_df$sale_price - ), - desk_review_mki = assessr::mki( - sales_df$desk_review_FMV, sales_df$sale_price - ), - price_range = paste( - dollar(min(sales_df$sale_price)), - dollar(max(sales_df$sale_price)), - sep = "–" +township_stats <- sales_df %>% + summarize( + model_ratio = median(model_sale_ratio, na.rm = TRUE), + model_cod = assessr::cod(model_sale_ratio), + model_prd = assessr::prd(model_FMV, sale_price), + model_prb = assessr::prb(model_FMV, sale_price), + model_mki = assessr::mki(model_FMV, sale_price), + desk_review_ratio = median(desk_review_sale_ratio, na.rm = TRUE), + desk_review_cod = assessr::cod(desk_review_sale_ratio), + desk_review_prd = assessr::prd(desk_review_FMV, sale_price), + desk_review_prb = assessr::prb(desk_review_FMV, sale_price), + desk_review_mki = assessr::mki(desk_review_FMV, sale_price), + price_range = paste( + dollar(min(sale_price)), + dollar(max(sale_price)), + sep = "–" + ) ) -) decile_stats <- sales_df %>% summarize( From 70b2ce5522690b2ce59a340fcc5a96e01e6ed803 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 11 Sep 2026 16:30:43 +0000 Subject: [PATCH 38/46] add commenting --- ratio-analysis/render_all_files.R | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index bc143a1..cdf3214 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -1,3 +1,10 @@ +# This file runs the ratio_analysis.qmd report for all files +# stored in the O drive in +# O:/CCAODATA/recurring-data-requests/provisional-ratio-curves/. Since +# that isn't accessible from the server they need to be copied locally or run +# from a local machine. They MUST be named according to the current naming +# scheme, and there must be PIN and Desk Review Value columns + library(quarto) library(assessr) @@ -17,13 +24,13 @@ library(scales) library(sf) library(tidyr) -data_path <- "." +data_path <- "O:/CCAODATA/recurring-data-requests/provisional-ratio-curves" year <- Sys.getenv("ANALYSIS_YEAR") input_path <- file.path(data_path, "input", year) output_path <- file.path(data_path, "output", year) input_files <- list.files(input_path, pattern = "\\.xlsx$", full.names = TRUE) - +# This is a test to make sure that the township number is valid town_codes <- substr(basename(input_files), 1, 2) if (!all(town_codes %in% ccao::town_dict$township_code)) { stop("One or more township codes in the input files are not valid.") @@ -32,16 +39,21 @@ if (!all(town_codes %in% ccao::town_dict$township_code)) { dir.create(output_path, recursive = TRUE, showWarnings = FALSE) for (f in input_files) { + # Grab the town code for the file that we are processing. + # The files in the folder must be named in the structure of + # ##-township.xlsx town_code <- substr(basename(f), 1, 2) town_name <- tolower(town_convert(town_code)) out_name <- paste0(town_name, "_ratio_analysis.pdf") message("Rendering PDF report for ", town_name) + # Render the report with the name of township_ratio_analysis.pdf quarto_render( "ratio-analysis.qmd", execute_params = list(input_file = f), output_file = out_name ) file.rename(out_name, file.path(output_path, out_name)) + # Output the .xlsx file with all PIN values xlsx_name <- paste0(town_name, ".xlsx") file.rename(xlsx_name, file.path(output_path, xlsx_name)) } From 67480822c3bec1bab370fe960937022c769c16c5 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Wed, 16 Sep 2026 18:58:17 +0000 Subject: [PATCH 39/46] Add readme and tidy up --- ratio-analysis/.Renviron | 1 + ratio-analysis/.gitignore | 1 - ratio-analysis/ratio-analysis.qmd | 6 +++++- ratio-analysis/readme.txt | 19 +++++++++++++++++++ ratio-analysis/render_all_files.R | 11 +++++++++-- ratio-analysis/renv.lock | 4 ++-- 6 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 ratio-analysis/.Renviron create mode 100644 ratio-analysis/readme.txt diff --git a/ratio-analysis/.Renviron b/ratio-analysis/.Renviron new file mode 100644 index 0000000..42bca39 --- /dev/null +++ b/ratio-analysis/.Renviron @@ -0,0 +1 @@ +ANALYSIS_YEAR=2026 diff --git a/ratio-analysis/.gitignore b/ratio-analysis/.gitignore index 5f27234..21da21e 100644 --- a/ratio-analysis/.gitignore +++ b/ratio-analysis/.gitignore @@ -1,3 +1,2 @@ /.quarto/ /quarto/ -.Renviron diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index cbe8157..d39344b 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -41,6 +41,9 @@ input_file <- params$input_file file_base <- sub("\\.xlsx$", "", basename(input_file)) town_code <- substr(file_base, 1, 2) analysis_year <- Sys.getenv("ANALYSIS_YEAR") +if (!nzchar(analysis_year)) { + stop("ANALYSIS_YEAR is not set.") +} prior_year <- as.character(as.integer(analysis_year) - 1) town_name <- ccao::town_dict %>% @@ -65,7 +68,8 @@ model_vals <- dbGetQuery( read_file("ratio-analysis.sql"), .con = conn ) -) +) %>% + rename_with(tolower) dbDisconnect(conn) diff --git a/ratio-analysis/readme.txt b/ratio-analysis/readme.txt new file mode 100644 index 0000000..18d986a --- /dev/null +++ b/ratio-analysis/readme.txt @@ -0,0 +1,19 @@ +This folder runs a ratio analysis comparing desk review values against model values for residential PINs, either for a single township or for every township at once. +Each input file must be an xlsx named ##-township.xlsx (e.g., 17-berwyn.xlsx) with PIN and Desk Review Value columns. + +To run a single township, render ratio-analysis.qmd in Quarto with the input_file parameter pointing to that township's xlsx file. +Example: + +library(quarto) +quarto_render( + "ratio-analysis.qmd", + execute_params = list(input_file = "input/2026/17-berwyn.xlsx"), + output_file = "berwyn_ratio_analysis.pdf" +) + +This produces berwyn_ratio_analysis.pdf in the current working directory. You can also render from a terminal instead: + +quarto render ratio-analysis.qmd -P input_file:input/2026/17-berwyn.xlsx --output berwyn_ratio_analysis.pdf + +To run every township at once, place each township's input file in input// and run render_all_files.R. +The analysis year is controlled by the ANALYSIS_YEAR variable in a .Renviron file. Make sure this file is updated at the beginning of the new modeling year. \ No newline at end of file diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index cdf3214..4269fa7 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -4,6 +4,10 @@ # that isn't accessible from the server they need to be copied locally or run # from a local machine. They MUST be named according to the current naming # scheme, and there must be PIN and Desk Review Value columns +# +# The analysis year is set via the ANALYSIS_YEAR variable in .Renviron so +# that this script, ratio-analysis.qmd, and ratio-analysis.sql all stay in +# sync. Update .Renviron and restart R to change the year. library(quarto) @@ -26,8 +30,11 @@ library(tidyr) data_path <- "O:/CCAODATA/recurring-data-requests/provisional-ratio-curves" year <- Sys.getenv("ANALYSIS_YEAR") -input_path <- file.path(data_path, "input", year) -output_path <- file.path(data_path, "output", year) +if (!nzchar(year)) { + stop("ANALYSIS_YEAR is not set. Add it to .Renviron and restart R.") +} +input_path <- file.path("input", year) +output_path <- file.path("output", year) input_files <- list.files(input_path, pattern = "\\.xlsx$", full.names = TRUE) # This is a test to make sure that the township number is valid diff --git a/ratio-analysis/renv.lock b/ratio-analysis/renv.lock index b488d6a..73d3445 100644 --- a/ratio-analysis/renv.lock +++ b/ratio-analysis/renv.lock @@ -1027,7 +1027,7 @@ "Package": "processx", "Version": "3.9.0", "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/2026-07-10", + "Repository": "CRAN", "Requirements": [ "R", "R6", @@ -1083,7 +1083,7 @@ "Package": "ps", "Version": "1.9.3", "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/2026-07-10", + "Repository": "CRAN", "Requirements": [ "R", "utils" From fd487f5c5cd5e23664a569cc8fbb4d92ae4f4d26 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Wed, 16 Sep 2026 20:18:38 +0000 Subject: [PATCH 40/46] remove scientific notation --- ratio-analysis/ratio-analysis.qmd | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index d39344b..e7d9e0a 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -36,6 +36,9 @@ library(scales) library(sf) library(tidyr) +# Prevent format() from switching round numbers (e.g. 400000) to +# scientific notation (4e+05) in report tables. +options(scipen = 999) input_file <- params$input_file file_base <- sub("\\.xlsx$", "", basename(input_file)) @@ -443,8 +446,10 @@ p_main + p_gap + plot_layout(widths = c(7, 3)) ```{r desc-helpers} no_sale <- all_parcels %>% filter(is.na(sale_price)) -fmt_n <- function(x) format(x, big.mark = ",") -fmt_dol <- function(x) paste0("\\$", format(round(x), big.mark = ",")) +fmt_n <- function(x) format(x, big.mark = ",", scientific = FALSE) +fmt_dol <- function(x) { + paste0("\\$", format(round(x), big.mark = ",", scientific = FALSE)) +} fmt_pct <- function(changed, total) { paste0(round(changed / total * 100, 1), "\\%") } From a3a4a5f925649a190c8c4d8198d8f0bec43a071a Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Fri, 18 Sep 2026 03:07:16 +0000 Subject: [PATCH 41/46] manual exclusion --- ratio-analysis/ratio-analysis.qmd | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ratio-analysis/ratio-analysis.qmd b/ratio-analysis/ratio-analysis.qmd index e7d9e0a..ee17319 100644 --- a/ratio-analysis/ratio-analysis.qmd +++ b/ratio-analysis/ratio-analysis.qmd @@ -496,7 +496,8 @@ mv_table <- tibble( ) %>% mutate(across( c(`Median DR FMV`, `Mean DR FMV`), - \(x) if_else(Group == "Excluded", "---", x) + # Desk review FMVs are absent for Excluded parcels + \(x) if_else(Group == "Excluded", "excluded", x) )) kable( @@ -535,7 +536,12 @@ changes_table <- tibble( fmt_pct(n_changed(no_sale), nrow(no_sale)), fmt_pct(n_changed(all_parcels), nrow(all_parcels)) ) -) +) %>% + mutate(across( + c(`Desk Review Changes`, `\\% Changed`), + # Desk review FMVs are absent for Excluded parcels + \(x) if_else(Group == "Excluded", "excluded", x) + )) kable( changes_table, From 8a428b234d63980c317bb5df14d12b0aaf1cfb63 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Mon, 19 Oct 2026 20:26:33 +0000 Subject: [PATCH 42/46] remove provisional ratio curve folder --- provisional-ratio-curves/.Rprofile | 1 - provisional-ratio-curves/.gitignore | 5 - provisional-ratio-curves/README.md | 17 - .../provisional-ratio-curves.R | 278 ---- .../provisional-ratio-curves.Rproj | 16 - .../provisional-ratio-curves.sql | 67 - provisional-ratio-curves/renv.lock | 1279 ---------------- provisional-ratio-curves/renv/.gitignore | 7 - provisional-ratio-curves/renv/activate.R | 1334 ----------------- 9 files changed, 3004 deletions(-) delete mode 100644 provisional-ratio-curves/.Rprofile delete mode 100644 provisional-ratio-curves/.gitignore delete mode 100644 provisional-ratio-curves/README.md delete mode 100644 provisional-ratio-curves/provisional-ratio-curves.R delete mode 100644 provisional-ratio-curves/provisional-ratio-curves.Rproj delete mode 100644 provisional-ratio-curves/provisional-ratio-curves.sql delete mode 100644 provisional-ratio-curves/renv.lock delete mode 100644 provisional-ratio-curves/renv/.gitignore delete mode 100644 provisional-ratio-curves/renv/activate.R diff --git a/provisional-ratio-curves/.Rprofile b/provisional-ratio-curves/.Rprofile deleted file mode 100644 index 81b960f..0000000 --- a/provisional-ratio-curves/.Rprofile +++ /dev/null @@ -1 +0,0 @@ -source("renv/activate.R") diff --git a/provisional-ratio-curves/.gitignore b/provisional-ratio-curves/.gitignore deleted file mode 100644 index 50e8752..0000000 --- a/provisional-ratio-curves/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# excel files -*.xlsx - -# png files -*.png diff --git a/provisional-ratio-curves/README.md b/provisional-ratio-curves/README.md deleted file mode 100644 index 3e2461e..0000000 --- a/provisional-ratio-curves/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Ratio Curve Analysis - -We run `provisional-ratio-curves.R` every time valuations finishes desk review for a town -that's about to mail and sends us their provisional values. All they need to -provide us is an excel sheet with two columns: `PIN` and `Desk Review Value`. -- The sheet can contain more columns than that, they'll just be ignored. -- Before running the R script make sure the excel workbook is -in `O:\CCAODATA\recurring-data-requests\provisional-ratio-curves\input`, labeled using the -established schema in that folder (`town_code-town_name.xlsx`), and that there -are in fact `PIN` and `Desk Review Value` columns or the script will throw an -error. -- Run the script in a local installation of RStudio, rather than on the server, -since the script needs to read from the O Drive and write to it - - If you can't run the script locally, you can also just edit the input and output - paths as defined in the script to write to a relative path, and then copy the input - and output files between your machine and the server -- Output will show up in `O:\CCAODATA\recurring-data-requests\provisional-ratio-curves\output` diff --git a/provisional-ratio-curves/provisional-ratio-curves.R b/provisional-ratio-curves/provisional-ratio-curves.R deleted file mode 100644 index 5e4ae34..0000000 --- a/provisional-ratio-curves/provisional-ratio-curves.R +++ /dev/null @@ -1,278 +0,0 @@ -# Setup ---- - -library(arrow) -library(assessr) -library(ccao) -library(colorspace) -library(DBI) -library(dplyr) -library(ggplot2) -library(ggspatial) -library(glue) -library(noctua) -library(openxlsx) -library(prettymapr) -library(readr) -library(purrr) -library(scales) -library(stringr) -library(sf) -library(tidyr) - -noctua_options(unload = TRUE) -AWS_ATHENA_CONN_NOCTUA <- dbConnect(noctua::athena(), rstudio_conn_tab = FALSE) - -year <- format(Sys.Date(), "%Y") - -# These files live on the O drive in -# O:/CCAODATA/recurring-data-requests/provisional-ratio-curves/. Since -# that isn't accessible from the server they need to be copied locally or run -# from a local machine. They MUST be named according to the current naming -# scheme, and there must be PIN and Desk Review Value columns -data_path <- "O:/CCAODATA/recurring-data-requests/provisional-ratio-curves" -input_path <- file.path(data_path, "input", year) -output_path <- file.path(data_path, "output", year) -files_in <- list.files(input_path, full.names = TRUE, pattern = "\\.xlsx$") - -# Flatfile ---- - -# Read in desk review workbooks, keep PIN and Desk Review Value columns. -dr_vals <- map(files_in, \(x) { - read.xlsx(x, sheet = 1) %>% - tibble(.name_repair = "unique") %>% - select( - pin = PIN, - desk_review_value = Desk.Review.Value - ) -}) %>% - bind_rows() - -# Grab a list of all towns we're processing to use in the SQL query. This is -# based on the first two characters of the file name, which should be the -# township code. Input files *must* be named correctly. -dr_towns <- substr(basename(files_in), 1, 2) -if (!all(dr_towns %in% ccao::town_dict$township_code)) { - stop("One or more township codes in the input files are not valid.") -} - -# This SQL query will return townships, neighborhoods, and model values for -# every PIN, as well as any associated sales used for training -model_vals <- dbGetQuery( - conn = AWS_ATHENA_CONN_NOCTUA, - glue_sql( - read_file("provisional-ratio-curves.sql"), - .con = AWS_ATHENA_CONN_NOCTUA - ) -) - -# Attach dr and model values to calculate ratios -all_ratios <- dr_vals %>% - # Valuations provides a bunch of parcels of classes that are not part of the - # modeling pipeline. We strip these parcels out of the analysis. - inner_join( - model_vals %>% - select(pin) - ) %>% - full_join(model_vals, by = "pin") %>% - # Define an excluded sale as one that has a sale price but no provided desk - # review value. - mutate( - sale_excluded = if_else(is.na(sale_price), NA, is.na(desk_review_value)) - ) - -walk(unique(all_ratios$township_name), \(x) { - # Construct list for outputting multisheet .xlsx - output <- list() - output$`All Parcels` <- all_ratios %>% - filter(township_name == x) %>% - select(-township_name) %>% - mutate( - price_decile = ntile( - if_else(sale_excluded %in% TRUE, NA_real_, sale_price), - 10 - ), - model_sale_ratio = model_value / sale_price, - desk_review_sale_ratio = desk_review_value / sale_price - ) - - # Summarize ratios and price ranges by decile for .xlsx output - output$`Ratio Deciles` <- output$`All Parcels` %>% - filter(!is.na(sale_price), !sale_excluded) %>% - summarize( - model_ratio = median(model_sale_ratio), - model_cod = assessr::cod(model_sale_ratio), - desk_review_ratio = median(desk_review_sale_ratio), - desk_review_cod = assessr::cod(desk_review_sale_ratio), - price_range = paste( - scales::dollar(min(sale_price)), - scales::dollar(max(sale_price)), - sep = "-" - ), - number_of_sales = n(), - .by = price_decile - ) %>% - arrange(price_decile) %>% - mutate(across(model_ratio:desk_review_cod, ~ round(.x, digits = 6))) %>% - rename_with(~ str_to_title(gsub("_", " ", .x))) - - # Calculate vertical equity metrics for .xlsx output - output$`Town-Level Stats` <- output$`All Parcels` %>% - filter(!is.na(sale_price), !sale_excluded) %>% - summarize( - model_ratio = median(model_sale_ratio), - model_cod = assessr::cod(model_sale_ratio), - model_prd = assessr::prd(model_value, sale_price), - model_prb = assessr::prb(model_value, sale_price), - model_mki = assessr::mki(model_value, sale_price), - desk_review_ratio = median(desk_review_sale_ratio), - desk_review_cod = assessr::cod(desk_review_sale_ratio), - desk_review_prd = assessr::prd(desk_review_value, sale_price), - desk_review_prb = assessr::prb(desk_review_value, sale_price), - desk_review_mki = assessr::mki(desk_review_value, sale_price), - price_range = paste( - scales::dollar(min(sale_price)), - scales::dollar(max(sale_price)), - sep = "-" - ), - number_of_sales = n() - ) %>% - mutate(across(model_ratio:desk_review_mki, ~ round(.x, digits = 6))) %>% - rename_with(~ str_to_title(gsub("_", " ", .x))) - - output$`All Parcels` <- output$`All Parcels` %>% - rename_with(~ str_to_title(gsub("_", " ", .x))) - - output %>% - write.xlsx(file.path(output_path, paste0(gsub(" ", "_", x), ".xlsx"))) - - # Pivot decile data for graph - decile_ratios <- output$`Ratio Deciles` %>% - select(`Price Decile`, `Model Ratio`, `Desk Review Ratio`) %>% - pivot_longer( - cols = c("Model Ratio", "Desk Review Ratio"), - names_to = "Stage", - values_to = "Sale Ratio" - ) - - # Build x-axis labels with abbreviated price ranges per decile - axis_labels <- output$`All Parcels` %>% - filter(!is.na(`Sale Price`), !`Sale Excluded`) %>% - summarize( - min_price = min(`Sale Price`), - max_price = max(`Sale Price`), - .by = `Price Decile` - ) %>% - arrange(`Price Decile`) %>% - mutate(label = paste0( - `Price Decile`, "\n", - scales::dollar(min_price, scale_cut = scales::cut_short_scale()), - "\u2013\n", - scales::dollar(max_price, scale_cut = scales::cut_short_scale()) - )) %>% - { - setNames(.$label, .$`Price Decile`) - } - - # Graph ---- - - # Create ratio curves for both stages - y_min <- min(decile_ratios$`Sale Ratio`, 0.7, na.rm = TRUE) - y_max <- max(decile_ratios$`Sale Ratio`, 1.3, na.rm = TRUE) - - ggplot(decile_ratios, aes( - x = `Price Decile`, - y = `Sale Ratio`, - group = Stage, - color = Stage, - label = round(`Sale Ratio`, 2) - )) + - # IAAO dotted range - geom_hline(yintercept = 1, color = "darkgreen", linewidth = 1) + - geom_hline( - yintercept = 0.9, linetype = "dotted", color = "black", linewidth = 0.8 - ) + - geom_hline( - yintercept = 1.1, linetype = "dotted", color = "black", linewidth = 0.8 - ) + - annotate( - "text", - x = 1, y = 1.11, - label = "IAAO Range (0.9 - 1.1)", - hjust = 0, - vjust = -0.5, - size = 4 - ) + - geom_line(linewidth = 1) + - geom_label(show.legend = FALSE) + - theme_minimal() + - theme(axis.text.x = element_text(size = 8)) + - coord_cartesian(ylim = c(y_min, y_max)) + - scale_y_continuous( - breaks = seq(floor(y_min * 10) / 10, - ceiling(y_max * 10) / 10, - by = 0.1 - ) - ) + - scale_x_continuous(breaks = seq(1, 10, by = 1), labels = axis_labels) + - ggtitle( - label = paste0("Sale Ratios for ", x, " Township"), - subtitle = "Model and Desk Review Values" - ) - - ggsave( - file.path(output_path, paste0(gsub(" ", "_", x), "_ratio_curve.png")), - bg = "white" - ) - - # Maps ---- - - # Gather neighborhood polygons - neighborhoods <- ccao::nbhd_shp %>% - filter(township_name == x) %>% - select(town_nbhd, geometry) - - map_data <- output$`All Parcels` %>% - filter(!isTRUE(`Sale Excluded`)) %>% - select( - `Neighborhood Number`, - `Model Sale Ratio`, - `Desk Review Sale Ratio` - ) %>% - summarize( - `Model` = median(`Model Sale Ratio`, na.rm = TRUE), - `Desk Review` = median(`Desk Review Sale Ratio`, na.rm = TRUE), - .by = `Neighborhood Number` - ) %>% - pivot_longer( - cols = c("Desk Review", "Model"), - names_to = "Stage", - values_to = "Median Sale Ratio" - ) %>% - mutate( - Stage = factor(Stage, levels = c("Model", "Desk Review")), - `Neighborhood Number` = gsub("-", "", `Neighborhood Number`) - ) %>% - left_join(neighborhoods, c("Neighborhood Number" = "town_nbhd")) %>% - st_as_sf(crs = 4326) - - ggplot() + - annotation_map_tile(type = "cartolight", zoomin = 0) + - geom_sf( - data = map_data, - aes(fill = `Median Sale Ratio`), - alpha = 0.8, - linewidth = 0.1 - ) + - scale_fill_continuous_diverging( - palette = "Purple-Green", mid = 1, rev = TRUE, alpha = 0.8 - ) + - theme_void() + - labs(fill = "Median Ratio") + - facet_grid(cols = vars(Stage)) + - theme(strip.text.x = element_text(size = 14)) - - ggsave( - file.path(output_path, paste0(gsub(" ", "_", x), "_map.png")), - bg = "white" - ) -}) diff --git a/provisional-ratio-curves/provisional-ratio-curves.Rproj b/provisional-ratio-curves/provisional-ratio-curves.Rproj deleted file mode 100644 index e83436a..0000000 --- a/provisional-ratio-curves/provisional-ratio-curves.Rproj +++ /dev/null @@ -1,16 +0,0 @@ -Version: 1.0 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX - -AutoAppendNewline: Yes -StripTrailingWhitespace: Yes diff --git a/provisional-ratio-curves/provisional-ratio-curves.sql b/provisional-ratio-curves/provisional-ratio-curves.sql deleted file mode 100644 index 9476dea..0000000 --- a/provisional-ratio-curves/provisional-ratio-curves.sql +++ /dev/null @@ -1,67 +0,0 @@ --- Final model run IDs by township and year -WITH final_models AS ( - SELECT - final_model.run_id, - towns.township_code - FROM model.final_model - CROSS JOIN - UNNEST(final_model.township_code_coverage) AS towns (township_code) - -- Year will need to be adjusted so that desk review to model values join in - -- R script is 1 to 1. - WHERE final_model.year = CAST(YEAR(CURRENT_DATE) AS VARCHAR) - AND final_model.type = 'res' -), - --- Use final model run IDs to grab the model values we need to compare Res Val's --- desk review values against -model_vals AS ( - SELECT - assessment_pin.meta_pin AS pin, - assessment_pin.pred_pin_final_fmv_round AS model_value, - assessment_pin.sale_ratio_study_price AS sale_price, - assessment_pin.sale_ratio_study_date AS sale_date, - assessment_pin.sale_ratio_study_document_num AS sale_document_number - FROM model.assessment_pin - INNER JOIN final_models - ON assessment_pin.run_id = final_models.run_id - AND assessment_pin.township_code = final_models.township_code -), - --- Res Val provides PINs that sometimes only appear in 2025 or 2026 in --- default.vw_pin_universe. Make sure we grab one and only one row for every PIN --- that appears in either year, regardless of whether they have a model value. -most_recent_pin AS ( - SELECT - uni.pin, - uni.township_name, - uni.nbhd_code AS neighborhood_number, - ROW_NUMBER() OVER ( - PARTITION BY - uni.pin - ORDER BY uni.year DESC - ) AS rank - FROM default.vw_pin_universe AS uni - -- Make sure we only grab parcels valued by the res avm, for the towns we're - -- processing. - INNER JOIN ccao.class_dict - ON uni.class = class_dict.class_code - AND class_dict.modeling_group IN ('SF', 'MF', 'BB') - WHERE uni.year IN ( - CAST(YEAR(CURRENT_DATE) - 1 AS VARCHAR), - CAST(YEAR(CURRENT_DATE) AS VARCHAR) - ) - AND uni.township_code IN ({dr_towns*}) -- noqa -) - -SELECT - vpu.pin, - vpu.township_name, - vpu.neighborhood_number, - model_vals.model_value, - model_vals.sale_price, - model_vals.sale_date, - model_vals.sale_document_number -FROM most_recent_pin AS vpu -LEFT JOIN model_vals - ON vpu.pin = model_vals.pin -WHERE vpu.rank = 1 diff --git a/provisional-ratio-curves/renv.lock b/provisional-ratio-curves/renv.lock deleted file mode 100644 index f1d122c..0000000 --- a/provisional-ratio-curves/renv.lock +++ /dev/null @@ -1,1279 +0,0 @@ -{ - "R": { - "Version": "4.5.1", - "Repositories": [ - { - "Name": "CRAN", - "URL": "https://cloud.r-project.org" - } - ] - }, - "Packages": { - "DBI": { - "Package": "DBI", - "Version": "1.2.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "065ae649b05f1ff66bb0c793107508f5" - }, - "KernSmooth": { - "Package": "KernSmooth", - "Version": "2.23-26", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "stats" - ], - "Hash": "2fb39782c07b5ad422b0448ae83f64c4" - }, - "MASS": { - "Package": "MASS", - "Version": "7.3-65", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics", - "methods", - "stats", - "utils" - ], - "Hash": "a41d0fc833ea756a1136b60a437efe26" - }, - "R6": { - "Package": "R6", - "Version": "2.6.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "d4335fe7207f1c01ab8c41762f5840d4" - }, - "RColorBrewer": { - "Package": "RColorBrewer", - "Version": "1.1-3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "45f0398006e83a5b10b72a90663d8d8c" - }, - "Rcpp": { - "Package": "Rcpp", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "methods", - "utils" - ], - "Hash": "0d3d8867aa41b0d9ad113b50c169ecb2" - }, - "S7": { - "Package": "S7", - "Version": "0.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "5deb66b3ae702137e1f4162c11861e76" - }, - "abind": { - "Package": "abind", - "Version": "1.4-8", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R", - "methods", - "utils" - ], - "Hash": "2288423bb0f20a457800d7fc47f6aa54" - }, - "arrow": { - "Package": "arrow", - "Version": "21.0.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "assertthat", - "bit64", - "cpp11", - "glue", - "methods", - "purrr", - "rlang", - "stats", - "tidyselect", - "utils", - "vctrs" - ], - "Hash": "ef54a31808517d2197e83dd57ca391e5" - }, - "askpass": { - "Package": "askpass", - "Version": "1.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "sys" - ], - "Hash": "c39f4155b3ceb1a9a2799d700fbd4b6a" - }, - "assertthat": { - "Package": "assertthat", - "Version": "0.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "tools" - ], - "Hash": "50c838a310445e954bc13f26f26a6ecf" - }, - "assessr": { - "Package": "assessr", - "Version": "0.6.0", - "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "ccao-data", - "RemoteRepo": "assessr", - "RemoteRef": "master", - "RemoteSha": "ddc5799e912eefb6caa1cc8da24e11beb7c052f6", - "Requirements": [ - "R", - "stats" - ], - "Hash": "f23830de8c4b1e169fe1e44d769a6583" - }, - "base64enc": { - "Package": "base64enc", - "Version": "0.1-3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "543776ae6848fde2f48ff3816d0628bc" - }, - "bit": { - "Package": "bit", - "Version": "4.6.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "ebe86ffd194564abdc895d87742d5a29" - }, - "bit64": { - "Package": "bit64", - "Version": "4.6.0-1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bit", - "graphics", - "methods", - "stats", - "utils" - ], - "Hash": "4f572fbc586294afff277db583b9060f" - }, - "ccao": { - "Package": "ccao", - "Version": "1.3.1", - "Source": "GitHub", - "RemoteType": "github", - "RemoteUsername": "ccao-data", - "RemoteRepo": "ccao", - "RemoteRef": "master", - "RemoteSha": "18e12ca5115741924a58b0be6b4055f480f22a2d", - "RemoteHost": "api.github.com", - "Requirements": [ - "R", - "assessr", - "dplyr", - "magrittr", - "rlang", - "tidyr" - ], - "Hash": "c4c334d304550bbf4736eee6a4f15592" - }, - "class": { - "Package": "class", - "Version": "7.3-23", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "MASS", - "R", - "stats", - "utils" - ], - "Hash": "d0cb9cc838c3b43560bd958fc4317fdc" - }, - "classInt": { - "Package": "classInt", - "Version": "0.4-11", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "KernSmooth", - "R", - "class", - "e1071", - "grDevices", - "graphics", - "stats" - ], - "Hash": "f2af70314a63d7f025ae668f08bd933a" - }, - "cli": { - "Package": "cli", - "Version": "3.6.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "16850760556401a2eeb27d39bd11c9cb" - }, - "clipr": { - "Package": "clipr", - "Version": "0.8.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "3f038e5ac7f41d4ac41ce658c85e3042" - }, - "colorspace": { - "Package": "colorspace", - "Version": "2.1-2", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R", - "grDevices", - "graphics", - "methods", - "stats" - ], - "Hash": "2c14b873da71cacec1284f3f6d112ddc" - }, - "cpp11": { - "Package": "cpp11", - "Version": "0.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "2720e3fd3dad08f34b19b56b3d6f073d" - }, - "crayon": { - "Package": "crayon", - "Version": "1.5.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "grDevices", - "methods", - "utils" - ], - "Hash": "859d96e65ef198fd43e82b9628d593ef" - }, - "curl": { - "Package": "curl", - "Version": "7.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "aa27e963d3deccf4bade44d06b976977" - }, - "data.table": { - "Package": "data.table", - "Version": "1.17.8", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "1d991cd6160fa7b1fdbd3689034cbd15" - }, - "digest": { - "Package": "digest", - "Version": "0.6.37", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "33698c4b3127fc9f506654607fb73676" - }, - "dplyr": { - "Package": "dplyr", - "Version": "1.1.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", - "generics", - "glue", - "lifecycle", - "magrittr", - "methods", - "pillar", - "rlang", - "tibble", - "tidyselect", - "utils", - "vctrs" - ], - "Hash": "fedd9d00c2944ff00a0e2696ccf048ec" - }, - "e1071": { - "Package": "e1071", - "Version": "1.7-16", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "class", - "grDevices", - "graphics", - "methods", - "proxy", - "stats", - "utils" - ], - "Hash": "27a09ca40266a1066d62ef5402dd51d6" - }, - "farver": { - "Package": "farver", - "Version": "2.1.2", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "680887028577f3fa2a81e410ed0d6e42" - }, - "generics": { - "Package": "generics", - "Version": "0.1.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "4b29bf698d0c7bdb9f1e4976e7ade41d" - }, - "ggplot2": { - "Package": "ggplot2", - "Version": "4.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "S7", - "cli", - "grDevices", - "grid", - "gtable", - "isoband", - "lifecycle", - "rlang", - "scales", - "stats", - "vctrs", - "withr" - ], - "Hash": "3b4625a157bcbd82b937fcb3acdd2d85" - }, - "ggspatial": { - "Package": "ggspatial", - "Version": "1.1.10", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R", - "abind", - "ggplot2", - "glue", - "grid", - "methods", - "rlang", - "rosm", - "scales", - "sf", - "tibble", - "tidyr" - ], - "Hash": "a065e21174bbce1866deff1e30d26ca5" - }, - "glue": { - "Package": "glue", - "Version": "1.8.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "5899f1eaa825580172bb56c08266f37c" - }, - "gtable": { - "Package": "gtable", - "Version": "0.3.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "grid", - "lifecycle", - "rlang", - "stats" - ], - "Hash": "de949855009e2d4d0e52a844e30617ae" - }, - "hms": { - "Package": "hms", - "Version": "1.1.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cli", - "lifecycle", - "methods", - "pkgconfig", - "rlang", - "vctrs" - ], - "Hash": "2799ac720626cec589478b191e48b88b" - }, - "httr": { - "Package": "httr", - "Version": "1.4.7", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "curl", - "jsonlite", - "mime", - "openssl" - ], - "Hash": "ac107251d9d9fd72f0ca8049988f1d7f" - }, - "httr2": { - "Package": "httr2", - "Version": "1.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", - "curl", - "glue", - "lifecycle", - "magrittr", - "openssl", - "rappdirs", - "rlang", - "vctrs", - "withr" - ], - "Hash": "6e29f1ed132b927f7d52e9fd8869f0ea" - }, - "isoband": { - "Package": "isoband", - "Version": "0.2.7", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "grid", - "utils" - ], - "Hash": "0080607b4a1a7b28979aecef976d8bc2" - }, - "jpeg": { - "Package": "jpeg", - "Version": "0.1-11", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "c23ab23c370d1ce3a7a80d8c0bdfa105" - }, - "jsonlite": { - "Package": "jsonlite", - "Version": "2.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "methods" - ], - "Hash": "b0776f526d36d8bd4a3344a88fe165c4" - }, - "labeling": { - "Package": "labeling", - "Version": "0.4.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "graphics", - "stats" - ], - "Hash": "b64ec208ac5bc1852b285f665d6368b3" - }, - "lifecycle": { - "Package": "lifecycle", - "Version": "1.0.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "rlang" - ], - "Hash": "b8552d117e1b808b09a832f589b79035" - }, - "magrittr": { - "Package": "magrittr", - "Version": "2.0.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "8b3b213aa0c54a0dec254288ccb545d1" - }, - "mime": { - "Package": "mime", - "Version": "0.13", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "tools" - ], - "Hash": "0ec19f34c72fab674d8f2b4b1c6410e1" - }, - "noctua": { - "Package": "noctua", - "Version": "2.6.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "DBI", - "R", - "data.table", - "methods", - "paws", - "stats", - "utils", - "uuid" - ], - "Hash": "15471c0eaafcb7f2a4dabc983ea71112" - }, - "openssl": { - "Package": "openssl", - "Version": "2.3.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "askpass" - ], - "Hash": "d5811dade9cd3a34a9038a45f1a59bae" - }, - "openxlsx": { - "Package": "openxlsx", - "Version": "4.2.8", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R", - "Rcpp", - "grDevices", - "methods", - "stats", - "stringi", - "utils", - "zip" - ], - "Hash": "0dae94b258dc5abc4713eacdbbebcb51" - }, - "paws": { - "Package": "paws", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.analytics", - "paws.application.integration", - "paws.common", - "paws.compute", - "paws.cost.management", - "paws.customer.engagement", - "paws.database", - "paws.developer.tools", - "paws.end.user.computing", - "paws.machine.learning", - "paws.management", - "paws.networking", - "paws.security.identity", - "paws.storage" - ], - "Hash": "694342c0b4f1a09ea666861bc140cd46" - }, - "paws.analytics": { - "Package": "paws.analytics", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "3213419b212594e3d5ba31b92522e493" - }, - "paws.application.integration": { - "Package": "paws.application.integration", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "b36a81f2be98e63b209ddebeeea51909" - }, - "paws.common": { - "Package": "paws.common", - "Version": "0.8.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", - "base64enc", - "curl", - "digest", - "httr2", - "jsonlite", - "methods", - "stats", - "utils", - "xml2" - ], - "Hash": "988d9d011a6f6fe5063f0be358047ffb" - }, - "paws.compute": { - "Package": "paws.compute", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "b6f7689860e23aad2722a15790999bc9" - }, - "paws.cost.management": { - "Package": "paws.cost.management", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "cbf7124973cff04a96c5dc75d380ba2a" - }, - "paws.customer.engagement": { - "Package": "paws.customer.engagement", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "f6ffb43e3600734f4407fdb2624a2f8a" - }, - "paws.database": { - "Package": "paws.database", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "aeebf8b9c74940263f873492fd2206f3" - }, - "paws.developer.tools": { - "Package": "paws.developer.tools", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "162420e68b0d68235893e3a85255e08b" - }, - "paws.end.user.computing": { - "Package": "paws.end.user.computing", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "33c2424c8606acae8064af2dc1c2f017" - }, - "paws.machine.learning": { - "Package": "paws.machine.learning", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "925b45f2b6ee221271d8cf25f7a5f1f7" - }, - "paws.management": { - "Package": "paws.management", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "a4720ad47b2f3073370ec0c18de1cbf5" - }, - "paws.networking": { - "Package": "paws.networking", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "da9b0f0c9663cb049be40b4aaf1b9af6" - }, - "paws.security.identity": { - "Package": "paws.security.identity", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "8544aa9e403357d7af332d86126f0b85" - }, - "paws.storage": { - "Package": "paws.storage", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" - ], - "Hash": "e6735db72fe328ce12c044c95cf325cb" - }, - "pillar": { - "Package": "pillar", - "Version": "1.11.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cli", - "glue", - "lifecycle", - "rlang", - "utf8", - "utils", - "vctrs" - ], - "Hash": "1395e64f2689ffd503657778e810cee2" - }, - "pkgconfig": { - "Package": "pkgconfig", - "Version": "2.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "01f28d4278f15c76cddbea05899c5d6f" - }, - "plyr": { - "Package": "plyr", - "Version": "1.8.9", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R", - "Rcpp" - ], - "Hash": "6b8177fd19982f0020743fadbfdbd933" - }, - "png": { - "Package": "png", - "Version": "0.1-8", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "bd54ba8a0a5faded999a7aab6e46b374" - }, - "prettymapr": { - "Package": "prettymapr", - "Version": "0.2.5", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "digest", - "httr", - "plyr", - "rjson" - ], - "Hash": "56a976e191eefe5830dfed35b3f77219" - }, - "prettyunits": { - "Package": "prettyunits", - "Version": "1.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" - }, - "progress": { - "Package": "progress", - "Version": "1.2.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "crayon", - "hms", - "prettyunits" - ], - "Hash": "f4625e061cb2865f111b47ff163a5ca6" - }, - "proxy": { - "Package": "proxy", - "Version": "0.4-27", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R", - "stats", - "utils" - ], - "Hash": "e0ef355c12942cf7a6b91a6cfaea8b3e" - }, - "purrr": { - "Package": "purrr", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "lifecycle", - "magrittr", - "rlang", - "vctrs" - ], - "Hash": "9240cfb47489133f809918a0d3cc60cb" - }, - "rappdirs": { - "Package": "rappdirs", - "Version": "0.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "5e3c5dc0b071b21fa128676560dbe94d" - }, - "readr": { - "Package": "readr", - "Version": "2.1.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", - "clipr", - "cpp11", - "crayon", - "hms", - "lifecycle", - "methods", - "rlang", - "tibble", - "tzdb", - "utils", - "vroom" - ], - "Hash": "9de96463d2117f6ac49980577939dfb3" - }, - "renv": { - "Package": "renv", - "Version": "1.1.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "770fcbc2c4616e8fbcb187cccd46a6b1" - }, - "rjson": { - "Package": "rjson", - "Version": "0.2.23", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R" - ], - "Hash": "7a04e9eff95857dbf557b4e5f0b3d1a8" - }, - "rlang": { - "Package": "rlang", - "Version": "1.1.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "892124978869b74935dc3934c42bfe5a" - }, - "rosm": { - "Package": "rosm", - "Version": "0.3.0", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "curl", - "glue", - "jpeg", - "png", - "progress", - "rlang", - "wk" - ], - "Hash": "fcd529f183c4163a91430d7b7bbaece5" - }, - "s2": { - "Package": "s2", - "Version": "1.1.9", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R", - "Rcpp", - "wk" - ], - "Hash": "4e664a5d610d58f27ec196e96cdb7f6f" - }, - "scales": { - "Package": "scales", - "Version": "1.4.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "RColorBrewer", - "cli", - "farver", - "glue", - "labeling", - "lifecycle", - "rlang", - "viridisLite" - ], - "Hash": "c5bba8f0d1df8c4b9538a40570798d9b" - }, - "sf": { - "Package": "sf", - "Version": "1.0-21", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "DBI", - "R", - "Rcpp", - "classInt", - "grDevices", - "graphics", - "grid", - "magrittr", - "methods", - "s2", - "stats", - "tools", - "units", - "utils" - ], - "Hash": "14a8dae2a678fa953907893a9df561c0" - }, - "stringi": { - "Package": "stringi", - "Version": "1.8.7", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "stats", - "tools", - "utils" - ], - "Hash": "2b56088e23bdd58f89aebf43a0913457" - }, - "stringr": { - "Package": "stringr", - "Version": "1.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "magrittr", - "rlang", - "stringi", - "vctrs" - ], - "Hash": "8f28c568a22dde52d2c8b11958776ac2" - }, - "sys": { - "Package": "sys", - "Version": "3.4.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "de342ebfebdbf40477d0758d05426646" - }, - "tibble": { - "Package": "tibble", - "Version": "3.3.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "lifecycle", - "magrittr", - "methods", - "pillar", - "pkgconfig", - "rlang", - "utils", - "vctrs" - ], - "Hash": "784b27d0801c3829de602105757b2cd7" - }, - "tidyr": { - "Package": "tidyr", - "Version": "1.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "cpp11", - "dplyr", - "glue", - "lifecycle", - "magrittr", - "purrr", - "rlang", - "stringr", - "tibble", - "tidyselect", - "utils", - "vctrs" - ], - "Hash": "915fb7ce036c22a6a33b5a8adb712eb1" - }, - "tidyselect": { - "Package": "tidyselect", - "Version": "1.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "rlang", - "vctrs", - "withr" - ], - "Hash": "829f27b9c4919c16b593794a6344d6c0" - }, - "tzdb": { - "Package": "tzdb", - "Version": "0.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" - ], - "Hash": "09e3961e87b7bafa4a9340bbb34aeda8" - }, - "units": { - "Package": "units", - "Version": "1.0-0", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R", - "Rcpp" - ], - "Hash": "3797c73fd3bde8b1601a4e1bf53557ac" - }, - "utf8": { - "Package": "utf8", - "Version": "1.2.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "d526d558be176e9ceb68c3d1e83479b7" - }, - "uuid": { - "Package": "uuid", - "Version": "1.2-1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "34e965e62a41fcafb1ca60e9b142085b" - }, - "vctrs": { - "Package": "vctrs", - "Version": "0.6.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "rlang" - ], - "Hash": "c03fa420630029418f7e6da3667aac4a" - }, - "viridisLite": { - "Package": "viridisLite", - "Version": "0.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "c826c7c4241b6fc89ff55aaea3fa7491" - }, - "vroom": { - "Package": "vroom", - "Version": "1.6.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bit64", - "cli", - "cpp11", - "crayon", - "glue", - "hms", - "lifecycle", - "methods", - "progress", - "rlang", - "stats", - "tibble", - "tidyselect", - "tzdb", - "vctrs", - "withr" - ], - "Hash": "a9d1c6bf67f15a0d07be840caeaab49a" - }, - "withr": { - "Package": "withr", - "Version": "3.0.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics" - ], - "Hash": "cc2d62c76458d425210d1eb1478b30b4" - }, - "wk": { - "Package": "wk", - "Version": "0.9.4", - "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/latest", - "Requirements": [ - "R" - ], - "Hash": "37be35d733130f1de1ef51672cf7cdc0" - }, - "xml2": { - "Package": "xml2", - "Version": "1.4.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "methods", - "rlang" - ], - "Hash": "3dfd9ffbe221af775cb37f95e7e893ec" - }, - "zip": { - "Package": "zip", - "Version": "2.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "6ebe4b1dc74c3e50e74e316323629583" - } - } -} diff --git a/provisional-ratio-curves/renv/.gitignore b/provisional-ratio-curves/renv/.gitignore deleted file mode 100644 index 0ec0cbb..0000000 --- a/provisional-ratio-curves/renv/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -library/ -local/ -cellar/ -lock/ -python/ -sandbox/ -staging/ diff --git a/provisional-ratio-curves/renv/activate.R b/provisional-ratio-curves/renv/activate.R deleted file mode 100644 index 2753ae5..0000000 --- a/provisional-ratio-curves/renv/activate.R +++ /dev/null @@ -1,1334 +0,0 @@ - -local({ - - # the requested version of renv - version <- "1.1.5" - attr(version, "sha") <- NULL - - # the project directory - project <- Sys.getenv("RENV_PROJECT") - if (!nzchar(project)) - project <- getwd() - - # use start-up diagnostics if enabled - diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE") - if (diagnostics) { - start <- Sys.time() - profile <- tempfile("renv-startup-", fileext = ".Rprof") - utils::Rprof(profile) - on.exit({ - utils::Rprof(NULL) - elapsed <- signif(difftime(Sys.time(), start, units = "auto"), digits = 2L) - writeLines(sprintf("- renv took %s to run the autoloader.", format(elapsed))) - writeLines(sprintf("- Profile: %s", profile)) - print(utils::summaryRprof(profile)) - }, add = TRUE) - } - - # figure out whether the autoloader is enabled - enabled <- local({ - - # first, check config option - override <- getOption("renv.config.autoloader.enabled") - if (!is.null(override)) - return(override) - - # if we're being run in a context where R_LIBS is already set, - # don't load -- presumably we're being run as a sub-process and - # the parent process has already set up library paths for us - rcmd <- Sys.getenv("R_CMD", unset = NA) - rlibs <- Sys.getenv("R_LIBS", unset = NA) - if (!is.na(rlibs) && !is.na(rcmd)) - return(FALSE) - - # next, check environment variables - # prefer using the configuration one in the future - envvars <- c( - "RENV_CONFIG_AUTOLOADER_ENABLED", - "RENV_AUTOLOADER_ENABLED", - "RENV_ACTIVATE_PROJECT" - ) - - for (envvar in envvars) { - envval <- Sys.getenv(envvar, unset = NA) - if (!is.na(envval)) - return(tolower(envval) %in% c("true", "t", "1")) - } - - # enable by default - TRUE - - }) - - # bail if we're not enabled - if (!enabled) { - - # if we're not enabled, we might still need to manually load - # the user profile here - profile <- Sys.getenv("R_PROFILE_USER", unset = "~/.Rprofile") - if (file.exists(profile)) { - cfg <- Sys.getenv("RENV_CONFIG_USER_PROFILE", unset = "TRUE") - if (tolower(cfg) %in% c("true", "t", "1")) - sys.source(profile, envir = globalenv()) - } - - return(FALSE) - - } - - # avoid recursion - if (identical(getOption("renv.autoloader.running"), TRUE)) { - warning("ignoring recursive attempt to run renv autoloader") - return(invisible(TRUE)) - } - - # signal that we're loading renv during R startup - options(renv.autoloader.running = TRUE) - on.exit(options(renv.autoloader.running = NULL), add = TRUE) - - # signal that we've consented to use renv - options(renv.consent = TRUE) - - # load the 'utils' package eagerly -- this ensures that renv shims, which - # mask 'utils' packages, will come first on the search path - library(utils, lib.loc = .Library) - - # unload renv if it's already been loaded - if ("renv" %in% loadedNamespaces()) - unloadNamespace("renv") - - # load bootstrap tools - ansify <- function(text) { - if (renv_ansify_enabled()) - renv_ansify_enhanced(text) - else - renv_ansify_default(text) - } - - renv_ansify_enabled <- function() { - - override <- Sys.getenv("RENV_ANSIFY_ENABLED", unset = NA) - if (!is.na(override)) - return(as.logical(override)) - - pane <- Sys.getenv("RSTUDIO_CHILD_PROCESS_PANE", unset = NA) - if (identical(pane, "build")) - return(FALSE) - - testthat <- Sys.getenv("TESTTHAT", unset = "false") - if (tolower(testthat) %in% "true") - return(FALSE) - - iderun <- Sys.getenv("R_CLI_HAS_HYPERLINK_IDE_RUN", unset = "false") - if (tolower(iderun) %in% "false") - return(FALSE) - - TRUE - - } - - renv_ansify_default <- function(text) { - text - } - - renv_ansify_enhanced <- function(text) { - - # R help links - pattern <- "`\\?(renv::(?:[^`])+)`" - replacement <- "`\033]8;;x-r-help:\\1\a?\\1\033]8;;\a`" - text <- gsub(pattern, replacement, text, perl = TRUE) - - # runnable code - pattern <- "`(renv::(?:[^`])+)`" - replacement <- "`\033]8;;x-r-run:\\1\a\\1\033]8;;\a`" - text <- gsub(pattern, replacement, text, perl = TRUE) - - # return ansified text - text - - } - - renv_ansify_init <- function() { - - envir <- renv_envir_self() - if (renv_ansify_enabled()) - assign("ansify", renv_ansify_enhanced, envir = envir) - else - assign("ansify", renv_ansify_default, envir = envir) - - } - - `%||%` <- function(x, y) { - if (is.null(x)) y else x - } - - catf <- function(fmt, ..., appendLF = TRUE) { - - quiet <- getOption("renv.bootstrap.quiet", default = FALSE) - if (quiet) - return(invisible()) - - msg <- sprintf(fmt, ...) - cat(msg, file = stdout(), sep = if (appendLF) "\n" else "") - - invisible(msg) - - } - - header <- function(label, - ..., - prefix = "#", - suffix = "-", - n = min(getOption("width"), 78)) - { - label <- sprintf(label, ...) - n <- max(n - nchar(label) - nchar(prefix) - 2L, 8L) - if (n <= 0) - return(paste(prefix, label)) - - tail <- paste(rep.int(suffix, n), collapse = "") - paste0(prefix, " ", label, " ", tail) - - } - - heredoc <- function(text, leave = 0) { - - # remove leading, trailing whitespace - trimmed <- gsub("^\\s*\\n|\\n\\s*$", "", text) - - # split into lines - lines <- strsplit(trimmed, "\n", fixed = TRUE)[[1L]] - - # compute common indent - indent <- regexpr("[^[:space:]]", lines) - common <- min(setdiff(indent, -1L)) - leave - text <- paste(substring(lines, common), collapse = "\n") - - # substitute in ANSI links for executable renv code - ansify(text) - - } - - bootstrap <- function(version, library) { - - friendly <- renv_bootstrap_version_friendly(version) - section <- header(sprintf("Bootstrapping renv %s", friendly)) - catf(section) - - # attempt to download renv - catf("- Downloading renv ... ", appendLF = FALSE) - withCallingHandlers( - tarball <- renv_bootstrap_download(version), - error = function(err) { - catf("FAILED") - stop("failed to download:\n", conditionMessage(err)) - } - ) - catf("OK") - on.exit(unlink(tarball), add = TRUE) - - # now attempt to install - catf("- Installing renv ... ", appendLF = FALSE) - withCallingHandlers( - status <- renv_bootstrap_install(version, tarball, library), - error = function(err) { - catf("FAILED") - stop("failed to install:\n", conditionMessage(err)) - } - ) - catf("OK") - - # add empty line to break up bootstrapping from normal output - catf("") - - return(invisible()) - } - - renv_bootstrap_tests_running <- function() { - getOption("renv.tests.running", default = FALSE) - } - - renv_bootstrap_repos <- function() { - - # get CRAN repository - cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") - - # check for repos override - repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) - if (!is.na(repos)) { - - # check for RSPM; if set, use a fallback repository for renv - rspm <- Sys.getenv("RSPM", unset = NA) - if (identical(rspm, repos)) - repos <- c(RSPM = rspm, CRAN = cran) - - return(repos) - - } - - # check for lockfile repositories - repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) - if (!inherits(repos, "error") && length(repos)) - return(repos) - - # retrieve current repos - repos <- getOption("repos") - - # ensure @CRAN@ entries are resolved - repos[repos == "@CRAN@"] <- cran - - # add in renv.bootstrap.repos if set - default <- c(FALLBACK = "https://cloud.r-project.org") - extra <- getOption("renv.bootstrap.repos", default = default) - repos <- c(repos, extra) - - # remove duplicates that might've snuck in - dupes <- duplicated(repos) | duplicated(names(repos)) - repos[!dupes] - - } - - renv_bootstrap_repos_lockfile <- function() { - - lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") - if (!file.exists(lockpath)) - return(NULL) - - lockfile <- tryCatch(renv_json_read(lockpath), error = identity) - if (inherits(lockfile, "error")) { - warning(lockfile) - return(NULL) - } - - repos <- lockfile$R$Repositories - if (length(repos) == 0) - return(NULL) - - keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) - vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) - names(vals) <- keys - - return(vals) - - } - - renv_bootstrap_download <- function(version) { - - sha <- attr(version, "sha", exact = TRUE) - - methods <- if (!is.null(sha)) { - - # attempting to bootstrap a development version of renv - c( - function() renv_bootstrap_download_tarball(sha), - function() renv_bootstrap_download_github(sha) - ) - - } else { - - # attempting to bootstrap a release version of renv - c( - function() renv_bootstrap_download_tarball(version), - function() renv_bootstrap_download_cran_latest(version), - function() renv_bootstrap_download_cran_archive(version) - ) - - } - - for (method in methods) { - path <- tryCatch(method(), error = identity) - if (is.character(path) && file.exists(path)) - return(path) - } - - stop("All download methods failed") - - } - - renv_bootstrap_download_impl <- function(url, destfile) { - - mode <- "wb" - - # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715 - fixup <- - Sys.info()[["sysname"]] == "Windows" && - substring(url, 1L, 5L) == "file:" - - if (fixup) - mode <- "w+b" - - args <- list( - url = url, - destfile = destfile, - mode = mode, - quiet = TRUE - ) - - if ("headers" %in% names(formals(utils::download.file))) { - headers <- renv_bootstrap_download_custom_headers(url) - if (length(headers) && is.character(headers)) - args$headers <- headers - } - - do.call(utils::download.file, args) - - } - - renv_bootstrap_download_custom_headers <- function(url) { - - headers <- getOption("renv.download.headers") - if (is.null(headers)) - return(character()) - - if (!is.function(headers)) - stopf("'renv.download.headers' is not a function") - - headers <- headers(url) - if (length(headers) == 0L) - return(character()) - - if (is.list(headers)) - headers <- unlist(headers, recursive = FALSE, use.names = TRUE) - - ok <- - is.character(headers) && - is.character(names(headers)) && - all(nzchar(names(headers))) - - if (!ok) - stop("invocation of 'renv.download.headers' did not return a named character vector") - - headers - - } - - renv_bootstrap_download_cran_latest <- function(version) { - - spec <- renv_bootstrap_download_cran_latest_find(version) - type <- spec$type - repos <- spec$repos - - baseurl <- utils::contrib.url(repos = repos, type = type) - ext <- if (identical(type, "source")) - ".tar.gz" - else if (Sys.info()[["sysname"]] == "Windows") - ".zip" - else - ".tgz" - name <- sprintf("renv_%s%s", version, ext) - url <- paste(baseurl, name, sep = "/") - - destfile <- file.path(tempdir(), name) - status <- tryCatch( - renv_bootstrap_download_impl(url, destfile), - condition = identity - ) - - if (inherits(status, "condition")) - return(FALSE) - - # report success and return - destfile - - } - - renv_bootstrap_download_cran_latest_find <- function(version) { - - # check whether binaries are supported on this system - binary <- - getOption("renv.bootstrap.binary", default = TRUE) && - !identical(.Platform$pkgType, "source") && - !identical(getOption("pkgType"), "source") && - Sys.info()[["sysname"]] %in% c("Darwin", "Windows") - - types <- c(if (binary) "binary", "source") - - # iterate over types + repositories - for (type in types) { - for (repos in renv_bootstrap_repos()) { - - # build arguments for utils::available.packages() call - args <- list(type = type, repos = repos) - - # add custom headers if available -- note that - # utils::available.packages() will pass this to download.file() - if ("headers" %in% names(formals(utils::download.file))) { - headers <- renv_bootstrap_download_custom_headers(repos) - if (length(headers) && is.character(headers)) - args$headers <- headers - } - - # retrieve package database - db <- tryCatch( - as.data.frame( - do.call(utils::available.packages, args), - stringsAsFactors = FALSE - ), - error = identity - ) - - if (inherits(db, "error")) - next - - # check for compatible entry - entry <- db[db$Package %in% "renv" & db$Version %in% version, ] - if (nrow(entry) == 0) - next - - # found it; return spec to caller - spec <- list(entry = entry, type = type, repos = repos) - return(spec) - - } - } - - # if we got here, we failed to find renv - fmt <- "renv %s is not available from your declared package repositories" - stop(sprintf(fmt, version)) - - } - - renv_bootstrap_download_cran_archive <- function(version) { - - name <- sprintf("renv_%s.tar.gz", version) - repos <- renv_bootstrap_repos() - urls <- file.path(repos, "src/contrib/Archive/renv", name) - destfile <- file.path(tempdir(), name) - - for (url in urls) { - - status <- tryCatch( - renv_bootstrap_download_impl(url, destfile), - condition = identity - ) - - if (identical(status, 0L)) - return(destfile) - - } - - return(FALSE) - - } - - renv_bootstrap_download_tarball <- function(version) { - - # if the user has provided the path to a tarball via - # an environment variable, then use it - tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) - if (is.na(tarball)) - return() - - # allow directories - if (dir.exists(tarball)) { - name <- sprintf("renv_%s.tar.gz", version) - tarball <- file.path(tarball, name) - } - - # bail if it doesn't exist - if (!file.exists(tarball)) { - - # let the user know we weren't able to honour their request - fmt <- "- RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." - msg <- sprintf(fmt, tarball) - warning(msg) - - # bail - return() - - } - - catf("- Using local tarball '%s'.", tarball) - tarball - - } - - renv_bootstrap_github_token <- function() { - for (envvar in c("GITHUB_TOKEN", "GITHUB_PAT", "GH_TOKEN")) { - envval <- Sys.getenv(envvar, unset = NA) - if (!is.na(envval)) - return(envval) - } - } - - renv_bootstrap_download_github <- function(version) { - - enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") - if (!identical(enabled, "TRUE")) - return(FALSE) - - # prepare download options - token <- renv_bootstrap_github_token() - if (is.null(token)) - token <- "" - - if (nzchar(Sys.which("curl")) && nzchar(token)) { - fmt <- "--location --fail --header \"Authorization: token %s\"" - extra <- sprintf(fmt, token) - saved <- options("download.file.method", "download.file.extra") - options(download.file.method = "curl", download.file.extra = extra) - on.exit(do.call(base::options, saved), add = TRUE) - } else if (nzchar(Sys.which("wget")) && nzchar(token)) { - fmt <- "--header=\"Authorization: token %s\"" - extra <- sprintf(fmt, token) - saved <- options("download.file.method", "download.file.extra") - options(download.file.method = "wget", download.file.extra = extra) - on.exit(do.call(base::options, saved), add = TRUE) - } - - url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) - name <- sprintf("renv_%s.tar.gz", version) - destfile <- file.path(tempdir(), name) - - status <- tryCatch( - renv_bootstrap_download_impl(url, destfile), - condition = identity - ) - - if (!identical(status, 0L)) - return(FALSE) - - renv_bootstrap_download_augment(destfile) - - return(destfile) - - } - - # Add Sha to DESCRIPTION. This is stop gap until #890, after which we - # can use renv::install() to fully capture metadata. - renv_bootstrap_download_augment <- function(destfile) { - sha <- renv_bootstrap_git_extract_sha1_tar(destfile) - if (is.null(sha)) { - return() - } - - # Untar - tempdir <- tempfile("renv-github-") - on.exit(unlink(tempdir, recursive = TRUE), add = TRUE) - untar(destfile, exdir = tempdir) - pkgdir <- dir(tempdir, full.names = TRUE)[[1]] - - # Modify description - desc_path <- file.path(pkgdir, "DESCRIPTION") - desc_lines <- readLines(desc_path) - remotes_fields <- c( - "RemoteType: github", - "RemoteHost: api.github.com", - "RemoteRepo: renv", - "RemoteUsername: rstudio", - "RemotePkgRef: rstudio/renv", - paste("RemoteRef: ", sha), - paste("RemoteSha: ", sha) - ) - writeLines(c(desc_lines[desc_lines != ""], remotes_fields), con = desc_path) - - # Re-tar - local({ - old <- setwd(tempdir) - on.exit(setwd(old), add = TRUE) - - tar(destfile, compression = "gzip") - }) - invisible() - } - - # Extract the commit hash from a git archive. Git archives include the SHA1 - # hash as the comment field of the tarball pax extended header - # (see https://www.kernel.org/pub/software/scm/git/docs/git-archive.html) - # For GitHub archives this should be the first header after the default one - # (512 byte) header. - renv_bootstrap_git_extract_sha1_tar <- function(bundle) { - - # open the bundle for reading - # We use gzcon for everything because (from ?gzcon) - # > Reading from a connection which does not supply a 'gzip' magic - # > header is equivalent to reading from the original connection - conn <- gzcon(file(bundle, open = "rb", raw = TRUE)) - on.exit(close(conn)) - - # The default pax header is 512 bytes long and the first pax extended header - # with the comment should be 51 bytes long - # `52 comment=` (11 chars) + 40 byte SHA1 hash - len <- 0x200 + 0x33 - res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len]) - - if (grepl("^52 comment=", res)) { - sub("52 comment=", "", res) - } else { - NULL - } - } - - renv_bootstrap_install <- function(version, tarball, library) { - - # attempt to install it into project library - dir.create(library, showWarnings = FALSE, recursive = TRUE) - output <- renv_bootstrap_install_impl(library, tarball) - - # check for successful install - status <- attr(output, "status") - if (is.null(status) || identical(status, 0L)) - return(status) - - # an error occurred; report it - header <- "installation of renv failed" - lines <- paste(rep.int("=", nchar(header)), collapse = "") - text <- paste(c(header, lines, output), collapse = "\n") - stop(text) - - } - - renv_bootstrap_install_impl <- function(library, tarball) { - - # invoke using system2 so we can capture and report output - bin <- R.home("bin") - exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" - R <- file.path(bin, exe) - - args <- c( - "--vanilla", "CMD", "INSTALL", "--no-multiarch", - "-l", shQuote(path.expand(library)), - shQuote(path.expand(tarball)) - ) - - system2(R, args, stdout = TRUE, stderr = TRUE) - - } - - renv_bootstrap_platform_prefix_default <- function() { - - # read version component - version <- Sys.getenv("RENV_PATHS_VERSION", unset = "R-%v") - - # expand placeholders - placeholders <- list( - list("%v", format(getRversion()[1, 1:2])), - list("%V", format(getRversion()[1, 1:3])) - ) - - for (placeholder in placeholders) - version <- gsub(placeholder[[1L]], placeholder[[2L]], version, fixed = TRUE) - - # include SVN revision for development versions of R - # (to avoid sharing platform-specific artefacts with released versions of R) - devel <- - identical(R.version[["status"]], "Under development (unstable)") || - identical(R.version[["nickname"]], "Unsuffered Consequences") - - if (devel) - version <- paste(version, R.version[["svn rev"]], sep = "-r") - - version - - } - - renv_bootstrap_platform_prefix <- function() { - - # construct version prefix - version <- renv_bootstrap_platform_prefix_default() - - # build list of path components - components <- c(version, R.version$platform) - - # include prefix if provided by user - prefix <- renv_bootstrap_platform_prefix_impl() - if (!is.na(prefix) && nzchar(prefix)) - components <- c(prefix, components) - - # build prefix - paste(components, collapse = "/") - - } - - renv_bootstrap_platform_prefix_impl <- function() { - - # if an explicit prefix has been supplied, use it - prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA) - if (!is.na(prefix)) - return(prefix) - - # if the user has requested an automatic prefix, generate it - auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) - if (is.na(auto) && getRversion() >= "4.4.0") - auto <- "TRUE" - - if (auto %in% c("TRUE", "True", "true", "1")) - return(renv_bootstrap_platform_prefix_auto()) - - # empty string on failure - "" - - } - - renv_bootstrap_platform_prefix_auto <- function() { - - prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity) - if (inherits(prefix, "error") || prefix %in% "unknown") { - - msg <- paste( - "failed to infer current operating system", - "please file a bug report at https://github.com/rstudio/renv/issues", - sep = "; " - ) - - warning(msg) - - } - - prefix - - } - - renv_bootstrap_platform_os <- function() { - - sysinfo <- Sys.info() - sysname <- sysinfo[["sysname"]] - - # handle Windows + macOS up front - if (sysname == "Windows") - return("windows") - else if (sysname == "Darwin") - return("macos") - - # check for os-release files - for (file in c("/etc/os-release", "/usr/lib/os-release")) - if (file.exists(file)) - return(renv_bootstrap_platform_os_via_os_release(file, sysinfo)) - - # check for redhat-release files - if (file.exists("/etc/redhat-release")) - return(renv_bootstrap_platform_os_via_redhat_release()) - - "unknown" - - } - - renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) { - - # read /etc/os-release - release <- utils::read.table( - file = file, - sep = "=", - quote = c("\"", "'"), - col.names = c("Key", "Value"), - comment.char = "#", - stringsAsFactors = FALSE - ) - - vars <- as.list(release$Value) - names(vars) <- release$Key - - # get os name - os <- tolower(sysinfo[["sysname"]]) - - # read id - id <- "unknown" - for (field in c("ID", "ID_LIKE")) { - if (field %in% names(vars) && nzchar(vars[[field]])) { - id <- vars[[field]] - break - } - } - - # read version - version <- "unknown" - for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) { - if (field %in% names(vars) && nzchar(vars[[field]])) { - version <- vars[[field]] - break - } - } - - # join together - paste(c(os, id, version), collapse = "-") - - } - - renv_bootstrap_platform_os_via_redhat_release <- function() { - - # read /etc/redhat-release - contents <- readLines("/etc/redhat-release", warn = FALSE) - - # infer id - id <- if (grepl("centos", contents, ignore.case = TRUE)) - "centos" - else if (grepl("redhat", contents, ignore.case = TRUE)) - "redhat" - else - "unknown" - - # try to find a version component (very hacky) - version <- "unknown" - - parts <- strsplit(contents, "[[:space:]]")[[1L]] - for (part in parts) { - - nv <- tryCatch(numeric_version(part), error = identity) - if (inherits(nv, "error")) - next - - version <- nv[1, 1] - break - - } - - paste(c("linux", id, version), collapse = "-") - - } - - renv_bootstrap_library_root_name <- function(project) { - - # use project name as-is if requested - asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE") - if (asis) - return(basename(project)) - - # otherwise, disambiguate based on project's path - id <- substring(renv_bootstrap_hash_text(project), 1L, 8L) - paste(basename(project), id, sep = "-") - - } - - renv_bootstrap_library_root <- function(project) { - - prefix <- renv_bootstrap_profile_prefix() - - path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) - if (!is.na(path)) - return(paste(c(path, prefix), collapse = "/")) - - path <- renv_bootstrap_library_root_impl(project) - if (!is.null(path)) { - name <- renv_bootstrap_library_root_name(project) - return(paste(c(path, prefix, name), collapse = "/")) - } - - renv_bootstrap_paths_renv("library", project = project) - - } - - renv_bootstrap_library_root_impl <- function(project) { - - root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) - if (!is.na(root)) - return(root) - - type <- renv_bootstrap_project_type(project) - if (identical(type, "package")) { - userdir <- renv_bootstrap_user_dir() - return(file.path(userdir, "library")) - } - - } - - renv_bootstrap_validate_version <- function(version, description = NULL) { - - # resolve description file - # - # avoid passing lib.loc to `packageDescription()` below, since R will - # use the loaded version of the package by default anyhow. note that - # this function should only be called after 'renv' is loaded - # https://github.com/rstudio/renv/issues/1625 - description <- description %||% packageDescription("renv") - - # check whether requested version 'version' matches loaded version of renv - sha <- attr(version, "sha", exact = TRUE) - valid <- if (!is.null(sha)) - renv_bootstrap_validate_version_dev(sha, description) - else - renv_bootstrap_validate_version_release(version, description) - - if (valid) - return(TRUE) - - # the loaded version of renv doesn't match the requested version; - # give the user instructions on how to proceed - dev <- identical(description[["RemoteType"]], "github") - remote <- if (dev) - paste("rstudio/renv", description[["RemoteSha"]], sep = "@") - else - paste("renv", description[["Version"]], sep = "@") - - # display both loaded version + sha if available - friendly <- renv_bootstrap_version_friendly( - version = description[["Version"]], - sha = if (dev) description[["RemoteSha"]] - ) - - fmt <- heredoc(" - renv %1$s was loaded from project library, but this project is configured to use renv %2$s. - - Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile. - - Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library. - ") - catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) - - FALSE - - } - - renv_bootstrap_validate_version_dev <- function(version, description) { - - expected <- description[["RemoteSha"]] - if (!is.character(expected)) - return(FALSE) - - pattern <- sprintf("^\\Q%s\\E", version) - grepl(pattern, expected, perl = TRUE) - - } - - renv_bootstrap_validate_version_release <- function(version, description) { - expected <- description[["Version"]] - is.character(expected) && identical(expected, version) - } - - renv_bootstrap_hash_text <- function(text) { - - hashfile <- tempfile("renv-hash-") - on.exit(unlink(hashfile), add = TRUE) - - writeLines(text, con = hashfile) - tools::md5sum(hashfile) - - } - - renv_bootstrap_load <- function(project, libpath, version) { - - # try to load renv from the project library - if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) - return(FALSE) - - # warn if the version of renv loaded does not match - renv_bootstrap_validate_version(version) - - # execute renv load hooks, if any - hooks <- getHook("renv::autoload") - for (hook in hooks) - if (is.function(hook)) - tryCatch(hook(), error = warnify) - - # load the project - renv::load(project) - - TRUE - - } - - renv_bootstrap_profile_load <- function(project) { - - # if RENV_PROFILE is already set, just use that - profile <- Sys.getenv("RENV_PROFILE", unset = NA) - if (!is.na(profile) && nzchar(profile)) - return(profile) - - # check for a profile file (nothing to do if it doesn't exist) - path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) - if (!file.exists(path)) - return(NULL) - - # read the profile, and set it if it exists - contents <- readLines(path, warn = FALSE) - if (length(contents) == 0L) - return(NULL) - - # set RENV_PROFILE - profile <- contents[[1L]] - if (!profile %in% c("", "default")) - Sys.setenv(RENV_PROFILE = profile) - - profile - - } - - renv_bootstrap_profile_prefix <- function() { - profile <- renv_bootstrap_profile_get() - if (!is.null(profile)) - return(file.path("profiles", profile, "renv")) - } - - renv_bootstrap_profile_get <- function() { - profile <- Sys.getenv("RENV_PROFILE", unset = "") - renv_bootstrap_profile_normalize(profile) - } - - renv_bootstrap_profile_set <- function(profile) { - profile <- renv_bootstrap_profile_normalize(profile) - if (is.null(profile)) - Sys.unsetenv("RENV_PROFILE") - else - Sys.setenv(RENV_PROFILE = profile) - } - - renv_bootstrap_profile_normalize <- function(profile) { - - if (is.null(profile) || profile %in% c("", "default")) - return(NULL) - - profile - - } - - renv_bootstrap_path_absolute <- function(path) { - - substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( - substr(path, 1L, 1L) %in% c(letters, LETTERS) && - substr(path, 2L, 3L) %in% c(":/", ":\\") - ) - - } - - renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { - renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") - root <- if (renv_bootstrap_path_absolute(renv)) NULL else project - prefix <- if (profile) renv_bootstrap_profile_prefix() - components <- c(root, renv, prefix, ...) - paste(components, collapse = "/") - } - - renv_bootstrap_project_type <- function(path) { - - descpath <- file.path(path, "DESCRIPTION") - if (!file.exists(descpath)) - return("unknown") - - desc <- tryCatch( - read.dcf(descpath, all = TRUE), - error = identity - ) - - if (inherits(desc, "error")) - return("unknown") - - type <- desc$Type - if (!is.null(type)) - return(tolower(type)) - - package <- desc$Package - if (!is.null(package)) - return("package") - - "unknown" - - } - - renv_bootstrap_user_dir <- function() { - dir <- renv_bootstrap_user_dir_impl() - path.expand(chartr("\\", "/", dir)) - } - - renv_bootstrap_user_dir_impl <- function() { - - # use local override if set - override <- getOption("renv.userdir.override") - if (!is.null(override)) - return(override) - - # use R_user_dir if available - tools <- asNamespace("tools") - if (is.function(tools$R_user_dir)) - return(tools$R_user_dir("renv", "cache")) - - # try using our own backfill for older versions of R - envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") - for (envvar in envvars) { - root <- Sys.getenv(envvar, unset = NA) - if (!is.na(root)) - return(file.path(root, "R/renv")) - } - - # use platform-specific default fallbacks - if (Sys.info()[["sysname"]] == "Windows") - file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") - else if (Sys.info()[["sysname"]] == "Darwin") - "~/Library/Caches/org.R-project.R/R/renv" - else - "~/.cache/R/renv" - - } - - renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) { - sha <- sha %||% attr(version, "sha", exact = TRUE) - parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L))) - paste(parts, collapse = "") - } - - renv_bootstrap_exec <- function(project, libpath, version) { - if (!renv_bootstrap_load(project, libpath, version)) - renv_bootstrap_run(project, libpath, version) - } - - renv_bootstrap_run <- function(project, libpath, version) { - - # perform bootstrap - bootstrap(version, libpath) - - # exit early if we're just testing bootstrap - if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) - return(TRUE) - - # try again to load - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - return(renv::load(project = project)) - } - - # failed to download or load renv; warn the user - msg <- c( - "Failed to find an renv installation: the project will not be loaded.", - "Use `renv::activate()` to re-initialize the project." - ) - - warning(paste(msg, collapse = "\n"), call. = FALSE) - - } - - renv_json_read <- function(file = NULL, text = NULL) { - - jlerr <- NULL - - # if jsonlite is loaded, use that instead - if ("jsonlite" %in% loadedNamespaces()) { - - json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) - if (!inherits(json, "error")) - return(json) - - jlerr <- json - - } - - # otherwise, fall back to the default JSON reader - json <- tryCatch(renv_json_read_default(file, text), error = identity) - if (!inherits(json, "error")) - return(json) - - # report an error - if (!is.null(jlerr)) - stop(jlerr) - else - stop(json) - - } - - renv_json_read_jsonlite <- function(file = NULL, text = NULL) { - text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") - jsonlite::fromJSON(txt = text, simplifyVector = FALSE) - } - - renv_json_read_patterns <- function() { - - list( - - # objects - list("{", "\t\n\tobject(\t\n\t", TRUE), - list("}", "\t\n\t)\t\n\t", TRUE), - - # arrays - list("[", "\t\n\tarray(\t\n\t", TRUE), - list("]", "\n\t\n)\n\t\n", TRUE), - - # maps - list(":", "\t\n\t=\t\n\t", TRUE), - - # newlines - list("\\u000a", "\n", FALSE) - - ) - - } - - renv_json_read_envir <- function() { - - envir <- new.env(parent = emptyenv()) - - envir[["+"]] <- `+` - envir[["-"]] <- `-` - - envir[["object"]] <- function(...) { - result <- list(...) - names(result) <- as.character(names(result)) - result - } - - envir[["array"]] <- list - - envir[["true"]] <- TRUE - envir[["false"]] <- FALSE - envir[["null"]] <- NULL - - envir - - } - - renv_json_read_remap <- function(object, patterns) { - - # repair names if necessary - if (!is.null(names(object))) { - - nms <- names(object) - for (pattern in patterns) - nms <- gsub(pattern[[2L]], pattern[[1L]], nms, fixed = TRUE) - names(object) <- nms - - } - - # repair strings if necessary - if (is.character(object)) { - for (pattern in patterns) - object <- gsub(pattern[[2L]], pattern[[1L]], object, fixed = TRUE) - } - - # recurse for other objects - if (is.recursive(object)) - for (i in seq_along(object)) - object[i] <- list(renv_json_read_remap(object[[i]], patterns)) - - # return remapped object - object - - } - - renv_json_read_default <- function(file = NULL, text = NULL) { - - # read json text - text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") - - # convert into something the R parser will understand - patterns <- renv_json_read_patterns() - transformed <- text - for (pattern in patterns) - transformed <- gsub(pattern[[1L]], pattern[[2L]], transformed, fixed = TRUE) - - # parse it - rfile <- tempfile("renv-json-", fileext = ".R") - on.exit(unlink(rfile), add = TRUE) - writeLines(transformed, con = rfile) - json <- parse(rfile, keep.source = FALSE, srcfile = NULL)[[1L]] - - # evaluate in safe environment - result <- eval(json, envir = renv_json_read_envir()) - - # fix up strings if necessary -- do so only with reversible patterns - patterns <- Filter(function(pattern) pattern[[3L]], patterns) - renv_json_read_remap(result, patterns) - - } - - - # load the renv profile, if any - renv_bootstrap_profile_load(project) - - # construct path to library root - root <- renv_bootstrap_library_root(project) - - # construct library prefix for platform - prefix <- renv_bootstrap_platform_prefix() - - # construct full libpath - libpath <- file.path(root, prefix) - - # run bootstrap code - renv_bootstrap_exec(project, libpath, version) - - invisible() - -}) From 8a7d608f522783acd8cc0007a1fec8239c4a2825 Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Mon, 19 Oct 2026 20:28:34 +0000 Subject: [PATCH 43/46] update the references to provisional-ratio-curves --- ratio-analysis/render_all_files.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index 4269fa7..fee7b01 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -1,6 +1,6 @@ # This file runs the ratio_analysis.qmd report for all files # stored in the O drive in -# O:/CCAODATA/recurring-data-requests/provisional-ratio-curves/. Since +# O:/CCAODATA/recurring-data-requests/ratio_analysis/. Since # that isn't accessible from the server they need to be copied locally or run # from a local machine. They MUST be named according to the current naming # scheme, and there must be PIN and Desk Review Value columns @@ -28,7 +28,7 @@ library(scales) library(sf) library(tidyr) -data_path <- "O:/CCAODATA/recurring-data-requests/provisional-ratio-curves" +data_path <- "O:/CCAODATA/recurring-data-requests/ratio_analysis" year <- Sys.getenv("ANALYSIS_YEAR") if (!nzchar(year)) { stop("ANALYSIS_YEAR is not set. Add it to .Renviron and restart R.") From cb0285ec3fd2f1366bc6d67c756e3d4a7b0a209f Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Mon, 19 Oct 2026 20:36:45 +0000 Subject: [PATCH 44/46] add data path --- ratio-analysis/render_all_files.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index fee7b01..e8c8067 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -33,7 +33,7 @@ year <- Sys.getenv("ANALYSIS_YEAR") if (!nzchar(year)) { stop("ANALYSIS_YEAR is not set. Add it to .Renviron and restart R.") } -input_path <- file.path("input", year) +input_path <- file.path(data_path, "input", year) output_path <- file.path("output", year) input_files <- list.files(input_path, pattern = "\\.xlsx$", full.names = TRUE) From 50bd7dd4a3378f5df774554de97658ff6918239f Mon Sep 17 00:00:00 2001 From: Damonamajor Date: Sun, 25 Oct 2026 18:54:14 +0000 Subject: [PATCH 45/46] Add data path to output --- ratio-analysis/render_all_files.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ratio-analysis/render_all_files.R b/ratio-analysis/render_all_files.R index e8c8067..9d234af 100644 --- a/ratio-analysis/render_all_files.R +++ b/ratio-analysis/render_all_files.R @@ -34,7 +34,7 @@ if (!nzchar(year)) { stop("ANALYSIS_YEAR is not set. Add it to .Renviron and restart R.") } input_path <- file.path(data_path, "input", year) -output_path <- file.path("output", year) +output_path <- file.path(data_path, "output", year) input_files <- list.files(input_path, pattern = "\\.xlsx$", full.names = TRUE) # This is a test to make sure that the township number is valid From 0f32ded260e0e4bf2dc4f69c0e1ea66cb7f5b075 Mon Sep 17 00:00:00 2001 From: damonamajor Date: Thu, 29 Oct 2026 15:10:07 -0500 Subject: [PATCH 46/46] update renv --- ratio-analysis/renv.lock | 4302 ++++++++++++++++++++++++++++++++------ 1 file changed, 3608 insertions(+), 694 deletions(-) diff --git a/ratio-analysis/renv.lock b/ratio-analysis/renv.lock index 73d3445..34be9b4 100644 --- a/ratio-analysis/renv.lock +++ b/ratio-analysis/renv.lock @@ -1,6 +1,6 @@ { "R": { - "Version": "4.6.1", + "Version": "4.5.1", "Repositories": [ { "Name": "CRAN", @@ -13,1105 +13,3057 @@ "Package": "DBI", "Version": "1.3.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" + "Title": "R Database Interface", + "Date": "2026-02-11", + "Authors@R": "c( person(\"R Special Interest Group on Databases (R-SIG-DB)\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"R Consortium\", role = \"fnd\") )", + "Description": "A database interface definition for communication between R and relational database management systems. All classes in this package are virtual and need to be extended by the various R/DBMS implementations.", + "License": "LGPL (>= 2.1)", + "URL": "https://dbi.r-dbi.org, https://github.com/r-dbi/DBI", + "BugReports": "https://github.com/r-dbi/DBI/issues", + "Depends": [ + "methods", + "R (>= 3.0.0)" + ], + "Suggests": [ + "arrow", + "blob", + "callr", + "covr", + "DBItest (>= 1.8.2)", + "dbplyr", + "downlit", + "dplyr", + "glue", + "hms", + "knitr", + "magrittr", + "nanoarrow (>= 0.3.0.1)", + "otel", + "otelsdk", + "RMariaDB", + "rmarkdown", + "rprojroot", + "RSQLite (>= 1.1-2)", + "testthat (>= 3.0.0)", + "vctrs", + "xml2" ], - "Hash": "dbfa2adb83f8063640982459e153f650" + "VignetteBuilder": "knitr", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/Needs/check": "r-dbi/DBItest", + "Config/Needs/website": "r-dbi/DBItest, r-dbi/dbitemplate, adbi, AzureKusto, bigrquery, DatabaseConnector, dittodb, duckdb, implyr, lazysf, odbc, pool, RAthena, IMSMWU/RClickhouse, RH2, RJDBC, RMariaDB, RMySQL, RPostgres, RPostgreSQL, RPresto, RSQLite, sergeant, sparklyr, withr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "no", + "Author": "R Special Interest Group on Databases (R-SIG-DB) [aut], Hadley Wickham [aut], Kirill Müller [aut, cre] (ORCID: ), R Consortium [fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "KernSmooth": { "Package": "KernSmooth", "Version": "2.23-26", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Priority": "recommended", + "Date": "2024-12-10", + "Title": "Functions for Kernel Smoothing Supporting Wand & Jones (1995)", + "Authors@R": "c(person(\"Matt\", \"Wand\", role = \"aut\", email = \"Matt.Wand@uts.edu.au\"), person(\"Cleve\", \"Moler\", role = \"ctb\", comment = \"LINPACK routines in src/d*\"), person(\"Brian\", \"Ripley\", role = c(\"trl\", \"cre\", \"ctb\"), email = \"Brian.Ripley@R-project.org\", comment = \"R port and updates\"))", + "Note": "Maintainers are not available to give advice on using a package they did not author.", + "Depends": [ + "R (>= 2.5.0)", "stats" ], - "Hash": "2fb39782c07b5ad422b0448ae83f64c4" + "Suggests": [ + "MASS", + "carData" + ], + "Description": "Functions for kernel smoothing (and density estimation) corresponding to the book: Wand, M.P. and Jones, M.C. (1995) \"Kernel Smoothing\".", + "License": "Unlimited", + "ByteCompile": "yes", + "NeedsCompilation": "yes", + "Author": "Matt Wand [aut], Cleve Moler [ctb] (LINPACK routines in src/d*), Brian Ripley [trl, cre, ctb] (R port and updates)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "MASS": { "Package": "MASS", "Version": "7.3-65", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Priority": "recommended", + "Date": "2025-02-19", + "Revision": "$Rev: 3681 $", + "Depends": [ + "R (>= 4.4.0)", "grDevices", "graphics", - "methods", "stats", "utils" ], - "Hash": "a41d0fc833ea756a1136b60a437efe26" + "Imports": [ + "methods" + ], + "Suggests": [ + "lattice", + "nlme", + "nnet", + "survival" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Brian.Ripley@R-project.org\"), person(\"Bill\", \"Venables\", role = c(\"aut\", \"cph\")), person(c(\"Douglas\", \"M.\"), \"Bates\", role = \"ctb\"), person(\"Kurt\", \"Hornik\", role = \"trl\", comment = \"partial port ca 1998\"), person(\"Albrecht\", \"Gebhardt\", role = \"trl\", comment = \"partial port ca 1998\"), person(\"David\", \"Firth\", role = \"ctb\", comment = \"support functions for polr\"))", + "Description": "Functions and datasets to support Venables and Ripley, \"Modern Applied Statistics with S\" (4th edition, 2002).", + "Title": "Support Functions and Datasets for Venables and Ripley's MASS", + "LazyData": "yes", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "Contact": "", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], Bill Venables [aut, cph], Douglas M. Bates [ctb], Kurt Hornik [trl] (partial port ca 1998), Albrecht Gebhardt [trl] (partial port ca 1998), David Firth [ctb] (support functions for polr)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "R6": { "Package": "R6", "Version": "2.6.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Encapsulated Classes with Reference Semantics", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Creates classes with reference semantics, similar to R's built-in reference classes. Compared to reference classes, R6 classes are simpler and lighter-weight, and they are not built on S4 classes so they do not require the methods package. These classes allow public and private members, and they support inheritance, even when the classes are defined in different packages.", + "License": "MIT + file LICENSE", + "URL": "https://r6.r-lib.org, https://github.com/r-lib/R6", + "BugReports": "https://github.com/r-lib/R6/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Suggests": [ + "lobstr", + "testthat (>= 3.0.0)" ], - "Hash": "d4335fe7207f1c01ab8c41762f5840d4" + "Config/Needs/website": "tidyverse/tidytemplate, ggplot2, microbenchmark, scales", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "RColorBrewer": { "Package": "RColorBrewer", "Version": "1.1-3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Date": "2022-04-03", + "Title": "ColorBrewer Palettes", + "Authors@R": "c(person(given = \"Erich\", family = \"Neuwirth\", role = c(\"aut\", \"cre\"), email = \"erich.neuwirth@univie.ac.at\"))", + "Author": "Erich Neuwirth [aut, cre]", + "Maintainer": "Erich Neuwirth ", + "Depends": [ + "R (>= 2.0.0)" ], - "Hash": "45f0398006e83a5b10b72a90663d8d8c" + "Description": "Provides color schemes for maps (and other graphics) designed by Cynthia Brewer as described at http://colorbrewer2.org.", + "License": "Apache License 2.0", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "Rcpp": { "Package": "Rcpp", "Version": "1.1.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Seamless R and C++ Integration", + "Date": "2026-07-01", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"JJ\", \"Allaire\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Kevin\", \"Ushey\", role = \"aut\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Qiang\", \"Kou\", role = \"aut\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Nathan\", \"Russell\", role = \"aut\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"John\", \"Chambers\", role = \"aut\"))", + "Description": "The 'Rcpp' package provides R functions as well as C++ classes which offer a seamless integration of R and C++. Many R data types and objects can be mapped back and forth to C++ equivalents which facilitates both writing of new code as well as easier integration of third-party libraries. Documentation about 'Rcpp' is provided by several vignettes included in this package, via the 'Rcpp Gallery' site at , the paper by Eddelbuettel and Francois (2011, ), the book by Eddelbuettel (2013, ) and the paper by Eddelbuettel and Balamuta (2018, ); see 'citation(\"Rcpp\")' for details.", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "methods", "utils" ], - "Hash": "f481f89daa906a34eab8ef8658c8a89c" + "Suggests": [ + "tinytest", + "inline", + "rbenchmark", + "pkgKitten (>= 0.1.2)" + ], + "URL": "https://www.rcpp.org, https://dirk.eddelbuettel.com/code/rcpp.html, https://github.com/RcppCore/Rcpp", + "License": "GPL (>= 2)", + "BugReports": "https://github.com/RcppCore/Rcpp/issues", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "VignetteBuilder": "Rcpp", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Romain Francois [aut] (ORCID: ), JJ Allaire [aut] (ORCID: ), Kevin Ushey [aut] (ORCID: ), Qiang Kou [aut] (ORCID: ), Nathan Russell [aut], Iñaki Ucar [aut] (ORCID: ), Doug Bates [aut] (ORCID: ), John Chambers [aut]", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" }, "S7": { "Package": "S7", "Version": "0.2.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "An Object Oriented System Meant to Become a Successor to S3 and S4", + "Authors@R": "c( person(\"Object-Oriented Programming Working Group\", role = \"cph\"), person(\"Davis\", \"Vaughan\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Tomasz\", \"Kalinowski\", role = \"aut\"), person(\"Will\", \"Landau\", role = \"aut\"), person(\"Michael\", \"Lawrence\", role = \"aut\"), person(\"Martin\", \"Maechler\", role = \"aut\", comment = c(ORCID = \"0000-0002-8685-9910\")), person(\"Luke\", \"Tierney\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")) )", + "Description": "A new object oriented programming system designed to be a successor to S3 and S4. It includes formal class, generic, and method specification, and a limited form of multiple dispatch. It has been designed and implemented collaboratively by the R Consortium Object-Oriented Programming Working Group, which includes representatives from R-Core, 'Bioconductor', 'Posit'/'tidyverse', and the wider R community.", + "License": "MIT + file LICENSE", + "URL": "https://rconsortium.github.io/S7/, https://github.com/RConsortium/S7", + "BugReports": "https://github.com/RConsortium/S7/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "utils" ], - "Hash": "6a72e94a8c9be4ef719af3aa3628f2dc" + "Suggests": [ + "bench", + "callr", + "covr", + "knitr", + "methods", + "rmarkdown", + "testthat (>= 3.2.0)", + "tibble" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "sloop", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "external-generic", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Object-Oriented Programming Working Group [cph], Davis Vaughan [aut], Jim Hester [aut] (ORCID: ), Tomasz Kalinowski [aut], Will Landau [aut], Michael Lawrence [aut], Martin Maechler [aut] (ORCID: ), Luke Tierney [aut], Hadley Wickham [aut, cre] (ORCID: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "abind": { "Package": "abind", "Version": "1.4-8", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Date": "2024-09-08", + "Title": "Combine Multidimensional Arrays", + "Authors@R": "c(person(\"Tony\", \"Plate\", email = \"tplate@acm.org\", role = c(\"aut\", \"cre\")), person(\"Richard\", \"Heiberger\", role = c(\"aut\")))", + "Maintainer": "Tony Plate ", + "Description": "Combine multidimensional arrays into a single array. This is a generalization of 'cbind' and 'rbind'. Works with vectors, matrices, and higher-dimensional arrays (aka tensors). Also provides functions 'adrop', 'asub', and 'afill' for manipulating, extracting and replacing data in arrays.", + "Depends": [ + "R (>= 1.5.0)" + ], + "Imports": [ "methods", "utils" ], - "Hash": "2288423bb0f20a457800d7fc47f6aa54" + "License": "MIT + file LICENSE", + "NeedsCompilation": "no", + "Author": "Tony Plate [aut, cre], Richard Heiberger [aut]", + "Repository": "CRAN" }, "arrow": { "Package": "arrow", "Version": "25.0.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", + "Title": "Integration to 'Apache' 'Arrow'", + "Authors@R": "c( person(\"Neal\", \"Richardson\", email = \"neal.p.richardson@gmail.com\", role = c(\"aut\")), person(\"Ian\", \"Cook\", email = \"ianmcook@gmail.com\", role = c(\"aut\")), person(\"Nic\", \"Crane\", email = \"thisisnic@gmail.com\", role = c(\"aut\")), person(\"Dewey\", \"Dunnington\", role = c(\"aut\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Romain\", \"Fran\\u00e7ois\", role = c(\"aut\"), comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Jonathan\", \"Keane\", email = \"jkeane@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Bryce\", \"Mecum\", email = \"brycemecum@gmail.com\", role = c(\"aut\")), person(\"Drago\\u0219\", \"Moldovan-Gr\\u00fcnfeld\", email = \"dragos.mold@gmail.com\", role = c(\"aut\")), person(\"Jeroen\", \"Ooms\", email = \"jeroen@berkeley.edu\", role = c(\"aut\")), person(\"Jacob\", \"Wujciak-Jens\", email = \"jacob@wujciak.de\", role = c(\"aut\")), person(\"Javier\", \"Luraschi\", email = \"javier@rstudio.com\", role = c(\"ctb\")), person(\"Karl\", \"Dunkle Werner\", email = \"karldw@users.noreply.github.com\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0003-0523-7309\")), person(\"Jeffrey\", \"Wong\", email = \"jeffreyw@netflix.com\", role = c(\"ctb\")), person(\"Apache Arrow\", email = \"dev@arrow.apache.org\", role = c(\"aut\", \"cph\")) )", + "Description": "'Apache' 'Arrow' is a cross-language development platform for in-memory data. It specifies a standardized language-independent columnar memory format for flat and hierarchical data, organized for efficient analytic operations on modern hardware. This package provides an interface to the 'Arrow C++' library.", + "Depends": [ + "R (>= 4.2)" + ], + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/apache/arrow/, https://arrow.apache.org/docs/r/", + "BugReports": "https://github.com/apache/arrow/issues", + "Encoding": "UTF-8", + "Language": "en-US", + "SystemRequirements": "C++20; for AWS S3 support on Linux, libcurl and openssl (optional); cmake >= 3.26 (build-time only, and only for full source build)", + "Biarch": "true", + "Imports": [ "assertthat", - "bit64", - "cpp11", + "bit64 (>= 0.9-7)", "glue", "methods", "purrr", - "rlang", + "R6", + "rlang (>= 1.0.0)", "stats", - "tidyselect", + "tidyselect (>= 1.0.0)", "utils", "vctrs" ], - "Hash": "d8c220599be46a5d07f6837e715bfe13" + "Config/testthat/edition": "3", + "Config/build/bootstrap": "TRUE", + "Suggests": [ + "blob", + "curl", + "cli", + "DBI", + "dbplyr", + "decor", + "distro", + "dplyr", + "duckdb (>= 0.2.8)", + "hms", + "jsonlite", + "knitr", + "lubridate", + "pillar", + "pkgload", + "reticulate", + "rmarkdown", + "stringi", + "stringr", + "sys", + "testthat (>= 3.3.0)", + "tibble", + "tzdb", + "withr" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.2)" + ], + "Collate": "'arrowExports.R' 'enums.R' 'arrow-object.R' 'type.R' 'array-data.R' 'arrow-datum.R' 'array.R' 'arrow-info.R' 'arrow-package.R' 'arrow-tabular.R' 'buffer.R' 'chunked-array.R' 'io.R' 'compression.R' 'scalar.R' 'compute.R' 'config.R' 'csv.R' 'dataset.R' 'dataset-factory.R' 'dataset-format.R' 'dataset-partition.R' 'dataset-scan.R' 'dataset-write.R' 'dictionary.R' 'dplyr-across.R' 'dplyr-arrange.R' 'dplyr-by.R' 'dplyr-collect.R' 'dplyr-count.R' 'dplyr-datetime-helpers.R' 'dplyr-distinct.R' 'dplyr-eval.R' 'dplyr-filter.R' 'dplyr-funcs-agg.R' 'dplyr-funcs-augmented.R' 'dplyr-funcs-conditional.R' 'dplyr-funcs-datetime.R' 'dplyr-funcs-doc.R' 'dplyr-funcs-math.R' 'dplyr-funcs-simple.R' 'dplyr-funcs-string.R' 'dplyr-funcs-type.R' 'expression.R' 'dplyr-funcs.R' 'dplyr-glimpse.R' 'dplyr-group-by.R' 'dplyr-join.R' 'dplyr-mutate.R' 'dplyr-select.R' 'dplyr-slice.R' 'dplyr-summarize.R' 'dplyr-union.R' 'record-batch.R' 'table.R' 'dplyr.R' 'duckdb.R' 'extension.R' 'feather.R' 'field.R' 'filesystem.R' 'flight.R' 'install-arrow.R' 'ipc-stream.R' 'json.R' 'memory-pool.R' 'message.R' 'metadata.R' 'parquet.R' 'python.R' 'query-engine.R' 'record-batch-reader.R' 'record-batch-writer.R' 'reexports-tidyselect.R' 'schema.R' 'udf.R' 'util.R'", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "yes", + "Author": "Neal Richardson [aut], Ian Cook [aut], Nic Crane [aut], Dewey Dunnington [aut] (ORCID: ), Romain François [aut] (ORCID: ), Jonathan Keane [aut, cre], Bryce Mecum [aut], Dragoș Moldovan-Grünfeld [aut], Jeroen Ooms [aut], Jacob Wujciak-Jens [aut], Javier Luraschi [ctb], Karl Dunkle Werner [ctb] (ORCID: ), Jeffrey Wong [ctb], Apache Arrow [aut, cph]", + "Maintainer": "Jonathan Keane ", + "Repository": "CRAN" }, "askpass": { "Package": "askpass", "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "sys" + "Type": "Package", + "Title": "Password Entry Utilities for R, Git, and SSH", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Cross-platform utilities for prompting the user for credentials or a passphrase, for example to authenticate with a server or read a protected key. Includes native programs for MacOS and Windows, hence no 'tcltk' is required. Password entry can be invoked in two different ways: directly from R via the askpass() function, or indirectly as password-entry back-end for 'ssh-agent' or 'git-credential' via the SSH_ASKPASS and GIT_ASKPASS environment variables. Thereby the user can be prompted for credentials or a passphrase if needed when R calls out to git or ssh.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.r-universe.dev/askpass", + "BugReports": "https://github.com/r-lib/askpass/issues", + "Encoding": "UTF-8", + "Imports": [ + "sys (>= 2.1)" + ], + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat" ], - "Hash": "c39f4155b3ceb1a9a2799d700fbd4b6a" + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "assertthat": { "Package": "assertthat", "Version": "0.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Easy Pre and Post Assertions", + "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", c(\"aut\", \"cre\"))", + "Description": "An extension to stopifnot() that makes it easy to declare the pre and post conditions that you code should satisfy, while also producing friendly error messages so that your users know what's gone wrong.", + "License": "GPL-3", + "Imports": [ "tools" ], - "Hash": "50c838a310445e954bc13f26f26a6ecf" + "Suggests": [ + "testthat", + "covr" + ], + "RoxygenNote": "6.0.1", + "Collate": "'assert-that.r' 'on-failure.r' 'assertions-file.r' 'assertions-scalar.R' 'assertions.r' 'base.r' 'base-comparison.r' 'base-is.r' 'base-logical.r' 'base-misc.r' 'utils.r' 'validate-that.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "assessr": { "Package": "assessr", "Version": "0.6.0", "Source": "GitHub", + "Type": "Package", + "Title": "Measure Property Assessment Performance", + "Authors@R": "c( person(given = \"Dan\", family = \"Snow\", email=\"daniel.snow@cookcountyil.gov\", role=c(\"aut\", \"cre\")), person(given = \"William\", family = \"Ridgeway\", email=\"william.ridgeway@cookcountyil.gov\", role=c(\"ctb\")), person(given = \"Rob\", family = \"Ross\", role=c(\"ctb\")), person(given = \"Nathan\", family = \"Dignazio\", role=c(\"ctb\")), person(given = \"Damon\", family = \"Major\", role=c(\"ctb\")) )", + "Date": "2023-08-07", + "Description": "An R package to measure the performance of property assessments using IAAO standard statistics. Also includes a host of utility functions to make common assessment and evaluation tasks easier and more consistent.", + "URL": "https://ccao-data.github.io/assessr/, https://github.com/ccao-data/assessr", + "License": "AGPL-3 + file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "Imports": [ + "stats" + ], + "RoxygenNote": "7.2.4", + "Suggests": [ + "covr", + "devtools", + "dplyr", + "DT", + "forcats", + "ggplot2", + "jsonlite", + "knitr", + "lintr", + "pkgdown (>= 2.2.0)", + "rmarkdown", + "rprojroot", + "scales", + "testthat (>= 3.0.0)", + "tibble", + "tidyr" + ], + "Depends": [ + "R (>= 3.5.0)" + ], + "Config/testthat/edition": "3", + "Author": "Dan Snow [aut, cre], William Ridgeway [ctb], Rob Ross [ctb], Nathan Dignazio [ctb], Damon Major [ctb]", + "Maintainer": "Dan Snow ", "RemoteType": "github", "RemoteHost": "api.github.com", "RemoteUsername": "ccao-data", "RemoteRepo": "assessr", "RemoteRef": "master", - "RemoteSha": "f1b2cdaa4fd5bc9d1597b9fe9537dc48d34e4a80", - "Requirements": [ - "R", - "stats" - ], - "Hash": "e533ff8176cf00d0fec973ae645098a4" + "RemoteSha": "f1b2cdaa4fd5bc9d1597b9fe9537dc48d34e4a80" }, "base64enc": { "Package": "base64enc", "Version": "0.1-6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Tools for 'base64' Encoding", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" + ], + "Enhances": [ + "png" ], - "Hash": "5edb675b7baa6e9a0d86dd2c28de1676" + "Description": "Tools for handling 'base64' encoding. It is more flexible than the orphaned 'base64' package.", + "License": "GPL-2 | GPL-3", + "URL": "https://www.rforge.net/base64enc", + "BugReports": "https://github.com/s-u/base64enc/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN" }, "bit": { "Package": "bit", "Version": "4.6.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Classes and Methods for Fast Memory-Efficient Boolean Selections", + "Authors@R": "c( person(\"Michael\", \"Chirico\", email = \"MichaelChirico4@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Jens\", \"Oehlschlägel\", role = \"aut\"), person(\"Brian\", \"Ripley\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "testthat (>= 3.0.0)", + "roxygen2", + "knitr", + "markdown", + "rmarkdown", + "microbenchmark", + "bit64 (>= 4.0.0)", + "ff (>= 4.0.0)" ], - "Hash": "ebe86ffd194564abdc895d87742d5a29" + "Description": "Provided are classes for boolean and skewed boolean vectors, fast boolean methods, fast unique and non-unique integer sorting, fast set operations on sorted and unsorted sets of integers, and foundations for ff (range index, compression, chunked processing).", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "ByteCompile": "yes", + "Encoding": "UTF-8", + "URL": "https://github.com/r-lib/bit", + "VignetteBuilder": "knitr, rmarkdown", + "RoxygenNote": "7.3.2", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Michael Chirico [aut, cre], Jens Oehlschlägel [aut], Brian Ripley [ctb]", + "Maintainer": "Michael Chirico ", + "Repository": "CRAN" }, "bit64": { "Package": "bit64", "Version": "4.8.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bit", + "Title": "A S3 Class for Vectors of 64bit Integers", + "Authors@R": "c( person(\"Michael\", \"Chirico\", email=\"michaelchirico4@gmail.com\", role=c(\"aut\", \"cre\")), person(\"Jens\", \"Oehlschlägel\", role=\"aut\"), person(\"Leonardo\", \"Silvestri\", role=\"ctb\"), person(\"Ofek\", \"Shilon\", role=\"ctb\"), person(\"Christian\", \"Ullerich\", role=\"ctb\") )", + "Depends": [ + "R (>= 3.5.0)" + ], + "Description": "Package 'bit64' provides serializable S3 atomic 64bit (signed) integers. These are useful for handling database keys and exact counting in +-2^63. WARNING: do not use them as replacement for 32bit integers, integer64 are not supported for subscripting by R-core and they have different semantics when combined with double, e.g. integer64 + double => integer64. Class integer64 can be used in vectors, matrices, arrays and data.frames. Methods are available for coercion from and to logicals, integers, doubles, characters and factors as well as many elementwise and summary functions. Many fast algorithmic operations such as 'match' and 'order' support inter- active data exploration and manipulation and optionally leverage caching.", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "ByteCompile": "yes", + "URL": "https://github.com/r-lib/bit64, https://bit64.r-lib.org", + "Encoding": "UTF-8", + "Imports": [ + "bit (>= 4.0.0)", "graphics", "methods", "stats", "utils" ], - "Hash": "71778c0b60bbf439ac64e6a8be695917" + "Suggests": [ + "patrick (>= 0.3.0)", + "testthat (>= 3.3.0)", + "withr" + ], + "Config/testthat/edition": "3", + "Config/Needs/development": "patrick, testthat", + "Config/Needs/website": "tidyverse/tidytemplate", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Michael Chirico [aut, cre], Jens Oehlschlägel [aut], Leonardo Silvestri [ctb], Ofek Shilon [ctb], Christian Ullerich [ctb]", + "Maintainer": "Michael Chirico ", + "Repository": "CRAN" }, "bslib": { "Package": "bslib", "Version": "0.12.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", + "Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )", + "Description": "Simplifies custom 'CSS' styling of both 'shiny' and 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 and 5 as well as their various 'Bootswatch' themes. An interactive widget is also provided for previewing themes in real time.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib", + "BugReports": "https://github.com/rstudio/bslib/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ "base64enc", "cachem", - "fastmap", + "fastmap (>= 1.1.1)", "grDevices", - "htmltools", - "jquerylib", + "htmltools (>= 0.5.8)", + "jquerylib (>= 0.1.3)", "jsonlite", "lifecycle", - "memoise", + "memoise (>= 2.0.1)", "mime", "rlang", - "sass" + "sass (>= 0.4.9)" + ], + "Suggests": [ + "brand.yml", + "bsicons", + "curl", + "fontawesome", + "future", + "ggplot2", + "knitr", + "lattice", + "magrittr", + "rappdirs", + "rmarkdown (>= 2.7)", + "shiny (>= 1.11.1.9000)", + "testthat", + "thematic", + "tools", + "utils", + "withr", + "yaml" ], - "Hash": "b2d0b0a17142ed4858f252d88eb56223" + "Config/Needs/deploy": "BH, chiflights22, colourpicker, commonmark, cpp11, cpsievert/chiflights22, cpsievert/histoslider, dplyr, DT, ggplot2, ggridges, gt, hexbin, histoslider, htmlwidgets, lattice, leaflet, lubridate, markdown, modelr, plotly, reactable, reshape2, rprojroot, rsconnect, rstudio/shiny, scales, styler, tibble", + "Config/Needs/routine": "chromote, desc, renv", + "Config/Needs/website": "brio, crosstalk, dplyr, DT, ggplot2, glue, htmlwidgets, leaflet, lorem, palmerpenguins, plotly, purrr, rprojroot, rstudio/htmltools, scales, stringr, tidyr, webshot2", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", + "Encoding": "UTF-8", + "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-code-editor.R' 'input-dark-mode.R' 'input-submit.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'offcanvas.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'toast.R' 'toolbar.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (ORCID: ), Joe Cheng [aut], Garrick Aden-Buie [aut] (ORCID: ), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "cachem": { "Package": "cachem", "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "fastmap", - "rlang" + "Title": "Cache R Objects with Automatic Pruning", + "Description": "Key-value stores with automatic pruning. Caches can limit either their total size or the age of the oldest object (or both), automatically pruning objects to maintain the constraints.", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", c(\"aut\", \"cre\")), person(family = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")))", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "ByteCompile": "true", + "URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem", + "Imports": [ + "rlang", + "fastmap (>= 1.2.0)" ], - "Hash": "cd9a672193789068eb5a2aad65a0dedf" + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.2.3", + "Config/Needs/routine": "lobstr", + "Config/Needs/website": "pkgdown", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "ccao": { "Package": "ccao", "Version": "1.3.1", "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "ccao-data", - "RemoteRepo": "ccao", - "RemoteRef": "master", - "RemoteSha": "419b67731a1aeb1fa1d2b47b0ed6c3391f5c653a", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Convenience Functions and Datasets for the Cook County Assessor's Office", + "Authors@R": "c( person(given = \"Dan\", family = \"Snow\", email=\"daniel.snow@cookcountyil.gov\", role=c(\"aut\", \"cre\")), person(given = \"William\", family = \"Ridgeway\", email=\"william-ridgeway@cookcountyil.gov\", role=c(\"aut\", \"ctb\")), person(given = \"Nathan\", family = \"Dignazio\", role=c(\"ctb\")) )", + "Date": "2023-02-07", + "Description": "A set of functions used throughout the Cook County Assessor's valuation pipeline. The intention is to standardize the usage of critical functions across all users and scripts by having them all depend on a single package.", + "URL": "https://ccao-data.github.io/ccao/, https://github.com/ccao-data/ccao", + "License": "AGPL-3 + file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "Imports": [ "arrow", - "assessr", - "dplyr", + "assessr (>= 0.4.8)", + "dplyr (>= 1.1.0)", "glue", "magrittr", "noctua", "rlang", - "tidyr" + "tidyr (>= 1.3.0)" + ], + "RoxygenNote": "7.3.3", + "Suggests": [ + "covr", + "DBI", + "devtools", + "ggplot2", + "knitr", + "lintr", + "mockery", + "pkgdown", + "readr", + "rmarkdown", + "scales", + "sf", + "testthat", + "usethis" + ], + "Depends": [ + "R (>= 3.5.0)" ], - "Hash": "f05c4f99a56189cac0a30f11cc05dbf3" + "Config/testthat/edition": "3", + "Author": "Dan Snow [aut, cre], William Ridgeway [aut, ctb], Nathan Dignazio [ctb]", + "Maintainer": "Dan Snow ", + "RemoteType": "github", + "Remotes": "ccao-data/assessr", + "RemoteHost": "api.github.com", + "RemoteUsername": "ccao-data", + "RemoteRepo": "ccao", + "RemoteRef": "master", + "RemoteSha": "419b67731a1aeb1fa1d2b47b0ed6c3391f5c653a" }, "class": { "Package": "class", "Version": "7.3-23", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "MASS", - "R", + "Priority": "recommended", + "Date": "2025-01-01", + "Depends": [ + "R (>= 3.0.0)", "stats", "utils" ], - "Hash": "d0cb9cc838c3b43560bd958fc4317fdc" + "Imports": [ + "MASS" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Brian.Ripley@R-project.org\"), person(\"William\", \"Venables\", role = \"cph\"))", + "Description": "Various functions for classification, including k-nearest neighbour, Learning Vector Quantization and Self-Organizing Maps.", + "Title": "Functions for Classification", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], William Venables [cph]", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "classInt": { "Package": "classInt", "Version": "0.4-11", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "KernSmooth", - "R", - "class", - "e1071", + "Date": "2025-01-06", + "Title": "Choose Univariate Class Intervals", + "Authors@R": "c( person(\"Roger\", \"Bivand\", role=c(\"aut\", \"cre\"), email=\"Roger.Bivand@nhh.no\", comment=c(ORCID=\"0000-0003-2392-6140\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment=c(ORCID=\"0000-0002-5759-428X\")), person(\"Richard\", \"Dunlap\", role=\"ctb\"), person(\"Diego\", \"Hernangómez\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8457-4658\")), person(\"Hisaji\", \"Ono\", role=\"ctb\"), person(\"Josiah\", \"Parry\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9910-865X\")), person(\"Matthieu\", \"Stigler\", role=\"ctb\", comment =c(ORCID=\"0000-0002-6802-4290\")))", + "Depends": [ + "R (>= 2.2)" + ], + "Imports": [ "grDevices", + "stats", "graphics", - "stats" + "e1071", + "class", + "KernSmooth" + ], + "Suggests": [ + "spData (>= 0.2.6.2)", + "units", + "knitr", + "rmarkdown", + "tinytest" ], - "Hash": "f2af70314a63d7f025ae668f08bd933a" + "NeedsCompilation": "yes", + "Description": "Selected commonly used methods for choosing univariate class intervals for mapping or other graphics purposes.", + "License": "GPL (>= 2)", + "URL": "https://r-spatial.github.io/classInt/, https://github.com/r-spatial/classInt/", + "BugReports": "https://github.com/r-spatial/classInt/issues/", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "VignetteBuilder": "knitr", + "Author": "Roger Bivand [aut, cre] (), Bill Denney [ctb] (), Richard Dunlap [ctb], Diego Hernangómez [ctb] (), Hisaji Ono [ctb], Josiah Parry [ctb] (), Matthieu Stigler [ctb] ()", + "Maintainer": "Roger Bivand ", + "Repository": "CRAN" }, "cli": { "Package": "cli", "Version": "3.6.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Helpers for Developing Command Line Interfaces", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"gabor@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kirill\", \"Müller\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", , \"salim-b@pm.me\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A suite of tools to build attractive command line interfaces ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs, etc. Supports custom themes via a 'CSS'-like language. It also contains a number of lower level 'CLI' elements: rules, boxes, trees, and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI colors and text styles as well.", + "License": "MIT + file LICENSE", + "URL": "https://cli.r-lib.org, https://github.com/r-lib/cli", + "BugReports": "https://github.com/r-lib/cli/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "utils" ], - "Hash": "a73d822b669d443ff8de6928f9c49850" + "Suggests": [ + "callr", + "covr", + "crayon", + "digest", + "glue (>= 1.6.0)", + "grDevices", + "htmltools", + "htmlwidgets", + "knitr", + "methods", + "processx", + "ps (>= 1.3.4.9000)", + "rlang (>= 1.0.2.9003)", + "rmarkdown", + "rprojroot", + "rstudioapi", + "testthat (>= 3.2.0)", + "tibble", + "whoami", + "withr" + ], + "Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc, fansi, prettyunits, sessioninfo, tidyverse/tidytemplate, usethis, vctrs", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Hadley Wickham [ctb], Kirill Müller [ctb], Salim Brüggemann [ctb] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "clipr": { "Package": "clipr", "Version": "0.8.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Read and Write from the System Clipboard", + "Authors@R": "c( person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4387-3384\")), person(\"Louis\", \"Maddox\", role = \"ctb\"), person(\"Steve\", \"Simpson\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\") )", + "Description": "Simple utility functions to read from and write to the Windows, OS X, and X11 clipboards.", + "License": "GPL-3", + "URL": "https://github.com/mdlincoln/clipr, http://matthewlincoln.net/clipr/", + "BugReports": "https://github.com/mdlincoln/clipr/issues", + "Imports": [ "utils" ], - "Hash": "cc6e507cf89f11ffc44b32519e0198da" + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "rstudioapi (>= 0.5)", + "testthat (>= 2.0.0)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "SystemRequirements": "xclip (https://github.com/astrand/xclip) or xsel (http://www.vergenet.net/~conrad/software/xsel/) for accessing the X11 clipboard, or wl-clipboard (https://github.com/bugaevc/wl-clipboard) for systems using Wayland.", + "NeedsCompilation": "no", + "Author": "Matthew Lincoln [aut, cre] (ORCID: ), Louis Maddox [ctb], Steve Simpson [ctb], Jennifer Bryan [ctb]", + "Maintainer": "Matthew Lincoln ", + "Repository": "CRAN" }, "commonmark": { "Package": "commonmark", "Version": "2.0.0", "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/2026-07-10", - "Hash": "8cba62334c1088d21689d353a7e87663" + "Type": "Package", + "Title": "High Performance CommonMark and Github Markdown Rendering in R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", ,\"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"John MacFarlane\", role = \"cph\", comment = \"Author of cmark\"))", + "Description": "The CommonMark specification defines a rationalized version of markdown syntax. This package uses the 'cmark' reference implementation for converting markdown text into various formats including html, latex and groff man. In addition it exposes the markdown parse tree in xml format. Also includes opt-in support for GFM extensions including tables, autolinks, and strikethrough text.", + "License": "BSD_2_clause + file LICENSE", + "URL": "https://docs.ropensci.org/commonmark/ https://ropensci.r-universe.dev/commonmark", + "BugReports": "https://github.com/r-lib/commonmark/issues", + "Suggests": [ + "curl", + "testthat", + "xml2" + ], + "RoxygenNote": "7.3.2", + "Language": "en-US", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), John MacFarlane [cph] (Author of cmark)", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "cpp11": { "Package": "cpp11", "Version": "0.5.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "A C++11 Interface for R's C Interface", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", email = \"davis@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Jim\",\"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Benjamin\", \"Kietzman\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a header only, C++11 interface to R's C interface. Compared to other approaches 'cpp11' strives to be safe against long jumps from the C API as well as C++ exceptions, conform to normal R function semantics and supports interaction with 'ALTREP' vectors.", + "License": "MIT + file LICENSE", + "URL": "https://cpp11.r-lib.org, https://github.com/r-lib/cpp11", + "BugReports": "https://github.com/r-lib/cpp11/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "bench", + "brio", + "callr", + "cli", + "covr", + "decor", + "desc", + "ggplot2", + "glue", + "knitr", + "lobstr", + "mockery", + "progress", + "rmarkdown", + "scales", + "Rcpp", + "testthat (>= 3.2.0)", + "tibble", + "utils", + "vctrs", + "withr" ], - "Hash": "20ecb9105a3fb48a8390919abc3b7e90" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/Needs/cpp11/cpp_register": "brio, cli, decor, desc, glue, tibble, vctrs", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Davis Vaughan [aut, cre] (ORCID: ), Jim Hester [aut] (ORCID: ), Romain François [aut] (ORCID: ), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" }, "crayon": { "Package": "crayon", "Version": "1.5.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Colored Terminal Output", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Brodie\", \"Gaslam\", , \"brodie.gaslam@yahoo.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The crayon package is now superseded. Please use the 'cli' package for new projects. Colored terminal output on terminals that support 'ANSI' color and highlight codes. It also works in 'Emacs' 'ESS'. 'ANSI' color support is automatically detected. Colors and highlighting can be combined and nested. New styles can also be created easily. This package was inspired by the 'chalk' 'JavaScript' project.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.github.io/crayon/, https://github.com/r-lib/crayon", + "BugReports": "https://github.com/r-lib/crayon/issues", + "Imports": [ "grDevices", "methods", "utils" ], - "Hash": "859d96e65ef198fd43e82b9628d593ef" + "Suggests": [ + "mockery", + "rstudioapi", + "testthat", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Collate": "'aaa-rstudio-detect.R' 'aaaa-rematch2.R' 'aab-num-ansi-colors.R' 'aac-num-ansi-colors.R' 'ansi-256.R' 'ansi-palette.R' 'combine.R' 'string.R' 'utils.R' 'crayon-package.R' 'disposable.R' 'enc-utils.R' 'has_ansi.R' 'has_color.R' 'link.R' 'styles.R' 'machinery.R' 'parts.R' 'print.R' 'style-var.R' 'show.R' 'string_operations.R'", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Brodie Gaslam [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "curl": { "Package": "curl", "Version": "7.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "A Modern and Flexible Web Client for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Posit Software, PBC\", role = \"cph\"))", + "Description": "Bindings to 'libcurl' for performing fully configurable HTTP/FTP requests where responses can be processed in memory, on disk, or streaming via the callback or connection interfaces. Some knowledge of 'libcurl' is recommended; for a more-user-friendly web client see the 'httr2' package which builds on this package with http specific tools and logic.", + "License": "MIT + file LICENSE", + "SystemRequirements": "libcurl (>= 7.73): libcurl-devel (rpm) or libcurl4-openssl-dev (deb)", + "URL": "https://jeroen.r-universe.dev/curl", + "BugReports": "https://github.com/jeroen/curl/issues", + "Suggests": [ + "spelling", + "testthat (>= 1.0.0)", + "knitr", + "jsonlite", + "later", + "rmarkdown", + "httpuv (>= 1.4.4)", + "webutils" ], - "Hash": "2e004ed19964915a8faf48a574439be9" + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 3.0.0)" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Hadley Wickham [ctb], Posit Software, PBC [cph]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "data.table": { "Package": "data.table", "Version": "1.18.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Extension of `data.frame`", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ "methods" ], - "Hash": "da9ddede68a6f6e5d3098c0ab81b6e1f" + "Suggests": [ + "bit64 (>= 4.0.0)", + "bit (>= 4.0.4)", + "R.utils (>= 2.13.0)", + "xts", + "zoo (>= 1.8-1)", + "yaml", + "knitr", + "markdown" + ], + "Description": "Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, fast add/modify/delete of columns by group using no copies at all, list columns, friendly and fast character-separated-value read/write. Offers a natural and flexible syntax, for faster development.", + "License": "MPL-2.0 | file LICENSE", + "URL": "https://r-datatable.com, https://Rdatatable.gitlab.io/data.table, https://github.com/Rdatatable/data.table", + "BugReports": "https://github.com/Rdatatable/data.table/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "ByteCompile": "TRUE", + "Authors@R": "c( person(\"Tyson\",\"Barrett\", role=c(\"aut\",\"cre\"), email=\"t.barrett88@gmail.com\", comment = c(ORCID=\"0000-0002-2137-1391\")), person(\"Matt\",\"Dowle\", role=\"aut\", email=\"mattjdowle@gmail.com\"), person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"), person(\"Jan\",\"Gorecki\", role=\"aut\", email=\"j.gorecki@wit.edu.pl\"), person(\"Michael\",\"Chirico\", role=\"aut\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\")), person(\"Toby\",\"Hocking\", role=\"aut\", email=\"toby.hocking@r-project.org\", comment = c(ORCID=\"0000-0002-3146-0865\")), person(\"Benjamin\",\"Schwendinger\",role=\"aut\", comment = c(ORCID=\"0000-0003-3315-8114\")), person(\"Ivan\", \"Krylov\", role=\"aut\", email=\"ikrylov@disroot.org\", comment = c(ORCID=\"0000-0002-0172-3812\")), person(\"Pasha\",\"Stetsenko\", role=\"ctb\"), person(\"Tom\",\"Short\", role=\"ctb\"), person(\"Steve\",\"Lianoglou\", role=\"ctb\"), person(\"Eduard\",\"Antonyan\", role=\"ctb\"), person(\"Markus\",\"Bonsch\", role=\"ctb\"), person(\"Hugh\",\"Parsonage\", role=\"ctb\"), person(\"Scott\",\"Ritchie\", role=\"ctb\"), person(\"Kun\",\"Ren\", role=\"ctb\"), person(\"Xianying\",\"Tan\", role=\"ctb\"), person(\"Rick\",\"Saporta\", role=\"ctb\"), person(\"Otto\",\"Seiskari\", role=\"ctb\"), person(\"Xianghui\",\"Dong\", role=\"ctb\"), person(\"Michel\",\"Lang\", role=\"ctb\"), person(\"Watal\",\"Iwasaki\", role=\"ctb\"), person(\"Seth\",\"Wenchel\", role=\"ctb\"), person(\"Karl\",\"Broman\", role=\"ctb\"), person(\"Tobias\",\"Schmidt\", role=\"ctb\"), person(\"David\",\"Arenburg\", role=\"ctb\"), person(\"Ethan\",\"Smith\", role=\"ctb\"), person(\"Francois\",\"Cocquemas\", role=\"ctb\"), person(\"Matthieu\",\"Gomez\", role=\"ctb\"), person(\"Philippe\",\"Chataignon\", role=\"ctb\"), person(\"Nello\",\"Blaser\", role=\"ctb\"), person(\"Dmitry\",\"Selivanov\", role=\"ctb\"), person(\"Andrey\",\"Riabushenko\", role=\"ctb\"), person(\"Cheng\",\"Lee\", role=\"ctb\"), person(\"Declan\",\"Groves\", role=\"ctb\"), person(\"Daniel\",\"Possenriede\", role=\"ctb\"), person(\"Felipe\",\"Parages\", role=\"ctb\"), person(\"Denes\",\"Toth\", role=\"ctb\"), person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"), person(\"Ayappan\",\"Perumal\", role=\"ctb\"), person(\"James\",\"Sams\", role=\"ctb\"), person(\"Martin\",\"Morgan\", role=\"ctb\"), person(\"Michael\",\"Quinn\", role=\"ctb\"), person(given=\"@javrucebo\", role=\"ctb\", comment=\"GitHub user\"), person(\"Marc\",\"Halperin\", role=\"ctb\"), person(\"Roy\",\"Storey\", role=\"ctb\"), person(\"Manish\",\"Saraswat\", role=\"ctb\"), person(\"Morgan\",\"Jacob\", role=\"ctb\"), person(\"Michael\",\"Schubmehl\", role=\"ctb\"), person(\"Davis\",\"Vaughan\", role=\"ctb\"), person(\"Leonardo\",\"Silvestri\", role=\"ctb\"), person(\"Jim\",\"Hester\", role=\"ctb\"), person(\"Anthony\",\"Damico\", role=\"ctb\"), person(\"Sebastian\",\"Freundt\", role=\"ctb\"), person(\"David\",\"Simons\", role=\"ctb\"), person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"), person(\"Cole\",\"Miller\", role=\"ctb\"), person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"), person(\"Vaclav\",\"Tlapak\", role=\"ctb\"), person(\"Kevin\",\"Ushey\", role=\"ctb\"), person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"), person(\"Tony\",\"Fischetti\", role=\"ctb\"), person(\"Ofek\",\"Shilon\", role=\"ctb\"), person(\"Vadim\",\"Khotilovich\", role=\"ctb\"), person(\"Hadley\",\"Wickham\", role=\"ctb\"), person(\"Bennet\",\"Becker\", role=\"ctb\"), person(\"Kyle\",\"Haynes\", role=\"ctb\"), person(\"Boniface Christian\",\"Kamgang\", role=\"ctb\"), person(\"Olivier\",\"Delmarcell\", role=\"ctb\"), person(\"Josh\",\"O'Brien\", role=\"ctb\"), person(\"Dereck\",\"de Mezquita\", role=\"ctb\"), person(\"Michael\",\"Czekanski\", role=\"ctb\"), person(\"Dmitry\", \"Shemetov\", role=\"ctb\"), person(\"Nitish\", \"Jha\", role=\"ctb\"), person(\"Joshua\", \"Wu\", role=\"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role=\"ctb\"), person(\"Anirban\", \"Chetia\", role=\"ctb\"), person(\"Doris\", \"Amoakohene\", role=\"ctb\"), person(\"Angel\", \"Feliz\", role=\"ctb\"), person(\"Michael\",\"Young\", role=\"ctb\"), person(\"Mark\", \"Seeto\", role=\"ctb\"), person(\"Philippe\", \"Grosjean\", role=\"ctb\"), person(\"Vincent\", \"Runge\", role=\"ctb\"), person(\"Christian\", \"Wia\", role=\"ctb\"), person(\"Elise\", \"Maigné\", role=\"ctb\"), person(\"Vincent\", \"Rocher\", role=\"ctb\"), person(\"Vijay\", \"Lulla\", role=\"ctb\"), person(\"Aljaž\", \"Sluga\", role=\"ctb\"), person(\"Bill\", \"Evans\", role=\"ctb\"), person(\"Reino\", \"Bruner\", role=\"ctb\"), person(given=\"@badasahog\", role=\"ctb\", comment=\"GitHub user\"), person(\"Vinit\", \"Thakur\", role=\"ctb\"), person(\"Mukul\", \"Kumar\", role=\"ctb\"), person(\"Ildikó\", \"Czeller\", role=\"ctb\"), person(\"Manmita\", \"Das\", role=\"ctb\"), person(\"Tarun\", \"Thammisetty\", role=\"ctb\") )", + "NeedsCompilation": "yes", + "Author": "Tyson Barrett [aut, cre] (ORCID: ), Matt Dowle [aut], Arun Srinivasan [aut], Jan Gorecki [aut], Michael Chirico [aut] (ORCID: ), Toby Hocking [aut] (ORCID: ), Benjamin Schwendinger [aut] (ORCID: ), Ivan Krylov [aut] (ORCID: ), Pasha Stetsenko [ctb], Tom Short [ctb], Steve Lianoglou [ctb], Eduard Antonyan [ctb], Markus Bonsch [ctb], Hugh Parsonage [ctb], Scott Ritchie [ctb], Kun Ren [ctb], Xianying Tan [ctb], Rick Saporta [ctb], Otto Seiskari [ctb], Xianghui Dong [ctb], Michel Lang [ctb], Watal Iwasaki [ctb], Seth Wenchel [ctb], Karl Broman [ctb], Tobias Schmidt [ctb], David Arenburg [ctb], Ethan Smith [ctb], Francois Cocquemas [ctb], Matthieu Gomez [ctb], Philippe Chataignon [ctb], Nello Blaser [ctb], Dmitry Selivanov [ctb], Andrey Riabushenko [ctb], Cheng Lee [ctb], Declan Groves [ctb], Daniel Possenriede [ctb], Felipe Parages [ctb], Denes Toth [ctb], Mus Yaramaz-David [ctb], Ayappan Perumal [ctb], James Sams [ctb], Martin Morgan [ctb], Michael Quinn [ctb], @javrucebo [ctb] (GitHub user), Marc Halperin [ctb], Roy Storey [ctb], Manish Saraswat [ctb], Morgan Jacob [ctb], Michael Schubmehl [ctb], Davis Vaughan [ctb], Leonardo Silvestri [ctb], Jim Hester [ctb], Anthony Damico [ctb], Sebastian Freundt [ctb], David Simons [ctb], Elliott Sales de Andrade [ctb], Cole Miller [ctb], Jens Peder Meldgaard [ctb], Vaclav Tlapak [ctb], Kevin Ushey [ctb], Dirk Eddelbuettel [ctb], Tony Fischetti [ctb], Ofek Shilon [ctb], Vadim Khotilovich [ctb], Hadley Wickham [ctb], Bennet Becker [ctb], Kyle Haynes [ctb], Boniface Christian Kamgang [ctb], Olivier Delmarcell [ctb], Josh O'Brien [ctb], Dereck de Mezquita [ctb], Michael Czekanski [ctb], Dmitry Shemetov [ctb], Nitish Jha [ctb], Joshua Wu [ctb], Iago Giné-Vázquez [ctb], Anirban Chetia [ctb], Doris Amoakohene [ctb], Angel Feliz [ctb], Michael Young [ctb], Mark Seeto [ctb], Philippe Grosjean [ctb], Vincent Runge [ctb], Christian Wia [ctb], Elise Maigné [ctb], Vincent Rocher [ctb], Vijay Lulla [ctb], Aljaž Sluga [ctb], Bill Evans [ctb], Reino Bruner [ctb], @badasahog [ctb] (GitHub user), Vinit Thakur [ctb], Mukul Kumar [ctb], Ildikó Czeller [ctb], Manmita Das [ctb], Tarun Thammisetty [ctb]", + "Maintainer": "Tyson Barrett ", + "Repository": "CRAN" }, "digest": { "Package": "digest", "Version": "0.6.39", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Antoine\", \"Lucas\", role=\"ctb\", comment = c(ORCID = \"0000-0002-8059-9767\")), person(\"Jarek\", \"Tuszynski\", role=\"ctb\"), person(\"Henrik\", \"Bengtsson\", role=\"ctb\", comment = c(ORCID = \"0000-0002-7579-5165\")), person(\"Simon\", \"Urbanek\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2297-1732\")), person(\"Mario\", \"Frasca\", role=\"ctb\"), person(\"Bryan\", \"Lewis\", role=\"ctb\"), person(\"Murray\", \"Stokely\", role=\"ctb\"), person(\"Hannes\", \"Muehleisen\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8552-0029\")), person(\"Duncan\", \"Murdoch\", role=\"ctb\"), person(\"Jim\", \"Hester\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Wush\", \"Wu\", role=\"ctb\", comment = c(ORCID = \"0000-0001-5180-0567\")), person(\"Qiang\", \"Kou\", role=\"ctb\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Thierry\", \"Onkelinx\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8804-4216\")), person(\"Michel\", \"Lang\", role=\"ctb\", comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Viliam\", \"Simko\", role=\"ctb\"), person(\"Kurt\", \"Hornik\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"Radford\", \"Neal\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2473-3407\")), person(\"Kendon\", \"Bell\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9093-8312\")), person(\"Matthew\", \"de Queljoe\", role=\"ctb\"), person(\"Dmitry\", \"Selivanov\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0492-6647\")), person(\"Ion\", \"Suruceanu\", role=\"ctb\", comment = c(ORCID = \"0009-0005-6446-4909\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Dirk\", \"Schumacher\", role=\"ctb\"), person(\"András\", \"Svraka\", role=\"ctb\", comment = c(ORCID = \"0009-0008-8480-1329\")), person(\"Sergey\", \"Fedorov\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5970-7233\")), person(\"Will\", \"Landau\", role=\"ctb\", comment = c(ORCID = \"0000-0003-1878-3253\")), person(\"Floris\", \"Vanderhaeghe\", role=\"ctb\", comment = c(ORCID = \"0000-0002-6378-6229\")), person(\"Kevin\", \"Tappe\", role=\"ctb\"), person(\"Harris\", \"McGehee\", role=\"ctb\"), person(\"Tim\", \"Mastny\", role=\"ctb\"), person(\"Aaron\", \"Peikert\", role=\"ctb\", comment = c(ORCID = \"0000-0001-7813-818X\")), person(\"Mark\", \"van der Loo\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9807-4686\")), person(\"Chris\", \"Muir\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2555-3878\")), person(\"Moritz\", \"Beller\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4852-0526\")), person(\"Sebastian\", \"Campbell\", role=\"ctb\", comment = c(ORCID = \"0009-0000-5948-4503\")), person(\"Winston\", \"Chang\", role=\"ctb\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Dean\", \"Attali\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5645-3493\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Kevin\", \"Ushey\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Carl\", \"Pearson\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0701-7860\")))", + "Date": "2025-11-19", + "Title": "Create Compact Hash Digests of R Objects", + "Description": "Implementation of a function 'digest()' for the creation of hash digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32', 'xxhash', 'murmurhash', 'spookyhash', 'blake3', 'crc32c', 'xxh3_64', and 'xxh3_128' algorithms) permitting easy comparison of R language objects, as well as functions such as 'hmac()' to create hash-based message authentication code. Please note that this package is not meant to be deployed for cryptographic purposes for which more comprehensive (and widely tested) libraries such as 'OpenSSL' should be used.", + "URL": "https://github.com/eddelbuettel/digest, https://eddelbuettel.github.io/digest/, https://dirk.eddelbuettel.com/code/digest.html", + "BugReports": "https://github.com/eddelbuettel/digest/issues", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ "utils" ], - "Hash": "d18028e978a88b2b16ef8d400cb49adf" + "License": "GPL (>= 2)", + "Suggests": [ + "tinytest", + "simplermarkdown", + "rbenchmark" + ], + "VignetteBuilder": "simplermarkdown", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Antoine Lucas [ctb] (ORCID: ), Jarek Tuszynski [ctb], Henrik Bengtsson [ctb] (ORCID: ), Simon Urbanek [ctb] (ORCID: ), Mario Frasca [ctb], Bryan Lewis [ctb], Murray Stokely [ctb], Hannes Muehleisen [ctb] (ORCID: ), Duncan Murdoch [ctb], Jim Hester [ctb] (ORCID: ), Wush Wu [ctb] (ORCID: ), Qiang Kou [ctb] (ORCID: ), Thierry Onkelinx [ctb] (ORCID: ), Michel Lang [ctb] (ORCID: ), Viliam Simko [ctb], Kurt Hornik [ctb] (ORCID: ), Radford Neal [ctb] (ORCID: ), Kendon Bell [ctb] (ORCID: ), Matthew de Queljoe [ctb], Dmitry Selivanov [ctb] (ORCID: ), Ion Suruceanu [ctb] (ORCID: ), Bill Denney [ctb] (ORCID: ), Dirk Schumacher [ctb], András Svraka [ctb] (ORCID: ), Sergey Fedorov [ctb] (ORCID: ), Will Landau [ctb] (ORCID: ), Floris Vanderhaeghe [ctb] (ORCID: ), Kevin Tappe [ctb], Harris McGehee [ctb], Tim Mastny [ctb], Aaron Peikert [ctb] (ORCID: ), Mark van der Loo [ctb] (ORCID: ), Chris Muir [ctb] (ORCID: ), Moritz Beller [ctb] (ORCID: ), Sebastian Campbell [ctb] (ORCID: ), Winston Chang [ctb] (ORCID: ), Dean Attali [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Kevin Ushey [ctb] (ORCID: ), Carl Pearson [ctb] (ORCID: )", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" }, "dplyr": { "Package": "dplyr", "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", + "Type": "Package", + "Title": "A Grammar of Data Manipulation", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Kirill\", \"Müller\", role = \"aut\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A fast, consistent tool for working with data frame like objects, both in memory and out of memory.", + "License": "MIT + file LICENSE", + "URL": "https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr", + "BugReports": "https://github.com/tidyverse/dplyr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli (>= 3.6.2)", "generics", - "glue", - "lifecycle", - "magrittr", + "glue (>= 1.3.2)", + "lifecycle (>= 1.0.5)", + "magrittr (>= 1.5)", "methods", - "pillar", - "rlang", - "tibble", - "tidyselect", + "pillar (>= 1.9.0)", + "R6", + "rlang (>= 1.1.7)", + "tibble (>= 3.2.0)", + "tidyselect (>= 1.2.0)", "utils", - "vctrs" + "vctrs (>= 0.7.1)" + ], + "Suggests": [ + "broom", + "covr", + "DBI", + "dbplyr (>= 2.2.1)", + "ggplot2", + "knitr", + "Lahman", + "lobstr", + "nycflights13", + "purrr", + "rmarkdown", + "RSQLite", + "stringi (>= 1.7.6)", + "testthat (>= 3.1.5)", + "tidyr (>= 1.3.0)", + "withr" ], - "Hash": "d71f190466b9496cf8543c76641be5cf" + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Romain François [aut] (ORCID: ), Lionel Henry [aut], Kirill Müller [aut] (ORCID: ), Davis Vaughan [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "e1071": { "Package": "e1071", "Version": "1.7-17", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "class", - "grDevices", + "Title": "Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien", + "Imports": [ "graphics", - "methods", - "proxy", + "grDevices", + "class", "stats", - "utils" + "methods", + "utils", + "proxy" + ], + "Suggests": [ + "cluster", + "mlbench", + "nnet", + "randomForest", + "rpart", + "SparseM", + "xtable", + "Matrix", + "MASS", + "slam" ], - "Hash": "9d516dde384526d4784166f888cd2c6c" + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")), person(given = \"Evgenia\", family = \"Dimitriadou\", role = c(\"aut\",\"cph\")), person(given = \"Kurt\", family = \"Hornik\", role = \"aut\", email = \"Kurt.Hornik@R-project.org\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(given = \"Andreas\", family = \"Weingessel\", role = \"aut\"), person(given = \"Friedrich\", family = \"Leisch\", role = \"aut\"), person(given = \"Chih-Chung\", family = \"Chang\", role = c(\"ctb\",\"cph\"), comment = \"libsvm C++-code\"), person(given = \"Chih-Chen\", family = \"Lin\", role = c(\"ctb\",\"cph\"), comment = \"libsvm C++-code\"))", + "Description": "Functions for latent class analysis, short time Fourier transform, fuzzy clustering, support vector machines, shortest path computation, bagged clustering, naive Bayes classifier, generalized k-nearest neighbour ...", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "NeedsCompilation": "yes", + "Author": "David Meyer [aut, cre] (ORCID: ), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (ORCID: ), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code)", + "Maintainer": "David Meyer ", + "Repository": "CRAN" }, "evaluate": { "Package": "evaluate", "Version": "1.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Parsing and Evaluation Tools that Provide More Details than the Default", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Yihui\", \"Xie\", role = \"aut\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Michael\", \"Lawrence\", role = \"ctb\"), person(\"Thomas\", \"Kluyver\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Adam\", \"Ryczkowski\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Michel\", \"Lang\", role = \"ctb\"), person(\"Karolis\", \"Koncevičius\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Parsing and evaluation tools that make it easy to recreate the command line behaviour of R.", + "License": "MIT + file LICENSE", + "URL": "https://evaluate.r-lib.org/, https://github.com/r-lib/evaluate", + "BugReports": "https://github.com/r-lib/evaluate/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "covr", + "ggplot2 (>= 3.3.6)", + "lattice", + "methods", + "pkgload", + "ragg (>= 1.4.0)", + "rlang (>= 1.1.5)", + "knitr", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "94cf2c54237f6841cee68e3ba4ab5a14" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Yihui Xie [aut] (ORCID: ), Michael Lawrence [ctb], Thomas Kluyver [ctb], Jeroen Ooms [ctb], Barret Schloerke [ctb], Adam Ryczkowski [ctb], Hiroaki Yutani [ctb], Michel Lang [ctb], Karolis Koncevičius [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "farver": { "Package": "farver", "Version": "2.1.2", "Source": "Repository", - "Repository": "CRAN", - "Hash": "680887028577f3fa2a81e410ed0d6e42" + "Type": "Package", + "Title": "High Performance Colour Space Manipulation", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Berendea\", \"Nicolae\", role = \"aut\", comment = \"Author of the ColorSpace C++ library\"), person(\"Romain\", \"François\", , \"romain@purrple.cat\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The encoding of colour can be handled in many different ways, using different colour spaces. As different colour spaces have different uses, efficient conversion between these representations are important. The 'farver' package provides a set of functions that gives access to very fast colour space conversion and comparisons implemented in C++, and offers speed improvements over the 'convertColor' function in the 'grDevices' package.", + "License": "MIT + file LICENSE", + "URL": "https://farver.data-imaginist.com, https://github.com/thomasp85/farver", + "BugReports": "https://github.com/thomasp85/farver/issues", + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (), Berendea Nicolae [aut] (Author of the ColorSpace C++ library), Romain François [aut] (), Posit, PBC [cph, fnd]", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "fastmap": { "Package": "fastmap", "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" + "Title": "Fast Data Structures", + "Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\") )", + "Description": "Fast implementation of data structures, including a key-value store, stack, and queue. Environments are commonly used as key-value stores in R, but every time a new key is used, it is added to R's global symbol table, causing a small amount of memory leakage. This can be problematic in cases where many different keys are used. Fastmap avoids this memory leak issue by implementing the map using data structures in C++.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat (>= 2.1.1)" + ], + "URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap", + "BugReports": "https://github.com/r-lib/fastmap/issues", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "fontawesome": { "Package": "fontawesome", "Version": "0.5.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "htmltools", - "rlang" + "Type": "Package", + "Title": "Easily Work with 'Font Awesome' Icons", + "Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown' documents and 'Shiny' apps. These icons can be inserted into HTML content through inline 'SVG' tags or 'i' tags. There is also a utility function for exporting 'Font Awesome' icons as 'PNG' images for those situations where raster graphics are needed.", + "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome font\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/fontawesome, https://rstudio.github.io/fontawesome/", + "BugReports": "https://github.com/rstudio/fontawesome/issues", + "Encoding": "UTF-8", + "ByteCompile": "true", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "rlang (>= 1.0.6)", + "htmltools (>= 0.5.1.1)" ], - "Hash": "bd1297f9b5b1fc1372d19e2c4cd82215" + "Suggests": [ + "covr", + "dplyr (>= 1.0.8)", + "gt (>= 0.9.0)", + "knitr (>= 1.31)", + "testthat (>= 3.0.0)", + "rsvg" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Richard Iannone [aut, cre] (), Christophe Dervieux [ctb] (), Winston Chang [ctb], Dave Gandy [ctb, cph] (Font-Awesome font), Posit Software, PBC [cph, fnd]", + "Maintainer": "Richard Iannone ", + "Repository": "CRAN" }, "fs": { "Package": "fs", "Version": "2.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Cross-Platform File System Operations Based on 'libuv'", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", , \"jeroenooms@gmail.com\", role = \"cre\"), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A cross-platform interface to file system operations, built on top of the 'libuv' C library.", + "License": "MIT + file LICENSE", + "URL": "https://fs.r-lib.org, https://github.com/r-lib/fs", + "BugReports": "https://github.com/r-lib/fs/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "methods" ], - "Hash": "09278623bca442bc53b0940ffa2f6d87" + "Suggests": [ + "covr", + "crayon", + "knitr", + "pillar (>= 1.0.0)", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "tibble (>= 1.1.0)", + "vctrs (>= 0.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "SystemRequirements": "libuv: libuv-devel (rpm) or libuv1-dev (deb). Alternatively to build the vendored libuv 'cmake' is required. GNU make.", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut], Hadley Wickham [aut], Gábor Csárdi [aut], Jeroen Ooms [cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "generics": { "Package": "generics", "Version": "0.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Common S3 Generics not Provided by Base R Methods Related to Model Fitting", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Max\", \"Kuhn\", , \"max@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", + "Description": "In order to reduce potential package dependencies and conflicts, generics provides a number of commonly used S3 generics.", + "License": "MIT + file LICENSE", + "URL": "https://generics.r-lib.org, https://github.com/r-lib/generics", + "BugReports": "https://github.com/r-lib/generics/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "methods" ], - "Hash": "4b29bf698d0c7bdb9f1e4976e7ade41d" + "Suggests": [ + "covr", + "pkgload", + "testthat (>= 3.0.0)", + "tibble", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Max Kuhn [aut], Davis Vaughan [aut], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "ggplot2": { "Package": "ggplot2", "Version": "4.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "S7", + "Title": "Create Elegant Data Visualisations Using the Grammar of Graphics", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Winston\", \"Chang\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Kohske\", \"Takahashi\", role = \"aut\"), person(\"Claus\", \"Wilke\", role = \"aut\", comment = c(ORCID = \"0000-0002-7470-9261\")), person(\"Kara\", \"Woo\", role = \"aut\", comment = c(ORCID = \"0000-0002-5125-4188\")), person(\"Hiroaki\", \"Yutani\", role = \"aut\", comment = c(ORCID = \"0000-0002-3385-7233\")), person(\"Dewey\", \"Dunnington\", role = \"aut\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Teun\", \"van den Brand\", role = \"aut\", comment = c(ORCID = \"0000-0002-9335-7468\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A system for 'declaratively' creating graphics, based on \"The Grammar of Graphics\". You provide the data, tell 'ggplot2' how to map variables to aesthetics, what graphical primitives to use, and it takes care of the details.", + "License": "MIT + file LICENSE", + "URL": "https://ggplot2.tidyverse.org, https://github.com/tidyverse/ggplot2", + "BugReports": "https://github.com/tidyverse/ggplot2/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "cli", "grDevices", "grid", - "gtable", + "gtable (>= 0.3.6)", "isoband", - "lifecycle", - "rlang", - "scales", + "lifecycle (> 1.0.1)", + "rlang (>= 1.1.0)", + "S7", + "scales (>= 1.4.0)", "stats", - "vctrs", - "withr" + "vctrs (>= 0.6.0)", + "withr (>= 2.5.0)" + ], + "Suggests": [ + "broom", + "covr", + "dplyr", + "ggplot2movies", + "hexbin", + "Hmisc", + "hms", + "knitr", + "mapproj", + "maps", + "MASS", + "mgcv", + "multcomp", + "munsell", + "nlme", + "profvis", + "quantreg", + "quarto", + "ragg (>= 1.2.6)", + "RColorBrewer", + "roxygen2", + "rpart", + "sf (>= 0.7-3)", + "svglite (>= 2.1.2)", + "testthat (>= 3.1.5)", + "tibble", + "vdiffr (>= 1.0.6)", + "xml2" ], - "Hash": "98520fe6b2745c466dca8e46aaa86242" + "Enhances": [ + "sp" + ], + "VignetteBuilder": "quarto", + "Config/Needs/website": "ggtext, tidyr, forcats, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "Collate": "'ggproto.R' 'ggplot-global.R' 'aaa-.R' 'aes-colour-fill-alpha.R' 'aes-evaluation.R' 'aes-group-order.R' 'aes-linetype-size-shape.R' 'aes-position.R' 'all-classes.R' 'compat-plyr.R' 'utilities.R' 'aes.R' 'annotation-borders.R' 'utilities-checks.R' 'legend-draw.R' 'geom-.R' 'annotation-custom.R' 'annotation-logticks.R' 'scale-type.R' 'layer.R' 'make-constructor.R' 'geom-polygon.R' 'geom-map.R' 'annotation-map.R' 'geom-raster.R' 'annotation-raster.R' 'annotation.R' 'autolayer.R' 'autoplot.R' 'axis-secondary.R' 'backports.R' 'bench.R' 'bin.R' 'coord-.R' 'coord-cartesian-.R' 'coord-fixed.R' 'coord-flip.R' 'coord-map.R' 'coord-munch.R' 'coord-polar.R' 'coord-quickmap.R' 'coord-radial.R' 'coord-sf.R' 'coord-transform.R' 'data.R' 'docs_layer.R' 'facet-.R' 'facet-grid-.R' 'facet-null.R' 'facet-wrap.R' 'fortify-map.R' 'fortify-models.R' 'fortify-spatial.R' 'fortify.R' 'stat-.R' 'geom-abline.R' 'geom-rect.R' 'geom-bar.R' 'geom-tile.R' 'geom-bin2d.R' 'geom-blank.R' 'geom-boxplot.R' 'geom-col.R' 'geom-path.R' 'geom-contour.R' 'geom-point.R' 'geom-count.R' 'geom-crossbar.R' 'geom-segment.R' 'geom-curve.R' 'geom-defaults.R' 'geom-ribbon.R' 'geom-density.R' 'geom-density2d.R' 'geom-dotplot.R' 'geom-errorbar.R' 'geom-freqpoly.R' 'geom-function.R' 'geom-hex.R' 'geom-histogram.R' 'geom-hline.R' 'geom-jitter.R' 'geom-label.R' 'geom-linerange.R' 'geom-pointrange.R' 'geom-quantile.R' 'geom-rug.R' 'geom-sf.R' 'geom-smooth.R' 'geom-spoke.R' 'geom-text.R' 'geom-violin.R' 'geom-vline.R' 'ggplot2-package.R' 'grob-absolute.R' 'grob-dotstack.R' 'grob-null.R' 'grouping.R' 'properties.R' 'margins.R' 'theme-elements.R' 'guide-.R' 'guide-axis.R' 'guide-axis-logticks.R' 'guide-axis-stack.R' 'guide-axis-theta.R' 'guide-legend.R' 'guide-bins.R' 'guide-colorbar.R' 'guide-colorsteps.R' 'guide-custom.R' 'guide-none.R' 'guide-old.R' 'guides-.R' 'guides-grid.R' 'hexbin.R' 'import-standalone-obj-type.R' 'import-standalone-types-check.R' 'labeller.R' 'labels.R' 'layer-sf.R' 'layout.R' 'limits.R' 'performance.R' 'plot-build.R' 'plot-construction.R' 'plot-last.R' 'plot.R' 'position-.R' 'position-collide.R' 'position-dodge.R' 'position-dodge2.R' 'position-identity.R' 'position-jitter.R' 'position-jitterdodge.R' 'position-nudge.R' 'position-stack.R' 'quick-plot.R' 'reshape-add-margins.R' 'save.R' 'scale-.R' 'scale-alpha.R' 'scale-binned.R' 'scale-brewer.R' 'scale-colour.R' 'scale-continuous.R' 'scale-date.R' 'scale-discrete-.R' 'scale-expansion.R' 'scale-gradient.R' 'scale-grey.R' 'scale-hue.R' 'scale-identity.R' 'scale-linetype.R' 'scale-linewidth.R' 'scale-manual.R' 'scale-shape.R' 'scale-size.R' 'scale-steps.R' 'scale-view.R' 'scale-viridis.R' 'scales-.R' 'stat-align.R' 'stat-bin.R' 'stat-summary-2d.R' 'stat-bin2d.R' 'stat-bindot.R' 'stat-binhex.R' 'stat-boxplot.R' 'stat-connect.R' 'stat-contour.R' 'stat-count.R' 'stat-density-2d.R' 'stat-density.R' 'stat-ecdf.R' 'stat-ellipse.R' 'stat-function.R' 'stat-identity.R' 'stat-manual.R' 'stat-qq-line.R' 'stat-qq.R' 'stat-quantilemethods.R' 'stat-sf-coordinates.R' 'stat-sf.R' 'stat-smooth-methods.R' 'stat-smooth.R' 'stat-sum.R' 'stat-summary-bin.R' 'stat-summary-hex.R' 'stat-summary.R' 'stat-unique.R' 'stat-ydensity.R' 'summarise-plot.R' 'summary.R' 'theme.R' 'theme-defaults.R' 'theme-current.R' 'theme-sub.R' 'utilities-break.R' 'utilities-grid.R' 'utilities-help.R' 'utilities-patterns.R' 'utilities-resolution.R' 'utilities-tidy-eval.R' 'zxx.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Lionel Henry [aut], Thomas Lin Pedersen [aut, cre] (ORCID: ), Kohske Takahashi [aut], Claus Wilke [aut] (ORCID: ), Kara Woo [aut] (ORCID: ), Hiroaki Yutani [aut] (ORCID: ), Dewey Dunnington [aut] (ORCID: ), Teun van den Brand [aut] (ORCID: ), Posit, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "ggspatial": { "Package": "ggspatial", "Version": "1.1.10", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Spatial Data Framework for ggplot2", + "Authors@R": "c( person(\"Dewey\", \"Dunnington\", email = \"dewey@fishandwhistle.net\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-9415-4582\") ), person(\"Brent\", \"Thorne\", role = \"ctb\", comment = c(ORCID = \"0000-0002-1099-3857\")), person(\"Diego\", \"Hernangómez\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8457-4658\")) )", + "Maintainer": "Dewey Dunnington ", + "Description": "Spatial data plus the power of the ggplot2 framework means easier mapping when input data are already in the form of spatial objects.", + "License": "GPL-3", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ + "sf", + "ggplot2 (>= 3.0.0)", + "rosm (>= 0.2)", "abind", - "ggplot2", - "glue", - "grid", "methods", - "rlang", - "rosm", - "scales", - "sf", "tibble", - "tidyr" + "scales", + "tidyr", + "rlang", + "grid", + "glue" + ], + "Suggests": [ + "prettymapr", + "knitr", + "rmarkdown", + "sp", + "raster", + "terra", + "testthat (>= 3.0.0)", + "dplyr", + "withr", + "ggrepel", + "stars", + "covr", + "vdiffr", + "lwgeom" ], - "Hash": "a065e21174bbce1866deff1e30d26ca5" + "URL": "https://paleolimbot.github.io/ggspatial/, https://github.com/paleolimbot/ggspatial", + "BugReports": "https://github.com/paleolimbot/ggspatial/issues", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Dewey Dunnington [aut, cre] (ORCID: ), Brent Thorne [ctb] (ORCID: ), Diego Hernangómez [ctb] (ORCID: )", + "Repository": "CRAN" }, "glue": { "Package": "glue", "Version": "1.8.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Interpreted String Literals", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "An implementation of interpreted string literals, inspired by Python's Literal String Interpolation and Docstrings and Julia's Triple-Quoted String Literals .", + "License": "MIT + file LICENSE", + "URL": "https://glue.tidyverse.org/, https://github.com/tidyverse/glue", + "BugReports": "https://github.com/tidyverse/glue/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "methods" ], - "Hash": "f8122473e9a49e00d0642f78235ca5e3" + "Suggests": [ + "crayon", + "DBI (>= 1.2.0)", + "dplyr", + "knitr", + "rlang", + "rmarkdown", + "RSQLite", + "testthat (>= 3.2.0)", + "vctrs (>= 0.3.0)", + "waldo (>= 0.5.3)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "bench, forcats, ggbeeswarm, ggplot2, R.utils, rprintf, tidyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2026-04-16", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "gtable": { "Package": "gtable", "Version": "0.3.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Arrange 'Grobs' in Tables", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to make it easier to work with \"tables\" of 'grobs'. The 'gtable' package defines a 'gtable' grob class that specifies a grid along with a list of grobs and their placement in the grid. Further the package makes it easy to manipulate and combine 'gtable' objects so that complex compositions can be built up sequentially.", + "License": "MIT + file LICENSE", + "URL": "https://gtable.r-lib.org, https://github.com/r-lib/gtable", + "BugReports": "https://github.com/r-lib/gtable/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ "cli", "glue", "grid", "lifecycle", - "rlang", + "rlang (>= 1.1.0)", "stats" ], - "Hash": "de949855009e2d4d0e52a844e30617ae" + "Suggests": [ + "covr", + "ggplot2", + "knitr", + "profvis", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2024-10-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Thomas Lin Pedersen [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "highr": { "Package": "highr", "Version": "0.12", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "xfun" + "Type": "Package", + "Title": "Syntax Highlighting for R Source Code", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Yixuan\", \"Qiu\", role = \"aut\"), person(\"Christopher\", \"Gandrud\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\") )", + "Description": "Provides syntax highlighting for R source code. Currently it supports LaTeX and HTML output. Source code of other languages is supported via Andre Simon's highlight package ().", + "Depends": [ + "R (>= 3.3.0)" ], - "Hash": "2a2f862ade01a56dcbcd60944de11255" + "Imports": [ + "xfun (>= 0.18)" + ], + "Suggests": [ + "knitr", + "markdown", + "testit" + ], + "License": "GPL", + "URL": "https://github.com/yihui/highr", + "BugReports": "https://github.com/yihui/highr/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (ORCID: ), Yixuan Qiu [aut], Christopher Gandrud [ctb], Qiang Li [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "hms": { "Package": "hms", "Version": "1.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Pretty Time of Day", + "Date": "2025-10-11", + "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"R Consortium\", role = \"fnd\"), person(\"Posit Software, PBC\", role = \"fnd\", comment = c(ROR = \"03wc8by49\")) )", + "Description": "Implements an S3 class for storing and formatting time-of-day values, based on the 'difftime' class.", + "License": "MIT + file LICENSE", + "URL": "https://hms.tidyverse.org/, https://github.com/tidyverse/hms", + "BugReports": "https://github.com/tidyverse/hms/issues", + "Imports": [ "cli", "lifecycle", "methods", "pkgconfig", - "rlang", - "vctrs" + "rlang (>= 1.0.2)", + "vctrs (>= 0.3.8)" + ], + "Suggests": [ + "crayon", + "lubridate", + "pillar (>= 1.1.0)", + "testthat (>= 3.0.0)" ], - "Hash": "2799ac720626cec589478b191e48b88b" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), R Consortium [fnd], Posit Software, PBC [fnd] (ROR: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "htmltools": { "Package": "htmltools", "Version": "0.5.9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Tools for HTML", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools for HTML generation and output.", + "License": "GPL (>= 2)", + "URL": "https://github.com/rstudio/htmltools, https://rstudio.github.io/htmltools/", + "BugReports": "https://github.com/rstudio/htmltools/issues", + "Depends": [ + "R (>= 2.14.1)" + ], + "Imports": [ "base64enc", "digest", - "fastmap", + "fastmap (>= 1.1.0)", "grDevices", - "rlang", + "rlang (>= 1.0.0)", "utils" ], - "Hash": "102298e238c14eb830cc4b5edd23c3e8" + "Suggests": [ + "Cairo", + "markdown", + "ragg", + "shiny", + "testthat", + "withr" + ], + "Enhances": [ + "knitr" + ], + "Config/Needs/check": "knitr", + "Config/Needs/website": "rstudio/quillt, bench", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R' 'html_print.R' 'htmltools-package.R' 'images.R' 'known_tags.R' 'selector.R' 'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R' 'template.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "httpuv": { "Package": "httpuv", "Version": "1.6.17", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "Rcpp", - "later", + "Type": "Package", + "Title": "HTTP and WebSocket Server Library", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Hector\", \"Corrada Bravo\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Andrzej\", \"Krzemienski\", role = \"cph\", comment = \"optional.hpp\"), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file\"), person(\"Niels\", \"Provos\", role = \"cph\", comment = \"libuv subcomponent: tree.h\"), person(\"Internet Systems Consortium, Inc.\", role = \"cph\", comment = \"libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c\"), person(\"Alexander\", \"Chemeris\", role = \"cph\", comment = \"libuv subcomponent: stdint-msvc2008.h (from msinttypes)\"), person(\"Google, Inc.\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Sony Mobile Communcations AB\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Berkeley Software Design Inc.\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Kenneth\", \"MacKay\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016)\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Steve\", \"Reid\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"James\", \"Brown\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"Bob\", \"Trower\", role = \"aut\", comment = \"base64 implementation\"), person(\"Alexander\", \"Peslyak\", role = \"aut\", comment = \"MD5 implementation\"), person(\"Trantor Standard Systems\", role = \"cph\", comment = \"base64 implementation\"), person(\"Igor\", \"Sysoev\", role = \"cph\", comment = \"http-parser\") )", + "Description": "Provides low-level socket and protocol support for handling HTTP and WebSocket requests directly from within R. It is primarily intended as a building block for other packages, rather than making it particularly easy to create complete web applications using httpuv alone. httpuv is built on top of the libuv and http-parser C libraries, both of which were developed by Joyent, Inc. (See LICENSE file for libuv and http-parser license information.)", + "License": "GPL (>= 2) | file LICENSE", + "URL": "https://rstudio.github.io/httpuv/, https://github.com/rstudio/httpuv", + "BugReports": "https://github.com/rstudio/httpuv/issues", + "Depends": [ + "R (>= 2.15.1)" + ], + "Imports": [ + "later (>= 0.8.0)", "promises", + "R6", + "Rcpp (>= 1.0.7)", "utils" ], - "Hash": "4ff0297ad1cd631d57f0d30172972754" + "Suggests": [ + "callr", + "curl", + "jsonlite", + "testthat (>= 3.0.0)", + "websocket" + ], + "LinkingTo": [ + "later", + "Rcpp" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-07-01", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "GNU make, zlib", + "Collate": "'RcppExports.R' 'httpuv-package.R' 'httpuv.R' 'random_port.R' 'server.R' 'staticServer.R' 'static_paths.R' 'utils.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Winston Chang [aut, cre], Posit, PBC [cph, fnd] (ROR: ), Hector Corrada Bravo [ctb], Jeroen Ooms [ctb], Andrzej Krzemienski [cph] (optional.hpp), libuv project contributors [cph] (libuv library, see src/libuv/AUTHORS file), Joyent, Inc. and other Node contributors [cph] (libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file), Niels Provos [cph] (libuv subcomponent: tree.h), Internet Systems Consortium, Inc. [cph] (libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c), Alexander Chemeris [cph] (libuv subcomponent: stdint-msvc2008.h (from msinttypes)), Google, Inc. [cph] (libuv subcomponent: pthread-fixes.c), Sony Mobile Communcations AB [cph] (libuv subcomponent: pthread-fixes.c), Berkeley Software Design Inc. [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Kenneth MacKay [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016) [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Steve Reid [aut] (SHA-1 implementation), James Brown [aut] (SHA-1 implementation), Bob Trower [aut] (base64 implementation), Alexander Peslyak [aut] (MD5 implementation), Trantor Standard Systems [cph] (base64 implementation), Igor Sysoev [cph] (http-parser)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "httr2": { "Package": "httr2", "Version": "1.3.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", - "curl", + "Title": "Perform HTTP Requests and Process the Responses", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Maximilian\", \"Girlich\", role = \"ctb\") )", + "Description": "Tools for creating and modifying HTTP requests, then performing them and processing the results. 'httr2' is a modern re-imagining of 'httr' that uses a pipe-based interface and solves more of the problems that API wrapping packages face.", + "License": "MIT + file LICENSE", + "URL": "https://httr2.r-lib.org, https://github.com/r-lib/httr2", + "BugReports": "https://github.com/r-lib/httr2/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "curl (>= 6.4.0)", "glue", "lifecycle", "magrittr", "openssl", - "rlang", - "vctrs", + "R6", + "rlang (>= 1.3.0)", + "vctrs (>= 0.6.3)", "withr" ], - "Hash": "f4d796ba71b073f7bc95da858caded00" + "Suggests": [ + "askpass", + "bench", + "clipr", + "covr", + "digest", + "docopt", + "httpuv", + "jose", + "jsonlite", + "knitr", + "later (>= 1.4.0)", + "nanonext", + "otel (>= 0.2.0)", + "otelsdk (>= 0.2.0)", + "paws.common (>= 0.8.0)", + "promises", + "rappdirs", + "rmarkdown", + "testthat (>= 3.1.8)", + "tibble", + "webfakes (>= 1.4.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "resp-stream, req-perform", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], Maximilian Girlich [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "isoband": { "Package": "isoband", "Version": "0.3.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Generate Isolines and Isobands from Regularly Spaced Elevation Grids", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Claus O.\", \"Wilke\", , \"wilke@austin.utexas.edu\", role = \"aut\", comment = c(\"Original author\", ORCID = \"0000-0002-7470-9261\")), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A fast C++ implementation to generate contour lines (isolines) and contour polygons (isobands) from regularly spaced grids containing elevation data.", + "License": "MIT + file LICENSE", + "URL": "https://isoband.r-lib.org, https://github.com/r-lib/isoband", + "BugReports": "https://github.com/r-lib/isoband/issues", + "Imports": [ "cli", - "cpp11", "grid", "rlang", "utils" ], - "Hash": "0f9a864bbd7ce0232ad05cb76249cc1a" + "Suggests": [ + "covr", + "ggplot2", + "knitr", + "magick", + "bench", + "rmarkdown", + "sf", + "testthat (>= 3.0.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-12-05", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/build/compilation-database": "true", + "LinkingTo": [ + "cpp11" + ], + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut] (ORCID: ), Claus O. Wilke [aut] (Original author, ORCID: ), Thomas Lin Pedersen [aut, cre] (ORCID: ), Posit, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "jpeg": { "Package": "jpeg", "Version": "0.1-11", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Read and write JPEG images", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.org\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" ], - "Hash": "c23ab23c370d1ce3a7a80d8c0bdfa105" + "Description": "This package provides an easy and simple way to read, write and display bitmap images stored in the JPEG format. It can read and write both files and in-memory raw vectors.", + "License": "GPL-2 | GPL-3", + "SystemRequirements": "libjpeg", + "URL": "https://www.rforge.net/jpeg/", + "BugReports": "https://github.com/s-u/jpeg/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN" }, "jquerylib": { "Package": "jquerylib", "Version": "0.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Obtain 'jQuery' as an HTML Dependency Object", + "Authors@R": "c( person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"), person(family = \"RStudio\", role = \"cph\"), person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\") )", + "Description": "Obtain any major version of 'jQuery' () and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown'). Most R users don't need to use this package directly, but other R packages (e.g. 'shiny', 'rmarkdown', etc.) depend on this package to avoid bundling redundant copies of 'jQuery'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "RoxygenNote": "7.0.2", + "Imports": [ "htmltools" ], - "Hash": "5aab57a3bd297eee1c1d862735972182" + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], RStudio [cph], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "jsonlite": { "Package": "jsonlite", "Version": "2.0.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "A Simple and Robust JSON Parser and Generator for R", + "License": "MIT + file LICENSE", + "Depends": [ "methods" ], - "Hash": "b0776f526d36d8bd4a3344a88fe165c4" + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Duncan\", \"Temple Lang\", role = \"ctb\"), person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))", + "URL": "https://jeroen.r-universe.dev/jsonlite https://arxiv.org/abs/1403.2805", + "BugReports": "https://github.com/jeroen/jsonlite/issues", + "Maintainer": "Jeroen Ooms ", + "VignetteBuilder": "knitr, R.rsp", + "Description": "A reasonably fast JSON parser and generator, optimized for statistical data and the web. Offers simple, flexible tools for working with JSON in R, and is particularly powerful for building pipelines and interacting with a web API. The implementation is based on the mapping described in the vignette (Ooms, 2014). In addition to converting JSON data from/to R objects, 'jsonlite' contains functions to stream, validate, and prettify JSON data. The unit tests included with the package verify that all edge cases are encoded and decoded consistently for use with dynamic data in systems and applications.", + "Suggests": [ + "httr", + "vctrs", + "testthat", + "knitr", + "rmarkdown", + "R.rsp", + "sf" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Duncan Temple Lang [ctb], Lloyd Hilaiel [cph] (author of bundled libyajl)", + "Repository": "CRAN" }, "knitr": { "Package": "knitr", "Version": "1.51", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "evaluate", - "highr", + "Type": "Package", + "Title": "A General-Purpose Package for Dynamic Report Generation in R", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Abhraneel\", \"Sarma\", role = \"ctb\"), person(\"Adam\", \"Vogt\", role = \"ctb\"), person(\"Alastair\", \"Andrew\", role = \"ctb\"), person(\"Alex\", \"Zvoleff\", role = \"ctb\"), person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"), person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"), person(\"Aron\", \"Atkins\", role = \"ctb\"), person(\"Aaron\", \"Wolen\", role = \"ctb\"), person(\"Ashley\", \"Manton\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")), person(\"Ben\", \"Baumer\", role = \"ctb\"), person(\"Brian\", \"Diggs\", role = \"ctb\"), person(\"Brian\", \"Zhang\", role = \"ctb\"), person(\"Bulat\", \"Yapparov\", role = \"ctb\"), person(\"Cassio\", \"Pereira\", role = \"ctb\"), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person(\"David\", \"Hall\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", role = \"ctb\"), person(\"David\", \"Robinson\", role = \"ctb\"), person(\"Doug\", \"Hemken\", role = \"ctb\"), person(\"Duncan\", \"Murdoch\", role = \"ctb\"), person(\"Elio\", \"Campitelli\", role = \"ctb\"), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Emily\", \"Riederer\", role = \"ctb\"), person(\"Fabian\", \"Hirschmann\", role = \"ctb\"), person(\"Fitch\", \"Simeon\", role = \"ctb\"), person(\"Forest\", \"Fang\", role = \"ctb\"), person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"), person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"), person(\"Gregoire\", \"Detrez\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Hao\", \"Zhu\", role = \"ctb\"), person(\"Heewon\", \"Jeon\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Hodges\", \"Daniel\", role = \"ctb\"), person(\"Jacob\", \"Bien\", role = \"ctb\"), person(\"Jake\", \"Burkhead\", role = \"ctb\"), person(\"James\", \"Manton\", role = \"ctb\"), person(\"Jared\", \"Lander\", role = \"ctb\"), person(\"Jason\", \"Punyon\", role = \"ctb\"), person(\"Javier\", \"Luraschi\", role = \"ctb\"), person(\"Jeff\", \"Arnold\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", role = \"ctb\"), person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"), person(\"Jeremy\", \"Stephens\", role = \"ctb\"), person(\"Jim\", \"Hester\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Johannes\", \"Ranke\", role = \"ctb\"), person(\"John\", \"Honaker\", role = \"ctb\"), person(\"John\", \"Muschelli\", role = \"ctb\"), person(\"Jonathan\", \"Keane\", role = \"ctb\"), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Johan\", \"Toloe\", role = \"ctb\"), person(\"Jonathan\", \"Sidi\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Julien\", \"Barnier\", role = \"ctb\"), person(\"Kaiyin\", \"Zhong\", role = \"ctb\"), person(\"Kamil\", \"Slowikowski\", role = \"ctb\"), person(\"Karl\", \"Forner\", role = \"ctb\"), person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"), person(\"Kirill\", \"Mueller\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Lorenz\", \"Walthert\", role = \"ctb\"), person(\"Lucas\", \"Gallindo\", role = \"ctb\"), person(\"Marius\", \"Hofert\", role = \"ctb\"), person(\"Martin\", \"Modrák\", role = \"ctb\"), person(\"Michael\", \"Chirico\", role = \"ctb\"), person(\"Michael\", \"Friendly\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", role = \"ctb\"), person(\"Michel\", \"Kuhlmann\", role = \"ctb\"), person(\"Miller\", \"Patrick\", role = \"ctb\"), person(\"Nacho\", \"Caballero\", role = \"ctb\"), person(\"Nick\", \"Salkowski\", role = \"ctb\"), person(\"Niels Richard\", \"Hansen\", role = \"ctb\"), person(\"Noam\", \"Ross\", role = \"ctb\"), person(\"Obada\", \"Mahdi\", role = \"ctb\"), person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")), person(\"Pedro\", \"Faria\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\"), person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"), person(\"Rodrigo\", \"Copetti\", role = \"ctb\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Ruaridh\", \"Williamson\", role = \"ctb\"), person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")), person(\"Scott\", \"Kostyshak\", role = \"ctb\"), person(\"Sebastian\", \"Meyer\", role = \"ctb\"), person(\"Sietse\", \"Brouwer\", role = \"ctb\"), person(c(\"Simon\", \"de\"), \"Bernard\", role = \"ctb\"), person(\"Sylvain\", \"Rousseau\", role = \"ctb\"), person(\"Taiyun\", \"Wei\", role = \"ctb\"), person(\"Thibaut\", \"Assus\", role = \"ctb\"), person(\"Thibaut\", \"Lamadon\", role = \"ctb\"), person(\"Thomas\", \"Leeper\", role = \"ctb\"), person(\"Tim\", \"Mastny\", role = \"ctb\"), person(\"Tom\", \"Torsney-Weir\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = \"ctb\"), person(\"Viktoras\", \"Veitas\", role = \"ctb\"), person(\"Weicheng\", \"Zhu\", role = \"ctb\"), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Zachary\", \"Foster\", role = \"ctb\"), person(\"Zhian N.\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a general-purpose tool for dynamic report generation in R using Literate Programming techniques.", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "evaluate (>= 0.15)", + "highr (>= 0.11)", "methods", "tools", - "xfun", - "yaml" + "xfun (>= 0.52)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "bslib", + "DBI (>= 0.4-1)", + "digest", + "formatR", + "gifski", + "gridSVG", + "htmlwidgets (>= 0.7)", + "jpeg", + "JuliaCall (>= 0.11.1)", + "magick", + "litedown", + "markdown (>= 1.3)", + "otel", + "otelsdk", + "png", + "ragg", + "reticulate (>= 1.4)", + "rgl (>= 0.95.1201)", + "rlang", + "rmarkdown", + "sass", + "showtext", + "styler (>= 1.2.0)", + "targets (>= 0.6.0)", + "testit", + "tibble", + "tikzDevice (>= 0.10)", + "tinytex (>= 0.56)", + "webshot", + "rstudioapi", + "svglite" ], - "Hash": "27682babb50f03b6eb7939ea69ec79ca" + "License": "GPL", + "URL": "https://yihui.org/knitr/", + "BugReports": "https://github.com/yihui/knitr/issues", + "Encoding": "UTF-8", + "VignetteBuilder": "litedown, knitr", + "SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).", + "Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'otel.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (ORCID: , URL: https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (ORCID: ), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (ORCID: ), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (ORCID: ), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "labeling": { "Package": "labeling", "Version": "0.4.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "graphics", - "stats" + "Type": "Package", + "Title": "Axis Labeling", + "Date": "2023-08-29", + "Author": "Justin Talbot,", + "Maintainer": "Nuno Sempere ", + "Description": "Functions which provide a range of axis labeling algorithms.", + "License": "MIT + file LICENSE | Unlimited", + "Collate": "'labeling.R'", + "NeedsCompilation": "no", + "Imports": [ + "stats", + "graphics" ], - "Hash": "b64ec208ac5bc1852b285f665d6368b3" + "Repository": "CRAN" }, "later": { "Package": "later", "Version": "1.4.8", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", + "Type": "Package", + "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", + "License": "MIT + file LICENSE", + "URL": "https://later.r-lib.org, https://github.com/r-lib/later", + "BugReports": "https://github.com/r-lib/later/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "Rcpp (>= 1.0.10)", "rlang" ], - "Hash": "824c180e69b9be79ab96a985e233c470" + "Suggests": [ + "knitr", + "nanonext", + "promises", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-07-18", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Maintainer": "Charlie Gao ", + "Repository": "CRAN" }, "lifecycle": { "Package": "lifecycle", "Version": "1.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "rlang" + "Title": "Manage the Life Cycle of your Package Functions", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Manage the life cycle of your exported functions with shared conventions, documentation badges, and user-friendly deprecation warnings.", + "License": "MIT + file LICENSE", + "URL": "https://lifecycle.r-lib.org/, https://github.com/r-lib/lifecycle", + "BugReports": "https://github.com/r-lib/lifecycle/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "rlang (>= 1.1.0)" ], - "Hash": "36dbfe4fba6c064db50a671a90297c85" + "Suggests": [ + "covr", + "knitr", + "lintr (>= 3.1.0)", + "rmarkdown", + "testthat (>= 3.0.1)", + "tibble", + "tidyverse", + "tools", + "vctrs", + "withr", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, usethis", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "magrittr": { "Package": "magrittr", "Version": "2.0.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "A Forward-Pipe Operator for R", + "Authors@R": "c( person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"), comment = \"Original author and creator of magrittr\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"cre\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. There is flexible support for the type of right-hand side expressions. For more information, see package vignette. To quote Rene Magritte, \"Ceci n'est pas un pipe.\"", + "License": "MIT + file LICENSE", + "URL": "https://magrittr.tidyverse.org, https://github.com/tidyverse/magrittr", + "BugReports": "https://github.com/tidyverse/magrittr/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat" ], - "Hash": "665e77ab6e5f37a7913226d40b324e37" + "VignetteBuilder": "knitr", + "ByteCompile": "Yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of magrittr), Hadley Wickham [aut], Lionel Henry [cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "memoise": { "Package": "memoise", "Version": "2.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cachem", - "rlang" + "Title": "'Memoisation' of Functions", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Jim\", family = \"Hester\", role = \"aut\"), person(given = \"Winston\", family = \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"), person(given = \"Kirill\", family = \"Müller\", role = \"aut\", email = \"krlmlr+r@mailbox.org\"), person(given = \"Daniel\", family = \"Cook\", role = \"aut\", email = \"danielecook@gmail.com\"), person(given = \"Mark\", family = \"Edmondson\", role = \"ctb\", email = \"r@sunholo.com\"))", + "Description": "Cache the results of a function so that when you call it again with the same arguments it returns the previously computed value.", + "License": "MIT + file LICENSE", + "URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise", + "BugReports": "https://github.com/r-lib/memoise/issues", + "Imports": [ + "rlang (>= 0.4.10)", + "cachem" ], - "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" + "Suggests": [ + "digest", + "aws.s3", + "covr", + "googleAuthR", + "googleCloudStorageR", + "httr", + "testthat" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill Müller [aut], Daniel Cook [aut], Mark Edmondson [ctb]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" }, "mime": { "Package": "mime", "Version": "0.13", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Map Filenames to MIME Types", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"Beilei\", \"Bian\", role = \"ctb\") )", + "Description": "Guesses the MIME type from a filename extension using the data derived from /etc/mime.types in UNIX-type systems.", + "Imports": [ "tools" ], - "Hash": "0ec19f34c72fab674d8f2b4b1c6410e1" + "License": "GPL", + "URL": "https://github.com/yihui/mime", + "BugReports": "https://github.com/yihui/mime/issues", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre] (, https://yihui.org), Jeffrey Horner [ctb], Beilei Bian [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "noctua": { "Package": "noctua", "Version": "2.6.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "DBI", - "R", - "data.table", + "Type": "Package", + "Title": "Connect to 'AWS Athena' using R 'AWS SDK' 'paws' ('DBI' Interface)", + "Authors@R": "person(\"Dyfan\", \"Jones\", email=\"dyfan.r.jones@gmail.com\", role= c(\"aut\", \"cre\"))", + "Description": "Designed to be compatible with the 'R' package 'DBI' (Database Interface) when connecting to Amazon Web Service ('AWS') Athena . To do this the 'R' 'AWS' Software Development Kit ('SDK') 'paws' is used as a driver.", + "Imports": [ + "data.table (>= 1.12.4)", + "DBI (>= 0.7)", "methods", - "paws", + "paws (>= 0.2.0)", "stats", "utils", - "uuid" + "uuid (>= 0.1-4)" + ], + "Suggests": [ + "arrow", + "bit64", + "dplyr (>= 1.0.0)", + "dbplyr (>= 2.3.3)", + "testthat", + "tibble", + "vroom (>= 1.2.0)", + "covr", + "knitr", + "rmarkdown", + "jsonify", + "jsonlite" ], - "Hash": "15471c0eaafcb7f2a4dabc983ea71112" + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 3.2.0)" + ], + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "URL": "https://dyfanjones.github.io/noctua/, https://github.com/DyfanJones/noctua", + "BugReports": "https://github.com/DyfanJones/noctua/issues", + "Collate": "'utils.R' 'dplyr_integration.R' 'noctua.R' 'Driver.R' 'Connection.R' 'DataTypes.R' 'File_Parser.R' 'Options.R' 'fetch_utils.R' 'Result.R' 'Table.R' 'View.R' 'athena_low_api.R' 'column_parser.R' 'sql_translate_utils.R' 'sql_translate_env.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Dyfan Jones [aut, cre]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "openssl": { "Package": "openssl", "Version": "2.4.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Toolkit for Encryption, Signatures and Certificates Based on OpenSSL", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Oliver\", \"Keyes\", role = \"ctb\"))", + "Description": "Bindings to OpenSSL libssl and libcrypto, plus custom SSH key parsers. Supports RSA, DSA and EC curves P-256, P-384, P-521, and curve25519. Cryptographic signatures can either be created and verified manually or via x509 certificates. AES can be used in cbc, ctr or gcm mode for symmetric encryption; RSA for asymmetric (public key) encryption or EC for Diffie Hellman. High-level envelope functions combine RSA and AES for encrypting arbitrary sized data. Other utilities include key generators, hash functions (md5, sha1, sha256, etc), base64 encoder, a secure random number generator, and 'bignum' math methods for manually performing crypto calculations on large multibyte integers.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/openssl", + "BugReports": "https://github.com/jeroen/openssl/issues", + "SystemRequirements": "OpenSSL >= 1.0.2", + "VignetteBuilder": "knitr", + "Imports": [ "askpass" ], - "Hash": "6994d1c3ea954f29de6aeca5da95c99d" + "Suggests": [ + "curl", + "testthat (>= 2.1.0)", + "digest", + "knitr", + "rmarkdown", + "jsonlite", + "jose", + "sodium" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Oliver Keyes [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "openxlsx": { "Package": "openxlsx", "Version": "4.2.8.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", + "Type": "Package", + "Title": "Read, Write and Edit xlsx Files", + "Date": "2025-10-30", + "Authors@R": "c(person(given = \"Philipp\", family = \"Schauberger\", role = \"aut\", email = \"philipp@schauberger.co.at\"), person(given = \"Alexander\", family = \"Walker\", role = \"aut\", email = \"Alexander.Walker1989@gmail.com\"), person(given = \"Luca\", family = \"Braglia\", role = \"ctb\"), person(given = \"Joshua\", family = \"Sturm\", role = \"ctb\"), person(given = \"Jan Marvin\", family = \"Garbuszus\", role = c(\"ctb\", \"cre\"), email = \"jan.garbuszus@ruhr-uni-bochum.de\"), person(given = \"Jordan Mark\", family = \"Barbone\", role = \"ctb\", email = \"jmbarbone@gmail.com\", comment = c(ORCID = \"0000-0001-9788-3628\")), person(given = \"David\", family = \"Zimmermann\", role = \"ctb\", email = \"david_j_zimmermann@hotmail.com\"), person(given = \"Reinhold\", family = \"Kainhofer\", role = \"ctb\", email = \"reinhold@kainhofer.com\"))", + "Description": "Simplifies the creation of Excel .xlsx files by providing a high level interface to writing, styling and editing worksheets. Through the use of 'Rcpp', read/write times are comparable to the 'xlsx' and 'XLConnect' packages with the added benefit of removing the dependency on Java.", + "License": "MIT + file LICENSE", + "URL": "https://ycphs.github.io/openxlsx/index.html, https://github.com/ycphs/openxlsx", + "BugReports": "https://github.com/ycphs/openxlsx/issues", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ "grDevices", "methods", + "Rcpp", "stats", "stringi", "utils", "zip" ], - "Hash": "a1565bd9ee11620aeea591cc037b3aa1" + "Suggests": [ + "curl", + "formula.tools", + "knitr", + "rmarkdown", + "testthat" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "Collate": "'CommentClass.R' 'HyperlinkClass.R' 'RcppExports.R' 'class_definitions.R' 'StyleClass.R' 'WorkbookClass.R' 'asserts.R' 'baseXML.R' 'borderFunctions.R' 'build_workbook.R' 'chartsheet_class.R' 'conditional_formatting.R' 'data-fontSizeLookupTables.R' 'helperFunctions.R' 'loadWorkbook.R' 'onUnload.R' 'openXL.R' 'openxlsx-package.R' 'openxlsx.R' 'openxlsxCoerce.R' 'readWorkbook.R' 'setWindowSize.R' 'sheet_data_class.R' 'utils.R' 'workbook_column_widths.R' 'workbook_read_workbook.R' 'workbook_write_data.R' 'worksheet_class.R' 'wrappers.R' 'writeData.R' 'writeDataTable.R' 'writexlsx.R' 'zzz.R'", + "LazyData": "true", + "NeedsCompilation": "yes", + "Author": "Philipp Schauberger [aut], Alexander Walker [aut], Luca Braglia [ctb], Joshua Sturm [ctb], Jan Marvin Garbuszus [ctb, cre], Jordan Mark Barbone [ctb] (ORCID: ), David Zimmermann [ctb], Reinhold Kainhofer [ctb]", + "Maintainer": "Jan Marvin Garbuszus ", + "Repository": "CRAN" }, "otel": { "Package": "otel", "Version": "0.2.0", "Source": "Repository", - "Repository": "https://packagemanager.posit.co/cran/__linux__/jammy/2026-07-10", - "Requirements": [ - "R" + "Title": "OpenTelemetry R API", + "Authors@R": "person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "High-quality, ubiquitous, and portable telemetry to enable effective observability. OpenTelemetry is a collection of tools, APIs, and SDKs used to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior. This package implements the OpenTelemetry API: . Use this package as a dependency if you want to instrument your R package for OpenTelemetry.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "cli", + "glue", + "jsonlite", + "otelsdk", + "processx", + "shiny", + "spelling", + "testthat (>= 3.0.0)", + "utils", + "withr" ], - "Hash": "627d6993db1043703c0b084fa432f21f" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "URL": "https://otel.r-lib.org, https://github.com/r-lib/otel", + "Additional_repositories": "https://github.com/r-lib/otelsdk/releases/download/devel", + "BugReports": "https://github.com/r-lib/otel/issues", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "patchwork": { "Package": "patchwork", "Version": "1.3.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cli", - "farver", - "ggplot2", - "grDevices", - "graphics", + "Type": "Package", + "Title": "The Composer of Plots", + "Authors@R": "person(given = \"Thomas Lin\", family = \"Pedersen\", role = c(\"cre\", \"aut\"), email = \"thomasp85@gmail.com\", comment = c(ORCID = \"0000-0002-5147-4711\"))", + "Maintainer": "Thomas Lin Pedersen ", + "Description": "The 'ggplot2' package provides a strong API for sequentially building up a plot, but does not concern itself with composition of multiple plots. 'patchwork' is a package that expands the API to allow for arbitrarily complex composition of plots by, among others, providing mathematical operators for combining multiple plots. Other packages that try to address this need (but with a different approach) are 'gridExtra' and 'cowplot'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Imports": [ + "ggplot2 (>= 3.0.0)", + "gtable (>= 0.3.6)", "grid", - "gtable", - "rlang", "stats", - "utils" + "grDevices", + "utils", + "graphics", + "rlang (>= 1.0.0)", + "cli", + "farver" ], - "Hash": "97fc0338dd42af55d170478dfc4c0c03" + "RoxygenNote": "7.3.2", + "URL": "https://patchwork.data-imaginist.com, https://github.com/thomasp85/patchwork", + "BugReports": "https://github.com/thomasp85/patchwork/issues", + "Suggests": [ + "knitr", + "rmarkdown", + "gridGraphics", + "gridExtra", + "ragg", + "testthat (>= 2.1.0)", + "vdiffr", + "covr", + "png", + "gt (>= 0.11.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "gifski", + "NeedsCompilation": "no", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: )", + "Repository": "CRAN" }, "paws": { "Package": "paws", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.analytics", - "paws.application.integration", - "paws.common", - "paws.compute", - "paws.cost.management", - "paws.customer.engagement", - "paws.database", - "paws.developer.tools", - "paws.end.user.computing", - "paws.machine.learning", - "paws.management", - "paws.networking", - "paws.security.identity", - "paws.storage" - ], - "Hash": "f840835e93f287e6bf79d95f536cdb2f" + "Title": "Amazon Web Services Software Development Kit", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to Amazon Web Services , including storage, database, and compute services, such as 'Simple Storage Service' ('S3'), 'DynamoDB' 'NoSQL' database, and 'Lambda' functions-as-a-service.", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.analytics (>= 0.11.0)", + "paws.application.integration (>= 0.11.0)", + "paws.common (>= 0.9.0)", + "paws.compute (>= 0.11.0)", + "paws.cost.management (>= 0.11.0)", + "paws.customer.engagement (>= 0.11.0)", + "paws.database (>= 0.11.0)", + "paws.developer.tools (>= 0.11.0)", + "paws.end.user.computing (>= 0.11.0)", + "paws.machine.learning (>= 0.11.0)", + "paws.management (>= 0.11.0)", + "paws.networking (>= 0.11.0)", + "paws.security.identity (>= 0.11.0)", + "paws.storage (>= 0.11.0)" + ], + "Suggests": [ + "testthat" + ], + "Config/roxygen2/version": "8.1.0", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.analytics": { "Package": "paws.analytics", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Analytics Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' 'analytics' services, including 'Elastic MapReduce' 'Hadoop' and 'Spark' big data service, 'Elasticsearch' search engine, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.analytics, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.common (>= 0.9.0)" ], - "Hash": "7d181b30d14ef34589ca20bbb7361fde" + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'athena_service.R' 'athena_interfaces.R' 'athena_operations.R' 'cloudsearch_service.R' 'cloudsearch_interfaces.R' 'cloudsearch_operations.R' 'cloudsearchdomain_service.R' 'cloudsearchdomain_interfaces.R' 'cloudsearchdomain_operations.R' 'datapipeline_service.R' 'datapipeline_interfaces.R' 'datapipeline_operations.R' 'datazone_service.R' 'datazone_interfaces.R' 'datazone_operations.R' 'elasticsearchservice_service.R' 'elasticsearchservice_interfaces.R' 'elasticsearchservice_operations.R' 'emr_service.R' 'emr_interfaces.R' 'emr_operations.R' 'entityresolution_service.R' 'entityresolution_interfaces.R' 'entityresolution_operations.R' 'firehose_service.R' 'firehose_interfaces.R' 'firehose_operations.R' 'glue_service.R' 'glue_interfaces.R' 'glue_operations.R' 'gluedatabrew_service.R' 'gluedatabrew_interfaces.R' 'gluedatabrew_operations.R' 'healthlake_service.R' 'healthlake_interfaces.R' 'healthlake_operations.R' 'ivs_service.R' 'ivs_interfaces.R' 'ivs_operations.R' 'ivsrealtime_service.R' 'ivsrealtime_interfaces.R' 'ivsrealtime_operations.R' 'kafka_service.R' 'kafka_interfaces.R' 'kafka_operations.R' 'kafkaconnect_service.R' 'kafkaconnect_interfaces.R' 'kafkaconnect_operations.R' 'kendra_service.R' 'kendra_interfaces.R' 'kendra_operations.R' 'kendraranking_service.R' 'kendraranking_interfaces.R' 'kendraranking_operations.R' 'kinesis_service.R' 'kinesis_interfaces.R' 'kinesis_operations.R' 'kinesisanalytics_service.R' 'kinesisanalytics_interfaces.R' 'kinesisanalytics_operations.R' 'kinesisanalyticsv2_service.R' 'kinesisanalyticsv2_interfaces.R' 'kinesisanalyticsv2_operations.R' 'mturk_service.R' 'mturk_interfaces.R' 'mturk_operations.R' 'opensearchingestion_service.R' 'opensearchingestion_interfaces.R' 'opensearchingestion_operations.R' 'opensearchservice_service.R' 'opensearchservice_interfaces.R' 'opensearchservice_operations.R' 'opensearchserviceserverless_service.R' 'opensearchserviceserverless_interfaces.R' 'opensearchserviceserverless_operations.R' 'quicksight_service.R' 'quicksight_interfaces.R' 'quicksight_operations.R' 'reexports_paws.common.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.application.integration": { "Package": "paws.application.integration", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Application Integration Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' application integration services, including 'Simple Queue Service' ('SQS') message queue, 'Simple Notification Service' ('SNS') publish/subscribe messaging, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.application.integration, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" ], - "Hash": "6cde06aeae9f2a6f193886a7756afa7f" + "Imports": [ + "paws.common (>= 0.9.0)" + ], + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'eventbridge_service.R' 'eventbridge_interfaces.R' 'eventbridge_operations.R' 'eventbridgepipes_service.R' 'eventbridgepipes_interfaces.R' 'eventbridgepipes_operations.R' 'eventbridgescheduler_service.R' 'eventbridgescheduler_interfaces.R' 'eventbridgescheduler_operations.R' 'locationservice_service.R' 'locationservice_interfaces.R' 'locationservice_operations.R' 'mq_service.R' 'mq_interfaces.R' 'mq_operations.R' 'mwaa_service.R' 'mwaa_interfaces.R' 'mwaa_operations.R' 'reexports_paws.common.R' 'resourceexplorer_service.R' 'resourceexplorer_interfaces.R' 'resourceexplorer_operations.R' 'schemas_service.R' 'schemas_interfaces.R' 'schemas_operations.R' 'sfn_service.R' 'sfn_interfaces.R' 'sfn_operations.R' 'sns_service.R' 'sns_interfaces.R' 'sns_operations.R' 'sqs_service.R' 'sqs_interfaces.R' 'sqs_operations.R' 'swf_service.R' 'swf_interfaces.R' 'swf_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.common": { "Package": "paws.common", - "Version": "0.8.10", + "Version": "0.9.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "Rcpp", + "Type": "Package", + "Title": "Paws Low-Level Amazon Web Services API", + "Authors@R": "c( person(\"David\", \"Kretch\", email = \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", email = \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", email = \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Functions for making low-level API requests to Amazon Web Services . The functions handle building, signing, and sending requests, and receiving responses. They are designed to help build higher-level interfaces to individual services, such as Simple Storage Service (S3).", + "License": "Apache License (>= 2.0)", + "Depends": [ + "R (>= 4.1.0)" + ], + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.common, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Encoding": "UTF-8", + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ "base64enc", "curl", - "digest", - "httr2", + "digest (>= 0.6.35)", + "httr2 (>= 1.0.4)", "jsonlite", "methods", - "stats", "utils", + "stats", + "Rcpp", "xml2" ], - "Hash": "39e4ac3a7ca67421d5f6b6f5ed2340b9" + "Suggests": [ + "covr", + "crayon", + "mockery", + "withr", + "rstudioapi", + "testthat (>= 3.0.0)", + "litedown" + ], + "Collate": "'RcppExports.R' 'util.R' 'cache.R' 'struct.R' 'handlers.R' 'iniutil.R' 'config.R' 'logging.R' 'dateutil.R' 'credential_sso.R' 'credential_sts.R' 'url.R' 'net.R' 'credential_providers.R' 'credentials.R' 'client.R' 'convert.R' 'request.R' 'custom_checksum.R' 'service.R' 'custom_dynamodb.R' 'custom_rds.R' 'head_bucket.R' 'http_status.R' 'error.R' 'custom_s3.R' 'handlers_core.R' 'handlers_ec2query.R' 'handlers_jsonrpc.R' 'handlers_query.R' 'handlers_rest.R' 'handlers_restjson.R' 'tags.R' 'xmlutil.R' 'handlers_restxml.R' 'handlers_stream.R' 'idempotency.R' 'jsonutil.R' 'mock_bindings.R' 'onLoad.R' 'paginate.R' 'populateutil.R' 'queryutil.R' 'retry.R' 'service_parameter_helper.R' 'signer_bearer.R' 'signer_v4.R' 'signer_s3.R' 'signer_s3v4.R' 'signer_v1.R' 'signer_v2.R' 'time.R'", + "Config/testthat/edition": "3", + "Config/roxygen2/version": "8.1.0", + "VignetteBuilder": "litedown", + "NeedsCompilation": "yes", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.compute": { "Package": "paws.compute", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Compute Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' compute services, including 'Elastic Compute Cloud' ('EC2'), 'Lambda' functions-as-a-service, containers, batch processing, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.compute, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" ], - "Hash": "ae63fc9e22e25b5f7d69bf6a62c6a2bb" + "Imports": [ + "paws.common (>= 0.9.0)" + ], + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'apprunner_service.R' 'apprunner_interfaces.R' 'apprunner_operations.R' 'batch_service.R' 'batch_interfaces.R' 'batch_operations.R' 'braket_service.R' 'braket_interfaces.R' 'braket_operations.R' 'computeoptimizer_service.R' 'computeoptimizer_interfaces.R' 'computeoptimizer_operations.R' 'ec2_service.R' 'ec2_interfaces.R' 'ec2_operations.R' 'ec2instanceconnect_service.R' 'ec2instanceconnect_interfaces.R' 'ec2instanceconnect_operations.R' 'ecr_service.R' 'ecr_interfaces.R' 'ecr_operations.R' 'ecrpublic_service.R' 'ecrpublic_interfaces.R' 'ecrpublic_operations.R' 'ecs_service.R' 'ecs_interfaces.R' 'ecs_operations.R' 'eks_service.R' 'eks_interfaces.R' 'eks_operations.R' 'elasticbeanstalk_service.R' 'elasticbeanstalk_interfaces.R' 'elasticbeanstalk_operations.R' 'emrcontainers_service.R' 'emrcontainers_interfaces.R' 'emrcontainers_operations.R' 'emrserverless_service.R' 'emrserverless_interfaces.R' 'emrserverless_operations.R' 'imagebuilder_service.R' 'imagebuilder_interfaces.R' 'imagebuilder_operations.R' 'lambda_service.R' 'lambda_interfaces.R' 'lambda_operations.R' 'lightsail_service.R' 'lightsail_interfaces.R' 'lightsail_operations.R' 'proton_service.R' 'proton_interfaces.R' 'proton_operations.R' 'reexports_paws.common.R' 'serverlessapplicationrepository_service.R' 'serverlessapplicationrepository_interfaces.R' 'serverlessapplicationrepository_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.cost.management": { "Package": "paws.cost.management", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Cost Management Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' cost management services, including cost and usage reports, budgets, pricing, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.cost.management, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.common (>= 0.9.0)" ], - "Hash": "f239556e7261d7e6036d882ae6cf1c39" + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'billing_service.R' 'billing_interfaces.R' 'billing_operations.R' 'billingconductor_service.R' 'billingconductor_interfaces.R' 'billingconductor_operations.R' 'budgets_service.R' 'budgets_interfaces.R' 'budgets_operations.R' 'costandusagereportservice_service.R' 'costandusagereportservice_interfaces.R' 'costandusagereportservice_operations.R' 'costexplorer_service.R' 'costexplorer_interfaces.R' 'costexplorer_operations.R' 'marketplacecatalog_service.R' 'marketplacecatalog_interfaces.R' 'marketplacecatalog_operations.R' 'marketplacecommerceanalytics_service.R' 'marketplacecommerceanalytics_interfaces.R' 'marketplacecommerceanalytics_operations.R' 'marketplaceentitlementservice_service.R' 'marketplaceentitlementservice_interfaces.R' 'marketplaceentitlementservice_operations.R' 'marketplacemetering_service.R' 'marketplacemetering_interfaces.R' 'marketplacemetering_operations.R' 'paymentcryptographycontrolplane_service.R' 'paymentcryptographycontrolplane_interfaces.R' 'paymentcryptographycontrolplane_operations.R' 'paymentcryptographydataplane_service.R' 'paymentcryptographydataplane_interfaces.R' 'paymentcryptographydataplane_operations.R' 'pricing_service.R' 'pricing_interfaces.R' 'pricing_operations.R' 'reexports_paws.common.R' 'savingsplans_service.R' 'savingsplans_interfaces.R' 'savingsplans_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.customer.engagement": { "Package": "paws.customer.engagement", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Customer Engagement Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' customer engagement services, including 'Simple Email Service', 'Connect' contact center service, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.customer.engagement, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.common (>= 0.9.0)" + ], + "Suggests": [ + "testthat" ], - "Hash": "07280ba6a6878f004297a1e00ad7a26f" + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'connect_service.R' 'connect_interfaces.R' 'connect_operations.R' 'connectcampaignservice_service.R' 'connectcampaignservice_interfaces.R' 'connectcampaignservice_operations.R' 'connectcampaignservicev2_service.R' 'connectcampaignservicev2_interfaces.R' 'connectcampaignservicev2_operations.R' 'connectcases_service.R' 'connectcases_interfaces.R' 'connectcases_operations.R' 'connectcontactlens_service.R' 'connectcontactlens_interfaces.R' 'connectcontactlens_operations.R' 'connectparticipant_service.R' 'connectparticipant_interfaces.R' 'connectparticipant_operations.R' 'connectwisdomservice_service.R' 'connectwisdomservice_interfaces.R' 'connectwisdomservice_operations.R' 'customerprofiles_service.R' 'customerprofiles_interfaces.R' 'customerprofiles_operations.R' 'pinpoint_service.R' 'pinpoint_interfaces.R' 'pinpoint_operations.R' 'pinpointemail_service.R' 'pinpointemail_interfaces.R' 'pinpointemail_operations.R' 'pinpointsmsvoice_service.R' 'pinpointsmsvoice_interfaces.R' 'pinpointsmsvoice_operations.R' 'pinpointsmsvoicev2_service.R' 'pinpointsmsvoicev2_interfaces.R' 'pinpointsmsvoicev2_operations.R' 'reexports_paws.common.R' 'ses_service.R' 'ses_interfaces.R' 'ses_operations.R' 'sesv2_service.R' 'sesv2_interfaces.R' 'sesv2_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.database": { "Package": "paws.database", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Database Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' database services, including 'Relational Database Service' ('RDS'), 'DynamoDB' 'NoSQL' database, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.database, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.common (>= 0.9.0)" ], - "Hash": "bdf105fa60f5705a47643ee8fd897500" + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'dax_service.R' 'dax_interfaces.R' 'dax_operations.R' 'docdb_service.R' 'docdb_interfaces.R' 'docdb_operations.R' 'docdbelastic_service.R' 'docdbelastic_interfaces.R' 'docdbelastic_operations.R' 'dynamodb_service.R' 'dynamodb_interfaces.R' 'dynamodb_operations.R' 'dynamodbstreams_service.R' 'dynamodbstreams_interfaces.R' 'dynamodbstreams_operations.R' 'elasticache_service.R' 'elasticache_interfaces.R' 'elasticache_operations.R' 'keyspaces_service.R' 'keyspaces_interfaces.R' 'keyspaces_operations.R' 'lakeformation_service.R' 'lakeformation_interfaces.R' 'lakeformation_operations.R' 'memorydb_service.R' 'memorydb_interfaces.R' 'memorydb_operations.R' 'neptune_service.R' 'neptune_interfaces.R' 'neptune_operations.R' 'neptunedata_service.R' 'neptunedata_interfaces.R' 'neptunedata_operations.R' 'rds_service.R' 'rds_operations.R' 'rds_custom.R' 'rds_interfaces.R' 'rdsdataservice_service.R' 'rdsdataservice_interfaces.R' 'rdsdataservice_operations.R' 'redshift_service.R' 'redshift_interfaces.R' 'redshift_operations.R' 'redshiftdataapiservice_service.R' 'redshiftdataapiservice_interfaces.R' 'redshiftdataapiservice_operations.R' 'redshiftserverless_service.R' 'redshiftserverless_interfaces.R' 'redshiftserverless_operations.R' 'reexports_paws.common.R' 'simpledb_service.R' 'simpledb_interfaces.R' 'simpledb_operations.R' 'timestreamquery_service.R' 'timestreamquery_interfaces.R' 'timestreamquery_operations.R' 'timestreamwrite_service.R' 'timestreamwrite_interfaces.R' 'timestreamwrite_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.developer.tools": { "Package": "paws.developer.tools", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Developer Tools Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' developer tools services, including version control, continuous integration and deployment, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.developer.tools, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" ], - "Hash": "ec39a93b14e132a19dd50ff439f821de" + "Imports": [ + "paws.common (>= 0.9.0)" + ], + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'cloud9_service.R' 'cloud9_interfaces.R' 'cloud9_operations.R' 'cloudcontrolapi_service.R' 'cloudcontrolapi_interfaces.R' 'cloudcontrolapi_operations.R' 'codeartifact_service.R' 'codeartifact_interfaces.R' 'codeartifact_operations.R' 'codebuild_service.R' 'codebuild_interfaces.R' 'codebuild_operations.R' 'codecatalyst_service.R' 'codecatalyst_interfaces.R' 'codecatalyst_operations.R' 'codecommit_service.R' 'codecommit_interfaces.R' 'codecommit_operations.R' 'codeconnections_service.R' 'codeconnections_interfaces.R' 'codeconnections_operations.R' 'codedeploy_service.R' 'codedeploy_interfaces.R' 'codedeploy_operations.R' 'codeguruprofiler_service.R' 'codeguruprofiler_interfaces.R' 'codeguruprofiler_operations.R' 'codegurureviewer_service.R' 'codegurureviewer_interfaces.R' 'codegurureviewer_operations.R' 'codegurusecurity_service.R' 'codegurusecurity_interfaces.R' 'codegurusecurity_operations.R' 'codepipeline_service.R' 'codepipeline_interfaces.R' 'codepipeline_operations.R' 'codestarconnections_service.R' 'codestarconnections_interfaces.R' 'codestarconnections_operations.R' 'codestarnotifications_service.R' 'codestarnotifications_interfaces.R' 'codestarnotifications_operations.R' 'devopsguru_service.R' 'devopsguru_interfaces.R' 'devopsguru_operations.R' 'drs_service.R' 'drs_interfaces.R' 'drs_operations.R' 'fis_service.R' 'fis_interfaces.R' 'fis_operations.R' 'reexports_paws.common.R' 'wellarchitected_service.R' 'wellarchitected_interfaces.R' 'wellarchitected_operations.R' 'xray_service.R' 'xray_interfaces.R' 'xray_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.end.user.computing": { "Package": "paws.end.user.computing", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' End User Computing Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' end user computing services, including collaborative document editing, mobile intranet, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.end.user.computing, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.common (>= 0.9.0)" ], - "Hash": "92a5c132a8a378e98028fdaf0cd71a27" + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'appstream_service.R' 'appstream_interfaces.R' 'appstream_operations.R' 'chatbot_service.R' 'chatbot_interfaces.R' 'chatbot_operations.R' 'ivschat_service.R' 'ivschat_interfaces.R' 'ivschat_operations.R' 'reexports_paws.common.R' 'workdocs_service.R' 'workdocs_interfaces.R' 'workdocs_operations.R' 'workmail_service.R' 'workmail_interfaces.R' 'workmail_operations.R' 'workmailmessageflow_service.R' 'workmailmessageflow_interfaces.R' 'workmailmessageflow_operations.R' 'workspaces_service.R' 'workspaces_interfaces.R' 'workspaces_operations.R' 'workspacesweb_service.R' 'workspacesweb_interfaces.R' 'workspacesweb_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.machine.learning": { "Package": "paws.machine.learning", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Machine Learning Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' machine learning services, including 'SageMaker' managed machine learning service, natural language processing, speech recognition, translation, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.machine.learning, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.common (>= 0.9.0)" + ], + "Suggests": [ + "testthat" ], - "Hash": "9cb6408161e048927bbbdff3d8765d62" + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'augmentedairuntime_service.R' 'augmentedairuntime_interfaces.R' 'augmentedairuntime_operations.R' 'bedrock_service.R' 'bedrock_interfaces.R' 'bedrock_operations.R' 'bedrockagent_service.R' 'bedrockagent_interfaces.R' 'bedrockagent_operations.R' 'bedrockagentcore_service.R' 'bedrockagentcore_interfaces.R' 'bedrockagentcore_operations.R' 'bedrockagentcorecontrol_service.R' 'bedrockagentcorecontrol_interfaces.R' 'bedrockagentcorecontrol_operations.R' 'bedrockagentruntime_service.R' 'bedrockagentruntime_interfaces.R' 'bedrockagentruntime_operations.R' 'bedrockdataautomation_service.R' 'bedrockdataautomation_interfaces.R' 'bedrockdataautomation_operations.R' 'bedrockdataautomationruntime_service.R' 'bedrockdataautomationruntime_interfaces.R' 'bedrockdataautomationruntime_operations.R' 'bedrockruntime_service.R' 'bedrockruntime_interfaces.R' 'bedrockruntime_operations.R' 'comprehend_service.R' 'comprehend_interfaces.R' 'comprehend_operations.R' 'comprehendmedical_service.R' 'comprehendmedical_interfaces.R' 'comprehendmedical_operations.R' 'forecastqueryservice_service.R' 'forecastqueryservice_interfaces.R' 'forecastqueryservice_operations.R' 'forecastservice_service.R' 'forecastservice_interfaces.R' 'forecastservice_operations.R' 'frauddetector_service.R' 'frauddetector_interfaces.R' 'frauddetector_operations.R' 'lexmodelbuildingservice_service.R' 'lexmodelbuildingservice_interfaces.R' 'lexmodelbuildingservice_operations.R' 'lexmodelsv2_service.R' 'lexmodelsv2_interfaces.R' 'lexmodelsv2_operations.R' 'lexruntimeservice_service.R' 'lexruntimeservice_interfaces.R' 'lexruntimeservice_operations.R' 'lexruntimev2_service.R' 'lexruntimev2_interfaces.R' 'lexruntimev2_operations.R' 'lookoutequipment_service.R' 'lookoutequipment_interfaces.R' 'lookoutequipment_operations.R' 'machinelearning_service.R' 'machinelearning_interfaces.R' 'machinelearning_operations.R' 'personalize_service.R' 'personalize_interfaces.R' 'personalize_operations.R' 'personalizeevents_service.R' 'personalizeevents_interfaces.R' 'personalizeevents_operations.R' 'personalizeruntime_service.R' 'personalizeruntime_interfaces.R' 'personalizeruntime_operations.R' 'polly_service.R' 'polly_interfaces.R' 'polly_operations.R' 'reexports_paws.common.R' 'rekognition_service.R' 'rekognition_interfaces.R' 'rekognition_operations.R' 'sagemaker_service.R' 'sagemaker_interfaces.R' 'sagemaker_operations.R' 'sagemakeredgemanager_service.R' 'sagemakeredgemanager_interfaces.R' 'sagemakeredgemanager_operations.R' 'sagemakerfeaturestoreruntime_service.R' 'sagemakerfeaturestoreruntime_interfaces.R' 'sagemakerfeaturestoreruntime_operations.R' 'sagemakergeospatialcapabilities_service.R' 'sagemakergeospatialcapabilities_interfaces.R' 'sagemakergeospatialcapabilities_operations.R' 'sagemakermetrics_service.R' 'sagemakermetrics_interfaces.R' 'sagemakermetrics_operations.R' 'sagemakerruntime_service.R' 'sagemakerruntime_interfaces.R' 'sagemakerruntime_operations.R' 'textract_service.R' 'textract_interfaces.R' 'textract_operations.R' 'transcribeservice_service.R' 'transcribeservice_interfaces.R' 'transcribeservice_operations.R' 'translate_service.R' 'translate_interfaces.R' 'translate_operations.R' 'voiceid_service.R' 'voiceid_interfaces.R' 'voiceid_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.management": { "Package": "paws.management", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Management & Governance Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' management and governance services, including 'CloudWatch' application and infrastructure monitoring, 'Auto Scaling' for automatically scaling resources, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.management, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.common (>= 0.9.0)" ], - "Hash": "b114e36c4090bb299408958c785856a8" + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'applicationautoscaling_service.R' 'applicationautoscaling_interfaces.R' 'applicationautoscaling_operations.R' 'applicationcostprofiler_service.R' 'applicationcostprofiler_interfaces.R' 'applicationcostprofiler_operations.R' 'applicationinsights_service.R' 'applicationinsights_interfaces.R' 'applicationinsights_operations.R' 'appregistry_service.R' 'appregistry_interfaces.R' 'appregistry_operations.R' 'auditmanager_service.R' 'auditmanager_interfaces.R' 'auditmanager_operations.R' 'autoscaling_service.R' 'autoscaling_interfaces.R' 'autoscaling_operations.R' 'autoscalingplans_service.R' 'autoscalingplans_interfaces.R' 'autoscalingplans_operations.R' 'cloudformation_service.R' 'cloudformation_interfaces.R' 'cloudformation_operations.R' 'cloudtrail_service.R' 'cloudtrail_interfaces.R' 'cloudtrail_operations.R' 'cloudtraildataservice_service.R' 'cloudtraildataservice_interfaces.R' 'cloudtraildataservice_operations.R' 'cloudwatch_service.R' 'cloudwatch_interfaces.R' 'cloudwatch_operations.R' 'cloudwatchapplicationsignals_service.R' 'cloudwatchapplicationsignals_interfaces.R' 'cloudwatchapplicationsignals_operations.R' 'cloudwatchinternetmonitor_service.R' 'cloudwatchinternetmonitor_interfaces.R' 'cloudwatchinternetmonitor_operations.R' 'cloudwatchlogs_service.R' 'cloudwatchlogs_interfaces.R' 'cloudwatchlogs_operations.R' 'cloudwatchobservabilityaccessmanager_service.R' 'cloudwatchobservabilityaccessmanager_interfaces.R' 'cloudwatchobservabilityaccessmanager_operations.R' 'cloudwatchrum_service.R' 'cloudwatchrum_interfaces.R' 'cloudwatchrum_operations.R' 'configservice_service.R' 'configservice_interfaces.R' 'configservice_operations.R' 'controltower_service.R' 'controltower_interfaces.R' 'controltower_operations.R' 'finspace_service.R' 'finspace_interfaces.R' 'finspace_operations.R' 'health_service.R' 'health_interfaces.R' 'health_operations.R' 'licensemanager_service.R' 'licensemanager_interfaces.R' 'licensemanager_operations.R' 'licensemanagerlinuxsubscriptions_service.R' 'licensemanagerlinuxsubscriptions_interfaces.R' 'licensemanagerlinuxsubscriptions_operations.R' 'licensemanagerusersubscriptions_service.R' 'licensemanagerusersubscriptions_interfaces.R' 'licensemanagerusersubscriptions_operations.R' 'managedgrafana_service.R' 'managedgrafana_interfaces.R' 'managedgrafana_operations.R' 'organizations_service.R' 'organizations_interfaces.R' 'organizations_operations.R' 'pi_service.R' 'pi_interfaces.R' 'pi_operations.R' 'prometheusservice_service.R' 'prometheusservice_interfaces.R' 'prometheusservice_operations.R' 'reexports_paws.common.R' 'resiliencehub_service.R' 'resiliencehub_interfaces.R' 'resiliencehub_operations.R' 'resourcegroups_service.R' 'resourcegroups_interfaces.R' 'resourcegroups_operations.R' 'resourcegroupstaggingapi_service.R' 'resourcegroupstaggingapi_interfaces.R' 'resourcegroupstaggingapi_operations.R' 'servicecatalog_service.R' 'servicecatalog_interfaces.R' 'servicecatalog_operations.R' 'servicequotas_service.R' 'servicequotas_interfaces.R' 'servicequotas_operations.R' 'ssm_service.R' 'ssm_interfaces.R' 'ssm_operations.R' 'ssmcontacts_service.R' 'ssmcontacts_interfaces.R' 'ssmcontacts_operations.R' 'ssmincidents_service.R' 'ssmincidents_interfaces.R' 'ssmincidents_operations.R' 'ssmsap_service.R' 'ssmsap_interfaces.R' 'ssmsap_operations.R' 'support_service.R' 'support_interfaces.R' 'support_operations.R' 'supportapp_service.R' 'supportapp_interfaces.R' 'supportapp_operations.R' 'synthetics_service.R' 'synthetics_interfaces.R' 'synthetics_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.networking": { "Package": "paws.networking", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Networking & Content Delivery Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' networking and content delivery services, including 'Route 53' Domain Name System service, 'CloudFront' content delivery, load balancing, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.networking, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" ], - "Hash": "92bea219331b4cbfe790ac56dd92ec0a" + "Imports": [ + "paws.common (>= 0.9.0)" + ], + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'apigateway_service.R' 'apigateway_interfaces.R' 'apigateway_operations.R' 'apigatewaymanagementapi_service.R' 'apigatewaymanagementapi_interfaces.R' 'apigatewaymanagementapi_operations.R' 'apigatewayv2_service.R' 'apigatewayv2_interfaces.R' 'apigatewayv2_operations.R' 'appfabric_service.R' 'appfabric_interfaces.R' 'appfabric_operations.R' 'appmesh_service.R' 'appmesh_interfaces.R' 'appmesh_operations.R' 'arczonalshift_service.R' 'arczonalshift_interfaces.R' 'arczonalshift_operations.R' 'backupgateway_service.R' 'backupgateway_interfaces.R' 'backupgateway_operations.R' 'cloudfront_service.R' 'cloudfront_interfaces.R' 'cloudfront_operations.R' 'cloudfrontkeyvaluestore_service.R' 'cloudfrontkeyvaluestore_interfaces.R' 'cloudfrontkeyvaluestore_operations.R' 'directconnect_service.R' 'directconnect_interfaces.R' 'directconnect_operations.R' 'elb_service.R' 'elb_interfaces.R' 'elb_operations.R' 'elbv2_service.R' 'elbv2_interfaces.R' 'elbv2_operations.R' 'globalaccelerator_service.R' 'globalaccelerator_interfaces.R' 'globalaccelerator_operations.R' 'networkfirewall_service.R' 'networkfirewall_interfaces.R' 'networkfirewall_operations.R' 'networkmanager_service.R' 'networkmanager_interfaces.R' 'networkmanager_operations.R' 'reexports_paws.common.R' 'route53_service.R' 'route53_interfaces.R' 'route53_operations.R' 'route53domains_service.R' 'route53domains_interfaces.R' 'route53domains_operations.R' 'route53profiles_service.R' 'route53profiles_interfaces.R' 'route53profiles_operations.R' 'route53recoverycluster_service.R' 'route53recoverycluster_interfaces.R' 'route53recoverycluster_operations.R' 'route53recoverycontrolconfig_service.R' 'route53recoverycontrolconfig_interfaces.R' 'route53recoverycontrolconfig_operations.R' 'route53recoveryreadiness_service.R' 'route53recoveryreadiness_interfaces.R' 'route53recoveryreadiness_operations.R' 'route53resolver_service.R' 'route53resolver_interfaces.R' 'route53resolver_operations.R' 'servicediscovery_service.R' 'servicediscovery_interfaces.R' 'servicediscovery_operations.R' 'telconetworkbuilder_service.R' 'telconetworkbuilder_interfaces.R' 'telconetworkbuilder_operations.R' 'vpclattice_service.R' 'vpclattice_interfaces.R' 'vpclattice_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.security.identity": { "Package": "paws.security.identity", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Security, Identity, & Compliance Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' security, identity, and compliance services, including the 'Identity & Access Management' ('IAM') service for managing access to services and resources, and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.security.identity, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" ], - "Hash": "0667aa70df94a5d303440420ca56c0f8" + "Imports": [ + "paws.common (>= 0.9.0)" + ], + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'accessanalyzer_service.R' 'accessanalyzer_interfaces.R' 'accessanalyzer_operations.R' 'account_service.R' 'account_interfaces.R' 'account_operations.R' 'acm_service.R' 'acm_interfaces.R' 'acm_operations.R' 'acmpca_service.R' 'acmpca_interfaces.R' 'acmpca_operations.R' 'cleanroomsml_service.R' 'cleanroomsml_interfaces.R' 'cleanroomsml_operations.R' 'clouddirectory_service.R' 'clouddirectory_interfaces.R' 'clouddirectory_operations.R' 'cloudhsm_service.R' 'cloudhsm_interfaces.R' 'cloudhsm_operations.R' 'cloudhsmv2_service.R' 'cloudhsmv2_interfaces.R' 'cloudhsmv2_operations.R' 'cognitoidentity_service.R' 'cognitoidentity_interfaces.R' 'cognitoidentity_operations.R' 'cognitoidentityprovider_service.R' 'cognitoidentityprovider_interfaces.R' 'cognitoidentityprovider_operations.R' 'cognitosync_service.R' 'cognitosync_interfaces.R' 'cognitosync_operations.R' 'detective_service.R' 'detective_interfaces.R' 'detective_operations.R' 'directoryservice_service.R' 'directoryservice_interfaces.R' 'directoryservice_operations.R' 'fms_service.R' 'fms_interfaces.R' 'fms_operations.R' 'guardduty_service.R' 'guardduty_interfaces.R' 'guardduty_operations.R' 'iam_service.R' 'iam_interfaces.R' 'iam_operations.R' 'iamrolesanywhere_service.R' 'iamrolesanywhere_interfaces.R' 'iamrolesanywhere_operations.R' 'identitystore_service.R' 'identitystore_interfaces.R' 'identitystore_operations.R' 'inspector2_service.R' 'inspector2_interfaces.R' 'inspector2_operations.R' 'inspector_service.R' 'inspector_interfaces.R' 'inspector_operations.R' 'kms_service.R' 'kms_interfaces.R' 'kms_operations.R' 'macie2_service.R' 'macie2_interfaces.R' 'macie2_operations.R' 'pcaconnectorad_service.R' 'pcaconnectorad_interfaces.R' 'pcaconnectorad_operations.R' 'ram_service.R' 'ram_interfaces.R' 'ram_operations.R' 'reexports_paws.common.R' 'secretsmanager_service.R' 'secretsmanager_interfaces.R' 'secretsmanager_operations.R' 'securityhub_service.R' 'securityhub_interfaces.R' 'securityhub_operations.R' 'securitylake_service.R' 'securitylake_interfaces.R' 'securitylake_operations.R' 'shield_service.R' 'shield_interfaces.R' 'shield_operations.R' 'sso_service.R' 'sso_interfaces.R' 'sso_operations.R' 'ssoadmin_service.R' 'ssoadmin_interfaces.R' 'ssoadmin_operations.R' 'ssooidc_service.R' 'ssooidc_interfaces.R' 'ssooidc_operations.R' 'sts_service.R' 'sts_interfaces.R' 'sts_operations.R' 'verifiedpermissions_service.R' 'verifiedpermissions_interfaces.R' 'verifiedpermissions_operations.R' 'waf_service.R' 'waf_interfaces.R' 'waf_operations.R' 'wafregional_service.R' 'wafregional_interfaces.R' 'wafregional_operations.R' 'wafv2_service.R' 'wafv2_interfaces.R' 'wafv2_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "paws.storage": { "Package": "paws.storage", - "Version": "0.10.0", + "Version": "0.11.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "paws.common" + "Title": "'Amazon Web Services' Storage Services", + "Authors@R": "c( person(\"David\", \"Kretch\", , \"david.kretch@gmail.com\", role = \"aut\"), person(\"Adam\", \"Banker\", , \"adam.banker39@gmail.com\", role = \"aut\"), person(\"Dyfan\", \"Jones\", , \"dyfan.r.jones@gmail.com\", role = \"cre\"), person(\"Amazon.com, Inc.\", role = \"cph\") )", + "Description": "Interface to 'Amazon Web Services' storage services, including 'Simple Storage Service' ('S3') and more .", + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/paws-r/paws, https://paws-r.r-universe.dev/paws.storage, https://www.paws-r-sdk.com", + "BugReports": "https://github.com/paws-r/paws/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "paws.common (>= 0.9.0)" ], - "Hash": "7dc3b787d34451ee84b1e1d60f245fe4" + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.1.0", + "Collate": "'backup_service.R' 'backup_interfaces.R' 'backup_operations.R' 'dlm_service.R' 'dlm_interfaces.R' 'dlm_operations.R' 'ebs_service.R' 'ebs_interfaces.R' 'ebs_operations.R' 'efs_service.R' 'efs_interfaces.R' 'efs_operations.R' 'finspacedata_service.R' 'finspacedata_interfaces.R' 'finspacedata_operations.R' 'fsx_service.R' 'fsx_interfaces.R' 'fsx_operations.R' 'glacier_service.R' 'glacier_interfaces.R' 'glacier_operations.R' 'omics_service.R' 'omics_interfaces.R' 'omics_operations.R' 'recyclebin_service.R' 'recyclebin_interfaces.R' 'recyclebin_operations.R' 'reexports_paws.common.R' 's3_service.R' 's3_operations.R' 's3_custom.R' 's3_interfaces.R' 's3control_service.R' 's3control_interfaces.R' 's3control_operations.R' 's3outposts_service.R' 's3outposts_interfaces.R' 's3outposts_operations.R' 's3tables_service.R' 's3tables_interfaces.R' 's3tables_operations.R' 'storagegateway_service.R' 'storagegateway_interfaces.R' 'storagegateway_operations.R'", + "NeedsCompilation": "no", + "Author": "David Kretch [aut], Adam Banker [aut], Dyfan Jones [cre], Amazon.com, Inc. [cph]", + "Maintainer": "Dyfan Jones ", + "Repository": "CRAN" }, "pillar": { "Package": "pillar", "Version": "1.11.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cli", + "Title": "Coloured Formatting for Columns", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\"), person(given = \"RStudio\", role = \"cph\"))", + "Description": "Provides 'pillar' and 'colonnade' generics designed for formatting columns of data using the full range of colours provided by modern terminals.", + "License": "MIT + file LICENSE", + "URL": "https://pillar.r-lib.org/, https://github.com/r-lib/pillar", + "BugReports": "https://github.com/r-lib/pillar/issues", + "Imports": [ + "cli (>= 2.3.0)", "glue", "lifecycle", - "rlang", - "utf8", + "rlang (>= 1.0.2)", + "utf8 (>= 1.1.0)", "utils", - "vctrs" + "vctrs (>= 0.5.0)" + ], + "Suggests": [ + "bit64", + "DBI", + "debugme", + "DiagrammeR", + "dplyr", + "formattable", + "ggplot2", + "knitr", + "lubridate", + "nanotime", + "nycflights13", + "palmerpenguins", + "rmarkdown", + "scales", + "stringi", + "survival", + "testthat (>= 3.1.1)", + "tibble", + "units (>= 0.7.2)", + "vdiffr", + "withr" ], - "Hash": "1395e64f2689ffd503657778e810cee2" + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "format_multi_fuzz, format_multi_fuzz_2, format_multi, ctl_colonnade, ctl_colonnade_1, ctl_colonnade_2", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/gha/extra-packages": "units=?ignore-before-r=4.3.0", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], RStudio [cph]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "pkgconfig": { "Package": "pkgconfig", "Version": "2.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Private Configuration for 'R' Packages", + "Author": "Gábor Csárdi", + "Maintainer": "Gábor Csárdi ", + "Description": "Set configuration options on a per-package basis. Options set by a given package only apply to that package, other packages are unaffected.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "Imports": [ "utils" ], - "Hash": "01f28d4278f15c76cddbea05899c5d6f" + "Suggests": [ + "covr", + "testthat", + "disposables (>= 1.0.3)" + ], + "URL": "https://github.com/r-lib/pkgconfig#readme", + "BugReports": "https://github.com/r-lib/pkgconfig/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "CRAN" }, "png": { "Package": "png", "Version": "0.1-9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Read and write PNG images", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" ], - "Hash": "961c433971606243a724eb19b1075e60" + "Description": "This package provides an easy and simple way to read, write and display bitmap images stored in the PNG format. It can read and write both files and in-memory raw vectors.", + "License": "GPL-2 | GPL-3", + "SystemRequirements": "libpng", + "URL": "https://www.rforge.net/png/", + "BugReports": "https://github.com/s-u/png/issues/", + "NeedsCompilation": "yes", + "Repository": "CRAN" }, "prettyunits": { "Package": "prettyunits", "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Pretty, Human Readable Formatting of Quantities", + "Authors@R": "c( person(\"Gabor\", \"Csardi\", email=\"csardi.gabor@gmail.com\", role=c(\"aut\", \"cre\")), person(\"Bill\", \"Denney\", email=\"wdenney@humanpredictions.com\", role=c(\"ctb\"), comment=c(ORCID=\"0000-0002-5759-428X\")), person(\"Christophe\", \"Regouby\", email=\"christophe.regouby@free.fr\", role=c(\"ctb\")) )", + "Description": "Pretty, human readable formatting of quantities. Time intervals: '1337000' -> '15d 11h 23m 20s'. Vague time intervals: '2674000' -> 'about a month ago'. Bytes: '1337' -> '1.34 kB'. Rounding: '99' with 3 significant digits -> '99.0' p-values: '0.00001' -> '<0.0001'. Colors: '#FF0000' -> 'red'. Quantities: '1239437' -> '1.24 M'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/prettyunits", + "BugReports": "https://github.com/r-lib/prettyunits/issues", + "Depends": [ + "R(>= 2.10)" ], - "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7" + "Suggests": [ + "codetools", + "covr", + "testthat" + ], + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Gabor Csardi [aut, cre], Bill Denney [ctb] (), Christophe Regouby [ctb]", + "Maintainer": "Gabor Csardi ", + "Repository": "CRAN" }, "processx": { "Package": "processx", "Version": "3.9.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Execute and Control System Processes", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Ascent Digital Services\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to run system processes in the background. It can check if a background process is running; wait on a background process to finish; get the exit status of finished processes; kill background processes. It can read the standard output and error of the processes, using non-blocking connections. 'processx' can poll a process for standard output or error, with a timeout. It can also poll several processes at once.", + "License": "MIT + file LICENSE", + "URL": "https://processx.r-lib.org, https://github.com/r-lib/processx", + "BugReports": "https://github.com/r-lib/processx/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "ps (>= 1.9.3)", "R6", - "ps", "utils" ], - "Hash": "188d6caf38e81bf15b5e918726a6fd3d" + "Suggests": [ + "callr (>= 3.7.3)", + "cli (>= 3.3.0)", + "codetools", + "covr", + "curl", + "debugme", + "parallel", + "rlang (>= 1.0.2)", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre, cph] (ORCID: ), Winston Chang [aut], Posit Software, PBC [cph, fnd] (ROR: ), Ascent Digital Services [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "progress": { "Package": "progress", "Version": "1.2.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", + "Title": "Terminal Progress Bars", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Rich\", \"FitzJohn\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Configurable Progress bars, they may include percentage, elapsed time, and/or the estimated completion time. They work in terminals, in 'Emacs' 'ESS', 'RStudio', 'Windows' 'Rgui' and the 'macOS' 'R.app'. The package also provides a 'C++' 'API', that works with or without 'Rcpp'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/progress#readme, http://r-lib.github.io/progress/", + "BugReports": "https://github.com/r-lib/progress/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "crayon", "hms", - "prettyunits" + "prettyunits", + "R6" ], - "Hash": "f4625e061cb2865f111b47ff163a5ca6" + "Suggests": [ + "Rcpp", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Rich FitzJohn [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "promises": { "Package": "promises", "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "fastmap", + "Type": "Package", + "Title": "Abstractions for Promise-Based Asynchronous Programming", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides fundamental abstractions for doing asynchronous programming in R using promises. Asynchronous programming is useful for allowing a single R process to orchestrate multiple tasks in the background while also attending to something else. Semantics are similar to 'JavaScript' promises, but with a syntax that is idiomatic R.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/promises/, https://github.com/rstudio/promises", + "BugReports": "https://github.com/rstudio/promises/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "fastmap (>= 1.1.0)", "later", "lifecycle", - "magrittr", - "otel", + "magrittr (>= 1.5)", + "otel (>= 0.2.0)", + "R6", "rlang" ], - "Hash": "62cb899ed5fff70d4e918ec1b762bf7c" + "Suggests": [ + "future (>= 1.21.0)", + "knitr", + "mirai", + "otelsdk (>= 0.2.0)", + "purrr", + "Rcpp", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "vembedr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "rsconnect, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-27", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Barret Schloerke [aut, cre] (ORCID: ), Winston Chang [aut] (ORCID: ), Charlie Gao [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Barret Schloerke ", + "Repository": "CRAN" }, "proxy": { "Package": "proxy", "Version": "0.4-29", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Distance and Similarity Measures", + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")),\t person(given = \"Christian\", family = \"Buchta\", role = \"aut\"))", + "Description": "Provides an extensible framework for the efficient calculation of auto- and cross-proximities, along with implementations of the most popular ones.", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ "stats", "utils" ], - "Hash": "b6c826e897b46b163c51a3b990113a21" + "Suggests": [ + "cba" + ], + "Collate": "registry.R database.R dist.R similarities.R dissimilarities.R util.R seal.R", + "License": "GPL-2 | GPL-3", + "NeedsCompilation": "yes", + "Author": "David Meyer [aut, cre] (ORCID: ), Christian Buchta [aut]", + "Maintainer": "David Meyer ", + "Repository": "CRAN" }, "ps": { "Package": "ps", "Version": "1.9.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "List, Query, Manipulate System Processes", + "Authors@R": "c( person(\"Jay\", \"Loden\", role = \"aut\"), person(\"Dave\", \"Daeschler\", role = \"aut\"), person(\"Giampaolo\", \"Rodola'\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "List, query and manipulate all system processes, on 'Windows', 'Linux' and 'macOS'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/ps, https://ps.r-lib.org/", + "BugReports": "https://github.com/r-lib/ps/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "utils" ], - "Hash": "83e7e486c434e7acc71766dfc20adf2b" + "Suggests": [ + "callr", + "covr", + "curl", + "pillar", + "pingr", + "processx (>= 3.1.0)", + "R6", + "rlang", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Biarch": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-28", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Jay Loden [aut], Dave Daeschler [aut], Giampaolo Rodola' [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "purrr": { "Package": "purrr", "Version": "1.2.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "lifecycle", - "magrittr", - "rlang", - "vctrs" + "Title": "Functional Programming Tools", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", + "Description": "A complete and consistent functional programming toolkit for R.", + "License": "MIT + file LICENSE", + "URL": "https://purrr.tidyverse.org/, https://github.com/tidyverse/purrr", + "BugReports": "https://github.com/tidyverse/purrr/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.6.1)", + "lifecycle (>= 1.0.3)", + "magrittr (>= 1.5.0)", + "rlang (>= 1.1.1)", + "vctrs (>= 0.6.3)" ], - "Hash": "0a35605539b085a4828ec55ad973fe60" + "Suggests": [ + "carrier (>= 0.3.0)", + "covr", + "dplyr (>= 0.7.8)", + "httr", + "knitr", + "lubridate", + "mirai (>= 2.5.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble", + "tidyselect" + ], + "LinkingTo": [ + "cli" + ], + "VignetteBuilder": "knitr", + "Biarch": "true", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate, tidyr", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Lionel Henry [aut], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "quarto": { "Package": "quarto", "Version": "1.5.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "R Interface to 'Quarto' Markdown Publishing System", + "Authors@R": "c( person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Gordon\", \"Woodhull\", role = \"ctb\") )", + "Description": "Convert R Markdown documents and 'Jupyter' notebooks to a variety of output formats using 'Quarto'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/quarto-dev/quarto-r, https://quarto-dev.github.io/quarto-r/", + "BugReports": "https://github.com/quarto-dev/quarto-r/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ "cli", "fs", "htmltools", @@ -1125,497 +3077,1459 @@ "tools", "utils", "xfun", - "yaml" + "yaml (>= 2.3.10)" ], - "Hash": "c948476ae43811c74888f0d4534832a3" + "Suggests": [ + "bslib", + "callr", + "curl", + "dplyr", + "flextable", + "ggiraph", + "ggplot2", + "gt", + "heatmaply", + "kableExtra", + "knitr", + "palmerpenguins", + "patchwork", + "pkgload", + "plotly", + "rsconnect (>= 0.8.26)", + "testthat (>= 3.1.7)", + "thematic", + "tidyverse", + "tinytable", + "whoami", + "withr" + ], + "VignetteBuilder": "quarto", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "Quarto command line tool ().", + "NeedsCompilation": "no", + "Author": "JJ Allaire [aut] (ORCID: ), Christophe Dervieux [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd], Gordon Woodhull [ctb]", + "Maintainer": "Christophe Dervieux ", + "Repository": "CRAN" }, "rappdirs": { "Package": "rappdirs", "Version": "0.3.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Application Directories: Determine Where to Save Data, Caches, and Logs", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"trl\", \"cre\", \"cph\")), person(\"Sridhar\", \"Ratnakumar\", role = \"aut\"), person(\"Trent\", \"Mick\", role = \"aut\"), person(\"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(\"Eddy\", \"Petrisor\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = c(\"trl\", \"aut\"), comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Gabor\", \"Csardi\", role = \"ctb\"), person(\"Gregory\", \"Jefferis\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' () to R.", + "License": "MIT + file LICENSE", + "URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs", + "BugReports": "https://github.com/r-lib/rappdirs/issues", + "Depends": [ + "R (>= 4.1)" ], - "Hash": "f146a5bfc94db048309712535d4d0aee" + "Suggests": [ + "covr", + "roxygen2", + "testthat (>= 3.2.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-05", + "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, Posit, PBC. See file LICENSE for details.", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [trl, cre, cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut] (ORCID: ), Gabor Csardi [ctb], Gregory Jefferis [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "readr": { "Package": "readr", "Version": "2.2.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", + "Title": "Read Rectangular Text Data", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\") )", + "Description": "The goal of 'readr' is to provide a fast and friendly way to read rectangular data (like 'csv', 'tsv', and 'fwf'). It is designed to flexibly parse many types of data found in the wild, while still cleanly failing when data unexpectedly changes.", + "License": "MIT + file LICENSE", + "URL": "https://readr.tidyverse.org, https://github.com/tidyverse/readr", + "BugReports": "https://github.com/tidyverse/readr/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "cli", "clipr", - "cpp11", "crayon", "glue", - "hms", + "hms (>= 0.4.1)", "lifecycle", "methods", + "R6", "rlang", "tibble", - "tzdb", "utils", - "vroom", + "vroom (>= 1.7.0)", "withr" ], - "Hash": "4425ad9e28b8e3351184ca2739995b87" + "Suggests": [ + "covr", + "curl", + "datasets", + "knitr", + "rmarkdown", + "spelling", + "stringi", + "testthat (>= 3.2.0)", + "tzdb (>= 0.1.1)", + "waldo", + "xml2" + ], + "LinkingTo": [ + "cpp11", + "tzdb (>= 0.1.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "false", + "Config/usethis/last-upkeep": "2025-11-14", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Romain Francois [ctb], Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], Posit Software, PBC [cph, fnd] (ROR: ), https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [ctb, cph] (grisu3 implementation), Mikkel Jørgensen [ctb, cph] (grisu3 implementation)", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "renv": { "Package": "renv", "Version": "1.2.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Project Environments", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@rstudio.com\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A dependency management toolkit for R. Using 'renv', you can create and manage project-local R libraries, save the state of these libraries to a 'lockfile', and later restore your library as required. Together, these tools can help make your projects more isolated, portable, and reproducible.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/renv/, https://github.com/rstudio/renv", + "BugReports": "https://github.com/rstudio/renv/issues", + "Imports": [ "utils" ], - "Hash": "1bd9f58e1cfe27ce035933937c6f03de" + "Suggests": [ + "BiocManager", + "cli", + "compiler", + "covr", + "cpp11", + "curl", + "devtools", + "generics", + "gitcreds", + "jsonlite", + "jsonvalidate", + "knitr", + "miniUI", + "modules", + "packrat", + "pak", + "R6", + "remotes", + "reticulate", + "rmarkdown", + "rstudioapi", + "shiny", + "testthat", + "uuid", + "waldo", + "yaml", + "webfakes" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "bioconductor,python,install,restore,snapshot,retrieve,remotes", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Kevin Ushey ", + "Repository": "CRAN" }, "rlang": { "Package": "rlang", "Version": "1.3.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"mikefc\", , , \"mikefc@coolbutuseless.com\", role = \"cph\", comment = \"Hash implementation based on Mike's xxhashlite\"), person(\"Yann\", \"Collet\", role = \"cph\", comment = \"Author of the embedded xxHash library\"), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", + "License": "MIT + file LICENSE", + "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", + "BugReports": "https://github.com/r-lib/rlang/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ "utils" ], - "Hash": "8d05afdb0b0dd5ef01b306db289fe21f" + "Suggests": [ + "cli (>= 3.1.0)", + "covr", + "crayon", + "desc", + "fs", + "glue", + "knitr", + "magrittr", + "methods", + "pillar", + "pkgload", + "rmarkdown", + "stats", + "testthat (>= 3.3.2)", + "tibble", + "usethis", + "vctrs (>= 0.2.3)", + "withr" + ], + "Enhances": [ + "winch" + ], + "Biarch": "true", + "ByteCompile": "true", + "Config/build/compilation-database": "true", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], mikefc [cph] (Hash implementation based on Mike's xxhashlite), Yann Collet [cph] (Author of the embedded xxHash library), Posit, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "rmarkdown": { "Package": "rmarkdown", "Version": "2.31", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bslib", - "evaluate", - "fontawesome", - "htmltools", + "Type": "Package", + "Title": "Dynamic Documents for R", + "Authors@R": "c( person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Javier\", \"Luraschi\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"), person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")), person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Malcolm\", \"Barrett\", role = \"ctb\"), person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"), person(\"Romain\", \"Lesur\", role = \"ctb\"), person(\"Roy\", \"Storey\", role = \"ctb\"), person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"), person(\"Sergio\", \"Oller\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"), person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"), person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"), person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"), person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"), person(, \"W3C\", role = \"cph\", comment = \"slidy library\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"), person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"), person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"), person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"), person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"), person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\") )", + "Description": "Convert R Markdown documents into a variety of formats.", + "License": "GPL-3", + "URL": "https://github.com/rstudio/rmarkdown, https://pkgs.rstudio.com/rmarkdown/", + "BugReports": "https://github.com/rstudio/rmarkdown/issues", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "bslib (>= 0.2.5.1)", + "evaluate (>= 0.13)", + "fontawesome (>= 0.5.0)", + "htmltools (>= 0.5.1)", "jquerylib", "jsonlite", - "knitr", + "knitr (>= 1.43)", "methods", - "tinytex", + "tinytex (>= 0.31)", "tools", "utils", - "xfun", - "yaml" + "xfun (>= 0.36)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "digest", + "dygraphs", + "fs", + "rsconnect", + "downlit (>= 0.4.0)", + "katex (>= 1.4.0)", + "sass (>= 0.4.0)", + "shiny (>= 1.6.0)", + "testthat (>= 3.0.3)", + "tibble", + "vctrs", + "cleanrmd", + "withr (>= 2.4.2)", + "xml2" ], - "Hash": "f34039d57d861d2869cbf9be813ed08e" + "VignetteBuilder": "knitr", + "Config/Needs/website": "rstudio/quillt, pkgdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "pandoc (>= 1.14) - http://pandoc.org", + "NeedsCompilation": "no", + "Author": "JJ Allaire [aut], Yihui Xie [aut, cre] (ORCID: ), Christophe Dervieux [aut] (ORCID: ), Jonathan McPherson [aut], Javier Luraschi [aut], Kevin Ushey [aut], Aron Atkins [aut], Hadley Wickham [aut], Joe Cheng [aut], Winston Chang [aut], Richard Iannone [aut] (ORCID: ), Andrew Dunning [ctb] (ORCID: ), Atsushi Yasumoto [ctb, cph] (ORCID: , cph: Number sections Lua filter), Barret Schloerke [ctb], Carson Sievert [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Frederik Aust [ctb] (ORCID: ), Jeff Allen [ctb], JooYoung Seo [ctb] (ORCID: ), Malcolm Barrett [ctb], Rob Hyndman [ctb], Romain Lesur [ctb], Roy Storey [ctb], Ruben Arslan [ctb], Sergio Oller [ctb], Posit Software, PBC [cph, fnd], jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Alexander Farkas [ctb, cph] (html5shiv library), Scott Jehl [ctb, cph] (Respond.js library), Ivan Sagalaev [ctb, cph] (highlight.js library), Greg Franko [ctb, cph] (tocify library), John MacFarlane [ctb, cph] (Pandoc templates), Google, Inc. [ctb, cph] (ioslides library), Dave Raggett [ctb] (slidy library), W3C [cph] (slidy library), Dave Gandy [ctb, cph] (Font-Awesome), Ben Sperry [ctb] (Ionicons), Drifty [cph] (Ionicons), Aidan Lister [ctb, cph] (jQuery StickyTabs), Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter), Albert Krewinkel [ctb, cph] (pagebreak Lua filter)", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "rosm": { "Package": "rosm", "Version": "0.3.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Plot Raster Map Tiles from Open Street Map and Other Sources", + "Encoding": "UTF-8", + "Authors@R": "c(person(\"Dewey\", \"Dunnington\", role = c(\"aut\", \"cre\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Timothée\", \"Giraud\", role = \"ctb\"))", + "Maintainer": "Dewey Dunnington ", + "Description": "Download and plot Open Street Map , Bing Maps and other tiled map sources. Use to create basemaps quickly and add hillshade to vector-based maps.", + "License": "GPL-2", + "Imports": [ "curl", - "glue", "jpeg", "png", + "wk", + "glue", "progress", - "rlang", - "wk" + "rlang" + ], + "Suggests": [ + "sp", + "plyr", + "raster", + "testthat (>= 3.0.0)", + "withr", + "sf", + "terra", + "abind", + "methods", + "jsonlite", + "tiff", + "vdiffr" ], - "Hash": "14c0023fdb16dddf88fd43b321dd1948" + "URL": "https://github.com/paleolimbot/rosm", + "BugReports": "https://github.com/paleolimbot/rosm/issues", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Dewey Dunnington [aut, cre] (ORCID: ), Timothée Giraud [ctb]", + "Repository": "CRAN" }, "rstudioapi": { "Package": "rstudioapi", "Version": "0.19.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "db86914207e4e0f112b60ebbc3e1793c" + "Title": "Safely Access the RStudio API", + "Description": "Access the RStudio API (if available) and provide informative error messages when it's not.", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\"), person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@posit.co\"), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@posit.co\"), person(\"Gary\", \"Ritchie\", role = c(\"aut\"), email = \"gary@posit.co\"), person(family = \"RStudio\", role = \"cph\") )", + "Maintainer": "Kevin Ushey ", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/rstudioapi/, https://github.com/rstudio/rstudioapi", + "BugReports": "https://github.com/rstudio/rstudioapi/issues", + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "clipr", + "covr", + "curl", + "jsonlite", + "R6", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre], JJ Allaire [aut], Hadley Wickham [aut], Gary Ritchie [aut], RStudio [cph]", + "Repository": "CRAN" }, "s2": { "Package": "s2", "Version": "1.1.11", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Spherical Geometry Operators Using the S2 Geometry Library", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(\"Ege\", \"Rubak\", email=\"rubak@math.aau.dk\", role = c(\"aut\")), person(\"Jeroen\", \"Ooms\", , \"jeroen.ooms@stat.ucla.edu\", role = \"ctb\", comment = \"configure script\"), person(family = \"Google, Inc.\", role = \"cph\", comment = \"Original s2geometry.io source code\") )", + "Description": "Provides R bindings for Google's s2 library for geometric calculations on the sphere. High-performance constructors and exporters provide high compatibility with existing spatial packages, transformers construct new geometries from existing geometries, predicates provide a means to select geometries based on spatial relationships, and accessors extract information about geometries.", + "License": "Apache License (== 2.0)", + "Encoding": "UTF-8", + "LazyData": "true", + "SystemRequirements": "cmake, OpenSSL >= 1.0.1, Abseil >= 20230802.0", + "LinkingTo": [ "Rcpp", "wk" ], - "Hash": "54b09824b3ac78eb4fa44f76c0616131" + "Imports": [ + "Rcpp", + "wk (>= 0.6.0)" + ], + "Suggests": [ + "bit64", + "testthat (>= 3.0.0)", + "vctrs" + ], + "URL": "https://r-spatial.github.io/s2/, https://github.com/r-spatial/s2, https://s2geometry.io/", + "BugReports": "https://github.com/r-spatial/s2/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut] (ORCID: ), Edzer Pebesma [aut, cre] (ORCID: ), Ege Rubak [aut], Jeroen Ooms [ctb] (configure script), Google, Inc. [cph] (Original s2geometry.io source code)", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" }, "sass": { "Package": "sass", "Version": "0.4.10", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Syntactically Awesome Style Sheets ('Sass')", + "Description": "An 'SCSS' compiler, powered by the 'LibSass' library. With this, R developers can use variables, inheritance, and functions to generate dynamic style sheets. The package uses the 'Sass CSS' extension language, which is stable, powerful, and CSS compatible.", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@rstudio.com\", \"aut\"), person(\"Timothy\", \"Mastny\", , \"tim.mastny@gmail.com\", \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Barret\", \"Schloerke\", , \"barret@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Carson\", \"Sievert\", , \"carson@rstudio.com\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Christophe\", \"Dervieux\", , \"cderv@rstudio.com\", c(\"ctb\"), comment = c(ORCID = \"0000-0003-4474-2498\")), person(family = \"RStudio\", role = c(\"cph\", \"fnd\")), person(family = \"Sass Open Source Foundation\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Greter\", \"Marcel\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Mifsud\", \"Michael\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Hampton\", \"Catlin\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Natalie\", \"Weizenbaum\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Chris\", \"Eppstein\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Adams\", \"Joseph\", role = c(\"ctb\", \"cph\"), comment = \"json.cpp\"), person(\"Trifunovic\", \"Nemanja\", role = c(\"ctb\", \"cph\"), comment = \"utf8.h\") )", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/sass/, https://github.com/rstudio/sass", + "BugReports": "https://github.com/rstudio/sass/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make", + "Imports": [ + "fs (>= 1.2.4)", + "rlang (>= 0.4.10)", + "htmltools (>= 0.5.1)", "R6", - "fs", - "htmltools", - "rappdirs", - "rlang" + "rappdirs" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "withr", + "shiny", + "curl" ], - "Hash": "3fb78d066fb92299b1d13f6a7c9a90a8" + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Timothy Mastny [aut], Richard Iannone [aut] (), Barret Schloerke [aut] (), Carson Sievert [aut, cre] (), Christophe Dervieux [ctb] (), RStudio [cph, fnd], Sass Open Source Foundation [ctb, cph] (LibSass library), Greter Marcel [ctb, cph] (LibSass library), Mifsud Michael [ctb, cph] (LibSass library), Hampton Catlin [ctb, cph] (LibSass library), Natalie Weizenbaum [ctb, cph] (LibSass library), Chris Eppstein [ctb, cph] (LibSass library), Adams Joseph [ctb, cph] (json.cpp), Trifunovic Nemanja [ctb, cph] (utf8.h)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "scales": { "Package": "scales", "Version": "1.4.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "RColorBrewer", + "Title": "Scale Functions for Visualization", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Dana\", \"Seidel\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Graphical scales map data to aesthetics, and provide methods for automatically determining breaks and labels for axes and legends.", + "License": "MIT + file LICENSE", + "URL": "https://scales.r-lib.org, https://github.com/r-lib/scales", + "BugReports": "https://github.com/r-lib/scales/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "cli", - "farver", + "farver (>= 2.0.3)", "glue", "labeling", "lifecycle", - "rlang", + "R6", + "RColorBrewer", + "rlang (>= 1.1.0)", "viridisLite" ], - "Hash": "c5bba8f0d1df8c4b9538a40570798d9b" + "Suggests": [ + "bit64", + "covr", + "dichromat", + "ggplot2", + "hms (>= 0.5.0)", + "stringi", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "LazyLoad": "yes", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Thomas Lin Pedersen [cre, aut] (), Dana Seidel [aut], Posit Software, PBC [cph, fnd] (03wc8by49)", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" }, "sf": { "Package": "sf", "Version": "1.1-2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "DBI", - "R", - "Rcpp", - "classInt", - "grDevices", + "Title": "Simple Features for R", + "Authors@R": "c(person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Roger\", family = \"Bivand\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2392-6140\")), person(given = \"Etienne\", family = \"Racine\", role = \"ctb\"), person(given = \"Michael\", family = \"Sumner\", role = \"ctb\"), person(given = \"Ian\", family = \"Cook\", role = \"ctb\"), person(given = \"Tim\", family = \"Keitt\", role = \"ctb\"), person(given = \"Robin\", family = \"Lovelace\", role = \"ctb\"), person(given = \"Hadley\", family = \"Wickham\", role = \"ctb\"), person(given = \"Jeroen\", family = \"Ooms\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"ctb\"), person(given = \"Thomas Lin\", family = \"Pedersen\", role = \"ctb\"), person(given = \"Dan\", family = \"Baston\", role = \"ctb\"), person(given = \"Dewey\", family = \"Dunnington\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Alexandre\", family = \"Courtiol\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0637-2959\")) )", + "Description": "Support for simple feature access, a standardized way to encode and analyze spatial vector data. Binds to 'GDAL' for reading and writing data, to 'GEOS' for geometrical operations, and to 'PROJ' for projection conversions and datum transformations. Uses by default the 's2' package for geometry operations on geodetic (long/lat degree) coordinates.", + "License": "GPL-2 | MIT + file LICENSE", + "URL": "https://r-spatial.github.io/sf/, https://github.com/r-spatial/sf", + "BugReports": "https://github.com/r-spatial/sf/issues", + "Depends": [ + "methods", + "R (>= 4.1.0)" + ], + "Imports": [ + "classInt (>= 0.4-1)", + "DBI (>= 0.8)", "graphics", + "grDevices", "grid", - "methods", - "s2", + "s2 (>= 1.1.0)", "stats", "tools", - "units", + "units (>= 0.7-0)", "utils" ], - "Hash": "02483c8ee4115581472646cd5d5984d9" + "Suggests": [ + "blob", + "nanoarrow", + "covr", + "dplyr (>= 1.0.0)", + "ggplot2", + "knitr", + "lwgeom (>= 0.2-14)", + "maps", + "mapview", + "Matrix", + "microbenchmark", + "odbc", + "pbapply", + "pillar", + "pool", + "raster", + "rlang", + "rmarkdown", + "RPostgres (>= 1.1.0)", + "RPostgreSQL", + "RSQLite", + "sp (>= 1.2-4)", + "spatstat (>= 2.0-1)", + "spatstat.geom", + "spatstat.random", + "spatstat.linnet", + "spatstat.utils", + "stars (>= 0.6-0)", + "terra", + "testthat (>= 3.0.0)", + "tibble (>= 1.4.1)", + "tidyr (>= 1.2.0)", + "tidyselect (>= 1.0.0)", + "tmap (>= 2.0)", + "vctrs", + "wk (>= 0.9.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Config/testthat/edition": "2", + "Config/needs/coverage": "XML", + "SystemRequirements": "GDAL (>= 2.0.1), GEOS (>= 3.4.0), PROJ (>= 4.8.0), sqlite3", + "Collate": "'RcppExports.R' 'init.R' 'import-standalone-s3-register.R' 'crs.R' 'bbox.R' 'read.R' 'db.R' 'sfc.R' 'sfg.R' 'sf.R' 'bind.R' 'wkb.R' 'wkt.R' 'plot.R' 'geom-measures.R' 'geom-predicates.R' 'geom-transformers.R' 'transform.R' 'proj.R' 'sp.R' 'grid.R' 'arith.R' 'tidyverse.R' 'tidyverse-vctrs.R' 'cast_sfg.R' 'cast_sfc.R' 'graticule.R' 'datasets.R' 'aggregate.R' 'agr.R' 'maps.R' 'join.R' 'sample.R' 'valid.R' 'collection_extract.R' 'jitter.R' 'sgbp.R' 'spatstat.R' 'stars.R' 'crop.R' 'gdal_utils.R' 'nearest.R' 'normalize.R' 'sf-package.R' 'defunct.R' 'z_range.R' 'm_range.R' 'shift_longitude.R' 'make_grid.R' 's2.R' 'terra.R' 'geos-overlayng.R' 'break_antimeridian.R'", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Roger Bivand [ctb] (ORCID: ), Etienne Racine [ctb], Michael Sumner [ctb], Ian Cook [ctb], Tim Keitt [ctb], Robin Lovelace [ctb], Hadley Wickham [ctb], Jeroen Ooms [ctb] (ORCID: ), Kirill Müller [ctb], Thomas Lin Pedersen [ctb], Dan Baston [ctb], Dewey Dunnington [ctb] (ORCID: ), Alexandre Courtiol [ctb] (ORCID: )", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" }, "shiny": { "Package": "shiny", "Version": "1.14.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "bslib", - "cachem", + "Type": "Package", + "Title": "Web Application Framework for R", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Garrick\", \"Aden-Buie\", , \"garrick@adenbuie.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(, \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(, \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", + "Description": "Makes it incredibly easy to build interactive web applications with R. Automatic \"reactive\" binding between inputs and outputs and extensive prebuilt widgets make it possible to build beautiful, responsive, and powerful applications with minimal effort.", + "License": "MIT + file LICENSE", + "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", + "BugReports": "https://github.com/rstudio/shiny/issues", + "Depends": [ + "methods", + "R (>= 3.1.2)" + ], + "Imports": [ + "bslib (>= 0.6.0)", + "cachem (>= 1.1.0)", "cli", - "commonmark", - "fastmap", - "fontawesome", - "glue", + "commonmark (>= 2.0.0)", + "fastmap (>= 1.1.1)", + "fontawesome (>= 0.4.0)", + "glue (>= 1.3.2)", "grDevices", - "htmltools", - "httpuv", - "jsonlite", - "later", - "lifecycle", - "methods", - "mime", + "htmltools (>= 0.5.4)", + "httpuv (>= 1.5.2)", + "jsonlite (>= 0.9.16)", + "later (>= 1.0.0)", + "lifecycle (>= 0.2.0)", + "mime (>= 0.3)", "otel", - "promises", - "rlang", + "promises (>= 1.5.0)", + "R6 (>= 2.0)", + "rlang (>= 0.4.10)", "sourcetools", "tools", "utils", "withr", "xtable" ], - "Hash": "e71fb3fcf73db153eccd8afed293984f" + "Suggests": [ + "Cairo (>= 1.5-5)", + "coro (>= 1.1.0)", + "datasets", + "DT", + "dygraphs", + "future", + "ggplot2", + "knitr (>= 1.6)", + "magrittr", + "markdown", + "mirai", + "otelsdk (>= 0.2.0)", + "ragg", + "reactlog (>= 1.0.0)", + "rmarkdown", + "sass", + "shinytest2", + "showtext", + "testthat (>= 3.2.1)", + "watcher", + "yaml" + ], + "Config/Needs/check": "shinyjs", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Collate": "'app-handle.R' 'globals.R' 'app-state.R' 'app_template.R' 'bind-cache.R' 'bind-event.R' 'bookmark-state-local.R' 'bookmark-state.R' 'bootstrap-deprecated.R' 'bootstrap-layout.R' 'conditions.R' 'map.R' 'utils.R' 'bootstrap.R' 'busy-indicators-spinners.R' 'busy-indicators.R' 'cache-utils.R' 'deprecated.R' 'devmode.R' 'diagnose.R' 'extended-task.R' 'fileupload.R' 'graph.R' 'reactives.R' 'reactive-domains.R' 'history.R' 'hooks.R' 'html-deps.R' 'image-interact-opts.R' 'image-interact.R' 'imageutils.R' 'input-action.R' 'input-checkbox.R' 'input-checkboxgroup.R' 'input-date.R' 'input-daterange.R' 'input-file.R' 'input-numeric.R' 'input-password.R' 'input-radiobuttons.R' 'input-select.R' 'input-slider.R' 'input-submit.R' 'input-text.R' 'input-textarea.R' 'input-utils.R' 'insert-tab.R' 'insert-ui.R' 'jqueryui.R' 'knitr.R' 'middleware-shiny.R' 'middleware.R' 'timer.R' 'shiny.R' 'mock-session.R' 'modal.R' 'modules.R' 'notifications.R' 'otel-attr-srcref.R' 'otel-collect.R' 'otel-enable.R' 'otel-error.R' 'otel-label.R' 'otel-reactive-update.R' 'otel-session.R' 'otel-shiny.R' 'otel-with.R' 'priorityqueue.R' 'progress.R' 'react.R' 'reexports.R' 'render-cached-plot.R' 'render-plot.R' 'render-table.R' 'run-url.R' 'runapp.R' 'serializers.R' 'server-input-handlers.R' 'server-resource-paths.R' 'server.R' 'shiny-options.R' 'shiny-package.R' 'shinyapp.R' 'shinyui.R' 'shinywrappers.R' 'showcase.R' 'snapshot.R' 'staticimports.R' 'tar.R' 'test-export.R' 'test-server.R' 'test.R' 'update-input.R' 'utils-lang.R' 'utils-tags.R' 'version_bs_date_picker.R' 'version_ion_range_slider.R' 'version_jquery.R' 'version_jqueryui.R' 'version_selectize.R' 'version_strftime.R' 'viewer.R'", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], JJ Allaire [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Garrick Aden-Buie [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Jonathan McPherson [aut], Alan Dipert [aut], Barbara Borges [aut], Posit Software, PBC [cph, fnd] (ROR: ), jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Prem Nawaz Khan [ctb] (Bootstrap accessibility plugin), Victor Tsaran [ctb] (Bootstrap accessibility plugin), Dennis Lembree [ctb] (Bootstrap accessibility plugin), Srinivasu Chakravarthula [ctb] (Bootstrap accessibility plugin), Cathy O'Connor [ctb] (Bootstrap accessibility plugin), PayPal, Inc [cph] (Bootstrap accessibility plugin), Stefan Petre [ctb, cph] (Bootstrap-datepicker library), Andrew Rowls [ctb, cph] (Bootstrap-datepicker library), Brian Reavis [ctb, cph] (selectize.js library), Salmen Bejaoui [ctb, cph] (selectize-plugin-a11y library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library), SpryMedia Limited [ctb, cph] (DataTables library), Ivan Sagalaev [ctb, cph] (highlight.js library), R Core Team [ctb, cph] (tar implementation from R)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "sourcetools": { "Package": "sourcetools", "Version": "0.1.7-2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Tools for Reading, Tokenizing and Parsing R Code", + "Authors@R": "person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevinushey@gmail.com\")", + "Maintainer": "Kevin Ushey ", + "Description": "Tools for the reading and tokenization of R code. The 'sourcetools' package provides both an R and C++ interface for the tokenization of R code, and helpers for interacting with the tokenized representation of R code.", + "License": "MIT + file LICENSE", + "Depends": [ + "R (>= 3.0.2)" ], - "Hash": "e716e13bfbfe8acb6182a05f4b367772" + "Suggests": [ + "testthat" + ], + "RoxygenNote": "5.0.1", + "BugReports": "https://github.com/kevinushey/sourcetools/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Kevin Ushey [aut, cre]", + "Repository": "CRAN" }, "stringi": { "Package": "stringi", "Version": "1.8.7", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "stats", + "Date": "2025-03-27", + "Title": "Fast and Portable Character String Processing Facilities", + "Description": "A collection of character string/text/natural language processing tools for pattern searching (e.g., with 'Java'-like regular expressions or the 'Unicode' collation algorithm), random string generation, case mapping, string transliteration, concatenation, sorting, padding, wrapping, Unicode normalisation, date-time formatting and parsing, and many more. They are fast, consistent, convenient, and - thanks to 'ICU' (International Components for Unicode) - portable across all locales and platforms. Documentation about 'stringi' is provided via its website at and the paper by Gagolewski (2022, ).", + "URL": "https://stringi.gagolewski.com/, https://github.com/gagolews/stringi, https://icu.unicode.org/", + "BugReports": "https://github.com/gagolews/stringi/issues", + "SystemRequirements": "ICU4C (>= 61, optional)", + "Type": "Package", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "tools", - "utils" + "utils", + "stats" ], - "Hash": "2b56088e23bdd58f89aebf43a0913457" + "Biarch": "TRUE", + "License": "file LICENSE", + "Authors@R": "c(person(given = \"Marek\", family = \"Gagolewski\", role = c(\"aut\", \"cre\", \"cph\"), email = \"marek@gagolewski.com\", comment = c(ORCID = \"0000-0003-0637-6028\")), person(given = \"Bartek\", family = \"Tartanus\", role = \"ctb\"), person(\"Unicode, Inc. and others\", role=\"ctb\", comment = \"ICU4C source code, Unicode Character Database\") )", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Marek Gagolewski [aut, cre, cph] (), Bartek Tartanus [ctb], Unicode, Inc. and others [ctb] (ICU4C source code, Unicode Character Database)", + "Maintainer": "Marek Gagolewski ", + "License_is_FOSS": "yes", + "Repository": "CRAN" }, "stringr": { "Package": "stringr", "Version": "1.6.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Simple, Consistent Wrappers for Common String Operations", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\", \"cph\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A consistent, simple and easy to use set of wrappers around the fantastic 'stringi' package. All function and argument names (and positions) are consistent, all functions deal with \"NA\"'s and zero length vectors in the same way, and the output from one function is easy to feed into the input of another.", + "License": "MIT + file LICENSE", + "URL": "https://stringr.tidyverse.org, https://github.com/tidyverse/stringr", + "BugReports": "https://github.com/tidyverse/stringr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ "cli", - "glue", - "lifecycle", + "glue (>= 1.6.1)", + "lifecycle (>= 1.0.3)", "magrittr", - "rlang", - "stringi", - "vctrs" + "rlang (>= 1.0.0)", + "stringi (>= 1.5.3)", + "vctrs (>= 0.4.0)" ], - "Hash": "d47392652eedc68bf916657347ff2526" + "Suggests": [ + "covr", + "dplyr", + "gt", + "htmltools", + "htmlwidgets", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/potools/style": "explicit", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre, cph], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "sys": { "Package": "sys", "Version": "3.4.3", "Source": "Repository", - "Repository": "CRAN", - "Hash": "de342ebfebdbf40477d0758d05426646" + "Type": "Package", + "Title": "Powerful and Reliable Tools for Running System Commands in R", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"ctb\"))", + "Description": "Drop-in replacements for the base system2() function with fine control and consistent behavior across platforms. Supports clean interruption, timeout, background tasks, and streaming STDIN / STDOUT / STDERR over binary or text connections. Arguments on Windows automatically get encoded and quoted to work on different locales.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/sys", + "BugReports": "https://github.com/jeroen/sys/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "Suggests": [ + "unix (>= 1.4)", + "spelling", + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Gábor Csárdi [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "tibble": { "Package": "tibble", "Version": "3.3.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Simple Data Frames", + "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Romain\", \"Francois\", , \"romain@r-enthusiasts.com\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides a 'tbl_df' class (the 'tibble') with stricter checking and better formatting than the traditional data frame.", + "License": "MIT + file LICENSE", + "URL": "https://tibble.tidyverse.org/, https://github.com/tidyverse/tibble", + "BugReports": "https://github.com/tidyverse/tibble/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ "cli", - "lifecycle", + "lifecycle (>= 1.0.0)", "magrittr", "methods", - "pillar", + "pillar (>= 1.8.1)", "pkgconfig", - "rlang", + "rlang (>= 1.0.2)", "utils", - "vctrs" + "vctrs (>= 0.5.0)" + ], + "Suggests": [ + "bench", + "bit64", + "blob", + "brio", + "callr", + "DiagrammeR", + "dplyr", + "evaluate", + "formattable", + "ggplot2", + "here", + "hms", + "htmltools", + "knitr", + "lubridate", + "nycflights13", + "pkgload", + "purrr", + "rmarkdown", + "stringi", + "testthat (>= 3.0.2)", + "tidyr", + "withr" ], - "Hash": "c55df870972551cac674b50cadb2d51f" + "VignetteBuilder": "knitr", + "Config/autostyle/rmd": "false", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "vignette-formats, as_tibble, add, invariants", + "Config/usethis/last-upkeep": "2025-06-07", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "yes", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "tidyr": { "Package": "tidyr", "Version": "1.3.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "cpp11", - "dplyr", + "Title": "Tidy Messy Data", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to help to create tidy data, where each column is a variable, each row is an observation, and each cell contains a single value. 'tidyr' contains tools for changing the shape (pivoting) and hierarchy (nesting and 'unnesting') of a dataset, turning deeply nested lists into rectangular data frames ('rectangling'), and extracting values out of string columns. It also includes tools for working with missing values (both implicit and explicit).", + "License": "MIT + file LICENSE", + "URL": "https://tidyr.tidyverse.org, https://github.com/tidyverse/tidyr", + "BugReports": "https://github.com/tidyverse/tidyr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli (>= 3.4.1)", + "dplyr (>= 1.1.0)", "glue", - "lifecycle", + "lifecycle (>= 1.0.3)", "magrittr", - "purrr", - "rlang", - "stringr", - "tibble", - "tidyselect", + "purrr (>= 1.0.1)", + "rlang (>= 1.1.1)", + "stringr (>= 1.5.0)", + "tibble (>= 2.1.1)", + "tidyselect (>= 1.2.1)", "utils", - "vctrs" + "vctrs (>= 0.5.2)" ], - "Hash": "a4fa2f5876396f04814cb9d8d9ab89e9" + "Suggests": [ + "covr", + "data.table", + "knitr", + "readr", + "repurrrsive (>= 1.1.0)", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.0)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Davis Vaughan [aut], Maximilian Girlich [aut], Kevin Ushey [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "tidyselect": { "Package": "tidyselect", "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "rlang", - "vctrs", + "Title": "Select from a Set of Strings", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A backend for the selecting functions of the 'tidyverse'. It makes it easy to implement select-like functions in your own packages in a way that is consistent with other 'tidyverse' interfaces for selection.", + "License": "MIT + file LICENSE", + "URL": "https://tidyselect.r-lib.org, https://github.com/r-lib/tidyselect", + "BugReports": "https://github.com/r-lib/tidyselect/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "cli (>= 3.3.0)", + "glue (>= 1.3.0)", + "lifecycle (>= 1.0.3)", + "rlang (>= 1.0.4)", + "vctrs (>= 0.5.2)", "withr" ], - "Hash": "829f27b9c4919c16b593794a6344d6c0" + "Suggests": [ + "covr", + "crayon", + "dplyr", + "knitr", + "magrittr", + "rmarkdown", + "stringr", + "testthat (>= 3.1.1)", + "tibble (>= 2.1.3)" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.0.9000", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "tinytex": { "Package": "tinytex", "Version": "0.60", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "xfun" + "Type": "Package", + "Title": "Helper Functions to Install and Maintain TeX Live, and Compile LaTeX Documents", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Devon\", \"Ryan\", role = \"ctb\", email = \"dpryan79@gmail.com\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Ethan\", \"Heinzen\", role = \"ctb\"), person(\"Fernando\", \"Cagua\", role = \"ctb\"), person() )", + "Description": "Helper functions to install and maintain the 'LaTeX' distribution named 'TinyTeX' (), a lightweight, cross-platform, portable, and easy-to-maintain version of 'TeX Live'. This package also contains helper functions to compile 'LaTeX' documents, and install missing 'LaTeX' packages automatically.", + "Imports": [ + "xfun (>= 0.48)" + ], + "Suggests": [ + "testit", + "rstudioapi" ], - "Hash": "263651b52279eaa7835e44aa32f9b754" + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/tinytex", + "BugReports": "https://github.com/rstudio/tinytex/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: ), Posit Software, PBC [cph, fnd], Christophe Dervieux [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Ethan Heinzen [ctb], Fernando Cagua [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "tzdb": { "Package": "tzdb", "Version": "0.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" + "Title": "Time Zone Database Information", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"Howard\", \"Hinnant\", role = \"cph\", comment = \"Author of the included date library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides an up-to-date copy of the Internet Assigned Numbers Authority (IANA) Time Zone Database. It is updated periodically to reflect changes made by political bodies to time zone boundaries, UTC offsets, and daylight saving time rules. Additionally, this package provides a C++ interface for working with the 'date' library. 'date' provides comprehensive support for working with dates and date-times, which this package exposes to make it easier for other R packages to utilize. Headers are provided for calendar specific calculations, along with a limited interface for time zone manipulations.", + "License": "MIT + file LICENSE", + "URL": "https://tzdb.r-lib.org, https://github.com/r-lib/tzdb", + "BugReports": "https://github.com/r-lib/tzdb/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.5.2)" ], - "Hash": "09e3961e87b7bafa4a9340bbb34aeda8" + "Biarch": "yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Davis Vaughan [aut, cre], Howard Hinnant [cph] (Author of the included date library), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" }, "units": { "Package": "units", "Version": "1.0-1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Measurement Units for R Vectors", + "Authors@R": "c(person(\"Edzer\", \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(\"Thomas\", \"Mailund\", role = \"aut\", email = \"mailund@birc.au.dk\"), person(\"Tomasz\", \"Kalinowski\", role = \"aut\"), person(\"James\", \"Hiebert\", role = \"ctb\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", email = \"iucar@fedoraproject.org\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Thomas Lin\", \"Pedersen\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "Rcpp" ], - "Hash": "14743a941151a12449e8af67497c7b96" + "LinkingTo": [ + "Rcpp (>= 1.1.0)" + ], + "Suggests": [ + "NISTunits", + "measurements", + "xml2", + "magrittr", + "pillar (>= 1.3.0)", + "dplyr (>= 1.0.0)", + "vctrs (>= 0.3.1)", + "ggplot2 (> 3.2.1)", + "testthat (>= 3.0.0)", + "vdiffr", + "knitr", + "rvest", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "Description": "Support for measurement units in R vectors, matrices and arrays: automatic propagation, conversion, derivation and simplification of units; raising errors in case of unit incompatibility. Compatible with the POSIXct, Date and difftime classes. Uses the UNIDATA udunits library and unit database for unit compatibility checking and conversion. Documentation about 'units' is provided in the paper by Pebesma, Mailund & Hiebert (2016, ), included in this package as a vignette; see 'citation(\"units\")' for details.", + "SystemRequirements": "udunits-2", + "License": "GPL-2", + "URL": "https://r-quantities.github.io/units/, https://github.com/r-quantities/units", + "BugReports": "https://github.com/r-quantities/units/issues", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Thomas Mailund [aut], Tomasz Kalinowski [aut], James Hiebert [ctb], Iñaki Ucar [aut] (ORCID: ), Thomas Lin Pedersen [ctb]", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" }, "utf8": { "Package": "utf8", "Version": "1.2.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Unicode Text Processing", + "Authors@R": "c(person(given = c(\"Patrick\", \"O.\"), family = \"Perry\", role = c(\"aut\", \"cph\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"cre\", email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database\"))", + "Description": "Process and print 'UTF-8' encoded international text (Unicode). Input, validate, normalize, encode, format, and display.", + "License": "Apache License (== 2.0) | file LICENSE", + "URL": "https://krlmlr.github.io/utf8/, https://github.com/krlmlr/utf8", + "BugReports": "https://github.com/krlmlr/utf8/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "cli", + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "d526d558be176e9ceb68c3d1e83479b7" + "VignetteBuilder": "knitr, rmarkdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "Patrick O. Perry [aut, cph], Kirill Müller [cre] (ORCID: ), Unicode, Inc. [cph, dtc] (Unicode Character Database)", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "uuid": { "Package": "uuid", "Version": "1.2-2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Tools for Generating and Handling of UUIDs", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, ORCID: ), Theodore Ts'o [aut, cph] (libuuid)", + "Maintainer": "Simon Urbanek ", + "Authors@R": "c(person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.org\", ORCID=\"0000-0003-2297-1732\")), person(\"Theodore\",\"Ts'o\", email=\"tytso@thunk.org\", role=c(\"aut\",\"cph\"), comment=\"libuuid\"))", + "Depends": [ + "R (>= 2.9.0)" ], - "Hash": "528fc9e90d70a6a115e21164f37b2c64" + "Description": "Tools for generating and handling of UUIDs (Universally Unique Identifiers).", + "License": "MIT + file LICENSE", + "URL": "https://www.rforge.net/uuid", + "BugReports": "https://github.com/s-u/uuid/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN" }, "vctrs": { "Package": "vctrs", "Version": "0.7.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Title": "Vector Helpers", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"data.table team\", role = \"cph\", comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Defines new notions of prototype and size that are used to provide tools for consistent and well-founded type-coercion and size-recycling, and are in turn connected to ideas of type- and size-stability useful for analysing function interfaces.", + "License": "MIT + file LICENSE", + "URL": "https://vctrs.r-lib.org/, https://github.com/r-lib/vctrs", + "BugReports": "https://github.com/r-lib/vctrs/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", "glue", - "lifecycle", - "rlang" + "lifecycle (>= 1.0.3)", + "rlang (>= 1.1.7)" + ], + "Suggests": [ + "bit64", + "covr", + "crayon", + "dplyr (>= 0.8.5)", + "generics", + "knitr", + "pillar (>= 1.4.4)", + "pkgdown (>= 2.0.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble (>= 3.1.3)", + "waldo (>= 0.2.0)", + "withr", + "xml2", + "zeallot" ], - "Hash": "2dcde2d30d3ad67bf1d3a37177457b87" + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "KeepSource": "true", + "Language": "en-GB", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Lionel Henry [aut], Davis Vaughan [aut, cre], data.table team [cph] (Radix sort based on data.table's forder() and their contribution to R's order()), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" }, "viridisLite": { "Package": "viridisLite", "Version": "0.4.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Colorblind-Friendly Color Maps (Lite Version)", + "Date": "2026-02-03", + "Authors@R": "c( person(\"Simon\", \"Garnier\", email = \"garnier@njit.edu\", role = c(\"aut\", \"cre\")), person(\"Noam\", \"Ross\", email = \"noam.ross@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Bob\", \"Rudis\", email = \"bob@rud.is\", role = c(\"ctb\", \"cph\")), person(\"Marco\", \"Sciaini\", email = \"sciaini.marco@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Antônio Pedro\", \"Camargo\", role = c(\"ctb\", \"cph\")), person(\"Cédric\", \"Scherer\", email = \"scherer@izw-berlin.de\", role = c(\"ctb\", \"cph\")) )", + "Maintainer": "Simon Garnier ", + "Description": "Color maps designed to improve graph readability for readers with common forms of color blindness and/or color vision deficiency. The color maps are also perceptually-uniform, both in regular form and also when converted to black-and-white for printing. This is the 'lite' version of the 'viridis' package that also contains 'ggplot2' bindings for discrete and continuous color and fill scales and can be found at .", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "hexbin (>= 1.27.0)", + "ggplot2 (>= 1.0.1)", + "testthat", + "covr" ], - "Hash": "9380d36888b72faf5ae6c22b44703867" + "URL": "https://sjmgarnier.github.io/viridisLite/, https://github.com/sjmgarnier/viridisLite/", + "BugReports": "https://github.com/sjmgarnier/viridisLite/issues/", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Simon Garnier [aut, cre], Noam Ross [ctb, cph], Bob Rudis [ctb, cph], Marco Sciaini [ctb, cph], Antônio Pedro Camargo [ctb, cph], Cédric Scherer [ctb, cph]", + "Repository": "CRAN" }, "vroom": { "Package": "vroom", "Version": "1.7.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Read and Write Rectangular Text Data Quickly", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "The goal of 'vroom' is to read and write data (like 'csv', 'tsv' and 'fwf') quickly. When reading it uses a quick initial indexing step, then reads the values lazily , so only the data you actually use needs to be read. The writer formats the data in parallel and writes to disk asynchronously from formatting.", + "License": "MIT + file LICENSE", + "URL": "https://vroom.tidyverse.org, https://github.com/tidyverse/vroom", + "BugReports": "https://github.com/tidyverse/vroom/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ "bit64", - "cli", - "cpp11", + "cli (>= 3.2.0)", "crayon", "glue", "hms", - "lifecycle", + "lifecycle (>= 1.0.3)", "methods", - "progress", - "rlang", + "rlang (>= 1.1.0)", "stats", - "tibble", + "tibble (>= 2.0.0)", "tidyselect", - "tzdb", - "vctrs", + "tzdb (>= 0.1.1)", + "vctrs (>= 0.2.0)", "withr" ], - "Hash": "1e9494eda38f3418f71474363293da2a" + "Suggests": [ + "archive", + "bench (>= 1.1.0)", + "covr", + "curl", + "dplyr", + "forcats", + "fs", + "ggplot2", + "knitr", + "patchwork", + "prettyunits", + "purrr", + "rmarkdown", + "rstudioapi", + "scales", + "spelling", + "testthat (>= 2.1.0)", + "tidyr", + "utils", + "waldo", + "xml2" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.0)", + "progress (>= 1.2.3)", + "tzdb (>= 0.1.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "nycflights13, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "false", + "Config/usethis/last-upkeep": "2025-11-25", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "Config/build/compilation-database": "true", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [cph] (grisu3 implementation), Mikkel Jørgensen [cph] (grisu3 implementation), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "withr": { "Package": "withr", "Version": "3.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics" + "Title": "Run Code 'With' Temporarily Modified Global State", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", , \"krlmlr+r@mailbox.org\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevinushey@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A set of functions to run code 'with' safely and temporarily modified global state. Many of these functions were originally a part of the 'devtools' package, this provides a simple package with limited dependencies to provide access to these functions.", + "License": "MIT + file LICENSE", + "URL": "https://withr.r-lib.org, https://github.com/r-lib/withr#readme", + "BugReports": "https://github.com/r-lib/withr/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "graphics", + "grDevices" ], - "Hash": "d979712ec72df779bc2d30bcc5d0d541" + "Suggests": [ + "callr", + "DBI", + "knitr", + "methods", + "rlang", + "rmarkdown (>= 2.12)", + "RSQLite", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Collate": "'aaa.R' 'collate.R' 'connection.R' 'db.R' 'defer-exit.R' 'standalone-defer.R' 'defer.R' 'devices.R' 'local_.R' 'with_.R' 'dir.R' 'env.R' 'file.R' 'language.R' 'libpaths.R' 'locale.R' 'makevars.R' 'namespace.R' 'options.R' 'par.R' 'path.R' 'rng.R' 'seed.R' 'wrap.R' 'sink.R' 'tempfile.R' 'timezone.R' 'torture.R' 'utils.R' 'with.R'", + "NeedsCompilation": "no", + "Author": "Jim Hester [aut], Lionel Henry [aut, cre], Kirill Müller [aut], Kevin Ushey [aut], Hadley Wickham [aut], Winston Chang [aut], Jennifer Bryan [ctb], Richard Cotton [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "wk": { "Package": "wk", "Version": "0.9.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Lightweight Well-Known Geometry Parsing", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\", \"cre\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Anthony\", family = \"North\", email = \"anthony.jl.north@gmail.com\", role = c(\"ctb\")) )", + "Maintainer": "Dewey Dunnington ", + "Description": "Provides a minimal R and C++ API for parsing well-known binary and well-known text representation of geometries to and from R-native formats. Well-known binary is compact and fast to parse; well-known text is human-readable and is useful for writing tests. These formats are useful in R only if the information they contain can be accessed in R, for which high-performance functions are provided here.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Suggests": [ + "testthat (>= 3.0.0)", + "vctrs (>= 0.3.0)", + "sf", + "tibble", + "readr" + ], + "URL": "https://paleolimbot.github.io/wk/, https://github.com/paleolimbot/wk", + "BugReports": "https://github.com/paleolimbot/wk/issues", + "Config/testthat/edition": "3", + "Depends": [ + "R (>= 2.10)" ], - "Hash": "10fb21ed42dbd4ed9162aaab818146e3" + "LazyData": "true", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut, cre] (ORCID: ), Edzer Pebesma [aut] (ORCID: ), Anthony North [ctb]", + "Repository": "CRAN" }, "xfun": { "Package": "xfun", "Version": "0.60", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Daijiang\", \"Li\", role = \"ctb\"), person(\"Xianying\", \"Tan\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person() )", + "Description": "Miscellaneous functions commonly used in other packages maintained by 'Yihui Xie'.", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ "grDevices", "stats", "tools" ], - "Hash": "8304c2894061f6ae062996f09dd1528e" + "Suggests": [ + "testit", + "parallel", + "codetools", + "methods", + "rstudioapi", + "tinytex (>= 0.30)", + "mime", + "litedown (>= 0.6)", + "commonmark", + "knitr (>= 1.50)", + "remotes", + "pak", + "curl", + "xml2", + "jsonlite", + "magick", + "yaml", + "data.table", + "qs2" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/yihui/xfun", + "BugReports": "https://github.com/yihui/xfun/issues", + "Encoding": "UTF-8", + "VignetteBuilder": "litedown", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: , URL: https://yihui.org), Wush Wu [ctb], Daijiang Li [ctb], Xianying Tan [ctb], Salim Brüggemann [ctb] (ORCID: ), Christophe Dervieux [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "xml2": { "Package": "xml2", "Version": "1.6.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Parse XML", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", email = \"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Foundation\", role = \"ctb\", comment = \"Copy of R-project homepage cached as example\") )", + "Description": "Bindings to 'libxml2' for working with XML data using a simple, consistent interface based on 'XPath' expressions. Also supports XML schema validation; for 'XSLT' transformations see the 'xslt' package.", + "License": "MIT + file LICENSE", + "URL": "https://xml2.r-lib.org, https://r-lib.r-universe.dev/xml2", + "BugReports": "https://github.com/r-lib/xml2/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ "cli", "methods", - "rlang" + "rlang (>= 1.1.0)" ], - "Hash": "568fe669c645b2007e4e8fcf5cde40e7" + "Suggests": [ + "covr", + "curl", + "httr", + "knitr", + "mockery", + "rmarkdown", + "testthat (>= 3.2.0)", + "xslt" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "libxml2: libxml2-dev (deb), libxml2-devel (rpm)", + "Collate": "'S4.R' 'as_list.R' 'xml_parse.R' 'as_xml_document.R' 'classes.R' 'format.R' 'import-standalone-obj-type.R' 'import-standalone-purrr.R' 'import-standalone-types-check.R' 'init.R' 'nodeset_apply.R' 'paths.R' 'utils.R' 'xml2-package.R' 'xml_attr.R' 'xml_children.R' 'xml_document.R' 'xml_find.R' 'xml_missing.R' 'xml_modify.R' 'xml_name.R' 'xml_namespaces.R' 'xml_node.R' 'xml_nodeset.R' 'xml_path.R' 'xml_schema.R' 'xml_serialize.R' 'xml_structure.R' 'xml_text.R' 'xml_type.R' 'xml_url.R' 'xml_write.R'", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Jeroen Ooms [aut, cre], Posit Software, PBC [cph, fnd], R Foundation [ctb] (Copy of R-project homepage cached as example)", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "xtable": { "Package": "xtable", "Version": "1.8-8", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods", + "Date": "2026-02-20", + "Title": "Export Tables to LaTeX or HTML", + "Authors@R": "c(person(\"David B.\", \"Dahl\", role=\"aut\"), person(\"David\", \"Scott\", role=c(\"aut\",\"cre\"), email=\"d.scott@auckland.ac.nz\"), person(\"Charles\", \"Roosen\", role=\"aut\"), person(\"Arni\", \"Magnusson\", role=\"aut\"), person(\"Jonathan\", \"Swinton\", role=\"aut\"), person(\"Ajay\", \"Shah\", role=\"ctb\"), person(\"Arne\", \"Henningsen\", role=\"ctb\"), person(\"Benno\", \"Puetz\", role=\"ctb\"), person(\"Bernhard\", \"Pfaff\", role=\"ctb\"), person(\"Claudio\", \"Agostinelli\", role=\"ctb\"), person(\"Claudius\", \"Loehnert\", role=\"ctb\"), person(\"David\", \"Mitchell\", role=\"ctb\"), person(\"David\", \"Whiting\", role=\"ctb\"), person(\"Fernando da\", \"Rosa\", role=\"ctb\"), person(\"Guido\", \"Gay\", role=\"ctb\"), person(\"Guido\", \"Schulz\", role=\"ctb\"), person(\"Ian\", \"Fellows\", role=\"ctb\"), person(\"Jeff\", \"Laake\", role=\"ctb\"), person(\"John\", \"Walker\", role=\"ctb\"), person(\"Jun\", \"Yan\", role=\"ctb\"), person(\"Liviu\", \"Andronic\", role=\"ctb\"), person(\"Markus\", \"Loecher\", role=\"ctb\"), person(\"Martin\", \"Gubri\", role=\"ctb\"), person(\"Matthieu\", \"Stigler\", role=\"ctb\"), person(\"Robert\", \"Castelo\", role=\"ctb\"), person(\"Seth\", \"Falcon\", role=\"ctb\"), person(\"Stefan\", \"Edwards\", role=\"ctb\"), person(\"Sven\", \"Garbade\", role=\"ctb\"), person(\"Uwe\", \"Ligges\", role=\"ctb\"))", + "Maintainer": "David Scott ", + "Imports": [ "stats", - "utils" + "utils", + "methods" + ], + "Suggests": [ + "knitr", + "zoo", + "survival", + "glue", + "tinytex" + ], + "VignetteBuilder": "knitr", + "Description": "Coerce data to LaTeX and HTML tables.", + "URL": "http://xtable.r-forge.r-project.org/", + "Depends": [ + "R (>= 2.10.0)" ], - "Hash": "93b19c064862d315a828c7170d806453" + "License": "GPL (>= 2)", + "Repository": "CRAN", + "NeedsCompilation": "no", + "Author": "David B. Dahl [aut], David Scott [aut, cre], Charles Roosen [aut], Arni Magnusson [aut], Jonathan Swinton [aut], Ajay Shah [ctb], Arne Henningsen [ctb], Benno Puetz [ctb], Bernhard Pfaff [ctb], Claudio Agostinelli [ctb], Claudius Loehnert [ctb], David Mitchell [ctb], David Whiting [ctb], Fernando da Rosa [ctb], Guido Gay [ctb], Guido Schulz [ctb], Ian Fellows [ctb], Jeff Laake [ctb], John Walker [ctb], Jun Yan [ctb], Liviu Andronic [ctb], Markus Loecher [ctb], Martin Gubri [ctb], Matthieu Stigler [ctb], Robert Castelo [ctb], Seth Falcon [ctb], Stefan Edwards [ctb], Sven Garbade [ctb], Uwe Ligges [ctb]" }, "yaml": { "Package": "yaml", "Version": "2.3.12", "Source": "Repository", - "Repository": "CRAN", - "Hash": "7cd77cb32abd9220d744307e9fc94ffb" + "Type": "Package", + "Title": "Methods to Convert R Data to YAML and Back", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"cre\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Shawn\", \"Garbett\", , \"shawn.garbett@vumc.org\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4079-5621\")), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )", + "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", + "License": "BSD_3_clause + file LICENSE", + "URL": "https://yaml.r-lib.org, https://github.com/r-lib/yaml/", + "BugReports": "https://github.com/r-lib/yaml/issues", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [cre] (ORCID: ), Shawn Garbett [ctb] (ORCID: ), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: ), Zhuoer Dong [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: ), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "zip": { "Package": "zip", "Version": "3.0.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Cross-Platform 'zip' Compression", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Kuba\", \"Podgórski\", role = \"ctb\"), person(\"Rich\", \"Geldreich\", role = \"ctb\"), person(\"Arm Limited\", role = c(\"ctb\", \"cph\"), comment = \"bundled Mbed TLS crypto subset in src/mbedtls/ (Apache-2.0)\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Cross-Platform 'zip' Compression Library. A replacement for the 'zip' function, that does not require any additional external tools on any platform.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/zip, https://r-lib.github.io/zip/", + "BugReports": "https://github.com/r-lib/zip/issues", + "LinkingTo": [ "cli" ], - "Hash": "2c4eff2acdb28a05588a5fee7b35921c" + "Suggests": [ + "callr", + "cli", + "curl", + "pillar", + "processx", + "R6", + "testthat", + "webfakes", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "large-files, http", + "Config/usethis/last-upkeep": "2025-05-07", + "Encoding": "UTF-8", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Kuba Podgórski [ctb], Rich Geldreich [ctb], Arm Limited [ctb, cph] (bundled Mbed TLS crypto subset in src/mbedtls/ (Apache-2.0)), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" } } }