diff --git a/.Rbuildignore b/.Rbuildignore index 614ea69..680a09c 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -13,3 +13,5 @@ ^temporary-scripts$ \.Rmd\.orig$ ^vignettes/precompile\.R$ +^reviews$ +^\.claude$ diff --git a/DESCRIPTION b/DESCRIPTION index 5d18abb..ac89779 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -19,16 +19,18 @@ Description: This packages combines a set of utilities for acquiring and process License: MIT + file LICENSE Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.3 -Imports: +Imports: arrow, censusapi, + crosswalk, + curl, sfarrow, dplyr, esri2sf (>= 0.1.1), ellmer, glue, - ggplot2, + httr, + httr2, ipumsr, janitor, jsonlite, @@ -43,7 +45,6 @@ Imports: rfema (>= 1.0.0), rlang, rvest, - scales, sf, stringr, tibble, @@ -52,21 +53,23 @@ Imports: tidytable, tigris, utils, - uuid, - urbnindicators, - urbnthemes + uuid Remotes: ropensci/rfema, yonghah/esri2sf, - UI-Research/urbnindicators, UI-Research/crosswalk, UrbanInstitute/urbnthemes URL: https://ui-research.github.io/climateapi/ Suggests: + ggplot2, knitr, qualtRics, rmarkdown, + scales, testthat (>= 3.0.0), - tidyverse + tidyverse, + urbnthemes Config/testthat/edition: 3 VignetteBuilder: knitr +Config/roxygen2/version: 8.0.0 +RoxygenNote: 7.3.2 diff --git a/NAMESPACE b/NAMESPACE index e642a47..4f4eb4b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,7 +3,6 @@ export(cache_it) export(convert_table_text_to_dataframe) export(download_openfema_datasets) -export(estimate_units_per_parcel) export(estimate_zoning_envelope) export(get_box_path) export(get_business_patterns) @@ -16,9 +15,11 @@ export(get_hazard_mitigation_assistance) export(get_ihp_registrations) export(get_lodes) export(get_naics_codes) +export(get_national_risk_index) export(get_nfip_claims) export(get_nfip_policies) export(get_nfip_residential_penetration) +export(get_openfema_cache_path) export(get_preliminary_damage_assessments) export(get_public_assistance) export(get_sba_loans) @@ -28,15 +29,8 @@ export(get_structures) export(get_system_username) export(get_wildfire_burn_zones) export(inflation_adjust) -export(interpolate_demographics) export(list_openfema_endpoints) -export(polygons_to_linestring) -export(qualtrics_define_missing) -export(qualtrics_format_metadata) -export(qualtrics_get_metadata) -export(qualtrics_plot_question) export(read_ipums_cached) export(read_xlsx_from_url) -export(subdivide_linestring) importFrom(magrittr,"%>%") -importFrom(rlang,":=") +importFrom(rlang,.data) diff --git a/R/climateapi-package.R b/R/climateapi-package.R new file mode 100644 index 0000000..4c9636d --- /dev/null +++ b/R/climateapi-package.R @@ -0,0 +1,5 @@ +#' @keywords internal +"_PACKAGE" + +#' @importFrom rlang .data +NULL diff --git a/R/download_openfema_datasets.R b/R/download_openfema_datasets.R index 288bc31..23ab685 100644 --- a/R/download_openfema_datasets.R +++ b/R/download_openfema_datasets.R @@ -162,11 +162,25 @@ download_openfema_datasets <- function( } message("[", name, "] Downloading ", chosen_format, " from: ", chosen_url) - old_timeout <- getOption("timeout") - on.exit(options(timeout = old_timeout), add = TRUE) - options(timeout = 1200) + ## download to a temporary path and rename only on success: a truncated file + ## would otherwise be served by find_openfema_cache_file() and fail to parse. + ## curl::multi_download() resumes interrupted transfers, which multi-GB + ## datasets (e.g. FimaNfipPolicies, ~5 GB) need on connections that drop + ## mid-transfer; the .partial file is kept on failure so a later attempt or + ## re-run picks up where it left off rather than restarting from zero + temp_path <- paste0(file_path, ".partial") dl_result <- tryCatch({ - utils::download.file(chosen_url, destfile = file_path, mode = "wb", quiet = FALSE) + attempts <- 0 + repeat { + attempts <- attempts + 1 + download_result <- curl::multi_download(chosen_url, destfiles = temp_path, resume = TRUE) + if (isTRUE(download_result$success) && download_result$status_code %in% c(200, 206)) break + if (attempts >= 5) { + stop( + "download failed after ", attempts, " attempts (last status: ", + download_result$status_code, "): ", download_result$error) } + } + file.rename(temp_path, file_path) "downloaded" }, error = function(e) { warning("[", name, "] Download failed: ", conditionMessage(e)) diff --git a/R/estimate_units_per_parcel.R b/R/estimate_units_per_parcel.R deleted file mode 100644 index 1973945..0000000 --- a/R/estimate_units_per_parcel.R +++ /dev/null @@ -1,441 +0,0 @@ -####----HELPER FUNCTIONS----#### -## 01: Deriving Tract-level Improvement Values to Assist with Imputation -prepare_improvement_values = function(data, building_count_variable) { - ## calculating medians/means at the tract level - parcel_improvement_values1a = data %>% - sf::st_drop_geometry() %>% - dplyr::filter( - building_count == .data[[building_count_variable]], - building_count >= 1) %>% - dplyr::group_by(tract_geoid, municipality_name) %>% - dplyr::summarize( - municipality_name = dplyr::first(municipality_name), - parcel_count = n(), - mean_value_improvement = mean(value_improvement, na.rm = TRUE), - median_value_improvement = stats::median(value_improvement, na.rm = TRUE)) %>% - dplyr::ungroup() - - parcel_improvement_values1b = dplyr::bind_rows( - parcel_improvement_values1a, - data %>% - dplyr::filter(!tract_geoid %in% parcel_improvement_values1a$tract_geoid) %>% - dplyr::select(tract_geoid) %>% - sf::st_drop_geometry %>% - dplyr::distinct()) - - ## calculating medians/means at the jurisdiction level - parcel_improvement_values1c = data %>% - sf::st_drop_geometry() %>% - dplyr::filter( - building_count == .data[[building_count_variable]], - building_count >= 1) %>% - dplyr::group_by(municipality_name) %>% - dplyr::summarize( - parcel_count_jurisdiction = n(), - mean_value_improvement_jurisdiction = mean(value_improvement, na.rm = TRUE), - median_value_improvement_jurisdiction = stats::median(value_improvement, na.rm = TRUE)) %>% - dplyr::ungroup() - - ## for tracts with tract-level parcel counts below 30, we use the jurisdiction-level values - parcel_improvement_values = dplyr::left_join( - parcel_improvement_values1b, - parcel_improvement_values1c, - by = "municipality_name") %>% - dplyr::mutate( - dplyr::across( - .cols = dplyr::matches("_value_improvement$"), - .fns = ~ dplyr::if_else(is.na(.x) | parcel_count < 30, get(stringr::str_c(dplyr::cur_column(), "_jurisdiction")), .x))) -} - -## 02: Aligning Imputed Unit Counts with ACS Estimates -benchmark_units_to_census = function(data) { - data %>% - dplyr::group_by(tract_geoid) %>% - ## calculate the tract-level differences between imputed and ACS-reported units, - ## by units-in-structure category - dplyr::mutate( - count_units_1 = sum(residential_unit_categories == "1", na.rm = TRUE), - count_units_2 = sum(residential_unit_categories == "2", na.rm = TRUE), - count_units_3_4 = sum(residential_unit_categories == "3-4", na.rm = TRUE), - count_units_5_9 = sum(residential_unit_categories == "5-9", na.rm = TRUE), - count_units_10_19 = sum(residential_unit_categories == "10-19", na.rm = TRUE), - count_units_20_49 = sum(residential_unit_categories == "20-49", na.rm = TRUE), - count_units_50_more = sum(residential_unit_categories == "50+", na.rm = TRUE), - imputed_units_1 = sum(residential_unit_count[residential_unit_categories == "1"], na.rm = TRUE), - imputed_units_2 = sum(residential_unit_count[residential_unit_categories == "2"], na.rm = TRUE), - imputed_units_3_4 = sum(residential_unit_count[residential_unit_categories == "3-4"], na.rm = TRUE), - imputed_units_5_9 = sum(residential_unit_count[residential_unit_categories == "5-9"], na.rm = TRUE), - imputed_units_10_19 = sum(residential_unit_count[residential_unit_categories == "10-19"], na.rm = TRUE), - imputed_units_20_49 = sum(residential_unit_count[residential_unit_categories == "20-49"], na.rm = TRUE), - imputed_units_50_more = sum(residential_unit_count[residential_unit_categories == "50+"], na.rm = TRUE), - dplyr::across( - .cols = dplyr::matches("acs_units_"), - .fns = ~ get(stringr::str_replace(dplyr::cur_column(), "acs", "imputed")) - .x, - .names = "{.col}_difference")) %>% - dplyr::ungroup() %>% - ## distribute the mean, parcel-level difference (calculated above) across all - ## parcels within each tract so that imputed counts are closer to reported counts - dplyr::mutate( - residential_unit_count_adjusted = dplyr::case_when( - residential_unit_categories == "2" ~ - pmax(residential_unit_count - (acs_units_2_difference / count_units_2), 1), - residential_unit_categories == "3-4" ~ - pmax(residential_unit_count - (acs_units_3_4_difference / count_units_3_4), 2), - residential_unit_categories == "5-9" ~ - pmax(residential_unit_count - (acs_units_5_9_difference / count_units_5_9), 3), - residential_unit_categories == "10-19" ~ - pmax(residential_unit_count - (acs_units_10_19_difference / count_units_10_19), 5), - residential_unit_categories == "20-49" ~ - pmax(residential_unit_count - (acs_units_20_49_difference / count_units_20_49), 10), - residential_unit_categories == "50+" ~ - pmax(residential_unit_count - (acs_units_50_more_difference / count_units_50_more), 20), - TRUE ~ residential_unit_count) %>% - round(0), - ## reclassify each parcel's adjusted unit count - residential_unit_categories = dplyr::case_when( - is.na(residential_unit_count_adjusted) ~ "0", - round(residential_unit_count_adjusted, 0) == 0 ~ "0", - round(residential_unit_count_adjusted, 0) == 1 ~ "1", - round(residential_unit_count_adjusted, 0) == 2 ~ "2", - round(residential_unit_count_adjusted, 0) >= 50 ~ "50+", - round(residential_unit_count_adjusted, 0) >= 20 ~ "20-49", - round(residential_unit_count_adjusted, 0) >= 10 ~ "10-19", - round(residential_unit_count_adjusted, 0) >= 5 ~ "5-9", - round(residential_unit_count_adjusted, 0) >= 3 ~ "3-4") %>% - factor(levels = c("0", "1", "2", "3-4", "5-9", "10-19", "20-49", "50+"), - ordered = TRUE)) %>% - dplyr::select( - parcel_id, - tract_geoid, - jurisdiction, - municipality_name, - residential_unit_count = residential_unit_count_adjusted, - residential_unit_categories, - dplyr::matches("median|mean"), - c(dplyr::matches("acs_units_"), -dplyr::matches("difference"))) -} - -####----MAIN FUNCTION----#### -#' @title Estimate the number and types of structures per parcel -#' -#' @param structures A dataset returned by `get_structure()`. -#' @param parcels A spatial (polygon) dataset. -#' @param zoning A spatial (polygon) zoning dataset. -#' @param acs Optionally, a non-spatial dataset, at the tract level, returned from `urbnindicators::compile_acs_data()`. -#' -#' @return An `sf` object (point geometry, representing parcel centroids) containing the input parcel data augmented with estimated residential unit information. The returned object includes: -#' \describe{ -#' \item{parcel_id}{Character or numeric. The unique parcel identifier from the input data.} -#' \item{tract_geoid}{Character. The 11-digit Census tract GEOID containing the parcel centroid.} -#' \item{jurisdiction}{Character. The jurisdiction name associated with the parcel.} -#' \item{municipality_name}{Character. The municipality name associated with the parcel.} -#' \item{residential_unit_count}{Numeric. The estimated number of residential units on the parcel, benchmarked against ACS estimates at the tract level.} -#' \item{residential_unit_categories}{Factor (ordered). Categorical classification of unit counts: "0", "1", "2", "3-4", "5-9", "10-19", "20-49", "50+".} -#' \item{median_value_improvement_sf}{Numeric. Tract-level median improvement value for single-family parcels.} -#' \item{median_value_improvement_mh}{Numeric. Tract-level median improvement value for manufactured home parcels.} -#' \item{acs_units_N}{Numeric columns (acs_units_1, acs_units_2, etc.). ACS-reported housing unit counts by units-in-structure category for the tract.} -#' \item{zone}{Character. Zoning designation from the zoning dataset.} -#' \item{zoned_housing_type}{Character. Housing type allowed by zoning.} -#' \item{far}{Numeric. Floor area ratio.} -#' \item{setback_front}{Numeric. Front setback requirement in feet.} -#' \item{setback_rear}{Numeric. Rear setback requirement in feet.} -#' \item{setback_side}{Numeric. Side setback requirement in feet.} -#' \item{height_maximum}{Numeric. Maximum building height allowed.} -#' } -#' @export -estimate_units_per_parcel = function( - structures, - parcels, - zoning, - acs = NULL) { - - relevant_geographies = get_spatial_extent_census(zoning) - - if ("state" %in% relevant_geographies$geography) { - relevant_geographies = purrr::map_dfr( - relevant_geographies$state_geoid, - ~ tigris::tracts(cb = TRUE, year = 2022, state = .x)) %>% - dplyr::transmute(GEOID, geography = "tract") %>% - sf::st_drop_geometry() } - - ## in the case that sociodemographic data are not provided by the user, - ## we query them - if (is.null(acs)) { - acs = urbnindicators::compile_acs_data( - variables = NULL, - years = c(2023), - geography = "tract", - states = relevant_geographies %>% - dplyr::mutate(state_geoid = stringr::str_sub(GEOID, 1, 2)) %>% - dplyr::pull(state_geoid) %>% unique(), - counties = NULL, - spatial = TRUE) %>% - sf::st_as_sf() %>% - sf::st_transform(projection) %>% - dplyr::filter(GEOID %in% relevant_geographies$GEOID) } else { - acs = acs %>% - sf::st_as_sf() %>% - sf::st_transform(projection) %>% - dplyr::filter(GEOID %in% relevant_geographies$GEOID) } - - - warning("Need to update code to address overlay zones.") - ## join together our core input datasets - parcel_structures_zoning1 = parcels %>% ## polygons - sf::st_join(structures) %>% - sf::st_point_on_surface() %>% ## points - ## omitting overlay zones so that we have a one-to-one match - ## (and because we have no useful information about the overlay zones...) - sf::st_join(zoning) %>% - dplyr::mutate(record_id = dplyr::row_number()) - - ####----Parcel Centroids Fall in Unzoned Streets----#### - ## some parcels span streets; streets are not (always) zoned in the spatial data - ## when the centroid (or point on surface) of a parcel falls within the street - ## it does not join to the zoning data. accordingly, we take these parcels and - ## if they're located within an incorporated jurisdiction, we join them to the - ## nearest zoning feature - parcels_no_matching_zoning = parcel_structures_zoning1 %>% - dplyr::filter(is.na(zoning_type)) %>% - sf::st_filter(mobile_places_acs %>% dplyr::filter(!stringr::str_detect(NAME, "CDP"))) %>% - sf::st_join(x = ., y = zoning, join = sf::st_nearest_feature) %>% - dplyr::select(-dplyr::matches(".x")) %>% - dplyr::rename_with(.cols = dplyr::matches("\\.y"), .fn = ~ stringr::str_remove(.x, "\\.y")) - - parcel_structures_zoning = dplyr::bind_rows( - parcel_structures_zoning1 %>% - dplyr::filter(!record_id %in% parcels_no_matching_zoning$record_id), - parcels_no_matching_zoning) - - ####----Aggregating Building Footprints to the Parcel Level----#### - non_residential_types = structures %>% - dplyr::filter( - occupancy_class != "Residential", - occupancy_primary != "Unclassified") %>% - dplyr::pull(occupancy_primary) %>% - unique() - - residential_types = structures %>% - dplyr::filter( - occupancy_class %in% c("Residential", "Unclassified"), - occupancy_primary != "Unclassified") %>% - dplyr::pull(occupancy_primary) %>% - unique() - - ## for speed, we drop geometries here and join them back following these - ## calculations - summarized_parcels1 = parcel_structures_zoning %>% - sf::st_drop_geometry() %>% - dplyr::group_by(parcel_id) %>% - dplyr::summarize( - building_count = dplyr::n_distinct(building_id, na.rm = TRUE), - other_building_count = sum( - occupancy_primary %in% c("Temporary Lodging", "Institutional Dormitory", "Nursing Home")), - unclassified_building_count = sum(occupancy_primary == "Unclassified"), - multifamily_building_count = sum(occupancy_primary == "Multi - Family Dwelling"), - singlefamily_building_count = sum(occupancy_primary %in% c("Single Family Dwelling")), - manufactured_building_count = sum(occupancy_primary %in% c("Manufactured Home")), - nonresidential_building_count = sum(occupancy_primary %in% non_residential_types), - residential_building_count = sum(occupancy_primary %in% residential_types), - footprint_building_sqm = sum(building_area_sqm), - average_building_footprint_sqm = sum(building_area_sqm / building_count), - dplyr::across( - .cols = c( - acreage, condo_unit_count, dplyr::matches("value"), zoning_type, treatment, zone, jurisdiction, - municipality_name, building_id), - .fns = dplyr::first)) %>% - dplyr::ungroup() - - ## joining back geometries - summarized_parcels = parcels %>% - dplyr::select(parcel_id) %>% - sf::st_centroid() %>% - dplyr::left_join(summarized_parcels1, by = "parcel_id") %>% - sf::st_join( - acs %>% - dplyr::select(c( - tract_geoid = GEOID, - dplyr::matches("units_in_structure.*renter.*owner"), - -dplyr::matches("percent|_M$|_cv$")))) - - ####----Imputing Parcel Residential Unit Counts----#### - - ## calculating tract-level summary statistics describing improvement values - single_family_parcel_improvement_values = prepare_improvement_values( - data = summarized_parcels, - building_count_variable = "singlefamily_building_count") - manufactured_home_parcel_improvement_values = prepare_improvement_values( - data = summarized_parcels, - building_count_variable = "manufactured_building_count") - - #joining these tract-level summary statistics to our summarized_parcels dataset - final_parcel <- summarized_parcels %>% - dplyr::left_join( - single_family_parcel_improvement_values %>% - dplyr::select( - municipality_name, tract_geoid, - median_value_improvement_sf = median_value_improvement), - by = c("tract_geoid", "municipality_name"), - relationship = "many-to-one") %>% - dplyr::left_join( - manufactured_home_parcel_improvement_values %>% - dplyr::select( - municipality_name, tract_geoid, - median_value_improvement_mh = median_value_improvement), - by = c("tract_geoid", "municipality_name"), - relationship = "many-to-one") - - # applying assumptions to arrive at preliminary estimated unit counts - classified_parcels1 = final_parcel %>% - dplyr::mutate( - residential_unit_count = dplyr::case_when( - !is.na(condo_unit_count) & residential_building_count > 0 ~ condo_unit_count, - # for parcels with multifamily buildings - multifamily_building_count > 0 & - # where the residential share of all buildings times the estimated number of - # single-family units (i.e., value_improvement / median_value_improvement_sf) - # is greater than 20 - ((residential_building_count / building_count) * - (value_improvement / median_value_improvement_sf) >= 20) ~ - # return the residential share of all buildings times the estimated number - # of single-family units times 2.5 (because we assume these multifamily units - # in large multifamily developments are much more affordable than single-family units) - (residential_building_count / building_count) * - (value_improvement / (median_value_improvement_sf * 2.5)), - # for sub-20-unit multifamily developments, return the estimated sf unit count - # (because we assume these units are roughly equivalent in price to an SF unit) - multifamily_building_count > 0 & - ((residential_building_count / building_count) * - (value_improvement / median_value_improvement_sf) < 20) ~ - (residential_building_count / building_count) * - (value_improvement / (median_value_improvement_sf)), - # no buildings = no residential units - building_count == 0 ~ 0, - # all buildings are nonresidential = no residential units - nonresidential_building_count == building_count ~ 0, - # 1 manufactured home = 1 residential unit - manufactured_building_count == 1 ~ 1, - # 1 residential building with an improvement value < 600000 = 1 unit - residential_building_count == 1 & value_improvement < 600000 ~ 1, - # 1 unclassified building with an improvement value < 600000 = 1 unit, provided - # it's in the county (no zoning) or is zoned "not residential" (i.e., it predates - # the curent ordinance) - unclassified_building_count == 1 & - building_count == 1 & - value_improvement < 600000 & - (is.na(zoned_housing_type) | zoned_housing_type != "Not residential") ~ 1, - # all buildings are unclassified = 0 residential units - unclassified_building_count == building_count ~ 0, - # one singlefamily building = 1 residential unit - singlefamily_building_count == 1 ~ 1, - # other buildings (dorms, elder housing, etc.) are akin to multifamily - other_building_count > 0 ~ - (residential_building_count / building_count) * - (value_improvement / median_value_improvement_sf), - # parcels zoned single-family with 1-2 buildings that are not multifamily - # have one residential unit - zoned_housing_type == "One family" & - building_count < 3 & - multifamily_building_count == 0 ~ 1, - # parcels zoned not residential with no multifamily have 0 units - zoned_housing_type == "Not residential" & - multifamily_building_count == 0 ~ 0, - # parcels with no zoning (the county) and 1-2 buildings with a residential - # building count and an improvement value under 600000 have one unit - is.na(zoned_housing_type) & - building_count < 3 & - residential_building_count > 0 & - value_improvement < 600000 ~ 1, - # manufactured home parks have a residential unit count equal to the number - # of manufactured homes - manufactured_building_count > 0 ~ manufactured_building_count, - # parcels with more than one residential building are treated akin to - # multifamily - residential_building_count > 1 & multifamily_building_count == 0 ~ - (residential_building_count / building_count) * - (value_improvement / median_value_improvement_sf)), - # max units on a parcel 300, regardless of above - residential_unit_count = dplyr::case_when( - residential_unit_count > 300 ~ 300, - # if there are more residential buildings than units (as calculated above), - # return the building count - residential_building_count > 3 & - residential_building_count > residential_unit_count ~ - residential_building_count, - TRUE ~ residential_unit_count), - residential_unit_categories = dplyr::case_when( - is.na(residential_unit_count) ~ "0", - round(residential_unit_count, 0) == 0 ~ "0", - round(residential_unit_count, 0) == 1 ~ "1", - round(residential_unit_count, 0) == 2 ~ "2", - round(residential_unit_count, 0) >= 50 ~ "50+", - round(residential_unit_count, 0) >= 20 ~ "20-49", - round(residential_unit_count, 0) >= 10 ~ "10-19", - round(residential_unit_count, 0) >= 5 ~ "5-9", - round(residential_unit_count, 0) >= 3 ~ "3-4") %>% - factor(levels = c("0", "1", "2", "3-4", "5-9", "10-19", "20-49", "50+"), ordered = TRUE), - tenure_by_units_in_structure_renter_owner_occupied_housing_units_1 = - tenure_by_units_in_structure_renter_owner_occupied_housing_units_mobile_home + - tenure_by_units_in_structure_renter_owner_occupied_housing_units_1_detached + - tenure_by_units_in_structure_renter_owner_occupied_housing_units_1_attached) %>% - dplyr::rename_with( - .cols = dplyr::matches("tenure_by_units"), - .fn = ~ stringr::str_replace(.x, "tenure_by_units_in_structure_renter_owner_occupied_housing_", "acs_")) %>% - dplyr::select(-acs_units, -dplyr::matches("detached|attached|boat|mobile")) %>% - ## we repeatedly benchmark against census numbers because each time we do this, - ## parcels shift across category boundaries in multiple directions - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - benchmark_units_to_census() %>% - ## finally, we join back our zoning attributes - dplyr::left_join( - parcel_buildings_zoning %>% - sf::st_drop_geometry() %>% - dplyr::select( - parcel_id, - acreage, - zone, - zoned_housing_type, - far = floorarearatio, - setback_front = frontsetbackft, - setback_rear = rearsetbackft, - setback_side = sidesetbackft, - height_maximum = maxheightft, - maxlotcoverage_building, - maxlotcoverage_buildingimpervious, - maxunitsperacre, - minparking_1br, - minparking_2br, - maxbedrooms, - maxunitsperbldg, - maxstories, - minlotacres, - minparking, - minunitsqft) %>% - dplyr::distinct(parcel_id, .keep_all = TRUE), - by = "parcel_id") -} - -utils::globalVariables(c( - "NAME", "acreage", "acs_units", "building_area_sqm", "building_count", "building_id", - "condo_unit_count", "floorarearatio", "frontsetbackft", - "jurisdiction", "maxbedrooms", "maxheightft", "maxlotcoverage_building", - "maxlotcoverage_buildingimpervious", "maxstories", "maxunitsperacre", - "maxunitsperbldg", "median_value_improvement", "minlotacres", - "minparking", "minparking_1br", "minparking_2br", "minunitsqft", - "mobile_places_acs", "municipality_name", "occupancy_primary", - "parcel_buildings_zoning", "projection", "rearsetbackft", "record_id", - "residential_unit_categories", "residential_unit_count", - "residential_unit_count_adjusted", "sidesetbackft", "state_geoid", - "tenure_by_units_in_structure_renter_owner_occupied_housing_units_1_attached", - "tenure_by_units_in_structure_renter_owner_occupied_housing_units_1_detached", - "tenure_by_units_in_structure_renter_owner_occupied_housing_units_mobile_home", - "tract_geoid", "treatment", "value_improvement", "zone", - "zoned_housing_type", "zoning_type")) diff --git a/R/estimate_zoning_envelope.R b/R/estimate_zoning_envelope.R index fd71dd0..21c97a5 100644 --- a/R/estimate_zoning_envelope.R +++ b/R/estimate_zoning_envelope.R @@ -66,7 +66,7 @@ estimate_zoning_envelope = function( accordingly and/or create such columns using reasonable assumed values.")) } parcel_dimensions = c("parcel_depth", "parcel_width") - if (all(parcel_dimensions %in% names(parcels)) & (any(parcel_dimensions %in% names(parcels)))) { + if (any(parcel_dimensions %in% names(parcels)) && !all(parcel_dimensions %in% names(parcels))) { stop("Include either both or neither of `parcel_depth` and `parcel_width`.") } if (nrow(parcels %>% dplyr::filter(is.na(height_stories_maximum) & is.na(height_feet_maximum))) > 1) { diff --git a/R/get_business_patterns.R b/R/get_business_patterns.R index aaca6a8..8514d96 100644 --- a/R/get_business_patterns.R +++ b/R/get_business_patterns.R @@ -6,8 +6,9 @@ #' codes for use with `get_business_patterns()`. This is a wrapper around #' `censusapi::listCensusMetadata(name = "cbp")`. #' -#' @param year The vintage year for NAICS codes. Data are available from 1986 through 2023. -#' Default is 2023. +#' @param year The vintage year for NAICS codes. Data are available from 2008 through 2023. +#' Years 1986-2007 use SIC or older NAICS classification systems that are not currently +#' supported. Default is 2023. #' @param digits The number of digits for desired NAICS codes. Must be between 2 and 6. #' Default is 3. Two-digit codes represent broad industry sectors (20 codes), #' while six-digit codes represent detailed industries. @@ -33,18 +34,12 @@ #' get_naics_codes(year = 2020, digits = 4) #' } get_naics_codes <- function(year = 2023, digits = 3) { - if (year < 1986) { stop("Year must be 1986 or later.") } + if (year < 2008) { stop("Year must be 2008 or later. Years 1986-2007 use SIC or older NAICS classification systems that are not currently supported.") } if (year > 2023) { stop("Most recent year for data is 2023.") } if (!digits %in% 2:6) { stop("`digits` must be between 2 and 6.") } - naics_metadata <- censusapi::listCensusMetadata( - name = "cbp", - vintage = as.character(year), - type = "variables", - include_values = TRUE) |> - dplyr::filter( - !is.na(values_code), - nchar(values_code) == digits) |> + naics_metadata <- get_cbp_naics_metadata(year) |> + dplyr::filter(nchar(values_code) == digits) |> dplyr::transmute( naics_code = values_code, naics_label = values_label, @@ -55,6 +50,36 @@ get_naics_codes <- function(year = 2023, digits = 3) { } +#' Get CBP NAICS code/label metadata, falling back to a bundled reference table for +#' 2008-2011 vintages where the Census API serves no code/label lookup at all +#' +#' @param year The CBP vintage year. +#' +#' @return A tibble with (at least) `values_code` and `values_label` columns, matching +#' the schema `censusapi::listCensusMetadata(..., include_values = TRUE)` returns for +#' vintages where a lookup table is available. +#' @noRd +get_cbp_naics_metadata = function(year) { + naics_metadata_raw = censusapi::listCensusMetadata( + name = "cbp", + vintage = as.character(year), + type = "variables", + include_values = TRUE) + + if ("values_code" %in% colnames(naics_metadata_raw)) { + naics_metadata_raw %>% + dplyr::filter(!is.na(values_code)) %>% + tibble::as_tibble() + } else { + ## years 2008-2011: the Census API returns unlabeled variable definitions only for + ## this vintage (no values_code/values_label columns at all); fall back to Census's + ## own official, bundled NAICS2007 code/label reference table + readr::read_csv( + system.file("extdata", "naics2007_codes.csv", package = "climateapi"), + show_col_types = FALSE) %>% + dplyr::rename(values_code = naics_code, values_label = naics_label) } +} + #' @title Obtain County Business Patterns (CBP) Estimates per County #' #' @param year The vintage of CBP data desired. Data are available from 2008-2023. @@ -106,16 +131,27 @@ get_naics_codes <- function(year = 2023, digits = 3) { #' Accounts (NAICS 525920); Offices of Notaries (NAICS 541120); Private Households (NAICS 814); #' and Public Administration (NAICS 92) #' -#' @return A tibble with data on county-level employees, employers, and aggregate -#' annual payrolls by industry and employer size +#' For `geo = "zipcode"`, Census's ZIP Code Business Patterns (ZBP) only publishes +#' `employees`/`annual_payroll` for `naics_code == "00"` (total, all sectors); the Census API +#' returns a literal `0` for every other NAICS code at the zip-code level, which reflects a +#' suppression convention, not a true absence of establishments. This function coerces those +#' values to `NA` and emits a one-time message explaining this. +#' +#' @return A tibble with data on employees, employers, and aggregate annual payrolls by +#' industry and employer size. The geographic columns differ by `geo`: #' \describe{ #' \item{year}{the year for which CBP data is pulled from} -#' \item{state}{A two-digit state identifier.} -#' \item{county}{A three-digit county identifier.} +#' \item{state}{(geo = "county" only) A two-digit state identifier.} +#' \item{county}{(geo = "county" only) A three-digit county identifier.} +#' \item{zip_code}{(geo = "zipcode" only) A five-digit ZIP code.} #' \item{employees}{number of individual employees employed in that particular industry -#' and establishment size combination} +#' and establishment size combination. For geo = "zipcode", this is only published +#' by Census for `naics_code == "00"` (total, all sectors); all other NAICS codes +#' are NA -- see `@details`.} #' \item{employers}{number of establishments of each employment size} -#' \item{annual_payroll}{total annual payroll expenditures measured in $1,000's of USD} +#' \item{annual_payroll}{total annual payroll expenditures measured in $1,000's of USD. +#' For geo = "zipcode", this is only published by Census for `naics_code == "00"` +#' (total, all sectors); all other NAICS codes are NA -- see `@details`.} #' \item{industry}{industry classification according to North American Industry Classification System. #' Refer to details for additional information} #' \item{employee_size_range_label}{range for the employment size of establishments included in each @@ -152,20 +188,26 @@ get_business_patterns = function(year = 2023, geo = "county", naics_code_digits year >= 2008 ~ "NAICS2007", TRUE ~ "NAICS2007" ) - naics_label_var <- paste0(naics_version, "_LABEL") + ## the 2008-2011 CBP API vintage uses a "_TTL" (title) suffix for the NAICS label + ## variable rather than the "_LABEL" suffix used from 2012 onward + naics_label_var <- if (year %in% 2008:2011) { + paste0(naics_version, "_TTL") } else { + paste0(naics_version, "_LABEL") } - naics_codes_metadata = censusapi::listCensusMetadata( - name = "cbp", - vintage = as.character(year), - type = "variables", - include_values = TRUE) %>% - #filter out codes 92 and 95 which do not appear to have data associated and - #don't appear on the census list of naics codes at - #https://www2.census.gov/programs-surveys/cbp/technical-documentation/reference/naics-descriptions/naics2017.txt - dplyr::filter(!stringr::str_starts(values_code, "92|95")) %>% - tibble::as_tibble() + ## single source of truth for NAICS code/label metadata, shared with get_naics_codes() + naics_codes_metadata = get_cbp_naics_metadata(year) if (!is.null(naics_codes)) { + ## sectors 92 and 95 are valid NAICS classification codes but CBP has no data for them + ## at all; give an honest, distinct error here rather than the generic "not a valid + ## NAICS code" message below + requested_92_95 = naics_codes[stringr::str_starts(as.character(naics_codes), "92|95")] + if (length(requested_92_95) > 0) { + stop(stringr::str_c( + "NAICS sector(s) ", stringr::str_c(requested_92_95, collapse = ", "), + " (92/95) have no CBP data available -- these sectors are excluded from Census's ", + "County Business Patterns series entirely (see `@details`).")) } + naics_code_check = naics_codes_metadata %>% dplyr::filter(values_code %in% naics_codes) %>% nrow() @@ -178,40 +220,58 @@ get_business_patterns = function(year = 2023, geo = "county", naics_code_digits naics_code_digits = NULL } + ## sectors 92 and 95 have no CBP data at all (see above); exclude them from the + ## digit-based query, which has no user-supplied codes to individually validate/error on + naics_codes_metadata_queryable = naics_codes_metadata %>% + dplyr::filter(!stringr::str_starts(values_code, "92|95")) + if (!is.null(naics_code_digits)) { - naics_codes_to_query = naics_codes_metadata %>% + naics_codes_to_query = naics_codes_metadata_queryable %>% dplyr::filter( nchar(values_code) == naics_code_digits, !is.na(values_code)) %>% dplyr::pull(values_code) } else { - naics_codes_to_query = naics_codes_metadata %>% + naics_codes_to_query = naics_codes_metadata_queryable %>% dplyr::filter( values_code %in% naics_codes, !is.na(values_code)) %>% dplyr::pull(values_code) } - cbp = purrr::map_dfr( - naics_codes_to_query, - ## some high-level codes (92 and 94) error with a "No data to return" - ## message, so we wrap this in a tryCatch(). this doesn't appear to be an - ## error with our query--there's no data for these codes on data.census.gov - ## either - ~ tryCatch({ - # Build the API call dynamically based on NAICS version - api_args <- list( - name = "cbp", - vintage = year, - vars = c("EMP", "YEAR", "ESTAB", "PAYANN", "EMPSZES", naics_label_var), - region = paste0(geo, ":*") - ) - # Add the NAICS filter with the correct variable name - api_args[[naics_version]] <- .x + ## fetches CBP data for one NAICS code, nationwide in a single call. Some older CBP + ## vintages (2008-2011) reject a single nationwide county-level query for exceeding the + ## Census API's cell limit; when that specific error occurs, fall back to querying + ## state-by-state instead (some high-level codes also error with "No data to return", + ## which doesn't appear to be an error with our query -- there's no data for these codes + ## on data.census.gov either -- so any other error is treated as "no data"). + fetch_cbp_data = function(naics_code) { + api_args <- list( + name = "cbp", + vintage = year, + vars = c("EMP", "YEAR", "ESTAB", "PAYANN", "EMPSZES", naics_label_var), + region = paste0(geo, ":*")) + api_args[[naics_version]] <- naics_code + tryCatch( do.call(censusapi::getCensus, api_args) %>% - dplyr::mutate(naics_code = .x)}, - error = function(e) { return(tibble::tibble()) })) %>% + dplyr::mutate(naics_code = naics_code), + error = function(e) { + if (geo == "county" && stringr::str_detect(conditionMessage(e), "cell limit")) { + state_codes = tidycensus::fips_codes$state_code |> unique() + + purrr::map_dfr( + state_codes, + function(state_code) { + state_api_args = api_args + state_api_args$regionin = stringr::str_c("state:", state_code) + tryCatch( + do.call(censusapi::getCensus, state_api_args) %>% + dplyr::mutate(naics_code = naics_code), + error = function(e2) tibble::tibble()) }) + } else { tibble::tibble() } }) } + + cbp = purrr::map_dfr(naics_codes_to_query, fetch_cbp_data) %>% # Rename the NAICS label column to a standard name - dplyr::rename_with(~ "NAICS_LABEL", dplyr::matches("NAICS[0-9]+_LABEL")) %>% + dplyr::rename_with(~ "NAICS_LABEL", dplyr::matches("NAICS[0-9]+_(LABEL|TTL)")) %>% dplyr::mutate( # state, # county, @@ -280,12 +340,29 @@ get_business_patterns = function(year = 2023, geo = "county", naics_code_digits { if (geo == "county") { dplyr::select(., year, state, county, employees, employers, annual_payroll, - industry, employee_size_range_label, employee_size_range_code, naics_code)} + industry, employee_size_range_label, employee_size_range_code, naics_code)} else if (geo == "zipcode") { dplyr::select(., year, zip_code, employees, employers, annual_payroll, industry, employee_size_range_label, employee_size_range_code, naics_code) } } + ## Census's ZIP Code Business Patterns (ZBP) only publishes employees/annual_payroll for + ## naics_code == "00" (total, all sectors); every other NAICS code returns a literal 0 at + ## the zip-code level, which reflects a suppression convention, not a true absence of + ## establishments -- coerce these to NA and disclose the convention once per call + if (geo == "zipcode" && any(cbp$naics_code != "00", na.rm = TRUE)) { + message(stringr::str_c( + "For geo = 'zipcode', Census's ZIP Code Business Patterns (ZBP) only publishes ", + "`employees`/`annual_payroll` for NAICS code '00' (total, all sectors); every other ", + "NAICS code returns a literal 0 from the Census API for these fields, which is NOT a ", + "true zero -- it reflects a suppression convention, not an absence of establishments. ", + "These values have been coerced to NA.")) + + cbp = cbp %>% + dplyr::mutate( + employees = dplyr::if_else(naics_code != "00", NA_real_, employees), + annual_payroll = dplyr::if_else(naics_code != "00", NA_real_, annual_payroll)) } + return(cbp %>% tibble::as_tibble()) } @@ -293,4 +370,5 @@ utils::globalVariables( c("EMP", "EMPSZES", "ESTAB", "NAICS2017_LABEL", "NAICS2012_LABEL", "NAICS2007_LABEL", "NAICS_LABEL", "PAYANN", "annual_payroll", "employee_size_range", "employee_size_range_code", "employee_size_range_label", - "employees", "employers", "industry", "values_code", "values_label", "naics_code")) + "employees", "employers", "industry", "values_code", "values_label", "naics_code", + "naics_label")) diff --git a/R/get_current_fire_perimeters.R b/R/get_current_fire_perimeters.R index dcc0905..986dc1f 100644 --- a/R/get_current_fire_perimeters.R +++ b/R/get_current_fire_perimeters.R @@ -50,6 +50,9 @@ get_current_fire_perimeters = function( if (!is.null(geography)) { stop("Invalid geography. Geography must be NULL.")} + if (!is.null(file_path)) { + stop("Invalid file_path. file_path must be NULL.")} + ## data may only be queried from the API if (!isTRUE(api)) { stop("Data must be queried from the API; set `api = TRUE`.")} @@ -64,8 +67,10 @@ get_current_fire_perimeters = function( incident_size_acres = attr_incident_size, incident_short_description = attr_incident_short_description, percent_contained = attr_percent_contained, - identified_date = attr_fire_discovery_date_time %>% lubridate::as_datetime(), - updated_date = attr_modified_on_date_time_dt %>% lubridate::as_datetime()) + ## the source fields are epoch milliseconds, but lubridate::as_datetime() expects + ## epoch seconds; dividing by 1000 avoids dates ~1000x too far in the future + identified_date = (attr_fire_discovery_date_time / 1000) %>% lubridate::as_datetime(), + updated_date = (attr_modified_on_date_time_dt / 1000) %>% lubridate::as_datetime()) message(stringr::str_c( "Each observation represents a distinct wildfire and its perimeters. ", diff --git a/R/get_disaster_dollar_database.R b/R/get_disaster_dollar_database.R index d73b723..602fa3f 100644 --- a/R/get_disaster_dollar_database.R +++ b/R/get_disaster_dollar_database.R @@ -1,9 +1,19 @@ -#' @title Get Disaster Dollar Database Data -#' @details These data are sourced from: https://carnegieendowment.org/features/disaster-dollar-database. The data returned from this function are unchanged, though some columns have been renamed slightly for clarity and consistency. +#' @title Get Disaster Dollar Database Data +#' @details These data are sourced from: https://carnegieendowment.org/features/disaster-dollar-database. +#' The raw source file has 86 columns; this function returns a curated 17-column subset +#' (renamed slightly for clarity and consistency). Columns dropped include: the Federal +#' Register Notice grantee detail columns (`frn{1-4}_date`/`_url`, and each FRN's +#' `grantee{1-9}_name`/`_url`/`_amount` columns), `declaration_url`, and the SBA home/business +#' loan split columns (`sba_home_approved_loan_amount`, `sba_home_loan_count`, +#' `sba_business_approved_loan_amount`, `sba_business_loan_count`). #' #' @param file_path The path (on Box) to the file containing the raw data. #' -#' @returns A dataframe comprising disaster-level observations with financial assistance metrics from FEMA's Individual and Households Program (IHP), Public Assistance (PA), HUD's Community Development Block Grant Disaster Recovery (CDBG-DR), and SBA disaster loans. +#' @returns A dataframe comprising disaster-level observations with financial assistance metrics +#' from FEMA's Individual and Households Program (IHP), Public Assistance (PA), HUD's Community +#' Development Block Grant Disaster Recovery (CDBG-DR), and SBA disaster loans. +#' `incident_start`, `incident_end`, and `declaration_date` are returned as `Date` objects +#' (parsed from the raw source's M/D/YY-formatted strings). #' @export #' #' @examples @@ -38,7 +48,15 @@ get_disaster_dollar_database = function( pa_allocated_amount_total = pa_total, pa_projects_count, cdbg_df_allocated_amount_total = cdbg_dr_allocation, - sba_loan_amount_approved_total = sba_total_approved_loan_amount) + sba_loan_amount_approved_total = sba_total_approved_loan_amount) |> + dplyr::mutate(dplyr::across(c(incident_start, incident_end, declaration_date), lubridate::mdy)) + + duplicated_incident_numbers = df_raw$incident_number[duplicated(df_raw$incident_number)] |> unique() + if (length(duplicated_incident_numbers) > 0) { + warning(stringr::str_c( + "The one-row-per-disaster-event assumption is violated in the current source file: ", + "incident_number(s) ", stringr::str_c(duplicated_incident_numbers, collapse = ", "), + " appear in more than one row.")) } message(stringr::str_c( "The unit of observation is: disaster event. ", diff --git a/R/get_emergency_managerment_performance.R b/R/get_emergency_managerment_performance.R index 9022c0b..94ebf3b 100644 --- a/R/get_emergency_managerment_performance.R +++ b/R/get_emergency_managerment_performance.R @@ -3,9 +3,10 @@ #' @description Retrieves Emergency Management Performance Grant (EMPG) award data #' from FEMA, which supports state and local emergency management agencies. #' -#' @param file_path Path to the downloaded dataset on Box. +#' @param file_path Path to the raw data. If NULL (default), reads the most recently +#' cached file for this dataset from `get_openfema_cache_path()`. #' @param api Logical indicating whether to use the OpenFEMA API to retrieve the data. -#' Default is TRUE. +#' Default is FALSE (read from `file_path`, or the local OpenFEMA cache if NULL). #' #' @details Data are from FEMA's OpenFEMA API. See #' \url{https://www.fema.gov/openfema-data-page/emergency-management-performance-grants-v2}. @@ -14,28 +15,32 @@ #' Columns include: #' \describe{ #' \item{id}{Unique identifier for the grant record.} +#' \item{reporting_period}{The reporting period associated with the record.} #' \item{state_name}{Full state name.} #' \item{state_code}{Two-digit state FIPS code.} #' \item{state_abbreviation}{Two-letter state abbreviation.} -#' \item{year_project_start}{Year the project started.} +#' \item{legal_agency_name}{The name of the legal agency administering the grant.} +#' \item{project_type}{The type of project funded.} +#' \item{year_project_start}{Year the project started (derived from `project_start_date`, +#' with corrections for a handful of records with typos in the raw data).} #' \item{project_start_date}{Date the project started.} #' \item{project_end_date}{Date the project ended.} -#' \item{grant_amount}{Total grant amount in dollars.} -#' \item{federal_share}{Federal portion of the grant in dollars.} -#' \item{non_federal_share}{Non-federal cost share in dollars.} -#' \item{program}{EMPG program type.} +#' \item{name_of_program}{The name of the EMPG program.} +#' \item{funding_amount}{Funding amount in dollars.} #' } #' @export get_emergency_management_performance = function( - file_path = file.path( - get_box_path(), "hazards", "FEMA", "emergency-management-performance", - "emergency_management_performance_grants_2025_06_29.csv"), - api = TRUE) { + file_path = NULL, + api = FALSE) { if (isTRUE(api)) { df1 = rfema::open_fema(data_set = "emergencymanagementperformancegrants", ask_before_call = FALSE) %>% janitor::clean_names() + } else if (is.null(file_path)) { + + df1 = arrow::read_parquet(find_openfema_cache_file("EmergencyManagementPerformanceGrants")) %>% + janitor::clean_names() } else { if (!file.exists(file_path)) { stop("Please query the API (`api = TRUE`) or provide a valid `file_path`.")} @@ -44,9 +49,11 @@ get_emergency_management_performance = function( janitor::clean_names() } - df2 %>% dplyr::count(year_project_start) + ## funding_amount is character in api mode, numeric in file mode + df1 = df1 %>% + dplyr::mutate(funding_amount = as.numeric(funding_amount)) - df2 = df1 %>% + df2a = df1 %>% dplyr::rename(state_name = state) %>% dplyr::mutate( year_project_start = lubridate::year(project_start_date), @@ -60,19 +67,23 @@ get_emergency_management_performance = function( id == "ebc64764-a62e-4d98-8a73-bc14a7c78ee3" ~ 2021, id == "a1932015-40ff-4f3d-8a01-f4946da70444" ~ 2022, id == "c8917cc1-853b-4ac5-b3ef-0a607c6e6881" ~ 2022, - TRUE ~ year_project_start)) %>% + TRUE ~ year_project_start)) + + n_excluded_years = df2a %>% dplyr::filter(year_project_start <= 2012) %>% nrow() + + df2 = df2a %>% dplyr::filter(year_project_start > 2012) %>% dplyr::left_join(get_geography_metadata(geography_type = "state")) warning(stringr::str_c( "At the time of writing, there are virtually no records with `year_project_start` values in 2024 and 2025 ", "although the dataset was reported as last being updated on August 24, 2025. ", -"Users should be cautious in interpreting these data as being complete for either year.", -"Further, some records have erroneous project start years in the raw data; these have been ", -"addressed by the authors of the `climateapi` package in part, but some records are included ", -"for years 2004, 2010, 2011, and 2012, those these awards likely correspond to different years.")) +"Users should be cautious in interpreting these data as being complete for either year. ", +n_excluded_years, " records with `year_project_start` <= 2012 have been excluded, due to ", +"suspected year mislabeling in the source data for years this far outside the program's ", +"typical reporting window.")) return(df2) } -utils::globalVariables(c("year_project_start", "project_start_date")) +utils::globalVariables(c("year_project_start", "project_start_date", "funding_amount")) diff --git a/R/get_fema_disaster_declarations.R b/R/get_fema_disaster_declarations.R index 6e8137a..7b6c63b 100644 --- a/R/get_fema_disaster_declarations.R +++ b/R/get_fema_disaster_declarations.R @@ -4,13 +4,22 @@ #' aggregated by year and month. Tribal declarations are stored separately as #' an attribute. #' -#' @param file_path The path (on Box) to the file containing the raw data. -#' @param api If TRUE (default), access data from the API. Else, read locally from `file_path`. +#' @param file_path The path to the raw data. If NULL (default), reads the most recently +#' cached file for this dataset from `get_openfema_cache_path()`. +#' @param api If TRUE, access data from the API. Else (default), read from `file_path` +#' (or the local OpenFEMA cache, if `file_path` is NULL). #' #' @details Data are from FEMA's OpenFEMA API. See #' \url{https://www.fema.gov/openfema-data-page/disaster-declarations-summaries-v2}. #' Statewide declarations are expanded to all counties in the state. #' +#' Connecticut's pre-2022 counties (FIPS 09001-09015) are crosswalked onto the 2022-vintage +#' planning regions (09110-09190) using a binary any-overlap assumption: a planning region +#' is treated as having received a declaration if ANY overlapping pre-2022 county received +#' it, even if only part of that county's area falls within the region. This is not a +#' proportional/population-weighted allocation (unlike the crosswalks this package uses for +#' dollar-valued FEMA datasets), since a declaration is a binary event, not a divisible amount. +#' #' @returns A dataframe comprising Major Disaster Declarations by month by year by county. #' Tribal declarations are stored as an attribute (`tribal_declarations`). Columns include: #' \describe{ @@ -29,20 +38,24 @@ #' get_fema_disaster_declarations(api = TRUE) #' } get_fema_disaster_declarations = function( - file_path = file.path( - get_box_path(), "hazards", "fema", "disaster-declarations", - "raw", "fema_disaster_declarations_county_2024_10_25.csv"), - api = TRUE) { - - ## is the file path valid/accessible? - if (!file.exists(file_path) & !api) { - stop(stringr::str_c( - "The path to the dataset does not point to a valid file. ", - "Please ensure there is a file located at this path: ", file_path, ".")) } + file_path = NULL, + api = FALSE) { if (!api) { - disaster_declarations1 <- readr::read_csv(file_path) |> - janitor::clean_names() + if (is.null(file_path)) { + disaster_declarations1 <- arrow::read_parquet( + find_openfema_cache_file("DisasterDeclarationsSummaries")) |> + janitor::clean_names() + } else { + + ## is the file path valid/accessible? + if (!file.exists(file_path)) { + stop(stringr::str_c( + "The path to the dataset does not point to a valid file. ", + "Please ensure there is a file located at this path: ", file_path, ".")) } + + disaster_declarations1 <- readr::read_csv(file_path) |> + janitor::clean_names() } } else { disaster_declarations1 = rfema::open_fema( data_set = "DisasterDeclarationsSummaries", @@ -51,6 +64,12 @@ get_fema_disaster_declarations = function( ask_before_call = FALSE) |> janitor::clean_names() } + ## api=TRUE and api=FALSE otherwise return different column types for these two fields + disaster_declarations1 = disaster_declarations1 |> + dplyr::mutate( + place_code = as.character(place_code), + tribal_request = as.logical(tribal_request)) + # Defining natural hazards so we can filter out disaster declarations for things like terrorist attacks/biological natural_hazards <- paste0( "incidents_", @@ -86,10 +105,13 @@ get_fema_disaster_declarations = function( ## Major Disaster Declarations only dplyr::filter(declaration_type == "DR") |> ## produce counts at the county x incident-type x year x month level + ## `place_code` is included in the grouping key so that distinct tribes (each + ## identified by their own place_code) aggregate independently, instead of collapsing + ## same-state/same-month/same-incident-type tribal records into one via + ## `dplyr::first(place_code)` tidytable::summarise( - .by = c(fips_state_code, fips_county_code, GEOID, incident_type, year_declared, month_declared), + .by = c(fips_state_code, fips_county_code, GEOID, place_code, incident_type, year_declared, month_declared), count = dplyr::n(), - place_code = dplyr::first(place_code), tribal_request = dplyr::first(tribal_request), declaration_title = paste(declaration_title, collapse = ", ")) |> dplyr::arrange(GEOID, year_declared, month_declared) |> @@ -128,10 +150,58 @@ get_fema_disaster_declarations = function( by = "fips_state_code", relationship = "many-to-many") - disaster_declarations3 = disaster_declarations2 |> + disaster_declarations3a = disaster_declarations2 |> dplyr::filter(!(id %in% c(statewide_declarations1$id))) |> dplyr::bind_rows(statewide_declarations2) + ## Connecticut's real (non-statewide, non-tribal) county-level declarations still carry + ## legacy pre-2022 county FIPS (09001-09015), mixing two incompatible FIPS vintages into + ## one GEOID column alongside the rest of the country's current-vintage GEOIDs (statewide + ## CT declarations, above, are already expanded onto the 2022-vintage regions). Crosswalk + ## these onto the 2022 planning regions via any-overlap propagation -- see @details. + incident_columns = disaster_declarations3a |> + dplyr::select(dplyr::starts_with("incidents_")) |> + colnames() + + is_ct_county_specific = disaster_declarations3a$fips_state_code == "09" & + disaster_declarations3a$fips_county_code != "000" & + disaster_declarations3a$tribal_request == FALSE + + if (any(is_ct_county_specific, na.rm = TRUE)) { + + message(stringr::str_c( + "Connecticut's pre-2022 counties are crosswalked onto 2022-vintage planning regions ", + "using an any-overlap assumption: a planning region is treated as having a declaration ", + "if ANY overlapping pre-2022 county did, even if only part of that county's area falls ", + "within the region. This is not a proportional/population-weighted allocation.")) + + ct_overlap_table = crosswalk::get_crosswalk( + source_geography = "county", + target_geography = "county", + source_year = 2020, + target_year = 2022, + silent = TRUE)$crosswalks$step_1 |> + dplyr::filter(state_fips == "09") |> + dplyr::select(source_geoid, target_geoid) + + ct_crosswalked = disaster_declarations3a |> + dplyr::filter(is_ct_county_specific) |> + dplyr::left_join(ct_overlap_table, by = c("GEOID" = "source_geoid"), relationship = "many-to-many") |> + dplyr::select(-GEOID, -fips_county_code) |> + dplyr::rename(GEOID = target_geoid) |> + dplyr::mutate(fips_county_code = stringr::str_sub(GEOID, 3, 5)) |> + tidytable::summarise( + .by = c(GEOID, fips_state_code, fips_county_code, place_code, year_declared, month_declared), + id = dplyr::first(id), + dplyr::across(dplyr::all_of(incident_columns), ~ sum(.x, na.rm = TRUE)), + declaration_title = paste(unique(declaration_title), collapse = ", ")) + + disaster_declarations3 = disaster_declarations3a |> + dplyr::filter(!is_ct_county_specific) |> + dplyr::bind_rows(ct_crosswalked) + + } else { disaster_declarations3 = disaster_declarations3a } + prep_data = function(data) { data |> dplyr::mutate( @@ -204,4 +274,5 @@ utils::globalVariables(c( "get_box_data_path", "fips_state_code", "fips_county_code", "declaration_date", "declaration_type", "incident_type", "GEOID", "year_declared", "month_declared", ".", "n", "count", "incidents_all", "incidents_natural_hazard", "benchmark_geographies", - "declaration_title", "place_code", "tribal_request")) + "declaration_title", "place_code", "tribal_request", "id", "source_geoid", "target_geoid", + "state_fips")) diff --git a/R/get_government_finances.R b/R/get_government_finances.R index 21aa24b..3e57217 100644 --- a/R/get_government_finances.R +++ b/R/get_government_finances.R @@ -9,7 +9,7 @@ #' 10.1371/journal.pone.0130119. See \url{https://my.willamette.edu/site/mba/public-datasets}. #' #' This is a survey in most years--i.e., only a subset of the full population of governments -#' comprises the sampling frame--but is a true census with relatively high response rates (90%%+) +#' comprises the sampling frame--but is a true census with relatively high response rates (90%+) #' in years ending in 2 and 7. #' #' Definitions of key constructs: @@ -164,19 +164,21 @@ get_government_finances = function() { revenue_intergovernmental_total = total_intergovernmental_revenue, revenue_intergovernmental_federal = total_federal_intergovernmental_revenue, revenue_intergovernmental_state = total_state_intergovernmental_revenue, + revenue_charges_total = revenue_total_chgs_and_miscellaneous, + revenue_utility_total = total_utility_revenue, ## Total expenditures and major subtotals expenditure_total, - expenditure_general = general_expenditure#, - # expenditure_capital_outlay = expenditure_total_capital_outlay, - # expenditure_construction = expenditure_total_construction, - # expenditure_salaries_wages = expenditure_total_salaries_wages, - # expenditure_intergovernmental = expenditure_total_intergovernmental, - # expenditure_education_total = expenditure_total_education, - # expenditure_public_safety = expenditure_total_police_protection, - # expenditure_health_hospitals = expenditure_total_health, - # expenditure_highways = expenditure_total_highways, - # expenditure_public_welfare = expenditure_total_public_welfare, - # expenditure_utility_total = expenditure_total_utility + expenditure_general = general_expenditure, + expenditure_capital_outlay = total_capital_outlays, + expenditure_construction = total_construction, + expenditure_salaries_wages = total_salaries_wages, + expenditure_intergovernmental = total_intergovernmental_expenditure, + expenditure_education_total = expenditure_total_education_total, + expenditure_public_safety = expenditure_police_prot_total, + expenditure_health_hospitals = expenditure_health_total, + expenditure_highways = expenditure_total_highways_total, + expenditure_public_welfare = expenditure_public_welfare_total, + expenditure_utility_total = expenditure_total_utility_total ) return(df_final) @@ -184,15 +186,14 @@ get_government_finances = function() { utils::globalVariables(c( "year4", "fips_code_state", "fips_county", "name", - "revenue_total", "revenue_total_general", "revenue_tax_total", "revenue_tax_property", - - "revenue_tax_total_sales_gross_receipts", "revenue_tax_total_income", - "revenue_total_intergovernmental", "revenue_total_federal_intergovernmental", - "revenue_total_state_intergovernmental", "revenue_total_charges_miscellaneous_general", - "revenue_total_utility", - "expenditure_total", "expenditure_total_general", "expenditure_total_capital_outlay", - "expenditure_total_construction", "expenditure_total_salaries_wages", - "expenditure_total_intergovernmental", "expenditure_total_education", - "expenditure_total_police_protection", "expenditure_total_health", - "expenditure_total_highways", "expenditure_total_public_welfare", - "expenditure_total_utility")) + "revenue_total", "general_revenue", "revenue_tax_total", "revenue_tax_property", + "revenue_tax_total_sales_gr_rec", "revenue_tax_total_income", + "total_intergovernmental_revenue", "total_federal_intergovernmental_revenue", + "total_state_intergovernmental_revenue", "revenue_total_chgs_and_miscellaneous", + "total_utility_revenue", + "expenditure_total", "general_expenditure", "total_capital_outlays", + "total_construction", "total_salaries_wages", + "total_intergovernmental_expenditure", "expenditure_total_education_total", + "expenditure_police_prot_total", "expenditure_health_total", + "expenditure_total_highways_total", "expenditure_public_welfare_total", + "expenditure_total_utility_total")) diff --git a/R/get_hazard_mitigation_assistance.R b/R/get_hazard_mitigation_assistance.R index 29ad50b..152968f 100644 --- a/R/get_hazard_mitigation_assistance.R +++ b/R/get_hazard_mitigation_assistance.R @@ -1,6 +1,6 @@ #' Standardize county names for matching, to the extent possible #' -#' @param county +#' @param county The raw county name #' #' @return Cleaned county names more suitable for matching on #' @noRd @@ -33,9 +33,13 @@ clean_county = function(county) { #' @param file_path_old_grant_system The file path to raw data for HMA applications from #' the older grant-reporting system. These data are typically available from: #' \url{https://www.fema.gov/openfema-data-page/hazard-mitigation-assistance-projects-v4} +#' If NULL (default), reads the most recently cached file for this dataset from +#' `get_openfema_cache_path()`. #' @param file_path_new_grant_system The file path to raw data for HMA applications from #' the newer (FEMA GO) grant-reporting system. These data are typically available from: #' \url{https://www.fema.gov/openfema-data-page/hma-subapplications-v2} +#' If NULL (default), reads the most recently cached file for this dataset from +#' `get_openfema_cache_path()`. #' @param state_abbreviations NULL by default, in which case data are returned for all 51 #' states. Provide a vector of two-character USPS state abbreviations to obtain data for #' a sub-selection of states. @@ -44,6 +48,12 @@ clean_county = function(county) { #' Hazard Mitigation Assistance Projects (v4) and the newer HMA Subapplications (v2). #' Multi-county projects are split across counties based on population proportions. #' +#' Records span the full application lifecycle, not only approved/funded projects -- +#' this includes Denied, Withdrawn, Void, Not Selected, and other pre-decision statuses +#' (the FEMA GO source in particular contains no funded/"Selected" status records at all). +#' Users must filter on `project_status` themselves before summing `project_cost_federal_split` +#' if only approved or funded projects are of interest. +#' #' @return A dataframe of project-county HMA application data. Only `project_cost_federal_split` #' should be used for county-level aggregations. Columns include: #' \describe{ @@ -55,7 +65,8 @@ clean_county = function(county) { #' \item{state_name}{Full state name.} #' \item{county_geoid}{Five-digit county FIPS code.} #' \item{county_population}{County population used for allocation.} -#' \item{project_status}{Current project status (e.g., "Closed", "Active").} +#' \item{project_status}{Current project status (e.g., "Closed", "Active") -- spans the +#' full application lifecycle; see `@details`.} #' \item{project_cost_federal}{Total federal cost at project level.} #' \item{project_cost_federal_split}{Federal cost allocated to this county.} #' } @@ -66,18 +77,22 @@ clean_county = function(county) { #' get_hazard_mitigation_assistance() #' } get_hazard_mitigation_assistance = function( - file_path_old_grant_system = file.path( - get_box_path(), "hazards", "fema", "hazard-mitigation-assistance", "raw", - "HazardMitigationAssistanceProjects_2025_09_27.parquet"), - file_path_new_grant_system = file.path( - get_box_path(), "hazards", "fema", "hazard-mitigation-assistance", "raw", - "HmaSubapplications_2025_09_27.parquet"), + file_path_old_grant_system = NULL, + file_path_new_grant_system = NULL, state_abbreviations = NULL) { if (is.null(state_abbreviations)) { state_abbreviations = c(state.abb, "DC") } if (any(!state_abbreviations %in% c(state.abb, "DC"))) { stop("Only the 50 states and DC are supported at this time.") } - if (!file.exists(file_path_old_grant_system)) stop("Error: there is no file at the specified `file_path_old_grant_system`.") - if (!file.exists(file_path_new_grant_system)) stop("Error: there is no file at the specified `file_path_new_grant_system`.") + + if (is.null(file_path_old_grant_system)) { + file_path_old_grant_system = find_openfema_cache_file("HazardMitigationAssistanceProjects") + } else if (!file.exists(file_path_old_grant_system)) { + stop("Error: there is no file at the specified `file_path_old_grant_system`.") } + + if (is.null(file_path_new_grant_system)) { + file_path_new_grant_system = find_openfema_cache_file("HmaSubapplications") + } else if (!file.exists(file_path_new_grant_system)) { + stop("Error: there is no file at the specified `file_path_new_grant_system`.") } state_fips = get_geography_metadata("state") %>% dplyr::filter(state_abbreviation %in% state_abbreviations) %>% @@ -109,8 +124,12 @@ get_hazard_mitigation_assistance = function( federal_share = cost_share_percentage, #project_federal_share_obligated = federal_share_obligated, project_number_of_properties_mitigated_final = number_of_final_properties) %>% + ## raw `state_number_code` is unpadded for single-digit FIPS states (e.g. "6" for + ## California); pad BEFORE filtering, or every record for AL/AK/AZ/AR/CA/CO/CT is + ## silently dropped by the state_fips filter below + dplyr::mutate( + state_code = as.character(stringr::str_pad(state_code, side = "left", pad = "0", width = 2))) %>% ## only the specified states - ## only approved projects dplyr::filter(state_code %in% !!state_fips) %>% dplyr::mutate( ## for some records, the project_application_cost is zero but there is an @@ -121,7 +140,6 @@ get_hazard_mitigation_assistance = function( project_application_cost > 0, project_application_cost * federal_share, initial_obligation_amount), - state_code = as.character(stringr::str_pad(state_code, side = "left", pad = "0", width = 2)), ## standardizing county names project_counties = project_counties %>% stringr::str_replace_all(c(";" = ",")) %>% @@ -146,6 +164,15 @@ get_hazard_mitigation_assistance = function( stringr::str_detect(project_counties, ","), 1, 0), row_id = dplyr::row_number()) + ## regression guard for the FIPS-padding bug above: every requested state should have + ## at least one legacy HMA record + missing_states = setdiff(state_fips, unique(hma_projects0$state_code)) + if (length(missing_states) > 0) { + stop(stringr::str_c( + "The following requested state FIPS codes are not represented in the legacy HMA data: ", + stringr::str_c(missing_states, collapse = ", "), + ". This may indicate a state_code padding/filtering regression.")) } + ## we lengthen records for projects with multiple counties hma_projects0a = hma_projects0 %>% dplyr::filter(project_counties_multiple_flag == 1) %>% @@ -270,10 +297,7 @@ get_hazard_mitigation_assistance = function( ## same number of distinct projects stopifnot( - hma_projects1b %>% - dplyr::summarize(dplyr::n_distinct(project_id)) %>% nrow() == - hma_projects2 %>% - dplyr::summarize(dplyr::n_distinct(project_id)) %>% nrow()) + dplyr::n_distinct(hma_projects1b$project_id) == dplyr::n_distinct(hma_projects2$project_id)) ####FEMA GO APPLICATIONS#### ## FEMA GO Applications @@ -309,73 +333,79 @@ get_hazard_mitigation_assistance = function( interpolate_columns = c("selection_federal_share_amount") ## Connecticut counties are dated -- we need to crosswalk them to current county- - ## equivalents (planning regions) + ## equivalents (planning regions). Each subapplication's `selection_federal_share_amount` + ## is repeated on every one of its benefiting-county rows (from separate_longer_delim + ## above), so we first weight by each legacy county's *own* population share among the + ## project's listed counties (mirroring the general multi-county split every other state + ## already gets in femago_df5, below) before applying the legacy-county -> planning-region + ## allocation. Without this, a project's amount is multiplied by its benefiting-county count. if ("CT" %in% state_abbreviations) { - ct_county_crosswalk1 = readr::read_csv( - file.path(get_box_path(), "crosswalks", "ctdata_2022_tractcrosswalk_connecticut.csv")) %>% - janitor::clean_names() %>% - dplyr::select( - ## each tract has a single observation - tract_fips_2020, - ## each tract has a single observation - tract_fips_2022, - county_name, - county_fips_2020, - county_fips_2022 = ce_fips_2022) - suppressMessages({ - ct_tract_populations = tidycensus::get_acs( - year = 2021, - geography = "tract", - state = "CT", - variable = "B01003_001", - output = "wide") %>% - dplyr::select( - tract_fips_2020 = GEOID, - population_2020 = B01003_001E) }) - - ct_county_crosswalk = ct_county_crosswalk1 %>% - dplyr::left_join(ct_tract_populations, by = "tract_fips_2020") %>% - tidytable::summarize( - .by = c("county_fips_2020", "county_name", "county_fips_2022"), - population_2020 = sum(population_2020)) %>% - tidytable::mutate( - .by = "county_fips_2020", - population_2020_total = sum(population_2020, na.rm = TRUE)) %>% - tidytable::mutate( - allocation_factor = population_2020 / population_2020_total, - county_name = county_name %>% stringr::str_to_lower()) %>% - tidytable::select(-dplyr::matches("population")) + ct_legacy_populations = tidycensus::get_acs( + year = 2020, + geography = "county", + state = "CT", + variable = "B01003_001", + output = "wide") %>% + dplyr::transmute( + counties = NAME %>% stringr::str_remove(",.*$") %>% clean_county(), + county_population_legacy = B01003_001E) }) + + ct_crosswalk_table = crosswalk::get_crosswalk( + source_geography = "county", + target_geography = "county", + source_year = 2020, + target_year = 2022, + silent = TRUE)$crosswalks$step_1 %>% + dplyr::filter(state_fips == "09") %>% + dplyr::left_join( + tidycensus::fips_codes %>% + dplyr::transmute( + source_geoid = stringr::str_c(state_code, county_code), + counties = clean_county(county)), + by = "source_geoid") %>% + dplyr::select(counties, target_geoid, allocation_factor_source_to_target) crosswalked_ct_counties = femago_df2 %>% dplyr::filter(state_abbreviation == "CT") %>% + dplyr::left_join(ct_legacy_populations, by = "counties") %>% + tidytable::mutate( + .by = "project_id", + project_population_legacy_total = sum(county_population_legacy, na.rm = TRUE)) %>% + dplyr::mutate( + county_weight = dplyr::if_else( + project_population_legacy_total == 0, + NA_real_, + county_population_legacy / project_population_legacy_total)) %>% dplyr::left_join( - ct_county_crosswalk, - by = c("counties" = "county_name"), + ct_crosswalk_table, + by = "counties", relationship = "many-to-many") %>% tidytable::summarize( - .by = c("project_id"), + .by = c("project_id", "target_geoid"), dplyr::across( .cols = dplyr::all_of(interpolate_columns), - .fns = ~ sum(.x * allocation_factor, na.rm = TRUE)), + .fns = ~ dplyr::if_else( + all(is.na(.x)), + NA_real_, + sum(.x * county_weight * allocation_factor_source_to_target, na.rm = TRUE))), dplyr::across( - .cols = -dplyr::all_of(interpolate_columns), + .cols = -dplyr::all_of(c( + interpolate_columns, "counties", "county_population_legacy", + "project_population_legacy_total", "county_weight", "allocation_factor_source_to_target")), .fns = ~ dplyr::first(.x))) %>% - dplyr::select(-county_fips_2020, -counties) %>% - dplyr::rename(county_code_ct = county_fips_2022) %>% dplyr::left_join( tidycensus::fips_codes %>% dplyr::transmute( - county_code_ct = stringr::str_c(state_code, county_code), + target_geoid = stringr::str_c(state_code, county_code), counties = county %>% stringr::str_to_lower() %>% stringr::str_c(" planning region")), - by = "county_code_ct") %>% - dplyr::select(-county_code_ct) + by = "target_geoid") %>% + dplyr::select(-target_geoid) #joining the non CT states with the CT crosswalk to create the updated dataset femago_df3 = femago_df2 %>% dplyr::filter(state_abbreviation != "CT") %>% - dplyr::bind_rows(crosswalked_ct_counties) %>% - dplyr::select(-allocation_factor) } else { + dplyr::bind_rows(crosswalked_ct_counties) } else { femago_df3 = femago_df2 } @@ -385,14 +415,53 @@ get_hazard_mitigation_assistance = function( state_county_xwalk %>% dplyr::select(state_name, county_code, county_population, county_clean), by = c("state_name", "counties" = "county_clean")) - projects_with_missing_county_identifiers = femago_df4 %>% - dplyr::filter(is.na(county_code)) %>% - dplyr::pull(project_id) %>% unique() - - warning(stringr::str_c(length(projects_with_missing_county_identifiers), " projects have been omitted due to missing county-level identifiers.")) + unmatched_rows = femago_df4 %>% dplyr::filter(is.na(county_code)) + unmatched_project_ids = unmatched_rows %>% dplyr::pull(project_id) %>% unique() + unmatched_dollar_total = femago_df1 %>% + dplyr::filter(project_id %in% unmatched_project_ids) %>% + dplyr::pull(selection_federal_share_amount) %>% + sum(na.rm = TRUE) + + if (nrow(unmatched_rows) > 0) { + example_rows = unmatched_rows %>% + dplyr::distinct(project_id, counties) %>% + dplyr::slice_head(n = 5) + + warning(stringr::str_c( + nrow(unmatched_rows), " county mentions across ", length(unmatched_project_ids), + " projects (totaling $", format(round(unmatched_dollar_total), big.mark = ","), + " in federal funding) did not match a known county and have been spread statewide ", + "instead, consistent with the legacy HMA branch's treatment of unmatched counties. ", + "Example project/county pairs: ", + stringr::str_c(stringr::str_c(example_rows$project_id, "/", example_rows$counties), collapse = "; "), ".")) } + + femago_df4b = femago_df4 %>% + dplyr::mutate(counties = dplyr::if_else(is.na(county_code), "statewide", counties)) %>% + dplyr::select(-county_code, -county_population) + + femago_df4c = dplyr::bind_rows( + femago_df4b %>% + dplyr::filter(counties != "statewide") %>% + dplyr::left_join( + state_county_xwalk %>% dplyr::select(state_name, county_code, county_population, county_clean), + by = c("state_name", "counties" = "county_clean")), + femago_df4b %>% + dplyr::filter(counties == "statewide") %>% + dplyr::left_join( + state_county_xwalk %>% + dplyr::transmute(state_name, county_code, county_population, statewide = "statewide"), + by = c("state_name", "counties" = "statewide"), + relationship = "many-to-many")) + + ## CT projects were already fully attributed to target planning regions by the crosswalk + ## step above; they should not be re-split by population here + femago_df5_ct = femago_df4c %>% + dplyr::filter(state_abbreviation == "CT") %>% + dplyr::mutate(selection_federal_share_amount_split = selection_federal_share_amount) %>% + dplyr::rename(county_geoid = county_code) - femago_df5 = femago_df4 %>% - dplyr::filter(! project_id %in% projects_with_missing_county_identifiers) %>% + femago_df5_general = femago_df4c %>% + dplyr::filter(state_abbreviation != "CT") %>% ## obtain a count of counties per project and then create a denominator for summed ## county populations across all the counties per project tidytable::mutate( @@ -411,6 +480,8 @@ get_hazard_mitigation_assistance = function( selection_federal_share_amount_split = selection_federal_share_amount * allocation_factor) %>% dplyr::rename(county_geoid = county_code) + femago_df5 = dplyr::bind_rows(femago_df5_general, femago_df5_ct) + ## ensure the same number of projects stopifnot( nrow(femago_df1) == nrow(femago_df2 %>% dplyr::distinct(project_id))) @@ -459,4 +530,7 @@ utils::globalVariables(c( "project_counties", "hma_project00", "initial_obligation_amount", "project_counties_multiple_flag", "project_fiscal_year", "project_id", "project_identifier", "project_program_area", "selection_federal_share_amount", "selection_federal_share_amount_split", "status", - "subapplicant_state", "subapplicant_state_abbreviation", "selection_status")) + "subapplicant_state", "subapplicant_state_abbreviation", "selection_status", + "county_population_legacy", "county_weight", "source_geoid", "target_geoid", + "allocation_factor_source_to_target", "state_fips", "NAME", "B01003_001E", + "project_population_legacy_total")) diff --git a/R/get_ihp_registrations.R b/R/get_ihp_registrations.R index 37ec2aa..1ee03ce 100644 --- a/R/get_ihp_registrations.R +++ b/R/get_ihp_registrations.R @@ -5,9 +5,11 @@ #' @description Retrieves FEMA Individual and Households Program (IHP) registration data, #' which captures applications for disaster assistance from individuals and households. #' -#' @param state_fips A character vector of two-letter state abbreviations. If NULL (default), -#' return data for all 51 states. Otherwise return data for the specified states. +#' @param state_abbreviation A character vector of two-letter state abbreviations. If NULL +#' (default), return data for all 51 states. Otherwise return data for the specified states. #' @param file_name The name (not the full path) of the Box file containing the raw data. +#' If NULL (default), reads the most recently cached file for this dataset from +#' `get_openfema_cache_path()`. #' @param api If TRUE, query the API. If FALSE (default), read from disk. #' @param outpath The path to save the parquet-formatted datafile. Applicable only when `api = FALSE`. #' @@ -42,76 +44,88 @@ #' @examples #' \dontrun{ #' get_ihp_registrations( -#' state_fips = "NJ", +#' state_abbreviation = "NJ", #' api = TRUE) #' } get_ihp_registrations = function( - state_fips = NULL, - file_name = "IndividualsAndHouseholdsProgramValidRegistrationsV2_2025_09_26.parquet", + state_abbreviation = NULL, + file_name = NULL, api = FALSE, outpath = NULL) { + ihp_vars_all = get_dataset_columns("ihp_registrations") + ihp_vars = ihp_vars_all[!stringr::str_detect(ihp_vars_all, "Need|Max|fvl|Refresh|^id")] + if (isFALSE(api)) { - inpath = file.path( - get_box_path(), "hazards", "fema", "individual-households-program", "raw", file_name) - if (! file.exists(inpath)) { - stop("The provided `file_name` is invalid.") } + if (is.null(state_abbreviation)) { + state_abbreviation = c(datasets::state.abb, "DC") } - if (! (stringr::str_detect(inpath, "parquet")) & - !file.exists(inpath %>% stringr::str_replace("csv", "parquet"))) { + if (is.null(file_name)) { - convert_delimited_to_parquet( - inpath = inpath, - delimit_character = ",", - dataset = "ihp_registrations") } + ## this dataset is ~500MB; filter/select at the arrow scan level (before collect) + ## rather than loading the full file into memory + df1 = arrow::open_dataset( + find_openfema_cache_file("IndividualsAndHouseholdsProgramValidRegistrations")) %>% + dplyr::select(dplyr::any_of(ihp_vars)) %>% + dplyr::filter(damagedStateAbbreviation %in% state_abbreviation) %>% + dplyr::collect() %>% + janitor::clean_names() %>% + clean_ihp() - if (is.null(state_fips)) { - state_fips = c(datasets::state.abb, "DC") } + } else { - if (!stringr::str_detect(inpath, "parquet")) { - inpath = inpath %>% stringr::str_replace("csv", "parquet") } + inpath = file.path( + get_box_path(), "hazards", "fema", "individual-households-program", "raw", file_name) - ihp_vars_all = get_dataset_columns("ihp_registrations") - ihp_vars = ihp_vars_all[!stringr::str_detect(ihp_vars_all, "Need|Max|fvl|Refresh|^id")] + if (! file.exists(inpath)) { + stop("The provided `file_name` is invalid.") } - df1 = arrow::read_parquet( - file = inpath, - col_select = dplyr::any_of(ihp_vars)) %>% - janitor::clean_names() %>% - dplyr::filter(damaged_state_abbreviation %in% state_fips) %>% - clean_ihp() + if (! (stringr::str_detect(inpath, "parquet")) & + !file.exists(inpath %>% stringr::str_replace("csv", "parquet"))) { + + convert_delimited_to_parquet( + inpath = inpath, + delimit_character = ",", + dataset = "ihp_registrations") } + + if (!stringr::str_detect(inpath, "parquet")) { + inpath = inpath %>% stringr::str_replace("csv", "parquet") } + + df1 = arrow::read_parquet( + file = inpath, + col_select = dplyr::any_of(ihp_vars)) %>% + janitor::clean_names() %>% + dplyr::filter(damaged_state_abbreviation %in% state_abbreviation) %>% + clean_ihp() + } } else { + if (is.null(state_abbreviation)) { + state_abbreviation = c(datasets::state.abb, "DC") } + df1 = purrr::map_dfr( - state_fips, + state_abbreviation, ~ rfema::open_fema( data_set = "individualsandhouseholdsprogramvalidregistrations", filters = list(damagedStateAbbreviation = .x), ask_before_call = FALSE)) %>% dplyr::select(dplyr::any_of(ihp_vars)) %>% janitor::clean_names() %>% - dplyr::filter(damaged_state_abbreviation %in% state_fips) %>% + dplyr::filter(damaged_state_abbreviation %in% state_abbreviation) %>% clean_ihp() } - zip_county_xwalk = readr::read_csv( - file.path(get_box_path(), "crosswalks", "geocorr2022_2020_zip_zcta_to_county.csv")) %>% - dplyr::slice(2:nrow(.)) %>% - janitor::clean_names() %>% - dplyr::mutate( - afact = as.numeric(afact), - dplyr::across( - .cols = c(county_name, zip_name), - .fns = ~ stringr::str_remove_all(.x, '\\"'))) %>% - dplyr::select( - zcta_code = zcta, - county_code = county, - county_name, - allocation_factor_zcta_to_county = afact) %>% - dplyr::filter(!is.na(zcta_code)) + zip_county_xwalk = crosswalk::get_crosswalk( + source_geography = "zcta", + target_geography = "county", + silent = TRUE)$crosswalks$step_1 %>% + dplyr::transmute( + zcta_code = source_geoid, + county_code = target_geoid, + allocation_factor_zcta_to_county = allocation_factor_source_to_target) df2 = df1 %>% dplyr::left_join( @@ -145,11 +159,21 @@ multiple observations, and it is critical to summarize or otherwise de-deuplicat What your workflow should look like: (1) You can obtain the original data by running: `dplyr::distinct(df, unique_id, .keep_all = TRUE)`. -(2) You can summarize the data to obtain county-level estimates as follows: +(2) You can summarize the data to obtain county-level estimates of registration counts as follows: + + df |> + dplyr::group_by(geoid_county) |> + dplyr::summarize(valid_registrations = sum(allocation_factor_zcta_to_county, na.rm = TRUE)) + +(3) For dollar-denominated columns (e.g. amount_individual_housing_program), scale by the + allocation factor before summing, so each original registration's dollar amount is only + counted once in total across all of its county matches: df |> dplyr::group_by(geoid_county) |> - dplyr::summarize(valid_registrations = sum(afact, na.rm = TRUE))") + dplyr::summarize( + amount_individual_housing_program = sum( + amount_individual_housing_program * allocation_factor_zcta_to_county, na.rm = TRUE))") message(" These data are from: https://www.fema.gov/openfema-data-page/individuals-and-households-program-valid-registrations-v2. @@ -228,11 +252,12 @@ utils::globalVariables(c( "fema_determined_value_real_property_damage", "fema_determined_value_personal_property_damage", "amount_rental_assistance", "amount_repairs", "amount_replacement", "amount_personal_property", "max_individual_households_program_flag", "max_housing_assistance_flag", "max_other_needs_assistance_flag", - "date_last_updated", "zip_county_xwalk", "access_functional_needs", "afact", + "date_last_updated", "zip_county_xwalk", "access_functional_needs", "damaged_city", "damaged_state_abbreviation", "damaged_zip_code", "emergency_needs", "fip_amount", "food_need", "gross_income", "ha_amount", "ha_max", "household_composition", "ihp_amount", "ihp_max", "last_refresh", "ona_amount", "ona_max", "own_rent", "personal_property_amount", "ppfvl", "rpfvl", "repair_amount", "replacement_amount", "rental_assistance_amount", "shelter_need", "uuid", "zip_name", "zcta", "pop20", "state.abb", "ihp_registrations", "disaster_number", "amount_other_needs_assistance", "census_geoid", "geoid_block_group", "geoid_county", - "geoid_tract", "zcta_code")) + "geoid_tract", "zcta_code", "source_geoid", "target_geoid", "allocation_factor_source_to_target", + "damagedStateAbbreviation")) diff --git a/R/get_lodes.R b/R/get_lodes.R index a636486..01cec91 100644 --- a/R/get_lodes.R +++ b/R/get_lodes.R @@ -179,6 +179,9 @@ get_lodes = function( if (!state_part %in% c("main", "aux")) { stop("`state_part` must be one of 'main' or 'aux'.")} + if (lodes_type != "od" && state_part == "aux") { + warning("state_part is only meaningful for lodes_type = 'od'; wac/rac results are identical for 'main' and 'aux'.") } + # if states == "all" then set states parameter as all 50 states plus DC if ("all" %in% states) { @@ -298,10 +301,22 @@ include federal jobs for 2010 and later. Records for pre-2010 federal jobs are l as NA.\n") } - ## if only years are pre-2010, returns jobs without federal job data + ## if only years are pre-2010, run through the same rename/pivot/rename_lodes_variables() + ## pipeline as post-2010 pulls (skipping only the federal-jobs join, since federal jobs + ## are not available prior to 2010 at all), so the returned schema is always consistent if (years %>% max < 2010) { - return(lodes_all_jobs) + lodes_all_nonfederal_jobs = lodes_all_jobs %>% + dplyr::rename_with(.cols = -c(year, dplyr::matches("GEOID"), state), .fn = ~ stringr::str_c("all_", .x)) %>% + dplyr::mutate(year = as.numeric(year)) %>% + tidyr::pivot_longer( + cols = -c(year, state, dplyr::matches("GEOID")), + names_pattern = "(all)_(.*)", + names_to = c("job_type", "variable")) %>% + tidyr::pivot_wider(names_from = "variable", values_from = value) %>% + rename_lodes_variables() + + return(lodes_all_nonfederal_jobs) } else { @@ -357,4 +372,4 @@ as NA.\n") } } utils::globalVariables(c( - "Explanation", "Variable", "Var1", "Var2", "flag")) + "Explanation", "Variable", "Var1", "Var2", "flag", "value")) diff --git a/R/get_national_risk_index.R b/R/get_national_risk_index.R new file mode 100644 index 0000000..16be673 --- /dev/null +++ b/R/get_national_risk_index.R @@ -0,0 +1,281 @@ +#' @title Get FEMA National Risk Index scores +#' +#' @description Downloads the complete FEMA National Risk Index (NRI) for every US +#' census tract or county. The NRI characterizes a community's relative risk from +#' 18 natural hazards by combining expected annual loss, social vulnerability, and +#' community resilience. All fields published by the NRI feature service are +#' returned, with the source's abbreviated field codes expanded into descriptive +#' snake_case column names (see Details). +#' +#' @param geography The geographic summary level of the results. One of "tract" +#' (the default) or "county". +#' @param cache_path Optional path to a `.parquet` file used as a read-through +#' cache. If supplied and the file already exists, data are read from it and no +#' download occurs. If supplied and the file does not exist, freshly downloaded +#' data are written there for reuse. If `NULL` (the default), data are downloaded +#' fresh and not written to disk. Because the NRI is periodically revised (see +#' Details), delete a stale cache file to force a refresh. +#' +#' @details Data are pulled from FEMA's National Risk Index ArcGIS feature services +#' (one service per geography) and paginated 2,000 records at a time. After +#' `janitor::clean_names()` normalization, the NRI's abbreviated field codes are +#' expanded into readable snake_case names (for example, `WFIR_EALT` becomes +#' `wildfire_estimated_annual_loss_total`, and `EAL_SPCTL` becomes +#' `estimated_annual_loss_state_percentile`); the ArcGIS service artifacts +#' (`OBJECTID`, `Shape__Area`, `Shape__Length`) and redundant source identifier +#' columns are dropped, and a standardized `geoid` join key is prepended. +#' +#' Interpreting the fields depends on the suffix: +#' \itemize{ +#' \item `*_score`, `*_state_percentile`, and `*_national_percentile` columns are +#' **values from 0 to 100**: `*_score` and `*_national_percentile` rank a +#' community against all US communities of the same type (all tracts, or all +#' counties), while `*_state_percentile` ranks it against communities in the +#' same state. Because these are ranks rather than additive quantities, they +#' **cannot be summed or averaged across geographies**; to describe risk for an +#' area spanning several tracts, request `geography = "county"` (or higher) +#' directly rather than aggregating tract scores. +#' \item `*_rating` columns are categorical labels (e.g. "Relatively High"). +#' \item Value and loss columns (`*_estimated_annual_loss_*`, `*_exposure_*`, +#' `*_exposed_area`, `*_event_count`, and the community totals `value_building`, +#' `value_agriculture`, `population`, and `area_sq_mi`) are absolute quantities +#' (dollars, counts, or areas) and *are* additive across geographies. +#' \item Rate and ratio columns (`*_annual_frequency`, `*_historic_loss_ratio_*`, +#' and `*_expected_annual_loss_rate_*`) are normalized rates rather than absolute +#' quantities and, like the percentile columns, **cannot be summed across +#' geographies**. +#' } +#' +#' Field definitions are documented in FEMA's NRI Technical Documentation and data +#' dictionary at (which uses the +#' original abbreviated field codes). Hazard coverage reflects NRI v1.20 (December +#' 2025), in which inland flooding (the `inland_flood_*` columns) replaced the +#' earlier riverine flooding hazard; the source version is carried in the +#' `nri_version` column. If a future NRI release changes the schema, the underlying +#' query surfaces the service error rather than silently truncating results. +#' +#' @returns A tibble with one row per census tract or county. Every field published +#' by the NRI service is returned, with the source's abbreviated field codes expanded +#' into descriptive snake_case names (see Details). Columns fall into these families: +#' \describe{ +#' \item{Identifiers}{`geoid` (a standardized, zero-padded 11-digit tract or +#' 5-digit county FIPS join key, prepended by this function), the `state_name` +#' and `county_name` labels, and the source version `nri_version`. The NRI's +#' redundant identifier fields (`nri_id`, the individual state and county FIPS +#' codes, and `tractfips`) are dropped in favor of `geoid`.} +#' \item{Community totals}{`population`, `value_building` (building value, dollars), +#' `value_agriculture` (agricultural value, dollars), and `area_sq_mi` (square +#' miles).} +#' \item{Composite index families}{`risk_*` (overall National Risk Index), +#' `estimated_annual_loss_*` and `expected_annual_loss_rate_composite_*` +#' (expected annual loss and its annualized rate), `social_vulnerability_index_*` +#' (social vulnerability), `resilience_*` (community resilience), and +#' `community_risk_factor_value`. Each family carries some combination of +#' `_score`/`_state_percentile`/`_national_percentile` (percentile), `_rating` +#' (rating), and `_value`/`_value_*` (absolute) columns.} +#' \item{Per-hazard metrics}{One block per hazard, prefixed by the hazard name: +#' `avalanche`, `coastal_flood`, `cold_wave`, `drought`, `earthquake`, `hail`, +#' `heat_wave`, `hurricane`, `ice_storm`, `landslide`, `lightning`, +#' `inland_flood`, `severe_wind`, `tornado`, `tsunami`, `volcano`, +#' `wildfire`, and `winter_weather`. Within each block, suffixes denote the +#' metric: `_event_count`/`_annual_frequency` (event count and annualized +#' frequency), `_exposure_*` and `_exposed_area` (exposure), `_historic_loss_ratio_*` +#' (historic loss ratio), `_estimated_annual_loss_*` (expected annual loss), +#' `_expected_annual_loss_rate_*` (annualized loss rate), and `_risk_value`/ +#' `_risk_score`/`_risk_rating` (hazard risk value, score, and rating).} +#' } +#' Coastal or otherwise geographically limited hazards are `NA` for communities with +#' no exposure. +#' @export +#' @examples +#' \dontrun{ +#' # county-level scores, downloaded fresh +#' nri_counties <- get_national_risk_index(geography = "county") +#' +#' # tract-level scores, cached locally for reuse across sessions +#' nri_tracts <- get_national_risk_index( +#' geography = "tract", +#' cache_path = file.path(tempdir(), "nri_tracts.parquet")) +#' } +get_national_risk_index = function( + geography = c("tract", "county"), + cache_path = NULL) { + + geography = match.arg(geography) + + ## read-through cache: return the cached copy if the caller supplied a path to one + if (!is.null(cache_path) && file.exists(cache_path)) { + message("Reading cached National Risk Index data from: ", cache_path) + return(arrow::read_parquet(cache_path)) + } + + service_name = if (geography == "tract") { + "National_Risk_Index_Census_Tracts" + } else { + "National_Risk_Index_Counties" + } + service_url = stringr::str_c( + "https://services.arcgis.com/XG15cJAlne2vxtgt/arcgis/rest/services/", + service_name, "/FeatureServer/0/query") + + ## the FIPS field that uniquely identifies each row; already a zero-padded string + ## in the source, but re-padded defensively when building the `geoid` key below + geoid_field = if (geography == "tract") "TRACTFIPS" else "STCOFIPS" + + page_size = 2000 + + fetch_page = function(offset) { + response = httr2::request(service_url) |> + httr2::req_url_query( + where = "1=1", + ## pull every field the service exposes rather than a curated subset + outFields = "*", + ## explicit ordering makes resultOffset pagination deterministic, so pages + ## can't overlap or leave gaps if the service's default order shifts + orderByFields = geoid_field, + returnGeometry = "false", + resultOffset = offset, + resultRecordCount = page_size, + f = "json") |> + httr2::req_timeout(120) |> + httr2::req_retry(max_tries = 3) |> + httr2::req_perform() |> + ## simplifyDataFrame turns the features array into a data frame in one pass + ## (missing values become NA), far faster than per-feature assembly for the + ## full ~460-column schema + httr2::resp_body_json(simplifyVector = TRUE, simplifyDataFrame = TRUE) + + ## ArcGIS reports query errors (e.g. a schema change) as an `error` object inside + ## an HTTP 200 body, which req_perform() won't raise; surface it here so a failed + ## query can't masquerade as "no more records" + if (!is.null(response$error)) { + stop(stringr::str_c( + "NRI feature service returned an error for the ", geography, " query: ", + response$error$message, + ". The service schema may have changed; see https://hazards.fema.gov/nri/data-resources.")) + } + + features = response$features + if (length(features) == 0 || is.null(features$attributes)) { + return(tibble::tibble()) + } + tibble::as_tibble(features$attributes) + } + + pages = list() + offset = 0 + repeat { + page = fetch_page(offset) + if (nrow(page) == 0) break + pages = c(pages, list(page)) + ## advance by the number of rows actually returned rather than a hardcoded + ## page_size, so results aren't skipped if the service caps a page below page_size + offset = offset + nrow(page) + } + + nri_raw = dplyr::bind_rows(pages) + + minimum_expected_records = if (geography == "tract") 80000 else 3000 + if (nrow(nri_raw) < minimum_expected_records) { + warning(stringr::str_c( + "NRI ", geography, " download returned only ", nrow(nri_raw), + " records; the feature service may have changed or truncated results.")) + } + + geoid_width = if (geography == "tract") 11 else 5 + + nri_df = nri_raw |> + janitor::clean_names() |> + ## drop ArcGIS service plumbing that isn't part of the NRI dataset + dplyr::select(-dplyr::any_of(c("objectid", "shape_area", "shape_length"))) |> + ## prepend a standardized, zero-padded join key consistent with the rest of the package + dplyr::mutate( + geoid = stringr::str_pad( + as.character(.data[[stringr::str_to_lower(geoid_field)]]), + width = geoid_width, side = "left", pad = "0")) |> + dplyr::relocate("geoid") |> + dplyr::rename( + state_name = state, + county_name = county, + value_building = buildvalue, + value_agriculture = agrivalue, + area_sq_mi = area) |> + dplyr::select(-c(nri_id, stateabbrv, statefips, countytype, countyfips, stcofips, tract, tractfips)) |> + dplyr::rename_with( + .cols = dplyr::everything(), + .fn = ~ stringr::str_replace_all(.x, c( + "crf" = "community_risk_factor", + "ratng" = "rating", + "wfir" = "wildfire", + "trnd" = "tornado", + "vlcn" = "volcano", + "tsun" = "tsunami", + "ltng" = "lightning", + "ifld" = "inland_flood", + "swnd" = "severe_wind", + "hrcn" = "hurricane", + "istm" = "ice_storm", + "cwav" = "cold_wave", + "hwav" = "heat_wave", + "drgt" = "drought", + "cfld" = "coastal_flood", + "avln" = "avalanche", + "erqk" = "earthquake", + "eal_" = "estimated_annual_loss_", + "ealt" = "estimated_annual_loss_total", + "npctl" = "national_percentile", + "^alr_" = "expected_annual_loss_rate", + "evnts" = "event_count", + "afreq" = "annual_frequency", + "ealpe" = "estimated_annual_loss_population_equivalence", + "eala" = "estimated_annual_loss_agriculture", + "ealb" = "estimated_annual_loss_building", + "ealp" = "estimated_annual_loss_population", + "eals" = "expected_annual_loss_score", + "ealr" = "expected_annual_loss_rating", + "alrb" = "expected_annual_loss_rate_building", + "alrp" = "expected_annual_loss_rate_population", + "alra" = "expected_annual_loss_rate_agriculture", + "_alr_" = "_expected_annual_loss_rate_", + "resl_" = "resilience_", + "sovi_" = "social_vulnerability_index_", + "_valt" = "_value_total", + "_valb" = "_value_building", + ## more-specific pattern first: str_replace_all applies these in order, so + ## "_valpe" must precede "_valp" or "_valp" strips "valp" and leaves a stray "e" + "_valpe" = "_value_population_equivalence", + "_valp" = "_value_population", + "_vala" = "_value_agriculture", + "_spctl" = "_state_percentile", + "wntw" = "winter_weather", + "expb" = "exposure_building", + "expa" = "exposure_agriculture", + "exppe" = "exposure_population_equivalence", + "expp" = "exposure_population", + "riskv" = "risk_value", + "riskr" = "risk_rating", + "risks" = "risk_score", + "nri_ver" = "nri_version", + "hlrb" = "historic_loss_ratio_building", + "hlrp" = "historic_loss_ratio_population", + "hlra" = "historic_loss_ratio_agriculture", + "hlrr" = "historic_loss_ratio_total_rating", + "expt" = "exposure_total", + "exp_area" = "exposed_area", + "lnds" = "landslide", + "ratevalb" = "rate_composite_building", + "ratevalp" = "rate_composite_population", + "ratevala" = "rate_composite_agriculture", + "ratenational_percentile" = "rate_composite_national_percentile", + "ratevra_national_percentile" = "rate_composite_vulnerability_resilience_national_percentile"))) + + if (!is.null(cache_path)) { + arrow::write_parquet(nri_df, sink = cache_path) + } + + return(nri_df) +} + +utils::globalVariables(c( + "buildvalue", "agrivalue", "area", "nri_id", "stateabbrv", "statefips", "countytype", + "countyfips", "stcofips", "tract", "tractfips")) diff --git a/R/get_nfip_claims.R b/R/get_nfip_claims.R index e280682..ddbb96c 100644 --- a/R/get_nfip_claims.R +++ b/R/get_nfip_claims.R @@ -6,6 +6,8 @@ #' @param county_geoids A character vector of five-digit county codes. NULL by default; #' must be non-NULL if `api = TRUE`. #' @param file_name The name (not the full path) of the Box file containing the raw data. +#' If NULL (default), reads the most recently cached file for this dataset from +#' `get_openfema_cache_path()`. #' @param api If TRUE, query the API. FALSE by default. #' #' @details Data are from FEMA's OpenFEMA API. See @@ -28,7 +30,6 @@ #' @returns A data frame comprising county-level data on current NFIP policies #' \describe{ #' \item{state_fips}{A two-digit state identifier.} -#' \item{state_abbreviation}{The name of the state.} #' \item{county_geoid}{A five-digit county identifier.} #' \item{county_name}{The name of the county.} #' \item{year_construction}{The original year of the construction of the building.} @@ -47,7 +48,7 @@ #' \item{damage_contents}{The value of damage to contents.} #' \item{net_payment_building}{Net building payment amount.} #' \item{net_payment_contents}{Net contents payment amount.} -#' \item{net_payment_increased_compliance}{Net Increased Cost of Compliance (ICC) payment amount.} +#' \item{net_payment_icc}{Net Increased Cost of Compliance (ICC) payment amount.} #' } #' @export #' @@ -56,41 +57,50 @@ #' #' test <- get_nfip_claims(county_geoids = c("01001", "48201")) |> #' dplyr::filter( -#' year_of_loss >= 2015, ### in the past 10 years +#' year_loss >= 2015, ### in the past 10 years #' !occupancy_type %in% c("non-residential")) |> ### only residential claims #' dplyr::summarize( #' .by = county_geoid, #' dplyr::across(dplyr::matches("payment"), sum, na.rm = TRUE), -#' residential_claims = dplyr::n_distinct(nfip_claim_id)) +#' residential_claims = dplyr::n()) #'} get_nfip_claims = function( county_geoids = NULL, - file_name = "fima_nfip_claims_2025_09_09.parquet", + file_name = NULL, api = FALSE) { ## if reading from disk if (isFALSE(api)) { - if (is.na(file_name)) stop("If `api = FALSE`, you must provide a `file_name` argument.") - inpath = file.path( - get_box_path(), "hazards", "fema", "national-flood-insurance-program", "raw", file_name) + if (is.null(file_name)) { - ## check that the cached file exists - if (! file.exists(inpath)) { - stop("The provided `file_name` is invalid.") } + df1a = arrow::read_parquet(find_openfema_cache_file("FimaNfipClaims")) |> + janitor::clean_names() - ## if the cached file isn't a parquet file, convert it to one - if (! (stringr::str_detect(inpath, "parquet"))) { + } else { - convert_delimited_to_parquet( - inpath = inpath, - delimit_character = ",", - dataset = "nfip_claims") } + if (is.na(file_name)) stop("If `api = FALSE`, you must provide a `file_name` argument.") - ## read the parquet file - df1a = arrow::read_parquet(file = inpath) |> - janitor::clean_names() + inpath = file.path( + get_box_path(), "hazards", "fema", "national-flood-insurance-program", "raw", file_name) + + ## check that the cached file exists + if (! file.exists(inpath)) { + stop("The provided `file_name` is invalid.") } + + ## if the cached file isn't a parquet file, convert it to one + if (! (stringr::str_detect(inpath, "parquet"))) { + + convert_delimited_to_parquet( + inpath = inpath, + delimit_character = ",", + dataset = "nfip_claims") } + + ## read the parquet file + df1a = arrow::read_parquet(file = inpath) |> + janitor::clean_names() + } } else { @@ -106,12 +116,15 @@ get_nfip_claims = function( "a slow query. An alternate approach is to download the full dataset and then supply that ", "filepath to the parameter `file_name`.")) } + ## rfema::open_fema()'s filter builder (rfema:::gen_api_query()) incorrectly coerces + ## the all-digit countyCode value to an unquoted number, stripping leading zeros and + ## producing a 400 Bad Request; query the API directly instead, always quoting countyCode df1a = purrr::map_dfr( county_geoids, - ~ rfema::open_fema( - data_set = "fimaNfipClaims", - filters = list(countyCode = .x), - ask_before_call = FALSE) |> + ~ query_openfema_quoted_filter( + data_set_endpoint = "https://www.fema.gov/api/open/v2/FimaNfipClaims", + field_name = "countyCode", + field_value = .x) |> janitor::clean_names()) } @@ -149,7 +162,7 @@ get_nfip_claims = function( occupancy_type %in% c(2, 3, 12, 13, 16, 15) ~ "multi-family", occupancy_type %in% c(14) ~ "mobile/manufactured home", occupancy_type %in% c(4, 6, 17, 18, 19) ~ "non-residential"), - year_loss = year_of_loss, + year_loss = as.double(year_of_loss), year_construction = lubridate::year(original_construction_date), count_units_insured = policy_count, ## number of insured units associated with the claim #cause_of_damage, @@ -169,7 +182,7 @@ get_nfip_claims = function( building_deductible_code == "D" ~ 25000, building_deductible_code == "E" ~ 50000, building_deductible_code == "F" ~ 1250, - building_deductible_code == "G" ~ 500, + building_deductible_code == "G" ~ 1500, building_deductible_code == "H" ~ 200), deductible_contents = dplyr::case_when( contents_deductible_code == "0" ~ 500, @@ -185,7 +198,7 @@ get_nfip_claims = function( contents_deductible_code == "D" ~ 25000, contents_deductible_code == "E" ~ 50000, contents_deductible_code == "F" ~ 1250, - contents_deductible_code == "G" ~ 500, + contents_deductible_code == "G" ~ 1500, contents_deductible_code == "H" ~ 200), value_building = building_property_value, value_contents = contents_property_value, diff --git a/R/get_nfip_policies.R b/R/get_nfip_policies.R index aaf34ff..f33cbf4 100644 --- a/R/get_nfip_policies.R +++ b/R/get_nfip_policies.R @@ -5,7 +5,11 @@ #' #' @param state_abbreviation A 2 letter state abbreviation (e.g. TX). #' @param county_geoids A character vector of five-digit county codes. -#' @param file_name The name (not the full path) of the Box file containing the raw data. +#' @param file_name The name (not the full path) of a per-state Box file containing the raw +#' data (see `@details`). If NULL (default), reads `state_abbreviation`'s records directly +#' from the most recently cached nationwide file for this dataset (see +#' `get_openfema_cache_path()`), which avoids the cross-border duplication issue described +#' below entirely. #' @param api If TRUE, query the API. If FALSE (default), read from `file_name`. #' #' @details Data are from FEMA's OpenFEMA API. See @@ -18,8 +22,18 @@ #' The dataset also contains both residential and commercial policies. In order to filter #' to residential policies, the analyst can filter out the "non-residential" occupancy type. #' +#' When `file_name` is supplied explicitly, per-state files (in the `intermediate/` Box +#' folder) are not mutually exclusive: a policy whose county sits near a state border can +#' appear in more than one state's file. When looping this function over multiple states +#' this way and combining results, run `dplyr::distinct(id, .keep_all = TRUE)` on the +#' combined data to remove these duplicates (verified: 72 Delaware-file rows keyed to +#' Maryland counties, all also present in Maryland's own file). This does not apply to the +#' default (cache-backed) mode, which reads directly from the single nationwide file. +#' #' @return A dataframe of project-level funding requests and awards, along with variables that can be aggregated to the county level. #' \describe{ +#' \item{id}{Unique identifier for the policy record; use this to de-duplicate +#' cross-border policies after combining results from multiple states -- see `@details`.} #' \item{state_fips}{A two-digit state identifier.} #' \item{state_abbreviation}{The two-character abbreviation of the state.} #' \item{county_code}{The five-digit county identifier.} @@ -45,7 +59,7 @@ #' file_name = "fima_nfip_policies_2025_10_14.parquet", #' api = FALSE) |> #' dplyr::filter( -#' !occupancy_type %in% c("non-residential"), ### only residential claims, +#' !building_occupancy_type %in% c("non-residential"), ### only residential claims, #' policy_date_termination >= as.Date("2025-10-15"), #' policy_date_effective <= as.Date("2025-10-15")) |> #' dplyr::group_by(county_geoid)|> @@ -56,45 +70,76 @@ get_nfip_policies = function( state_abbreviation, county_geoids = NULL, - file_name = "fima_nfip_policies_2025_10_14.parquet", + file_name = NULL, api = FALSE) { if (isFALSE(api)) { - file <- paste0(state_abbreviation, "_", file_name) + if (is.null(file_name)) { + + ## this dataset is >1GB; filter at the arrow scan level (before collect) rather than + ## loading the full nationwide file into memory. countyCode is the primary geography + ## field; censusTract's county prefix is a fallback for rows with an invalid/missing + ## countyCode (mirrors the county_geoid derivation below) -- both branches of that + ## fallback are covered here so no eventually-surviving row is excluded up front. + df1a_lazy = arrow::open_dataset(find_openfema_cache_file("FimaNfipPolicies")) %>% + dplyr::filter(propertyState %in% state_abbreviation) + + if (!is.null(county_geoids)) { + df1a_lazy = df1a_lazy %>% + dplyr::filter(countyCode %in% county_geoids | substr(censusTract, 1, 5) %in% county_geoids) + } + + df1a = df1a_lazy |> + dplyr::collect() |> + janitor::clean_names() - inpath = file.path( - get_box_path(),"hazards", "fema", "national-flood-insurance-program", "intermediate", file) + } else { - if (! file.exists(inpath)) { - stop("The provided `file_name` is invalid.") } + file <- paste0(state_abbreviation, "_", file_name) - if (! (stringr::str_detect(inpath, "parquet"))) { + inpath = file.path( + get_box_path(),"hazards", "fema", "national-flood-insurance-program", "intermediate", file) - convert_delimited_to_parquet( - inpath = inpath, - delimit_character = ",", - dataset = "nfip_policies") } + if (! file.exists(inpath)) { + stop("The provided `file_name` is invalid.") } - df1a = arrow::read_parquet(file = inpath) |> - janitor::clean_names() + if (! (stringr::str_detect(inpath, "parquet"))) { + + convert_delimited_to_parquet( + inpath = inpath, + delimit_character = ",", + dataset = "nfip_policies") } + + df1a = arrow::read_parquet(file = inpath) |> + janitor::clean_names() + } } else { + ## rfema::open_fema()'s filter builder (rfema:::gen_api_query()) incorrectly coerces + ## the all-digit countyCode value to an unquoted number, stripping leading zeros and + ## producing a 400 Bad Request; query the API directly instead, always quoting countyCode df1a = purrr::map_dfr( county_geoids, - ~ rfema::open_fema( - data_set = "fimanfippolicies", - filters = list(countyCode = .x), - ask_before_call = FALSE) |> + ~ query_openfema_quoted_filter( + data_set_endpoint = "https://www.fema.gov/api/open/v2/FimaNfipPolicies", + field_name = "countyCode", + field_value = .x) |> janitor::clean_names()) } + valid_county_geoids = tidycensus::fips_codes |> + dplyr::transmute(county_geoid = stringr::str_c(state_code, county_code)) |> + dplyr::pull(county_geoid) + df1b = df1a |> tidytable::mutate(county_geoid = tidytable::if_else( - !is.na(county_code), + !is.na(county_code) & county_code %in% valid_county_geoids, county_code, - ### taking county_code if it exists, if not extract from census_tract - stringr::str_sub(census_tract, 1, 5))) + ### taking county_code if it exists AND is a real FIPS county code; a bogus + ### placeholder value (e.g. "10000") otherwise silently overrides a resolvable + ### census_tract, orphaning valid rows to NA geography + stringr::str_sub(census_tract, 1, 5))) if (!is.null(county_geoids)) { df1b = df1b |> @@ -114,6 +159,7 @@ get_nfip_policies = function( result = df1c |> dplyr::transmute( + id, state_fips, state_abbreviation, county_geoid, @@ -152,4 +198,4 @@ utils::globalVariables(c( "mandatory_purchase_flag", "id", "censusTract", "policyCost", "policyCount", "ratedFloodZone", "totalInsurancePremiumOfThePolicy", "policyTerminationDate", "policyEffectiveDate", "occupancyType", "originalConstructionDate", "buildingReplacementCost", "primaryResidenceIndicator", "floodproofedIndicator", - "rentalPropertyIndicator", "tenantIndicator")) + "rentalPropertyIndicator", "tenantIndicator", "propertyState", "countyCode")) diff --git a/R/get_nfip_residential_penetration.R b/R/get_nfip_residential_penetration.R index 80c02ba..07da858 100644 --- a/R/get_nfip_residential_penetration.R +++ b/R/get_nfip_residential_penetration.R @@ -1,7 +1,8 @@ #' Get the share of residential structures covered by NFIP #' -#' @param states NULL by default. -#' @param file_name The name (not full path) of the raw dataset. +#' @param states NULL by default. +#' @param file_name The name (not full path) of the raw dataset. If NULL (default), +#' reads the most recently cached file for this dataset from `get_openfema_cache_path()`. #' #' @return A tibble with the following columns: #' \describe{ @@ -24,14 +25,20 @@ #' } get_nfip_residential_penetration <- function( states = NULL, - file_name = "nfip_residential_penetration_rates_12_12_2025.csv") { - - inpath <- file.path( - get_box_path(), "hazards", "fema", "national-flood-insurance-program", "raw", file_name) - - if (!file.exists(inpath)) { stop("The provided `file_name` is invalid.") } - - df1 <- readr::read_csv(file = inpath) %>% + file_name = NULL) { + + if (is.null(file_name)) { + df0 <- arrow::read_parquet(find_openfema_cache_file("NfipResidentialPenetrationRates")) + } else { + inpath <- file.path( + get_box_path(), "hazards", "fema", "national-flood-insurance-program", "raw", file_name) + + if (!file.exists(inpath)) { stop("The provided `file_name` is invalid.") } + + df0 <- readr::read_csv(file = inpath) + } + + df1 <- df0 %>% janitor::clean_names() %>% dplyr::transmute( state_name = state, @@ -52,8 +59,20 @@ get_nfip_residential_penetration <- function( # Apply filter only when states is not NULL if (!is.null(states)) { - df1 <- df1 %>% - dplyr::filter(state %in% states) } - + ## this column holds full state names (e.g. "Florida"), not abbreviations; warn if + ## any supplied value doesn't match, since an abbreviation would otherwise silently + ## return 0 rows + unmatched_states = setdiff(states, unique(df1$state_name)) + if (length(unmatched_states) > 0) { + stop(stringr::str_c( + "The following `states` values do not match any state_name in the data (this ", + "column holds full state names, e.g. 'Florida', not abbreviations): ", + stringr::str_c(unmatched_states, collapse = ", "), ".")) } + + df1 <- df1 %>% + dplyr::filter(state_name %in% states) } + return(df1) -} \ No newline at end of file +} + +utils::globalVariables(c("fips_code", "as_of_date")) \ No newline at end of file diff --git a/R/get_preliminary_damage_assessments.R b/R/get_preliminary_damage_assessments.R index a4c81b5..31e089d 100644 --- a/R/get_preliminary_damage_assessments.R +++ b/R/get_preliminary_damage_assessments.R @@ -145,9 +145,21 @@ extract_pda_attributes = function(path) { stringr::str_replace_all("(\\:[0-9]|\\: [0-9] )", ":") } text = stringr::str_c(text_event_name, text_pda_preempted, text_primary, sep = " ") + + ## the disaster number is parsed from the PDF text (the FEMA-XXXX-DR pattern) as the + ## primary strategy; filename parsing is only a fallback when that pattern is absent, + ## since some filenames contain unrelated 4-digit sequences (e.g. embedded dates) that + ## collide with real disaster numbers from other files + disaster_number_from_text = text0 %>% + stringr::str_extract("FEMA-[0-9]{4}-DR") %>% + stringr::str_extract("[0-9]{4}") + result = tibble::tibble( path = path, - disaster_number = path %>% stringr::str_extract("[0-9]{4}"), + disaster_number = dplyr::if_else( + !is.na(disaster_number_from_text), + disaster_number_from_text, + path %>% stringr::str_extract("[0-9]{4}")), event_type = event_type, event_title = text_event_name, event_native_flag = dplyr::if_else( @@ -190,8 +202,12 @@ extract_pda_attributes = function(path) { text %>% extract_value(term1 = "Statewide per capita impact indicator", term2 = "$") %>% stringr::str_split(" ") %>% purrr::map_chr(~ .[1]), pa_per_capita_impact_indicator_statewide), pa_per_capita_impact_indicator_countywide = stringr::str_sub(pa_per_capita_impact_indicator_countywide, 1, 5), - dplyr::across(dplyr::everything(), ~ stringr::str_remove_all(.x, "\\%|\\:|\\$|\\,") %>% stringr::str_trim() %>% stringr::str_squish()), - dplyr::across(dplyr::everything(), ~ stringr::str_remove_all(.x, "\\%|\\:|\\$|\\,") %>% stringr::str_trim() %>% stringr::str_squish())) + ## scoped away from path/disaster_number/event_type/event_title/text (which should + ## not have %, :, $, or , stripped -- doing so on `path` corrupted the colon in + ## Windows drive letters, e.g. "C:/...") + dplyr::across( + .cols = -c(path, disaster_number, event_type, event_title, event_native_flag, text), + .fns = ~ stringr::str_remove_all(.x, "\\%|\\:|\\$|\\,") %>% stringr::str_trim() %>% stringr::str_squish())) ## tribes have differently structured PDA report fields if (result$event_native_flag == 1) { @@ -206,22 +222,28 @@ extract_pda_attributes = function(path) { "September", "October", "November", "December") %>% stringr::str_c(collapse = "|") date_match_string = stringr::str_c("Denied (on |)(", months, ") [0-9]{1,2} [0-9]{4}") + ## columns that should not have their raw values reformatted/stripped by the + ## cleanup steps below (e.g. stripping ":" from `path` corrupted Windows drive + ## letters like "C:/...", and 0/1,356 cached rows then failed to match a file on disk) + non_extracted_columns = c("path", "disaster_number", "event_type", "event_title", "event_native_flag", "text") + result2 = result %>% dplyr::mutate( - dplyr::across(dplyr::everything(), ~ stringr::str_squish(.x) %>% stringr::str_trim()), - dplyr::across(dplyr::everything(), ~ stringr::str_remove_all(.x, "^- |\\$|\\:|\\,")), - dplyr::across(dplyr::everything(), ~ dplyr::if_else(.x == "-", NA_character_, .x)), - dplyr::across(dplyr::everything(), ~ dplyr::if_else(stringr::str_detect(.x, "^N.A$"), NA_character_, .x)), + dplyr::across(-dplyr::all_of(non_extracted_columns), ~ stringr::str_squish(.x) %>% stringr::str_trim()), + dplyr::across(-dplyr::all_of(non_extracted_columns), ~ stringr::str_remove_all(.x, "^- |\\$|\\:|\\,")), + dplyr::across(-dplyr::all_of(non_extracted_columns), ~ dplyr::if_else(.x == "-", NA_character_, .x)), + dplyr::across(-dplyr::all_of(non_extracted_columns), ~ dplyr::if_else(stringr::str_detect(.x, "^N.A$"), NA_character_, .x)), pa_per_capita_impact_countywide_1 = pa_per_capita_impact_countywide %>% stringr::str_extract_all("[0-9]{1,4}\\.[0-9]{1,3}"), - pa_per_capita_impact_countywide_max = dplyr::if_else( - is.na(pa_per_capita_impact_countywide_1), NA, - pa_per_capita_impact_countywide_1 %>% - purrr::map_dbl(~ .x %>% as.numeric %>% max(na.rm = TRUE))), - pa_per_capita_impact_countywide_min = dplyr::if_else( - is.na(pa_per_capita_impact_countywide_1), NA, - pa_per_capita_impact_countywide_1 %>% - purrr::map_dbl(~ .x %>% stringr::str_remove_all("\\(|\\)") %>% as.numeric %>% min(na.rm = TRUE))), + ## guard on length==0 or all-NA rather than is.na(.x): pa_per_capita_impact_countywide_1 + ## is a list-column from str_extract_all(), where a no-match row is character(0) (not + ## NA -- is.na() on that list silently returns FALSE) and an NA *input* row is a + ## length-1 NA_character_ (not character(0)); either previously slipped through to + ## max()/min() on an effectively-empty vector, producing -Inf/Inf instead of NA + pa_per_capita_impact_countywide_max = pa_per_capita_impact_countywide_1 %>% + purrr::map_dbl(~ if (length(.x) == 0 || all(is.na(.x))) { NA_real_ } else { .x %>% as.numeric() %>% max(na.rm = TRUE) }), + pa_per_capita_impact_countywide_min = pa_per_capita_impact_countywide_1 %>% + purrr::map_dbl(~ if (length(.x) == 0 || all(is.na(.x))) { NA_real_ } else { .x %>% stringr::str_remove_all("\\(|\\)") %>% as.numeric() %>% min(na.rm = TRUE) }), event_date_determined = event_title %>% date_string_to_date, event_date_determined = dplyr::if_else( is.na(event_date_determined), @@ -230,20 +252,81 @@ extract_pda_attributes = function(path) { dplyr::across( .cols = -c(path, disaster_number, event_title, event_type, event_date_determined, event_native_flag, pa_per_capita_impact_countywide, pa_primary_impact, text), - .fns = ~ stringr::str_split(.x, " ") %>% purrr::map_chr(~ .[1]) %>% as.numeric), - id = dplyr::row_number()) %>% + .fns = ~ stringr::str_split(.x, " ") %>% purrr::map_chr(~ .[1]) %>% as.numeric)) %>% + dplyr::select(-pa_per_capita_impact_countywide_1) %>% + dplyr::select(disaster_number, dplyr::matches("^event"), dplyr::matches("^pa"), dplyr::everything()) + + return(result2) +} + +#' Correct disaster numbers shared by multiple, genuinely different PDA reports +#' +#' A handful of PDAs carry a typo'd (or, for FEMA's newest filename convention, +#' absent) disaster number, which surfaces as two different reports sharing one +#' `disaster_number`. The number printed in the report body (`FEMA-XXXX`) is +#' authoritative, so for any `disaster_number` duplicated across reports we +#' re-derive it from the text. A lenient `FEMA-XXXX` match is used -- rather than +#' requiring the `-DR` suffix, as the per-file extraction does -- because the cases +#' that slip through to become duplicates are exactly those where `-DR` is missing +#' or mangled in the text. The correction is guarded to non-`NA`, already-duplicated +#' numbers, so it only ever replaces a wrong number and never fills an `NA` (many +#' denied requests never receive an official number, and their filename-derived +#' value is our best guess). Duplication is undetectable per-file, so this must run +#' on the full combined dataset. +#' +#' @param pda_df A dataframe of extracted PDA records (must contain `text` and +#' `disaster_number`). +#' @return `pda_df` with corrected `disaster_number` values (coerced to character). +#' @noRd +correct_duplicate_disaster_numbers = function(pda_df) { + pda_df %>% + ## coerce so the if_else() below is type-stable regardless of how a cached CSV + ## parsed the column (readr may guess double; the extracted value is character) + dplyr::mutate(disaster_number = as.character(disaster_number)) %>% dplyr::add_count(disaster_number, name = "disaster_number_count") %>% dplyr::mutate( - ## a very limited number of cases have typos in the event number in their URLs - ## we correct by extracting these directly from the text of the PDA + disaster_number_from_text = stringr::str_extract(text, "FEMA-[0-9]{4}") %>% + stringr::str_remove("FEMA-"), disaster_number = dplyr::if_else( - disaster_number_count > 1, - text %>% extract_value("FEMA-", "-DR"), + disaster_number_count > 1 & + !is.na(disaster_number) & + !is.na(disaster_number_from_text), + disaster_number_from_text, disaster_number)) %>% - dplyr::select(-c(pa_per_capita_impact_countywide_1, id, disaster_number_count)) %>% - dplyr::select(disaster_number, dplyr::matches("^event"), dplyr::matches("^pa"), dplyr::everything()) + dplyr::select(-disaster_number_count, -disaster_number_from_text) +} - return(result2) +#' Warn about disaster numbers shared by multiple approved PDA reports +#' +#' A disaster should map to exactly one approved PDA. Any `disaster_number` shared +#' by more than one approved report (after `correct_duplicate_disaster_numbers()`) +#' is incorrect -- a typo the text-based recovery could not resolve, or a +#' duplicated source file -- and is surfaced for manual review. +#' +#' @param pda_df A dataframe of extracted PDA records (must contain `event_type` +#' and `disaster_number`). +#' @return `pda_df`, invisibly and unchanged; called for the side effect of a +#' `warning()` listing any offending disaster numbers. +#' @noRd +warn_approved_disaster_number_duplicates = function(pda_df) { + approved_duplicates = pda_df %>% + dplyr::filter( + stringr::str_detect(event_type, "approv"), + !is.na(disaster_number)) %>% + dplyr::add_count(disaster_number, name = "approved_count") %>% + dplyr::filter(approved_count > 1) + + if (nrow(approved_duplicates) > 0) { + warning( + stringr::str_c( + dplyr::n_distinct(approved_duplicates$disaster_number), + " disaster number(s) map to more than one approved PDA report and are ", + "likely incorrect: ", + stringr::str_c( + sort(unique(approved_duplicates$disaster_number)), collapse = ", ")), + call. = FALSE) } + + invisible(pda_df) } #' Get Data from Preliminary Damage Assessments Submitted to FEMA for Disaster Declarations @@ -264,23 +347,49 @@ extract_pda_attributes = function(path) { #' @param use_cache Boolean. Read the existing dataset stored at `file_path`? If FALSE, #' data will be generated anew. Else, if a file exists at `file_path`, this file will be returned. #' -#' @return A dataframe of preliminary damage assessment reports. Key columns include: +#' @return A dataframe of preliminary damage assessment reports. Columns include: #' \describe{ +#' \item{path}{The local file path to the source PDA PDF.} #' \item{disaster_number}{FEMA disaster number.} #' \item{event_type}{Type of decision: "approved", "denial", "appeal_approved", or "appeal_denial".} #' \item{event_title}{Title/description of the disaster event.} #' \item{event_date_determined}{Date the PDA determination was made.} #' \item{event_native_flag}{1 if tribal request, 0 otherwise.} +#' \item{pa_requested}{1 if Public Assistance was requested, 0 otherwise.} +#' \item{pa_preemptive_declaration}{1 if the joint PDA requirement was waived due to the severity of the event, 0 otherwise.} +#' \item{pa_primary_impact}{The primary type of impact described for Public Assistance purposes.} +#' \item{pa_cost_estimate_total}{Estimated total Public Assistance cost.} +#' \item{pa_per_capita_impact_statewide}{Statewide (or territory/commonwealth) per capita impact amount.} +#' \item{pa_per_capita_impact_indicator_statewide}{Numeric ratio of the statewide per capita impact +#' to the applicable threshold -- a decimal ratio (e.g. 1.5, 1.89), not a "Met"/"Not Met" +#' categorical indicator despite the field's FEMA-assigned name.} +#' \item{pa_per_capita_impact_countywide}{Raw text of countywide per capita impact ratios (may list +#' multiple values across affected counties for a multi-county event).} +#' \item{pa_per_capita_impact_indicator_countywide}{Truncated text of the countywide per capita impact indicator.} +#' \item{pa_per_capita_impact_countywide_max}{Maximum countywide per capita impact ratio parsed +#' from `pa_per_capita_impact_countywide`.} +#' \item{pa_per_capita_impact_countywide_min}{Minimum countywide per capita impact ratio parsed +#' from `pa_per_capita_impact_countywide`.} #' \item{ia_requested}{1 if Individual Assistance was requested, 0 otherwise.} #' \item{ia_residences_impacted}{Total residences impacted.} #' \item{ia_residences_destroyed}{Number of residences destroyed.} #' \item{ia_residences_major_damage}{Number of residences with major damage.} #' \item{ia_residences_minor_damage}{Number of residences with minor damage.} +#' \item{ia_residences_affected}{Number of residences affected (lowest damage category).} +#' \item{ia_residences_insured_total_percent}{Percentage of impacted residences with any insurance coverage.} +#' \item{ia_residences_insured_flood_percent}{Percentage of impacted residences with flood insurance coverage.} +#' \item{ia_households_poverty_percent}{Percentage of households in poverty (or low income, +#' depending on report vintage).} +#' \item{ia_households_owner_percent}{Percentage of households that are owner-occupied.} +#' \item{ia_population_other_government_assistance_percent}{Percentage of the population receiving +#' other government assistance (e.g. SSI, SNAP).} +#' \item{ia_pre_disaster_unemployment_percent}{Pre-disaster unemployment rate.} +#' \item{ia_65plus_percent}{Percentage of the population age 65 and older.} +#' \item{ia_18below_percent}{Percentage of the population age 18 and under.} +#' \item{ia_disability_percent}{Percentage of the population with a disability.} +#' \item{ia_ihp_cost_to_capacity_ratio}{Individuals and Households Program (IHP) Cost to Capacity (ICC) ratio.} #' \item{ia_cost_estimate_total}{Estimated total Individual Assistance cost.} -#' \item{pa_requested}{1 if Public Assistance was requested, 0 otherwise.} -#' \item{pa_cost_estimate_total}{Estimated total Public Assistance cost.} -#' \item{pa_per_capita_impact_statewide}{Statewide per capita impact amount.} -#' \item{pa_per_capita_impact_indicator_statewide}{Met/Not Met indicator for statewide threshold.} +#' \item{text}{The cleaned text extracted from the PDA PDF used to derive the fields above.} #' } #' @export #' @@ -293,21 +402,52 @@ get_preliminary_damage_assessments = function( directory_path = file.path(get_box_path(), "hazards", "urban", "preliminary-damage-assessments"), use_cache = TRUE) { - suppressWarnings({ - if (!file.exists(file_path) | use_cache == FALSE) { - if (!is.null(directory_path)) { - pda_df = list.files(directory_path, recursive = TRUE, full.names = TRUE) %>% - purrr::keep(~ stringr::str_detect(.x, "pdf$")) %>% - purrr::map_dfr(extract_pda_attributes) + if (!file.exists(file_path) | use_cache == FALSE) { + if (!is.null(directory_path)) { + file_paths = list.files(directory_path, recursive = TRUE, full.names = TRUE) %>% + purrr::keep(~ stringr::str_detect(.x, "pdf$")) + + ## isolate per-file parsing failures (rather than letting one bad PDF abort the + ## entire regeneration) and surface a summary of any parsing warnings, rather than + ## blanket-suppressing them across the whole batch (which previously hid, among + ## other things, the -Inf/Inf sentinel bug fixed in extract_pda_attributes()) + safe_extract = purrr::possibly(purrr::quietly(extract_pda_attributes), otherwise = NULL) + extraction_results = purrr::map(file_paths, safe_extract) + + failed_files = file_paths[purrr::map_lgl(extraction_results, is.null)] + if (length(failed_files) > 0) { + message(stringr::str_c( + length(failed_files), "/", length(file_paths), + " files could not be parsed and were skipped: ", + stringr::str_c(basename(failed_files), collapse = ", "))) } + + successful_results = extraction_results %>% purrr::compact() + n_with_warnings = successful_results %>% purrr::map_lgl(~ length(.x$warnings) > 0) %>% sum() + if (n_with_warnings > 0) { + message(stringr::str_c( + n_with_warnings, "/", length(file_paths), + " files produced a parsing warning (extraction still completed for these files).")) } + + pda_df1 = successful_results %>% purrr::map_dfr(~ .x$result) + + ## Correct disaster numbers duplicated across genuinely different reports (a + ## typo'd or missing number colliding two disasters into one), then flag any + ## approved-report collisions that could not be resolved from the text. + pda_df2 = pda_df1 %>% correct_duplicate_disaster_numbers() + + warn_approved_disaster_number_duplicates(pda_df2) - readr::write_csv(pda_df, file_path) + readr::write_csv(pda_df2, file_path) - return(pda_df) - } } }) + return(pda_df2) + } } if (use_cache == TRUE) { message("Reading cached preliminary damage assessment data from disk.") - pda_df = readr::read_csv(file_path) + ## self-heal caches written before the duplicate-correction logic existed, and + ## surface any approved-report collisions that remain + pda_df = readr::read_csv(file_path) %>% correct_duplicate_disaster_numbers() + warn_approved_disaster_number_duplicates(pda_df) return(pda_df) } @@ -323,6 +463,7 @@ utils::globalVariables(c( "funding_lost_flag_cost_share", "funding_lost_flag_pci", "funding_lost_flag_pci_snowstorm", "funding_lost_flag_snowstorm", "date_match_string", "declaration_date_openfema", "disaster_number_count", "event_date_determined", "event_native_flag", "event_title", + "disaster_number", "disaster_number_from_text", "approved_count", "event_type", "text", "ia_cost_estimate_total", "ia_residences_insured_total_percent", "pa_per_capita_impact_countywide", "pa_per_capita_impact_countywide_1", "pa_per_capita_impact_indicator_countywide", "pa_per_capita_impact_indicator_statewide", diff --git a/R/get_public_assistance.R b/R/get_public_assistance.R index 0bf8b9d..986a440 100644 --- a/R/get_public_assistance.R +++ b/R/get_public_assistance.R @@ -7,7 +7,9 @@ #' #' @param state_abbreviations A character vector of state abbreviations. NULL by default, #' which returns records for all 51 states. Only the 51 states are supported at this time. -#' @param file_path The file path to the raw data contained in a .parquet file. +#' @param file_path The file path to the raw data contained in a .parquet file. If NULL +#' (default), reads the most recently cached file for this dataset from +#' `get_openfema_cache_path()`. #' #' @details Data are from FEMA's OpenFEMA API. See #' \url{https://www.fema.gov/openfema-data-page/public-assistance-funded-projects-details-v2}. @@ -62,22 +64,26 @@ #' } get_public_assistance= function( - file_path = file.path( - get_box_path(), "hazards", "fema", "public-assistance", "raw", - "PublicAssistanceFundedProjectsDetailsV2_2025_09_26.parquet"), + file_path = NULL, state_abbreviations = NULL) { if (is.null(state_abbreviations)) { state_abbreviations = c(state.abb, "DC") } if (any(!state_abbreviations %in% c(state.abb, "DC"))) { stop("Only the 50 states and DC are supported at this time.") } + if (is.null(file_path)) { file_path = find_openfema_cache_file("PublicAssistanceFundedProjectsDetails") } + state_fips = get_geography_metadata("state") |> dplyr::filter(state_abbreviation %in% state_abbreviations) |> dplyr::pull(state_code) - ## data on counties and their populations + ## data on counties and their populations -- fetched nationwide (not scoped to state_fips) + ## since the cross-state county/state reassignment patches below (e.g. WI -> MI, ND -> SD) + ## can move a project to a state the caller never requested; scoping this lookup to + ## state_fips caused those records' population joins to fail (NA population -> NA + ## allocation_factor -> NA split), which crashed the function for e.g. + ## state_abbreviations = "WI"/"ND" suppressMessages({suppressWarnings({ - state_county_xwalk = get_geography_metadata(geography_type = "county") |> - dplyr::filter(state_code %in% state_fips) })}) + state_county_xwalk = get_geography_metadata(geography_type = "county") })}) public_assistance_raw = arrow::read_parquet(file_path) |> janitor::clean_names() |> @@ -103,62 +109,53 @@ get_public_assistance= function( ## Connecticut counties are dated -- we need to crosswalk them to current county- ## equivalents (planning regions) if ("09" %in% state_fips) { - ct_county_crosswalk1 = readr::read_csv( - file.path(get_box_path(), "crosswalks", "ctdata_2022_tractcrosswalk_connecticut.csv")) |> - janitor::clean_names() |> - dplyr::select( - ## each tract has a single observation - tract_fips_2020, - ## each tract has a single observation - tract_fips_2022, - county_fips_2020, - county_fips_2022 = ce_fips_2022) - - suppressMessages({ - ct_tract_populations = tidycensus::get_acs( - year = 2021, - geography = "tract", - state = "CT", - variable = "B01003_001", - output = "wide") |> - dplyr::select( - tract_fips_2020 = GEOID, - population_2020 = B01003_001E) }) - - ct_county_crosswalk = ct_county_crosswalk1 |> - dplyr::left_join(ct_tract_populations, by = "tract_fips_2020") |> - dplyr::summarize( - .by = c("county_fips_2020", "county_fips_2022"), - population_2020 = sum(population_2020)) |> - dplyr::mutate( - .by = "county_fips_2020", - population_2020_total = sum(population_2020, na.rm = TRUE)) |> - dplyr::mutate(allocation_factor = population_2020 / population_2020_total) |> - dplyr::select(-dplyr::matches("population")) - - crosswalked_ct_counties = public_assistance_raw |> + ct_crosswalk_table = crosswalk::get_crosswalk( + source_geography = "county", + target_geography = "county", + source_year = 2020, + target_year = 2022, + silent = TRUE)$crosswalks$step_1 |> dplyr::filter(state_fips == "09") |> + dplyr::select(source_geoid, target_geoid, allocation_factor_source_to_target) + + ## some raw CT rows are labeled county_name = "Statewide"/"REAA" (or carry the "09000" + ## placeholder county_fips) yet still have -- inconsistently -- a real legacy county_fips + ## value too. These must bypass the per-region crosswalk entirely and flow through + ## unchanged, to be handled solely by the general statewide detection/expansion later on; + ## otherwise they get fanned out twice (once here by county, again later by the statewide + ## join), producing an inconsistent row count across CT's genuinely statewide projects. + ct_raw = public_assistance_raw |> dplyr::filter(state_fips == "09") + ct_statewide_like = ct_raw |> + dplyr::filter( + stringr::str_detect(county_name, "tatewide|REAA") | stringr::str_sub(county_fips, 3, 5) == "000") + ct_county_specific = ct_raw |> dplyr::filter(!id %in% ct_statewide_like$id) + + ## one row per (project, target planning region) -- NOT `.by = "id"` alone, which would + ## collapse every eligible target region for a project into a single arbitrary one. + ## `pa_federal_funding_obligated` is kept as the original, UNDIVIDED project total on + ## every regional row (consistent with how every other multi-county project in this + ## pipeline carries its undivided total until the final population-based split further + ## down); `region_weight` carries the region-specific allocation share, to be applied + ## later in place of the general population-based split (which CT no longer needs). + crosswalked_ct_counties = ct_county_specific |> dplyr::left_join( - ct_county_crosswalk, - by = c("county_fips" = "county_fips_2020"), + ct_crosswalk_table, + by = c("county_fips" = "source_geoid"), relationship = "many-to-many") |> tidytable::summarize( - .by = c("id"), - dplyr::across( - .cols = dplyr::all_of(interpolate_columns), - .fns = \(x) base::sum(x * allocation_factor, na.rm = TRUE)), + .by = c("id", "target_geoid"), + region_weight = sum(allocation_factor_source_to_target, na.rm = TRUE), dplyr::across( - .cols = -dplyr::all_of(interpolate_columns), + .cols = -dplyr::all_of(c("county_fips", "allocation_factor_source_to_target")), .fns = \(x) dplyr::first(x))) |> tibble::as_tibble() |> - dplyr::select(-county_fips) |> - dplyr::rename(county_fips = county_fips_2022) + dplyr::rename(county_fips = target_geoid) #joining the non CT states with the CT crosswalk to create the updated dataset public_assistance1 = public_assistance_raw |> dplyr::filter(state_fips != "09") |> - dplyr::bind_rows(crosswalked_ct_counties) |> - dplyr::select(-allocation_factor) } else { public_assistance1 = public_assistance_raw } + dplyr::bind_rows(crosswalked_ct_counties, ct_statewide_like) } else { + public_assistance1 = public_assistance_raw |> dplyr::mutate(region_weight = NA_real_) } public_assistance2 <- public_assistance1 |> dplyr::filter( @@ -286,9 +283,22 @@ get_public_assistance= function( by = c("state_fips", "statewide_flag"), relationship = "many-to-many") - public_assistance_5 = dplyr::bind_rows( - public_assistance_4a, - public_assistance_4b) |> + public_assistance_4 = dplyr::bind_rows(public_assistance_4a, public_assistance_4b) + + ## CT's non-statewide projects were already fully attributed to target planning regions + ## by the crosswalk step above (one row per project x eligible region, each with its own + ## already-final dollar amount); they must not be re-split by population here, or the + ## same dollar amount gets divided a second time + public_assistance_5_ct = public_assistance_4 |> + dplyr::filter(state_fips == "09", statewide_flag == 0) |> + dplyr::mutate( + county_count = 1L, + project_counties_population = county_population, + allocation_factor = region_weight, + pa_federal_funding_obligated_split = pa_federal_funding_obligated * region_weight) + + public_assistance_5_general = public_assistance_4 |> + dplyr::filter(!(state_fips == "09" & statewide_flag == 0)) |> ## obtain a count of counties per project and then create a denominator for summed ## county populations across all the counties per project tidytable::mutate( @@ -305,7 +315,9 @@ get_public_assistance= function( .by = c("id", "county_fips"), tidytable::across( .cols = tidytable::all_of(interpolate_columns), - .fns = ~ .x * allocation_factor, .names = "{.col}_split")) |> + .fns = ~ .x * allocation_factor, .names = "{.col}_split")) + + public_assistance_5 = dplyr::bind_rows(public_assistance_5_general, public_assistance_5_ct) |> tibble::as_tibble() |> dplyr::select( id, @@ -329,8 +341,18 @@ get_public_assistance= function( pa_federal_funding_obligated_split = base::sum(pa_federal_funding_obligated_split, na.rm = TRUE)) |> tibble::as_tibble() - ## ensure that we haven't lost any projects - stopifnot(nrow(test) == nrow(public_assistance3b)) + ## ensure that we haven't lost any projects -- compare distinct ids, not raw row counts: + ## `test` has exactly one row per id (grouped by id), but `public_assistance3b` can have + ## multiple rows per id for CT projects spanning more than one target planning region + if (nrow(test) != dplyr::n_distinct(public_assistance3b$id)) { + ids_missing = setdiff(unique(public_assistance3b$id), test$id) + ids_duplicated = test |> dplyr::count(id) |> dplyr::filter(n > 1) |> dplyr::pull(id) + stop(stringr::str_c( + "Distinct project ids do not align between the pre-split (", + dplyr::n_distinct(public_assistance3b$id), " ids) and post-split, re-aggregated (", + nrow(test), " ids) data. Missing ids: ", + stringr::str_c(utils::head(ids_missing, 10), collapse = ", "), ". Duplicated ids: ", + stringr::str_c(utils::head(ids_duplicated, 10), collapse = ", "), ".")) } ## total project costs are the same across both formulations (original and county-level) nonaligned_ids = test |> @@ -343,7 +365,16 @@ get_public_assistance= function( dplyr::filter(difference > 1) |> dplyr::pull(id) - stopifnot(length(nonaligned_ids) == 0) + if (length(nonaligned_ids) > 0) { + nonaligned_detail = test |> + dplyr::filter(id %in% nonaligned_ids) |> + dplyr::mutate(difference = pa_federal_funding_obligated - pa_federal_funding_obligated_split) + stop(stringr::str_c( + length(nonaligned_ids), " project ids have county-split funding totals that do not ", + "match the original project-level total (tolerance: $1): ", + stringr::str_c( + stringr::str_c(nonaligned_detail$id, " (diff $", round(nonaligned_detail$difference), ")"), + collapse = "; "), ".")) } years = public_assistance_5 |> dplyr::pull(declaration_year) @@ -356,23 +387,36 @@ get_public_assistance= function( dplyr::relocate(dplyr::matches("state_"), .after = id) ## checking row counts - stopifnot( - public_assistance_6 |> dplyr::distinct(id) |> nrow() == ( - public_assistance_4a |> nrow() + ## non-statewide projects - public_assistance_4b |> dplyr::distinct(id) |> nrow())) + ## `distinct(id)` (not raw `nrow()`) for non-statewide: CT non-statewide projects can now + ## legitimately have multiple rows (one per eligible target planning region) + n_nonstatewide = public_assistance_4a |> dplyr::distinct(id) |> nrow() + n_statewide = public_assistance_4b |> dplyr::distinct(id) |> nrow() + n_output = public_assistance_6 |> dplyr::distinct(id) |> nrow() + + if (n_output != n_nonstatewide + n_statewide) { + stop(stringr::str_c( + "Unexpected number of distinct project ids in the final output: expected ", + n_nonstatewide + n_statewide, " (", n_nonstatewide, " non-statewide + ", n_statewide, + " statewide), got ", n_output, ".")) } ## there should always be the same number of observations per id for statewide project ## ids within the same state - stopifnot( - public_assistance_4b |> + statewide_consistency = public_assistance_4b |> dplyr::count(id, state_fips, sort = TRUE) |> tidytable::summarize( .by = state_fips, distinct_state_records_per_id = dplyr::n_distinct(n)) |> - tibble::as_tibble() |> - dplyr::arrange(dplyr::desc(distinct_state_records_per_id)) |> - dplyr::slice(1) |> - dplyr::pull(distinct_state_records_per_id) == 1) + tibble::as_tibble() + + inconsistent_states = statewide_consistency |> + dplyr::filter(distinct_state_records_per_id != 1) |> + dplyr::pull(state_fips) + + if (length(inconsistent_states) > 0) { + stop(stringr::str_c( + "Statewide projects do not have a consistent number of county-level observations per ", + "project within these states (expected the same county count for every statewide ", + "project in a given state): ", stringr::str_c(inconsistent_states, collapse = ", "), ".")) } message(glue::glue("Public assistance records are filtered to include only 'natural' `incident_type` values, with records from the years {min(years)}-{max(years)}, inclusive. Tribal records are not included.")) @@ -393,10 +437,11 @@ get_public_assistance= function( } utils::globalVariables(c( - "tract_fips_2020", "tract_fips_2022", "county_fips_2020", "ce_fips_2022", "B01003_001E", - "population_2020", "population_2020_total", "state_number_code", "dcc", "damage_category", - "federal_share_obligated", "county_fips_2022", "allocation_factor", "county_population", + "state_number_code", "dcc", "damage_category", + "federal_share_obligated", "allocation_factor", "county_population", "statewide_flag", "project_counties_population", "pa_federal_funding_obligated", "pa_federal_funding_obligated_split", "difference", "declaration_year", "disaster_number", "damage_category_code", "damage_category_descrip", "damage_category_description", - "distinct_state_records_per_id", "imputed_statewide_flag", "pa_category", "project_status")) + "distinct_state_records_per_id", "imputed_statewide_flag", "pa_category", "project_status", + "source_geoid", "target_geoid", "allocation_factor_source_to_target", "state_fips", + "region_weight")) diff --git a/R/get_sba_loans.R b/R/get_sba_loans.R index f8fac58..08bcdaa 100644 --- a/R/get_sba_loans.R +++ b/R/get_sba_loans.R @@ -7,19 +7,34 @@ #' @details Data are sourced from the SBA's disaster loan reports. See #' \url{https://www.sba.gov/funding-programs/disaster-assistance}. #' +#' The FY16 source workbook (`sba_disaster_loan_data_fy16.xlsx`) is anomalous: its Home +#' and Business sheets have identical row counts and dollar totals, suggesting possible +#' ~2x double-counting in the source file itself. This function selects the correct +#' Home/Business sheet by name (avoiding the sheet-order swap present in this vintage), +#' but the underlying FY16 data should be manually re-verified against +#' \url{https://data.sba.gov} before being trusted. +#' #' @returns A dataframe comprising city- and zip-level data on SBA loanmaking. #' Columns include: #' \describe{ #' \item{fiscal_year}{The federal fiscal year of the loan.} +#' \item{disaster_description}{Text description of the disaster (only populated for +#' older, FY01-FY03 vintages; NA otherwise).} #' \item{disaster_number_fema}{FEMA disaster number associated with the loan.} #' \item{disaster_number_sba_physical}{SBA physical disaster declaration number.} +#' \item{disaster_number_sba}{SBA disaster declaration number (distinct from +#' `disaster_number_sba_physical`).} #' \item{disaster_number_sba_eidl}{SBA Economic Injury Disaster Loan (EIDL) declaration number.} #' \item{damaged_property_zip_code}{ZIP code of the damaged property.} #' \item{damaged_property_city_name}{City name of the damaged property.} #' \item{damaged_property_state_code}{Two-letter state abbreviation.} #' \item{verified_loss_total}{Total verified loss amount in dollars.} +#' \item{verified_loss_real_estate}{Verified loss amount for real estate in dollars.} +#' \item{verified_loss_content}{Verified loss amount for contents in dollars.} #' \item{approved_amount_total}{Total approved loan amount in dollars.} #' \item{approved_amount_real_estate}{Approved loan amount for real estate in dollars.} +#' \item{approved_amount_content}{Approved loan amount for contents in dollars.} +#' \item{approved_amount_eidl}{Approved EIDL amount in dollars (business loans only; NA for residential).} #' \item{loan_type}{Type of loan: "residential" or "business".} #' } #' @export @@ -34,12 +49,30 @@ get_sba_loans = function() { if (! file.exists(inpath)) { stop("The path to the data does not exist.") } + ## selects the Home or Business sheet by name (not position): some vintages (e.g. FY16) + ## have their Home/Business sheets in a swapped order relative to other years, which + ## silently mislabeled loan_type for every FY16 row when sheets were selected by position + find_sheet_index = function(file_path, loan_type_pattern) { + sheet_names = readxl::excel_sheets(file_path) + matches = which(stringr::str_detect(sheet_names, stringr::regex(stringr::str_c("^FY.*", loan_type_pattern), ignore_case = TRUE))) + + if (length(matches) != 1) { + stop(stringr::str_c( + "Expected exactly one '", loan_type_pattern, "' data sheet in ", basename(file_path), + ", found ", length(matches), ". Sheet names: ", stringr::str_c(sheet_names, collapse = ", "))) } + + matches + } + + read_loan_sheet = function(file_path, loan_type_pattern) { + readxl::read_xlsx(file_path, sheet = find_sheet_index(file_path, loan_type_pattern), skip = 4) %>% + janitor::clean_names() %>% + dplyr::mutate(fiscal_year = stringr::str_extract(file_path, "fy[0-9]{2}") %>% stringr::str_replace("fy", "20")) + } + home_loans = list.files(inpath, full.names = TRUE) %>% purrr::keep(~ stringr::str_detect(.x, "xlsx")) %>% - purrr::map(~ - readxl::read_xlsx(.x, sheet = 4, skip = 4) %>% - janitor::clean_names() %>% - dplyr::mutate(fiscal_year = stringr::str_extract(.x, "fy[0-9]{2}") %>% stringr::str_replace("fy", "20"))) %>% + purrr::map(~ read_loan_sheet(.x, "Home")) %>% dplyr::bind_rows() %>% dplyr::mutate( fema_disaster_number = dplyr::if_else(is.na(fema_disaster_number), fema_disaster, fema_disaster_number), @@ -47,16 +80,19 @@ get_sba_loans = function() { sba_eidl_declaration_number = dplyr::if_else(is.na(sba_eidl_declaration_number), sba_eidl_declaration, sba_eidl_declaration_number), damaged_property_zip_code = dplyr::if_else(is.na(damaged_property_zip_code), damaged_property_zip, damaged_property_zip_code), damaged_property_city_name = dplyr::if_else(is.na(damaged_property_city_name), damaged_property_city, damaged_property_city_name), - damaged_property_state_abbreviation = dplyr::if_else(is.na(damaged_property_state_code), damaged_property_state, damaged_property_state_code), + ## coalesced in place (not into a separate shadow column) so the cleanup steps + ## below -- which target this same column -- operate on the coalesced value + damaged_property_state_code = dplyr::if_else(is.na(damaged_property_state_code), damaged_property_state, damaged_property_state_code), total_approved_loan_amount = dplyr::if_else(is.na(total_approved_loan_amount), total_approved, total_approved_loan_amount), approved_amount_real_estate = dplyr::if_else(is.na(approved_amount_real_estate), approved_amount_real, approved_amount_real_estate), total_verified_loss = dplyr::if_else(is.na(total_verified_loss), total_verified, total_verified_loss)) %>% - dplyr::select(-c( - fema_disaster, sba_disaster, sba_eidl_declaration, damaged_property_zip, damaged_property_city, - damaged_property_state, total_approved, damaged_property_county_parish_name, total_verified, - approved_amount_real, approved_amount_eidl)) %>% + dplyr::select(-dplyr::any_of(c( + "fema_disaster", "sba_disaster", "sba_eidl_declaration", "damaged_property_zip", "damaged_property_city", + "damaged_property_state", "total_approved", "damaged_property_county_parish_name", "total_verified", + "approved_amount_real", "approved_amount_eidl"))) %>% dplyr::rename( disaster_number_fema = fema_disaster_number, + disaster_number_sba = sba_disaster_number, disaster_number_sba_physical = sba_physical_declaration_number, disaster_number_sba_eidl = sba_eidl_declaration_number, verified_loss_total = total_verified_loss, @@ -64,10 +100,7 @@ get_sba_loans = function() { business_loans = list.files(inpath, full.names = TRUE) %>% purrr::keep(~ stringr::str_detect(.x, "xlsx")) %>% - purrr::map(~ - readxl::read_xlsx(.x, sheet = 5, skip = 4) %>% - janitor::clean_names() %>% - dplyr::mutate(fiscal_year = stringr::str_extract(.x, "fy[0-9]{2}") %>% stringr::str_replace("fy", "20"))) %>% + purrr::map(~ read_loan_sheet(.x, "Business")) %>% dplyr::bind_rows() %>% dplyr::mutate( fema_disaster_number = dplyr::if_else(is.na(fema_disaster_number), fema_disaster, fema_disaster_number), @@ -75,14 +108,14 @@ get_sba_loans = function() { sba_eidl_declaration_number = dplyr::if_else(is.na(sba_eidl_declaration_number), sba_eidl_declaration, sba_eidl_declaration_number), damaged_property_zip_code = dplyr::if_else(is.na(damaged_property_zip_code), damaged_property_zip, damaged_property_zip_code), damaged_property_city_name = dplyr::if_else(is.na(damaged_property_city_name), damaged_property_city, damaged_property_city_name), - damaged_property_state_abbreviation = dplyr::if_else(is.na(damaged_property_state_code), damaged_property_state, damaged_property_state_code), + damaged_property_state_code = dplyr::if_else(is.na(damaged_property_state_code), damaged_property_state, damaged_property_state_code), total_approved_loan_amount = dplyr::if_else(is.na(total_approved_loan_amount), total_approved, total_approved_loan_amount), approved_amount_real_estate = dplyr::if_else(is.na(approved_amount_real_estate), approved_amount_real, approved_amount_real_estate), total_verified_loss = dplyr::if_else(is.na(total_verified_loss), total_verified, total_verified_loss)) %>% - dplyr::select(-c( - fema_disaster, sba_disaster, sba_eidl_declaration, damaged_property_zip, damaged_property_city, - damaged_property_state, total_approved, damaged_property_county_parish_name, total_verified, - approved_amount_real)) %>% + dplyr::select(-dplyr::any_of(c( + "fema_disaster", "sba_disaster", "sba_eidl_declaration", "damaged_property_zip", "damaged_property_city", + "damaged_property_state", "total_approved", "damaged_property_county_parish_name", "total_verified", + "approved_amount_real"))) %>% dplyr::rename( disaster_number_fema = fema_disaster_number, disaster_number_sba = sba_disaster_number, @@ -94,31 +127,43 @@ get_sba_loans = function() { result = dplyr::bind_rows( business_loans %>% dplyr::mutate(loan_type = "business"), home_loans %>% dplyr::mutate(loan_type = "residential")) %>% - suppressWarnings({dplyr::mutate( - ## state codes should be characters, not numbers (e.g., "AL") - damaged_property_state_code = dplyr::if_else(!is.na(as.numeric(damaged_property_state_code)), NA, damaged_property_state_code), + dplyr::mutate( + ## state codes should be characters, not numbers (e.g., "AL"); as.numeric() on a + ## real state abbreviation returns NA, so this only clears out numeric junk + damaged_property_state_code = dplyr::if_else( + !is.na(suppressWarnings(as.numeric(damaged_property_state_code))), NA, damaged_property_state_code), + ## in the raw data, zip/city are sometimes transposed; as.numeric(city) should be + ## NA if city is accurate, so this substitution is safe damaged_property_zip_code = dplyr::case_when( - ## sometimes these are represented as three digits in the raw data, but in PR, all zip codes are prefixed with "00", so padding is safe/correct - damaged_property_state_code == "PR" ~ stringr::str_pad(damaged_property_zip_code, width = 5, side = "left", pad = "0"), - ## in the raw data, these columns are transposed in some cases; as.numeric(city) should be NA if city is accurate, so this is safe - is.na(as.numeric(damaged_property_zip_code)) ~ as.numeric(damaged_property_city_name) %>% stringr::str_pad(width = 5, side = "left", pad = "0"), + is.na(suppressWarnings(as.numeric(damaged_property_zip_code))) & + !is.na(suppressWarnings(as.numeric(damaged_property_city_name))) ~ + as.character(suppressWarnings(as.numeric(damaged_property_city_name))), TRUE ~ damaged_property_zip_code), + ## pad every purely-numeric zip <= 5 characters to 5 digits (not just Puerto Rico -- + ## MA/NJ/CT/ME/VT/NH/RI/VI have the identical leading-zero problem) and truncate + ## 9-digit ZIP+4 codes to the 5-digit ZIP; anything still not numeric is set to NA + damaged_property_zip_code = dplyr::if_else( + !is.na(suppressWarnings(as.numeric(damaged_property_zip_code))), + damaged_property_zip_code %>% stringr::str_sub(1, 5) %>% stringr::str_pad(width = 5, side = "left", pad = "0"), + NA_character_), damaged_property_state_code = dplyr::case_when( ## we infer state codes from disaster codes, where state codes are prefixed on the disaster number - is.na(damaged_property_state_code) & stringr::str_detect(sba_disaster_number, "^[A-Z]{2}-") ~ stringr::str_sub(sba_disaster_number, 1, 2), + is.na(damaged_property_state_code) & stringr::str_detect(disaster_number_sba, "^[A-Z]{2}-") ~ stringr::str_sub(disaster_number_sba, 1, 2), is.na(damaged_property_state_code) & stringr::str_detect(disaster_number_fema, "^[A-Z]{2}-") ~ stringr::str_sub(disaster_number_fema, 1, 2), ## another transposition issue; we only use the city name when it is two, uppercase characters is.na(damaged_property_state_code) & stringr::str_detect(damaged_property_city_name, "^[A-Z]{2}$") ~ damaged_property_city_name, TRUE ~ damaged_property_state_code), damaged_property_city_name = dplyr::case_when( ## yet another raw data transposition issue - stringr::str_detect(damaged_property_city_name, "^[A-Z]{2}$") & !stringr::str_detect(sba_disaster_number, "-") ~ sba_disaster_number, - TRUE ~ damaged_property_city_name))}) %>% + stringr::str_detect(damaged_property_city_name, "^[A-Z]{2}$") & !stringr::str_detect(disaster_number_sba, "-") ~ disaster_number_sba, + TRUE ~ damaged_property_city_name)) %>% dplyr::filter( ## these are weird, meaningless records that are either embedded in the raw data - ## or that are accidentally created as rows when data are read-in from file - !stringr::str_detect(disaster_number_sba_physical, "Business Data Only|United States Small Business|Home Data Only")) - + ## or that are accidentally created as rows when data are read-in from file. EIDL-only + ## loans legitimately have no physical declaration number (NA), so those must be kept. + is.na(disaster_number_sba_physical) | + !stringr::str_detect(disaster_number_sba_physical, "Business Data Only|United States Small Business|Home Data Only")) + return(result) } @@ -126,7 +171,7 @@ utils::globalVariables(c( "fema_disaster_number", "sba_disaster_number", "sba_eidl_declaration_number", "damaged_property_zip_code", "damaged_property_city_name", "damaged_property_state_code", "total_approved_loan_amount", "approved_amount_real_estate", "total_verified_loss", - "disaster_number_fema", "disaster_number_sba_physical", "disaster_number_sba_eidl", + "disaster_number_fema", "disaster_number_sba_physical", "disaster_number_sba", "disaster_number_sba_eidl", "verified_loss_total", "approved_amount_total", "approved_amount_eidl", "approved_amount_real", "damaged_property_city", "damaged_property_county_parish_name", "damaged_property_state", "damaged_property_zip", "fema_disaster", "sba_disaster", "sba_eidl_declaration", diff --git a/R/get_sheldus.R b/R/get_sheldus.R index 415607f..69ed531 100644 --- a/R/get_sheldus.R +++ b/R/get_sheldus.R @@ -4,7 +4,9 @@ #' and Losses Database for the United States (SHELDUS), including property damage, #' crop damage, fatalities, and injuries. #' -#' @param file_path The path to the raw SHELDUS data. +#' @param file_path The path to the raw SHELDUS data. If NULL (default), the most recently +#' modified `direct_loss_aggregated_output_*.csv` file found under Box's `hazards/sheldus` +#' directory is used, and a message discloses which file/vintage was selected. #' #' @details Data are from Arizona State University's SHELDUS database. Access requires #' a subscription. See \url{https://cemhs.asu.edu/sheldus}. @@ -19,8 +21,9 @@ #' \item{year}{Year of the hazard event(s).} #' \item{month}{Month of the hazard event(s).} #' \item{hazard}{Type of hazard (e.g., "Flooding", "Hurricane/Tropical Storm").} -#' \item{damage_property}{Property damage in 2024 inflation-adjusted dollars.} -#' \item{damage_crop}{Crop damage in 2024 inflation-adjusted dollars.} +#' \item{damage_property}{Property damage in inflation-adjusted dollars (base year varies +#' by SHELDUS vintage; see the function's message for the base year used).} +#' \item{damage_crop}{Crop damage in inflation-adjusted dollars (see `damage_property`).} #' \item{fatalities}{Number of fatalities.} #' \item{injuries}{Number of injuries.} #' \item{records}{Number of individual events aggregated into this observation.} @@ -32,11 +35,23 @@ #' get_sheldus() #' } -get_sheldus = function( - file_path = file.path( - get_box_path(),"hazards", "sheldus", - "SHELDUS_24.0_12312024_AllCounties_CountyAggregate_YearMonthHazard_2024USD", - "direct_loss_aggregated_output_30457.csv")) { +get_sheldus = function(file_path = NULL) { + + if (is.null(file_path)) { + sheldus_directory = file.path(get_box_path(), "hazards", "sheldus") + + candidate_files = list.files(sheldus_directory, recursive = TRUE, full.names = TRUE) |> + stringr::str_subset("_archive", negate = TRUE) |> + stringr::str_subset("SHELDUS_[0-9.]+_.*YearMonthHazard.*/direct_loss_aggregated_output_.*\\.csv$") + + if (length(candidate_files) == 0) { + stop(stringr::str_c( + "No SHELDUS output file matching the expected naming pattern was found under: ", + sheldus_directory, ". Provide an explicit `file_path` argument.")) } + + file_path = candidate_files[order(file.info(candidate_files)$mtime, decreasing = TRUE)][1] + + message(stringr::str_c("Using the most recently modified SHELDUS file found: ", file_path)) } ## is the file path valid/accessible? if (!file.exists(file_path)) { @@ -44,43 +59,9 @@ get_sheldus = function( "The path to the dataset does not point to a valid file. ", "Please ensure there is a file located at this path: ", file_path, ".")) } - ## connecticut counties are dated -- we need to crosswalk them to current county- - ## equivalents (planning regions) - ct_county_crosswalk1 = readr::read_csv(file.path(get_box_path(), "crosswalks", "ctdata_2022_tractcrosswalk_connecticut.csv")) %>% - janitor::clean_names() %>% - dplyr::select( - tract_fips_2020, - tract_fips_2022, - county_fips_2020, - county_fips_2022 = ce_fips_2022) - - suppressWarnings({suppressMessages({ - ct_tract_populations = tidycensus::get_acs( - year = 2021, - geography = "tract", - state = "CT", - variable = "B01003_001", - output = "wide") %>% - dplyr::select( - tract_fips_2020 = GEOID, - population_2020 = B01003_001E) - })}) - - ct_county_crosswalk = ct_county_crosswalk1 %>% - dplyr::left_join(ct_tract_populations) %>% - dplyr::summarize( - .by = c("county_fips_2020", "county_fips_2022"), - population_2020 = sum(population_2020)) %>% - dplyr::mutate( - .by = "county_fips_2020", - population_2020_total = sum(population_2020, na.rm = TRUE)) %>% - dplyr:: mutate(allocation_factor = population_2020 / population_2020_total) %>% - dplyr::select(-dplyr::matches("population")) - ## the data date back to ~1960, so there are some valid observations for counties that ## no longer exist as of 2010; we drop those counties ## counties that exist in 2010 or 2022 - ## ## benchmark_geographies = dplyr::bind_rows( tigris::counties(cb = TRUE, year = 2010) |> dplyr::transmute(GEOID = stringr::str_c(STATE, COUNTY)) |> @@ -95,13 +76,24 @@ get_sheldus = function( readr::read_csv() |> janitor::clean_names() + ## the raw dollar-denominated columns embed their inflation-adjustment base year in the + ## column name (e.g. `property_dmg_adj_2023`); detect it dynamically rather than hardcoding + ## a year that will go stale as new SHELDUS vintages are released + detected_base_year = df1 |> + colnames() |> + stringr::str_subset("^property_dmg_adj_\\d{4}$") |> + stringr::str_extract("\\d{4}") + + if (length(detected_base_year) != 1) { + stop(stringr::str_c( + "Could not detect a single `property_dmg_adj_` column in the raw SHELDUS data; ", + "check that the file matches the expected schema.")) } + df2 = df1 |> + dplyr::rename_with(~ stringr::str_replace(.x, "^(property|crop)_dmg_adj_\\d{4}$", "damage_\\1_adjusted")) |> dplyr::mutate( state_name = state_name |> stringr::str_to_sentence(), GEOID = stringr::str_remove_all(county_fips, "'")) |> - dplyr::rename_with( - .cols = dplyr::everything(), - .fn = ~ stringr::str_replace_all(.x, c("dmg" = "damage", "adj" = "adjusted"))) |> dplyr::select( GEOID, state_name, @@ -109,10 +101,8 @@ get_sheldus = function( year, month, hazard, - damage_property = property_damage_adjusted_2024, - # damage_property_per_capita = property_damage_per_capita, - damage_crop = crop_damage_adjusted_2024, - # damage_crop_per_capita = crop_damage_per_capita, + damage_property = damage_property_adjusted, + damage_crop = damage_crop_adjusted, dplyr::matches("injuries|fatalities"), records) |> dplyr::select(-dplyr::matches("per_capita|duration")) |> @@ -121,21 +111,53 @@ get_sheldus = function( interpolate_columns = c("damage_property", "damage_crop", "fatalities", "injuries", "records") - crosswalked_ct_counties = df2 %>% + ## SHELDUS retains "historic county" records (county_name prefixed with "*") that share a + ## GEOID with a currently-existing county at the same year x month x hazard grain, producing + ## duplicate keys. Sort the historic-prefixed row after the current row within each group so + ## that `dplyr::first()` keeps the current county's identity, while summing the historic row's + ## values into the survivor. Groups without a collision pass through this step unchanged. + df2b = df2 |> + dplyr::mutate(is_historic_county = stringr::str_starts(county_name, stringr::fixed("*"))) |> + dplyr::arrange(GEOID, year, month, hazard, is_historic_county) |> + dplyr::summarize( + .by = c("GEOID", "year", "month", "hazard"), + dplyr::across( + .cols = dplyr::all_of(interpolate_columns), + .fns = ~ sum(.x, na.rm = TRUE)), + dplyr::across( + .cols = -dplyr::all_of(c(interpolate_columns, "is_historic_county")), + .fns = dplyr::first)) + + if (anyDuplicated(dplyr::select(df2b, GEOID, year, month, hazard)) != 0) { + stop(stringr::str_c( + "Duplicate GEOID x year x month x hazard keys remain after historic-county ", + "deduplication; a new SHELDUS vintage may have introduced a new collision pattern.")) } + + ## connecticut counties are dated -- we need to crosswalk them to current county- + ## equivalents (planning regions) + ct_crosswalk_table = crosswalk::get_crosswalk( + source_geography = "county", + target_geography = "county", + source_year = 2020, + target_year = 2022, + silent = TRUE)$crosswalks$step_1 |> + dplyr::filter(state_fips == "09") |> + dplyr::select(source_geoid, target_geoid, allocation_factor_source_to_target) + + crosswalked_ct_counties = df2b %>% dplyr::filter(state_name == "Connecticut") %>% - dplyr::left_join(ct_county_crosswalk, by = c("GEOID" = "county_fips_2020"), relationship = "many-to-many") %>% + dplyr::left_join(ct_crosswalk_table, by = c("GEOID" = "source_geoid"), relationship = "many-to-many") %>% dplyr::summarize( - .by = c("county_fips_2022", "year", "month", "hazard"), + .by = c("target_geoid", "year", "month", "hazard"), dplyr::across( .cols = dplyr::all_of(interpolate_columns), - .fns = ~ sum(.x * allocation_factor, na.rm = TRUE)), + .fns = ~ sum(.x * allocation_factor_source_to_target, na.rm = TRUE)), dplyr::across( - .cols = -dplyr::all_of(interpolate_columns), + .cols = -dplyr::all_of(c(interpolate_columns, "GEOID", "allocation_factor_source_to_target")), .fns = ~ dplyr::first(.x))) %>% - dplyr::select(-GEOID) %>% - dplyr::rename(GEOID = county_fips_2022) + dplyr::rename(GEOID = target_geoid) - df3 = df2 %>% + df3 = df2b %>% dplyr::filter(state_name != "Connecticut") %>% dplyr::bind_rows(crosswalked_ct_counties) @@ -152,13 +174,14 @@ get_sheldus = function( "That is, only counties with a disaster event have an observation for a given month x year x hazard. ", "The `records` field reflects the number of events that were aggregated to ", "calculate the values reflected in the given observation. ", - "All dollar-denominated values are in 2024 dollars.")) + "All dollar-denominated values are in ", detected_base_year, " dollars.")) return(df4) } utils::globalVariables(c( "state_name", "county_fips", "unique_id", "GEOID", "county_name", "year", "month", - "damage_property", "damage_property_per_capita", "damage_crop", "property_damage_adjusted_2024", - "damage_crop_per_capita", "records", "benchmark_geographies", "crop_damage_adjusted_2024", - "STATE", "COUNTY", ".")) + "damage_property", "damage_property_per_capita", "damage_crop", "damage_property_adjusted", + "damage_crop_adjusted", "damage_crop_per_capita", "records", "benchmark_geographies", + "is_historic_county", "state_fips", "source_geoid", "target_geoid", + "allocation_factor_source_to_target", "STATE", "COUNTY", ".")) diff --git a/R/get_structures.R b/R/get_structures.R index 46f83a0..89aad6a 100644 --- a/R/get_structures.R +++ b/R/get_structures.R @@ -35,16 +35,22 @@ get_structures = function( geography = "county", keep_structures = FALSE) { - warning("The raw building footprint data files are large; this function can be slow to execute.") - - options(timeout = 240) - if (! geography %in% c("county", "tract")) { stop("`geography` must be one of 'county' or 'tract'.") } if ( boundaries %>% sf::st_crs() %>% is.na(.) ) { stop("You must specify a spatial vector object with a defined CRS or a bbox from sf::st_bbox().")} + warning("The raw building footprint data files are large; this function can be slow to execute.") + + options(timeout = 240) + + ## an sf::st_bbox()-style bbox is documented as valid input but bbox objects aren't + ## sf/sfc objects, and previously errored on the st_transform()/mutate() calls below; + ## convert internally to an sf polygon + if (inherits(boundaries, "bbox")) { + boundaries = sf::st_as_sfc(boundaries) %>% sf::st_sf() } + projection = 5070 boundaries = boundaries %>% @@ -82,15 +88,31 @@ get_structures = function( data_urls = tibble::tibble( url = data_urls_html %>% rvest::html_attr("href"), + ## str_trim() fixes a Kentucky-specific trailing-whitespace mismatch against + ## fips_codes$state_name; "Virgin Islands" is special-cased since fips_codes uses + ## "U.S. Virgin Islands" state_name = data_urls_html %>% rvest::html_text() %>% - stringr::str_replace_all("D.C.", "District of Columbia")) %>% + stringr::str_trim() %>% + stringr::str_replace_all(c( + "D.C." = "District of Columbia", + "^Virgin Islands$" = "U.S. Virgin Islands"))) %>% dplyr::left_join( tidycensus::fips_codes %>% dplyr::select(state_name, state) %>% dplyr::distinct(), by = "state_name") + unmatched_state_names = data_urls %>% + dplyr::filter(is.na(state)) %>% + dplyr::pull(state_name) %>% + unique() + + if (length(unmatched_state_names) > 0) { + warning(stringr::str_c( + "The following scraped state/territory name(s) did not match a known name and will ", + "not be available for download: ", stringr::str_c(unmatched_state_names, collapse = ", "), ".")) } + df1 = purrr::map_dfr( structure_data_states, function(state_abbreviation) { @@ -99,7 +121,10 @@ get_structures = function( dplyr::pull(state_name) %>% unique() - existing_file = list.files(box_path, full.names = TRUE, recursive = TRUE) %>% + ## scoped to the state's own subfolder (not the full box_path tree), so an + ## unrelated stray/duplicate folder for another state can't produce a false match + ## and silently bypass this state's own cache + existing_file = list.files(file.path(box_path, state_abbreviation), full.names = TRUE, recursive = TRUE) %>% purrr::keep(stringr::str_detect(., stringr::str_c(state_abbreviation, "_Structures.gdb/gdb$"))) %>% stringr::str_remove("/gdb$") @@ -151,7 +176,7 @@ get_structures = function( dplyr::group_by(county_fips, primary_occupancy) %>% dplyr::summarize( occupancy_class = dplyr::first(occupancy_class), - count = n()) %>% + count = dplyr::n()) %>% dplyr::ungroup() %>% dplyr::arrange(county_fips, dplyr::desc(count)) %>% dplyr::rename(GEOID = county_fips) } @@ -173,7 +198,7 @@ get_structures = function( dplyr::group_by(GEOID, primary_occupancy) %>% dplyr::summarize( occupancy_class = dplyr::first(occupancy_class), - count = n()) %>% + count = dplyr::n()) %>% dplyr::ungroup() %>% dplyr::arrange(GEOID, dplyr::desc(count)) } @@ -185,5 +210,5 @@ get_structures = function( utils::globalVariables( c("intersection_area", "state_area", "intersection_share_state_area", "STUSPS", "build_id", "occ_cls", "prim_occ", "fips", "primary_occupancy", "occupancy_class", - "boundaries_area", "intersection_share_boundary_area")) + "boundaries_area", "intersection_share_boundary_area", "state")) diff --git a/R/get_wildfire_burn_zones.R b/R/get_wildfire_burn_zones.R index a4f7e0f..79617ad 100644 --- a/R/get_wildfire_burn_zones.R +++ b/R/get_wildfire_burn_zones.R @@ -12,30 +12,38 @@ #' FIRED, MTBS, NIFC, ICS-209, RedBook, and FEMA data sources. Geometries are in #' NAD83 / Conus Albers (EPSG:5070). #' -#' @returns An sf dataframe comprising wildfire burn zone disasters. Each row represents a -#' single wildfire event, with polygon geometries representing burn zones. +#' @returns An sf dataframe comprising wildfire burn zone disasters, with one row per +#' wildfire x affected county (a wildfire spanning multiple counties appears as multiple +#' rows). `geometry`, `area_sq_km`, and the other wildfire-level summary columns +#' (`fatalities_total`, `injuries_total`, `structures_destroyed`, `structures_threatened`, +#' `evacuation_total`, `wui_type`, `density_people_sq_km_wildfire_buffer`) are wildfire-level +#' and repeat identically across a multi-county wildfire's rows; de-duplicate on +#' `wildfire_id` before summing these columns or unioning geometries (e.g. +#' `sum(area_sq_km[!duplicated(wildfire_id)])`) to avoid over-counting. #' Columns include: #' \describe{ #' \item{wildfire_id}{Unique identifier for the wildfire event.} #' \item{id_fema}{FEMA disaster identifier (if applicable).} #' \item{year}{Year of the wildfire.} #' \item{wildfire_name}{Name of the wildfire or fire complex.} -#' \item{county_fips}{Pipe-delimited string of five-digit county FIPS codes for all -#' counties affected by the wildfire.} -#' \item{county_name}{Pipe-delimited string of county names for all counties -#' affected by the wildfire.} -#' \item{area_sq_km}{Burned area in square kilometers.} +#' \item{state_fips}{Two-digit state FIPS code, derived from `county_fips`.} +#' \item{county_fips}{Five-digit county FIPS code for a single county affected by the wildfire.} +#' \item{county_name}{Name of a single county affected by the wildfire, sourced from +#' Census's own canonical county names (joined on `county_fips`) rather than the raw +#' source data, to avoid mangling Mc-prefixed county names.} +#' \item{area_sq_km}{Burned area in square kilometers (wildfire-level; see above).} #' \item{wildfire_complex_binary}{Whether the fire is a complex (multiple fires).} #' \item{date_start}{Ignition date.} #' \item{date_containment}{Containment date.} -#' \item{fatalities_total}{Total fatalities.} -#' \item{injuries_total}{Total injuries.} -#' \item{structures_destroyed}{Number of structures destroyed.} -#' \item{structures_threatened}{Number of structures threatened.} -#' \item{evacuation_total}{Total evacuations.} -#' \item{wui_type}{Wildland-urban interface type.} -#' \item{density_people_sq_km_wildfire_buffer}{Population density in wildfire buffer area.} -#' \item{geometry}{Burn zone polygon geometry.} +#' \item{fatalities_total}{Total fatalities (wildfire-level; see above).} +#' \item{injuries_total}{Total injuries (wildfire-level; see above).} +#' \item{structures_destroyed}{Number of structures destroyed (wildfire-level; see above).} +#' \item{structures_threatened}{Number of structures threatened (wildfire-level; see above).} +#' \item{evacuation_total}{Total evacuations (wildfire-level; see above).} +#' \item{wui_type}{Wildland-urban interface type (wildfire-level; see above).} +#' \item{density_people_sq_km_wildfire_buffer}{Population density in wildfire buffer +#' area (wildfire-level; see above).} +#' \item{geometry}{Burn zone polygon geometry (wildfire-level; see above).} #' } #' @export #' @examples @@ -77,11 +85,32 @@ get_wildfire_burn_zones <- function( wui_type = wildfire_wui, ## codebook says this is per square meter, but that must be a typo based on distribution of density values ## other values are per square kilometer, which makes more sense - density_people_sq_km_wildfire_buffer = wildfire_buffered_avg_pop_den) + density_people_sq_km_wildfire_buffer = wildfire_buffered_avg_pop_den) |> + ## one row per wildfire x affected county (previously one row per wildfire, with all + ## affected counties packed into pipe-delimited strings); county_fips and county_name + ## always have matching pipe-delimited counts per record, so exploding both in lockstep + ## keeps them correctly paired + ## tidyr::separate_longer_delim() drops the sf class (though the geometry list-column + ## itself stays intact as sfc), so it must be re-wrapped with sf::st_as_sf() + tidyr::separate_longer_delim(c(county_fips, county_name), delim = "|") |> + sf::st_as_sf() |> + dplyr::mutate( + county_fips = stringr::str_trim(county_fips), + state_fips = stringr::str_sub(county_fips, 1, 2)) |> + ## county_name is re-derived from Census's own canonical county names (keyed on + ## county_fips) rather than title-casing the raw source string, which would mangle + ## Mc-prefixed county names (e.g. str_to_title("MCKENZIE") -> "Mckenzie", not "McKenzie") + dplyr::select(-county_name) |> + dplyr::left_join( + tidycensus::fips_codes |> + dplyr::transmute(county_fips = stringr::str_c(state_code, county_code), county_name = county), + by = "county_fips", + relationship = "many-to-one") |> + dplyr::relocate(state_fips, county_fips, county_name, .after = wildfire_name) message(stringr::str_c( - "Each observation represents a wildfire burn zone disaster. ", - "Counties affected by each wildfire are stored as pipe-delimited strings in county_fips and county_name columns. ", + "Each observation represents a county affected by a wildfire burn zone disaster. ", + "Wildfires spanning multiple counties appear as multiple rows. ", "Disasters are defined as wildfires that burned near a community and resulted in ", "at least one civilian fatality, one destroyed structure, or received federal disaster relief. ", "Geometries represent burn zone perimeters sourced from FIRED, MTBS, or NIFC datasets.")) @@ -94,4 +123,5 @@ utils::globalVariables(c( "wildfire_counties_fips", "wildfire_area", "wildfire_complex", "wildfire_ignition_date", "wildfire_containment_date", "wildfire_total_fatalities", "wildfire_total_injuries", "wildfire_struct_destroyed", "wildfire_struct_threatened", "wildfire_total_evacuation", - "wildfire_wui", "wildfire_buffered_avg_pop_den")) + "wildfire_wui", "wildfire_buffered_avg_pop_den", "state_code", "county_code", "county", + "state_fips", "county_fips", "county_name", "wildfire_name")) diff --git a/R/interpolate_demographics.R b/R/interpolate_demographics.R deleted file mode 100644 index 61a96d7..0000000 --- a/R/interpolate_demographics.R +++ /dev/null @@ -1,142 +0,0 @@ -## Author: Will Curran-Groome - -#' @importFrom magrittr %>% -#' -#' @title Interpolate tract-level sociodemographic data to zoning polygons -#' -#' @param sociodemographic_tracts_sf (optional) A tract level spatial (sf) dataset resulting from urbnindicators. If NULL, this function is run behind the scenes for appropriate tracts. -#' @param zones_sf A spatial (sf) dataset defining zoning districts. -#' @param id_column The name of the column in zones_sf that identifies each unique combination of zoning regulations. -#' @param weights One of c("population", "housing"). The variable to be used as the weight in the interpolation. -#' -#' @return A spatial (sf) dataset comprising one observation for each level of id_column with interpolated values taken from sociodemographic_tracts_sf. -#' @export -interpolate_demographics = function( - zones_sf, - sociodemographic_tracts_sf = NULL, - id_column, - weights = "population") { - - ## main function body - projection = 5070 - - ## this takes a value greater than one if there are any duplicate observations - duplicate_observations = zones_sf %>% - sf::st_drop_geometry() %>% - dplyr::count(.data[[id_column]], sort = TRUE) %>% - dplyr::slice(1) %>% - dplyr::pull(n) - - ## transform zoning data to a standard projection - ## group by the supplied summary column if there are duplicate observations - ## summarize so that there's only a single observation per value of the - ## grouping column, consolidating geometries accordingly - zones0 = zones_sf %>% - sf::st_transform(projection) %>% - { if (duplicate_observations > 1) - (dplyr::group_by(., .data[[id_column]]) %>% dplyr::summarize()) - else .} - - states_sf = tigris::states( - cb = TRUE, - resolution = "20m", - year = 2023, - progress_bar = FALSE, - refresh = TRUE) %>% - sf::st_transform(projection) - - zone_bbox = zones0 %>% - sf::st_bbox() %>% - sf::st_as_sfc() - - state_geoids = states_sf %>% - sf::st_filter(zone_bbox) %>% - .[["GEOID"]] - - options(tigris_use_cache = FALSE) - relevant_tracts = state_geoids %>% - purrr::map_dfr( - ~ tigris::tracts( - state = .x, - county = NULL, - cb = TRUE, - year = 2023, - progress_bar = FALSE, - refresh = TRUE)) %>% - sf::st_transform(projection) %>% - sf::st_filter(zones0) %>% - dplyr::mutate( - state_geoid = stringr::str_sub(GEOID, 1, 2), - county_geoid = stringr::str_sub(GEOID, 1, 5), - tract_area_sqm = sf::st_area(.) %>% as.numeric()) - - relevant_blocks = relevant_tracts %>% - .[["state_geoid"]] %>% - unique() %>% - purrr::map_dfr( - function(state_geoid) { - county_geoids = relevant_tracts %>% - dplyr::filter(state_geoid == !!state_geoid) %>% - dplyr::pull(county_geoid) %>% - unique() %>% - stringr::str_sub(3, 5) - - result = tigris::blocks( - state = state_geoid, - county = county_geoids, - year = 2022, - progress_bar = FALSE, - refresh = TRUE) - - }) %>% - sf::st_transform(projection) - - ## in the case that sociodemographic data are not provided by the user, - ## we query them - if (is.null(sociodemographic_tracts_sf)) { - sociodemographic_tracts_sf = urbnindicators::compile_acs_data( - variables = NULL, - years = c(2023), - geography = "tract", - states = state_geoids, - counties = NULL, - spatial = TRUE) %>% - sf::st_transform(projection) %>% - dplyr::filter(GEOID %in% relevant_tracts$GEOID) - } else { - sociodemographics0 = sociodemographic_tracts_sf %>% - sf::st_transform(projection) %>% - dplyr::filter(GEOID %in% relevant_tracts$GEOID) - } - - interpolated_zone_counts = tidycensus::interpolate_pw( - from = sociodemographics0 %>% - dplyr::select( - dplyr::where(is.numeric), - -dplyr::matches("_percent$|_mean$|_median$|_M$|_cv$|density|area")), - to = zones0, - to_id = id_column, - weights = relevant_blocks, - weight_column = weights, - crs = 5070, - extensive = TRUE) ## calculating weighted sums - - interpolated_zone_noncounts = tidycensus::interpolate_pw( - from = sociodemographics0 %>% - dplyr::select(dplyr::matches("_percent$|_mean$|_median$|density$")), - to = zones0, - to_id = id_column, - weights = relevant_blocks, - weight_column = weights, - crs = 5070, - extensive = FALSE) ## calculating weighted means - - interpolated_zones = dplyr::left_join( - interpolated_zone_counts, - interpolated_zone_noncounts %>% - sf::st_drop_geometry()) - - return(interpolated_zones) -} - -utils::globalVariables(c(".data")) diff --git a/R/qualtrics_analysis.R b/R/qualtrics_analysis.R deleted file mode 100644 index b263e5d..0000000 --- a/R/qualtrics_analysis.R +++ /dev/null @@ -1,323 +0,0 @@ -## Author: Will Curran-Groome - -#' @importFrom magrittr %>% - -#' @title Prep Qualtrics metadata -#' -#' @param metadata A dataframe containing unprocessed metadata from the Qualtrics API -#' @param sections A named vector specifying the last question number in each survey section -#' @param text_replace A named character vector of regex patterns to replace in the metadata -#' -#' @return A tibble containing formatted Qualtrics survey metadata with the following columns: -#' \describe{ -#' \item{question_number}{Integer. The sequential position of the question in the survey (1-indexed).} -#' \item{question_name}{Character. The internal Qualtrics question identifier (e.g., "Q1", "Q2_1").} -#' \item{text_main}{Character. The primary question text, with any patterns specified in `text_replace` substituted.} -#' \item{text_sub}{Character. The sub-question or response option text, with any patterns specified in `text_replace` substituted.} -#' \item{survey_section}{Character. The name of the survey section to which the question belongs, as defined by the `sections` parameter. Filled upward from section boundaries. -#' } -#' } -#' @export -qualtrics_format_metadata = function(metadata, sections = c(), text_replace = "zzzzz") { - - metadata = metadata %>% - dplyr::transmute( - question_number = dplyr::row_number(), - question_name = qname, - text_main = main, - text_sub = sub, - dplyr::across( - .cols = dplyr::matches("text"), - .fns = ~ stringr::str_replace_all(.x, text_replace))) %>% - dplyr::left_join( - tibble::tibble( - question_number = sections %>% as.numeric, - survey_section = names(sections)), - by = c("question_number")) %>% - tidyr::fill(survey_section, .direction = "up") - - return(metadata) -} - -#' @title Access Qualtrics metadata -#' -#' @param metadata The dataframe containing the Qualtrics metadata -#' @param question_name A regex pattern to match the question name(s) -#' @param survey_section A regex pattern to match the survey section(s) -#' @param return_values The name of the column (character) to be returned -#' -#' @return A character vector containing the values from the column specified by `return_values` (default: "text_sub"), filtered to rows matching either the `question_name` or `survey_section` pattern. The length of the vector corresponds to the number of matching rows in the metadata. Returns an empty character vector if no matches are found. -#' @export -qualtrics_get_metadata = function(metadata, question_name = NULL, survey_section = NULL, return_values = "text_sub") { - - if (is.null(survey_section) & is.null(question_name)) { - stop("One of `survey_section` and `question_name` must be supplied.") } - - if (!is.null(question_name)) { - result = metadata %>% - dplyr::filter(stringr::str_detect(question_name, !!question_name)) %>% - dplyr::pull(return_values) } else { - result = metadata %>% - dplyr::filter(stringr::str_detect(survey_section, !!survey_section)) %>% - dplyr::pull(return_values) } - - return(result) } - -#' @title Plot responses to Qualtrics survey questions -#' -#' @param df A dataframe of survey responses -#' @param metadata A dataframe of Qualtrics metadata -#' @param question_code_include A regex that matches the question codes to include in the plot -#' @param question_code_omit A regex that matches the question codes to omit from the plot -#' @param question_type one of c("continuous", "checkbox_single", "checkbox_multi", "checkbox_factor") -#' @param title Plot title -#' @param subtitle Plot subtitle -#' @param subtitle_replace A named character vector of regex patterns to replace in the subtitle -#' @param text_remove A regex pattern to select response options to exclude from the plot -#' @param text_replace A named character vector of regex patterns to replace in the response text -#' @param omit_other Logical; whether to omit the "Other" response option. Default is TRUE. -#' -#' @return A `ggplot2` object representing a visualization of survey responses. The plot type varies based on `question_type`: -#' \describe{ -#' \item{For "continuous"}{A boxplot showing the distribution of numeric responses, with question sub-text on the y-axis and values on the x-axis. Multiple sub-questions are displayed as separate boxplots. -#' } -#' \item{For "checkbox_single" or "checkbox_multi"}{A horizontal bar chart showing response counts. Response options are ordered by total count (descending). For "checkbox_multi", bars are stacked by response type.} -#' \item{For "checkbox_factor"}{A stacked horizontal bar chart showing response counts by factor level, with response options ordered by total count.} -#' } -#' The plot uses Urban Institute theming via `urbnthemes::theme_urbn_print()` and includes the specified `title` and auto-generated or custom `subtitle`. -#' @export -qualtrics_plot_question = function( - df, - metadata, - question_code_include, - question_code_omit = "zzzzz", - question_type, - title = "", - subtitle = NULL, - subtitle_replace = c("\\[Field.*\\]" = "your community", "Your best estimate is fine\\." = ""), - text_remove = "please describe|please specify", - text_replace = c("a" = "a"), - omit_other = TRUE) { - - urbnthemes::set_urbn_defaults(style = "print") - - if (is.null(subtitle)) { - subtitle = qualtrics_get_metadata( - metadata, - question_name = question_code_include, - return_values = "text_main") %>% - .[1] %>% - stringr::str_replace_all(subtitle_replace) %>% - stringr::str_wrap(100)} - - ## Continuous-response questions - if (question_type == "continuous") { - basic_data = df %>% - dplyr::select(dplyr::matches(question_code_include)) %>% - dplyr::mutate( - dplyr::across( - .cols = dplyr::everything(), - .fns = as.numeric)) %>% - tidyr::pivot_longer(dplyr::everything()) %>% - dplyr::filter(!is.na(value)) - - basic_data = basic_data %>% - dplyr::left_join( - metadata %>% - dplyr::filter(question_name %in% basic_data$name), - by = c("name" = "question_name")) %>% - dplyr::mutate(text_sub = dplyr::if_else(is.na(text_sub), "", text_sub)) - - plot = basic_data %>% - ggplot2::ggplot() + - ggplot2::geom_boxplot(ggplot2::aes(x = value, y = text_sub %>% stringr::str_wrap(40))) + - urbnthemes::theme_urbn_print() + - ggplot2::scale_x_continuous(labels = scales::comma_format()) + - ggplot2::labs(x = "", y = "", title = title, subtitle = subtitle) - - ## when there are multiple sub-questions (i.e., a grid of continuous-type questions) - ## we want to join and retain sub-question names from the metadata and include these in the plot - if (basic_data$name %>% unique %>% length() < 2) { - plot = plot + ggplot2::theme(axis.text.y = ggplot2::element_blank()) } - } - - ## Checkbox-type questions - if (stringr::str_detect(question_type, "checkbox")) { - basic_data = df %>% - dplyr::select(response_id, c(dplyr::matches(question_code_include), -dplyr::matches(question_code_omit))) %>% - tidyr::pivot_longer(-response_id) %>% - dplyr::filter(!is.na(value)) - - if (question_type == "checkbox_factor") { - plot = basic_data %>% - dplyr::left_join(metadata, by = c("name" = "question_name")) %>% - dplyr::count(text_sub, value) %>% - dplyr::mutate(text_sub = stringr::str_replace_all(text_sub, text_replace) %>% stringr::str_wrap(60)) %>% - dplyr::group_by(text_sub) %>% - dplyr::mutate(order = sum(n)) %>% - dplyr::ungroup() %>% - ggplot2::ggplot() + - ggplot2::geom_col( - ggplot2::aes( - y = stats::reorder(text_sub, order), - x = n, - fill = value), - position = "stack") + - urbnthemes::theme_urbn_print() + - ggplot2::labs( - x = "", - y = "", - title = title, - subtitle = subtitle) } - - if (question_type %in% c("checkbox_single", "checkbox_multi")) { - reformatted_data = basic_data %>% - tidyr::pivot_wider(names_from = value) %>% - janitor::clean_names() %>% - dplyr::left_join( - metadata %>% - dplyr::select(question_name, text_sub) %>% - dplyr::mutate( - text_sub = text_sub %>% stringr::str_remove_all(" - .*")), by = c("name" = "question_name")) %>% - dplyr::filter(!stringr::str_detect(text_sub, text_remove)) %>% - dplyr::group_by(name) %>% - dplyr::summarize( - text_sub = dplyr::first(text_sub, na_rm = TRUE), - dplyr::across(.cols = -c(response_id, text_sub), .fns = ~ sum(!is.na(.x), na.rm = T))) %>% - dplyr::filter(!is.na(name)) %>% - tidyr::pivot_longer(cols = -c(name, text_sub), names_to = "type", values_to = "count") %>% - dplyr::mutate( - text_sub = stringr::str_replace_all(text_sub, text_replace) %>% stringr::str_wrap(60), - type = type %>% stringr::str_replace_all("_", " ") %>% stringr::str_to_sentence()) - - plot = reformatted_data %>% - dplyr::group_by(text_sub) %>% - dplyr::mutate(order = sum(count)) %>% - dplyr::ungroup() %>% - ggplot2::ggplot() + - ggplot2::geom_col( - ggplot2::aes(y = stats::reorder(text_sub, order), x = count), - position = "stack", - fill = urbnthemes::palette_urbn_main[1] %>% as.character()) + - urbnthemes::theme_urbn_print() + - ggplot2::labs( - x = "# responses", - y = "", - title = title, - subtitle = subtitle) - - if (question_type == "checkbox_multi") { - plot = plot + - ggplot2::geom_col( - ggplot2::aes( - y = stats::reorder(text_sub, order), - x = count, - fill = type), - position = "stack") }} - } - - return(plot) -} - -#' Fill in missing and non-missing values across interrelated survey questions -#' -#' @param df A dataframe of survey responses -#' @param question_code_include A regex that matches the columns to include in the missing non-missing value imputation -#' @param question_code_omit A regex that matches the columns to omit from the missing non-missing value imputation -#' @param default_values A list of length three, specifying the default, non-missing values to be used for character, numeric, and Date columns, respectively -#' @param predicate_question Optional. The name of a single column that controls whether columns selected with `question_code_include` -#' @param predicate_question_negative_value If `predicate_question` is specified, provide the value that indicates a negative response to the predicate question. For responses where the predicate question has this value, this value will be imputed to the specified columns -#' -#' @return A tibble containing only the columns selected by `question_code_include` (excluding those matching `question_code_omit`), with missing values handled according to the following logic: -#' \describe{ -#' \item{Without predicate_question}{If all selected columns are NA for a row, values remain NA. If any selected column has a non-NA value, NA values in other selected columns are replaced with the appropriate default value from `default_values` based on column type.} -#' \item{With predicate_question}{If the predicate question is NA, all selected columns are set to NA. If the predicate question equals `predicate_question_negative_value -#' `, all selected columns are set to the appropriate default value. Otherwise, original values are preserved.} -#' } -#' Column types and their default value mappings: character uses `default_values[[1]]`, numeric uses `default_values[[2]]`, and Date/POSIXct uses `default_values[[3]]`. -#' @export -qualtrics_define_missing = function( - df, - question_code_include, - question_code_omit = NULL, - default_values = list("No", 0, as.Date(0)), - predicate_question = NULL, - predicate_question_negative_value = NULL) { - - if (!is.list(default_values) | length(default_values) != 3) { - stop("`default_values` must be a list of length 3.") } - - if (is.null(question_code_omit)) { question_code_omit = "zzzzxzzzz" } - - columns = df %>% - dplyr::select( - c( - dplyr::matches(question_code_include), - -dplyr::matches(question_code_omit))) %>% - colnames() - - column_types = purrr::map_chr(columns, ~ class(df[[.x]]) %>% .[1]) - - if (column_types %>% unique() %>% length() > 1) { - warning(stringr::str_c("Columns are of different types: ", stringr::str_c(column_types %>% unique, collapse = ", "))) } - - NA_value = as.character(NA) - default_value = default_values[[1]] - - if (column_types[1] == "numeric") { - NA_value = as.numeric(NA) - default_value = default_values[[2]] } - if (column_types[1] %in% c("POSIXct", "POSIXt")) { - NA_value = as.Date(NA) - default_value = default_values[[3]] } - - ## if no predicate question is specified, we apply the default missing values - ## to the specified columns, treating any responses with any non-missing value - ## in any of the specified columns as being a valid (non-missing) response across - ## all specified columns, replacing any missing values with the default values - if (is.null(predicate_question)) { - - result = df %>% - dplyr::select(dplyr::all_of(columns)) %>% - dplyr::transmute( - dplyr::across( - .cols = dplyr::all_of(columns), - .fns = ~ dplyr::case_when( - dplyr::if_all(dplyr::all_of(columns), ~ is.na(.x)) ~ NA_value, - is.na(.x) ~ default_value, - TRUE ~ .x))) } - - ## if a predicate question is specified, we use the value of the response to this - ## question to determine whether to apply the default missing values to the specified - ## columns - if (!is.null(predicate_question)) { - if (!predicate_question %in% colnames(df)) { - stop("Predicate question not found in `df`. Provide the specific name - of one column contained in `df.`") } - - if ((df %>% dplyr::select(predicate_question) %>% colnames() %>% length()) != 1) { - stop("Predicate question must be a single column.") } - - if (is.null(predicate_question_negative_value)) { - stop("If a predicate question is provided, a negative value must also be provided.") } - - predicate_question_type = class(df[[predicate_question]]) %>% as.character() - predicate_question_default_value = default_values[[1]] - if (any(predicate_question_type == "numeric")) { predicate_question_default_value = default_values[[2]] } - if (any(predicate_question_type %in% c("POSIXct", "POSIXt"))) { predicate_question_default_value = default_values[[3]] } - - result = df %>% - dplyr::transmute( - dplyr::across( - .cols = dplyr::all_of(columns), - .fns = ~ dplyr::case_when( - is.na(.data[[predicate_question]]) ~ NA, - .data[[predicate_question]] == predicate_question_negative_value ~ predicate_question_default_value, - TRUE ~ .x))) } - - return(result) -} - -utils::globalVariables( - c("qname", "main", "survey_section", "response_id", "value", "text_sub", - "name", "question_name", "type", "variable")) diff --git a/R/spatial_analysis.R b/R/spatial_analysis.R deleted file mode 100644 index ab84cdb..0000000 --- a/R/spatial_analysis.R +++ /dev/null @@ -1,113 +0,0 @@ -#' @importFrom magrittr %>% -#' @importFrom rlang := - -#' @title Subdivide a linestring into segments of a specified length -#' -#' @param line A linestring or simple feature collection thereof -#' @param max_length The maximum length of each segment. Segments longer than this value will be subdivided; those that are below this threshold will be returned as-is. -#' @param crs The coordinate reference system to which the linestring should be transformed. Default is 5070. -#' -#' @return An `sf` object (simple feature collection) with geometry type LINESTRING. The returned object contains: -#' \describe{ -#' \item{row_id}{Integer. The row index from the original input linestring, allowing linkage back to the input data.} -#' \item{...}{All original attributes from the input `line` object are preserved and joined back via `row_id`.} -#' \item{geometry}{LINESTRING geometry. Each segment is at most `max_length` units long (in the CRS units). Segments shorter than `max_length` in the input are returned unchanged.} -#' } -#' The CRS of the output is set to the value specified by the `crs` parameter (default: EPSG:5070). -#' @export -subdivide_linestring = function(line, max_length, crs = 5070) { - - ## create a copy of the input dataset; we'll join back to this at the end to - ## return all of the original attributes - lines0 = line %>% - dplyr::mutate(row_id = dplyr::row_number()) - - lines1 = line %>% - dplyr::transmute( - row_id = dplyr::row_number(), - length = as.numeric(sf::st_length(.))) - - lines2 = lines1 %>% - dplyr::filter(length > max_length) - - lines3 = purrr::map_dfr( - lines2$row_id, - function(row_id) { - lines2 %>% - dplyr::filter(row_id == !!row_id) %>% - sf::st_as_sfc() %>% - sf::st_line_interpolate( - dist = seq( - from = 0, - to = as.numeric(sf::st_length(.)), - by = max_length)) %>% - sf::st_as_sf() %>% - dplyr::mutate( - row_id = row_id, - point_id = dplyr::row_number())}) - - lines4 = purrr::map_dfr( - lines3$row_id %>% unique(), - function(row_id) { - df = lines3 %>% dplyr::filter(row_id == !!row_id) - point_ids = df %>% dplyr::pull(point_id) - purrr::map_dfr( - point_ids, - function(point_id) { - if (point_id < length(point_ids)) { - result = df %>% - dplyr::filter(point_id %in% c(!!point_id, !!point_id + 1)) %>% - sf::st_coordinates() %>% - sf::st_linestring() %>% - sf::st_sfc() %>% - sf::st_as_sf() %>% - dplyr::mutate(row_id = row_id) } else { - result = NULL } })}) - - lines5 = dplyr::left_join( - lines1 %>% - sf::st_transform(crs) %>% - dplyr::filter(!row_id %in% lines4$row_id) %>% - dplyr::bind_rows(lines4 %>% sf::st_set_crs(crs)) %>% - dplyr::select(-length), - lines0 %>% sf::st_drop_geometry(), - by = "row_id") -} - -#' @title Convert polygons into their component linestrings -#' -#' @param .sf The spatial dataframe containing one or more polygons -#' -#' @return An `sf` object (simple feature collection) with geometry type LINESTRING. The returned object contains: -#' \describe{ -#' \item{polygon_id}{Integer. The row index of the originating polygon from the input `.sf` object, enabling linkage back to the source polygon.} -#' \item{line_id}{Integer. A sequential identifier for each line segment within its originating polygon. Line segments are ordered according to the vertex sequence of the polygon boundary.} -#' \item{...}{All original attributes from the input `.sf` object are preserved and joined back via `polygon_id`.} -#' \item{geometry}{LINESTRING geometry. Each line segment represents one edge of the original polygon boundary.} -#' } -#' The CRS of the output matches the input `.sf` object (transformed to EPSG:5070 during processing). -#' @export -polygons_to_linestring = function(.sf) { - sf1 = .sf %>% - dplyr::mutate(polygon_id = dplyr::row_number()) - - sf1 %>% - sf::st_coordinates() %>% ## convert to a matrix of coordinates for each polygon vertex - tibble::as_tibble() %>% - dplyr::group_by(L3) %>% ## this identifies the originating polygon's index - dplyr::mutate(order = dplyr::row_number()) %>% ## this is the order of the vertices in the polygon - dplyr::bind_rows(., .) %>% ## this duplicates the rows, so we can create line segments - dplyr::arrange(L3, order) %>% ## this sorts the rows by polygon and vertex order - dplyr::group_by(L3) %>% ## this groups the rows by originating polygon - ## this creates an id that matches coordinate pairs to ID line segments - dplyr::mutate(line_id = dplyr::lag(order), line_id = dplyr::if_else(is.na(line_id), max(line_id, na.rm = TRUE), line_id)) %>% - ## adding spatial coordinates (points) - sf::st_as_sf(coords = c("X", "Y"), crs = 5070) %>% - dplyr::group_by(L3, line_id) %>% ## grouping into vertex pairs per polygon to create lines - dplyr::summarize(do_union = FALSE) %>% - sf::st_cast("LINESTRING") %>% ## and this takes us to linestrings, finally - dplyr::left_join(sf1 %>% sf::st_drop_geometry(), by = c("L3" = "polygon_id")) %>% - dplyr::rename(polygon_id = L3) -} - -utils::globalVariables(c("point_id", "row_id", "line_id", "L3")) diff --git a/R/utilities.R b/R/utilities.R index a40e9c4..2d05a5c 100644 --- a/R/utilities.R +++ b/R/utilities.R @@ -17,24 +17,77 @@ get_system_username = function() { username } -#' @title Get the path to the C&C Box folder +#' Query an OpenFEMA v2 dataset filtered to a single quoted field value #' -#' @return A character string containing the full file path to the Climate and Communities (C&C) Box folder. -#' On Windows, returns "C:/Users/{username}/Box/METRO Climate and Communities Practice Area/github-repository". -#' On Mac, checks for Box at "/Users/{username}/Box" or "/Users/{username}/Library/CloudStorage/Box-Box", -#' using whichever exists. Throws an error if the Box folder cannot be found. -#' @export +#' Bypasses a bug in `rfema:::gen_api_query()`, which coerces all-digit filter values +#' (e.g. `countyCode`) to unquoted numbers -- stripping leading zeros and producing a +#' 400 Bad Request, since FEMA's API schema requires fields like `countyCode` as a +#' quoted string. Constructs the OData query directly instead, and paginates by +#' incrementing `$skip` until a page returns fewer than the page size, rather than via +#' `$inlinecount=allpages` (which `rfema::open_fema()` uses internally to pre-compute an +#' exact total record count) -- that exact count times out on FEMA's largest datasets +#' (verified: reliably produces a 503 on FimaNfipPolicies, an ~80M-row table). #' -#' @examples -#' \dontrun{ -#' get_box_path() -#' } -get_box_path = function() { +#' @param data_set_endpoint The full OpenFEMA v2 API base URL for the dataset (e.g. +#' "https://www.fema.gov/api/open/v2/FimaNfipClaims"). +#' @param field_name The OData field name to filter on (e.g. "countyCode"). +#' @param field_value The (string-typed) value to filter to; always quoted in the request. +#' +#' @return A tibble of all matching records, paginated as needed. Zero-row tibble if +#' no records match. +#' @noRd +query_openfema_quoted_filter = function(data_set_endpoint, field_name, field_value) { + + page_size = 1000 + + base_query = stringr::str_c( + data_set_endpoint, "?$top=", page_size, "&$filter=(", + field_name, " eq '", field_value, "')") |> + stringr::str_replace_all(" ", "%20") + + fetch_page = function(skip) { + response = httr::GET(stringr::str_c(base_query, "&$skip=", format(skip, scientific = FALSE))) + if (response$status_code != 200) { + stop(httr::http_status(response)$message) } + + json_data = httr::content(response)[[2]] + if (length(json_data) == 0) { return(NULL) } + + max_list_length = max(sapply(json_data, length)) + json_data = lapply(json_data, function(x) c(x, rep(NA, max_list_length - length(x)))) + page_df = data.frame(do.call(rbind, json_data)) + ## each column is still list-typed at this point (one scalar per cell, wrapped in a + ## length-1 list); as.character() (called implicitly by gsub()) unwraps these to plain + ## atomic character vectors, matching what rfema::open_fema() does internally + page_df = as.data.frame(lapply(page_df, function(x) gsub("\n", "", x))) + tibble::as_tibble(page_df) } + + pages = list() + skip = 0 + repeat { + page = fetch_page(skip) + if (is.null(page)) { break } + pages[[length(pages) + 1]] = page + if (nrow(page) < page_size) { break } + skip = skip + page_size } + + if (length(pages) == 0) { return(tibble::tibble()) } + dplyr::bind_rows(pages) +} + +#' Locate the root of the user's Box folder +#' +#' Shared OS-detection logic used by both `get_box_path()` (the C&C practice +#' area subfolder) and `get_openfema_cache_path()` (the `data-cache` subfolder +#' at the Box root). +#' +#' @return A character string containing the full path to the root of the user's Box folder. +#' @noRd +locate_box_root = function() { username <- get_system_username() os <- Sys.info()[["sysname"]] - box_subfolder <- file.path("METRO Climate and Communities Practice Area", "github-repository") - if (os == "Windows") { + if (os == "Windows") { box_root <- file.path("C:", "Users", username, "Box") } else if (os == "Darwin") { # Mac: Check common Box locations @@ -59,7 +112,24 @@ get_box_path = function() { stop("Unsupported operating system: ", os, ". Only Windows and Mac are supported.") } - box_path <- file.path(box_root, box_subfolder) + box_root +} + +#' @title Get the path to the C&C Box folder +#' +#' @return A character string containing the full file path to the Climate and Communities (C&C) Box folder. +#' On Windows, returns "C:/Users/\{username\}/Box/METRO Climate and Communities Practice Area/github-repository". +#' On Mac, checks for Box at "/Users/\{username\}/Box" or "/Users/\{username\}/Library/CloudStorage/Box-Box", +#' using whichever exists. Throws an error if the Box folder cannot be found. +#' @export +#' +#' @examples +#' \dontrun{ +#' get_box_path() +#' } +get_box_path = function() { + box_path <- file.path( + locate_box_root(), "METRO Climate and Communities Practice Area", "github-repository") if (!dir.exists(box_path)) { warning("Box path does not exist: ", box_path) @@ -68,42 +138,109 @@ get_box_path = function() { box_path } +#' @title Get the path to the local OpenFEMA dataset cache +#' +#' @return A character string containing the full path to the local cache of +#' OpenFEMA datasets, populated via `download_openfema_datasets()`. This +#' cache lives at the root of the user's Box folder (`data-cache/openfema`), +#' not under the C&C practice area subfolder returned by `get_box_path()`. +#' @export +#' +#' @examples +#' \dontrun{ +#' get_openfema_cache_path() +#' } +get_openfema_cache_path = function() { + file.path(locate_box_root(), "data-cache", "openfema") +} + +#' Locate the most recently cached OpenFEMA dataset file +#' +#' Package `get_*` functions use this to default to the freshest local mirror +#' of a given OpenFEMA dataset instead of a hardcoded, inevitably stale filename. +#' +#' @param dataset_name The OpenFEMA API endpoint name (e.g. "DisasterDeclarationsSummaries"), +#' matching the file-naming convention produced by `download_openfema_datasets()` +#' (`_YYYY_MM_DD.parquet`). +#' @param cache_path Directory to search. Defaults to `get_openfema_cache_path()`. +#' +#' @return The full path to the most recently dated cached file for `dataset_name`. +#' @noRd +find_openfema_cache_file = function(dataset_name, cache_path = get_openfema_cache_path()) { + + if (!dir.exists(cache_path)) { + stop(stringr::str_c( + "No local OpenFEMA cache found at: ", cache_path, ". Use `download_openfema_datasets()` ", + "to populate it, or supply an explicit file path.")) } + + pattern = stringr::str_c("^", dataset_name, "_\\d{4}_\\d{2}_\\d{2}\\.parquet$") + cached_files = list.files(cache_path, pattern = pattern, full.names = TRUE) + + if (length(cached_files) == 0) { + stop(stringr::str_c( + "No cached file found for '", dataset_name, "' in: ", cache_path, ". Use ", + "`download_openfema_datasets()` to populate it, or supply an explicit file path.")) } + + file_dates = cached_files |> + basename() |> + stringr::str_extract("\\d{4}_\\d{2}_\\d{2}") |> + stringr::str_replace_all("_", "-") |> + as.Date() + + most_recent_file = cached_files[which.max(file_dates)] + message("Reading cached OpenFEMA file: ", basename(most_recent_file)) + most_recent_file +} + #' Get the raw column names for a specified dataset #' -#' @param dataset The name of the dataset. One of c('nfip_policies', 'ihp_registrations'). +#' @param dataset The name of the dataset. One of c('nfip_policies', 'nfip_claims', 'ihp_registrations'). #' -#' @return A character vector containing the raw column names (in camelCase format as they appear in the source data) to be selected when reading the specified dataset. The columns returned are curated subsets of the full dataset columns, excluding administrative/metadata fields. For "nfip_policies": 20 columns including location, policy details, and building characteristics. For "ihp_registrations": ~20 columns including disaster info, geographic identifiers, and assistance amounts. +#' @return A character vector containing the raw column names (in camelCase format as they appear in the source data) to be selected when reading the specified dataset. The columns returned are curated subsets of the full dataset columns, excluding administrative/metadata fields. For "nfip_policies": 11 columns matching the current per-state parquet schema. For "nfip_claims": 19 columns needed by `get_nfip_claims()`'s downstream `transmute()`. For "ihp_registrations": ~20 columns including disaster info, geographic identifiers, and assistance amounts. get_dataset_columns = function(dataset) { if (length(dataset) > 1 | !is.character(dataset)) { stop("The `dataset` argument must be a character of length one.") } - if (! dataset %in% c('nfip_policies', 'ihp_registrations')) { - stop("The `dataset` argument must be one of c('nfip_policies', 'ihp_registrations').") } + if (! dataset %in% c('nfip_policies', 'nfip_claims', 'ihp_registrations')) { + stop("The `dataset` argument must be one of c('nfip_policies', 'nfip_claims', 'ihp_registrations').") } if (dataset == "nfip_policies") { columns = c( "id", - "longitude", - "latitude", + "countyCode", "censusTract", - "crsClassCode", + "policyCost", + "policyCount", "ratedFloodZone", + "totalInsurancePremiumOfThePolicy", + "policyTerminationDate", + "policyEffectiveDate", "occupancyType", + "buildingReplacementCost") } + + if (dataset == "nfip_claims") { + columns = c( + "countyCode", + "censusTract", + "occupancyType", + "yearOfLoss", "originalConstructionDate", - "policyCost", "policyCount", - "policyEffectiveDate", - "policyTerminationDate", - "primaryResidenceIndicator", - "regularEmergencyProgramIndicator", - "smallBusinessIndicatorBuilding", - "totalInsurancePremiumOfThePolicy", + "buildingDeductibleCode", + "contentsDeductibleCode", + "buildingPropertyValue", + "contentsPropertyValue", "buildingReplacementCost", - "floodproofedIndicator", - "rentalPropertyIndicator", - "tenantIndicator") } + "contentsReplacementCost", + "totalBuildingInsuranceCoverage", + "totalContentsInsuranceCoverage", + "buildingDamageAmount", + "contentsDamageAmount", + "netBuildingPaymentAmount", + "netContentsPaymentAmount", + "netIccPaymentAmount") } if (dataset == "ihp_registrations") { columns = c( @@ -155,7 +292,7 @@ get_dataset_columns = function(dataset) { #' @param outpath The local path to write parquet data to. #' @param delimit_character The delimiting character of the raw data. #' @param subsetted_columns The columns to include in the outputted parquet data. -#' @param dataset NULL by default. Alternately, one of c("nfip_policies", "ihp_registrations"). If not null, this will be used to select the columns that are returned. +#' @param dataset NULL by default. Alternately, one of c("nfip_policies", "nfip_claims", "ihp_registrations"). If not null, this will be used to select the columns that are returned. #' #' @return NULL (invisibly). This function is called for its side effect of writing a parquet file to disk at the specified `outpath` (or a path derived from `inpath` with a .parquet extension). The function reads the input file in chunks to handle large files efficiently, optionally subsets to specified columns, and writes the result in Apache Parquet format using `arrow::write_parquet()`. convert_delimited_to_parquet = function( @@ -182,10 +319,12 @@ convert_delimited_to_parquet = function( subsetted_columns = get_dataset_columns("ihp_registrations") } if (dataset == "nfip_policies") { subsetted_columns = get_dataset_columns("nfip_policies") } + if (dataset == "nfip_claims") { + subsetted_columns = get_dataset_columns("nfip_claims") } if (is.null(dataset)) { subsetted_columns = colnames(raw_txt_test_delimit_character) } - if (!(dataset %in% c("ihp_registrations", "nfip_policies"))) { - stop("The `dataset` argument must be one of c('ihp_registrations', 'nfip_policies').") } + if (!(dataset %in% c("ihp_registrations", "nfip_policies", "nfip_claims"))) { + stop("The `dataset` argument must be one of c('ihp_registrations', 'nfip_policies', 'nfip_claims').") } ## a quick test prior to reading in full file raw_txt_test_subsetted_columns = tryCatch( @@ -217,32 +356,53 @@ convert_delimited_to_parquet = function( #' If `return_geometry = TRUE`, the geometry column is retained; otherwise it is dropped. #' @export get_spatial_extent_census = function(data, return_geometry = FALSE, projection = 5070) { - warning("This leverages `sf::st_overlaps()` and does not provide the desired results consistently.") - data = tigris::counties() - data = data |> + data1 = data |> sf::st_transform(projection) + data_union = data1 |> sf::st_union() + + ## computes the % of each candidate geography's own area that overlaps `data_union`, + ## retaining only geographies exceeding a 5% overlap threshold--this avoids keeping + ## geographies that only barely touch/border the input boundary + filter_by_overlap = function(candidates, threshold = 0.05) { + candidates |> + dplyr::mutate(geography_area = sf::st_area(geometry)) |> + sf::st_intersection(data_union) |> + dplyr::mutate(overlap_pct = as.numeric(sf::st_area(geometry) / geography_area)) |> + sf::st_drop_geometry() |> + dplyr::filter(overlap_pct > threshold) |> + dplyr::pull(GEOID) } + + all_counties = tigris::counties(cb = TRUE, year = 2023, progress_bar = FALSE) |> sf::st_transform(projection) - states_sf = tigris::states( - cb = TRUE, - resolution = "20m", - year = 2023, - progress_bar = FALSE, - refresh = TRUE) |> - sf::st_transform(projection) + overlapping_county_geoids = all_counties |> filter_by_overlap() + + if (length(overlapping_county_geoids) == 0) { + stop("No county overlaps `data` by more than 5% of the county's area.") } - state_geoids = states_sf |> - sf::st_filter(data, .predicate = sf::st_overlaps) |> - _[["GEOID"]] + state_geoids = all_counties |> + sf::st_drop_geometry() |> + dplyr::filter(GEOID %in% overlapping_county_geoids) |> + dplyr::pull(STATEFP) |> + unique() if (length(state_geoids) > 1) { + + states_sf = tigris::states( + cb = TRUE, + resolution = "20m", + year = 2023, + progress_bar = FALSE, + refresh = TRUE) |> + sf::st_transform(projection) + result = states_sf |> dplyr::filter(GEOID %in% state_geoids) |> dplyr::transmute( state_geoid = GEOID, geography = "state") } else { - result = state_geoids |> + all_tracts = state_geoids |> purrr::map_dfr( ~ tigris::tracts( state = .x, @@ -251,8 +411,12 @@ get_spatial_extent_census = function(data, return_geometry = FALSE, projection = year = 2023, progress_bar = FALSE, refresh = TRUE)) |> - sf::st_transform(projection) |> - sf::st_filter(data) |> + sf::st_transform(projection) + + overlapping_tract_geoids = all_tracts |> filter_by_overlap() + + result = all_tracts |> + dplyr::filter(GEOID %in% overlapping_tract_geoids) |> dplyr::transmute( state_geoid = stringr::str_sub(GEOID, 1, 2), county_geoid = stringr::str_sub(GEOID, 1, 5), @@ -322,8 +486,14 @@ get_geography_metadata = function( geography_type = match.arg(geography_type) + ## tidycensus::get_acs() only covers the 50 states, DC, and Puerto Rico; American Samoa, + ## Guam, the Northern Mariana Islands, and the US Virgin Islands are not part of the ACS, + ## so their geography metadata is sourced from tidycensus::fips_codes instead. Population + ## is unavailable for these territories from this source and is left NA. + territory_codes = c("60", "66", "69", "78") + suppressMessages({ - df = tidycensus::get_acs( + df1 = tidycensus::get_acs( year = year, output = "wide", variables = "B01003_001", @@ -339,16 +509,31 @@ get_geography_metadata = function( tidycensus::fips_codes %>% dplyr::select(state_abbreviation = state, state_code) %>% dplyr::distinct(), - by = "state_code") |> - dplyr::mutate( - .by = c(state_code), - state_population = sum(county_population, na.rm = TRUE)) |> - dplyr::select(dplyr::matches("state"), dplyr::matches("county")) }) + by = "state_code") }) + + territory_geographies = tidycensus::fips_codes |> + dplyr::filter(state_code %in% territory_codes) |> + dplyr::transmute( + state_code, + state_name, + state_abbreviation = state, + ## fips_codes' `county_code` is only the 3-digit county part; pair it with + ## `state_code` to match df1's 5-digit GEOID-based county_code + county_code = stringr::str_c(state_code, county_code), + county_name = county, + county_population = NA_real_) + + df2 = dplyr::bind_rows(df1, territory_geographies) |> + dplyr::mutate( + .by = c(state_code), + state_population = dplyr::if_else( + all(is.na(county_population)), NA_real_, sum(county_population, na.rm = TRUE))) |> + dplyr::select(dplyr::matches("state"), dplyr::matches("county")) if (geography_type == "state") { - df = df |> dplyr::distinct(state_abbreviation, state_code, state_name) } + df2 = df2 |> dplyr::distinct(state_abbreviation, state_code, state_name) } - return(df) + return(df2) } #' Convert named month-including dates to standardized date-type variables @@ -388,7 +573,7 @@ date_string_to_date = function(date_string) { #' @param base_year The year to use as the base for inflation adjustment. If NULL, defaults to the most recent year in the PCE index data. #' @param names_suffix A suffix to add to the names of the inflation-adjusted variables. If NULL, defaults to "_". If "", columns are renamed in place. #' -#' @return A tibble identical to the input `df` with additional inflation-adjusted columns. For each column specified in `dollar_variables`, a new column is created with the same name plus `names_suffix` (default: "_{base_year}"). The adjusted values are calculated by multiplying original values by an inflation factor derived from the PCE Price Index ratio between the base year and each observation's year. Original columns are preserved unchanged. +#' @return A tibble identical to the input `df` with additional inflation-adjusted columns. For each column specified in `dollar_variables`, a new column is created with the same name plus `names_suffix` (default: "_\{base_year\}"). The adjusted values are calculated by multiplying original values by an inflation factor derived from the PCE Price Index ratio between the base year and each observation's year. Original columns are preserved unchanged. #' @export #' #' @examples @@ -436,4 +621,5 @@ inflation_adjust = function( utils::globalVariables(c( "DPCERG3A086NBEA", "crop_damage_adjusted_2023", "inflation_factor", "inflation_year_", - "pce_index", "property_damage_adjusted_2023")) + "pce_index", "property_damage_adjusted_2023", "B01003_001E", "geometry", "geography_area", + "overlap_pct", "STATEFP")) diff --git a/_pkgdown.yml b/_pkgdown.yml index dcea51e..c579727 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -2,62 +2,49 @@ url: https://ui-research.github.io/climateapi/ template: bootstrap: 5 reference: -- title: Point data - contents: - - get_structures -- title: Block data - contents: - - get_lodes -- title: Cities data - contents: - - get_sba_loans -- title: Government unit data - contents: - - get_government_finances -- title: County data - contents: - - get_business_patterns +- title: Disaster events + contents: - get_fema_disaster_declarations + - get_current_fire_perimeters + - get_wildfire_burn_zones +- title: Disaster-related damages and funding + contents: - get_ihp_registrations - get_nfip_policies - get_nfip_claims - get_nfip_residential_penetration - get_public_assistance - - get_sheldus - - get_preliminary_damage_assessments - get_hazard_mitigation_assistance -- title: State data - contents: - get_emergency_management_performance + - get_sba_loans - get_disaster_dollar_database -- title: Event boundaries - contents: - - get_current_fire_perimeters - - get_wildfire_burn_zones + - get_sheldus + - get_preliminary_damage_assessments +- title: Disaster-impacted domains + contents: + - get_lodes + - get_business_patterns + - get_structures + - get_government_finances + - get_national_risk_index - title: Land use contents: - estimate_zoning_envelope - - estimate_units_per_parcel - - interpolate_demographics -- title: Surveys and Qualtrics - contents: - - qualtrics_format_metadata - - qualtrics_get_metadata - - qualtrics_plot_question - - qualtrics_define_missing - title: Utilities contents: - get_system_username - get_box_path + - get_openfema_cache_path - get_dataset_columns - get_geography_metadata + - list_openfema_endpoints + - download_openfema_datasets - convert_delimited_to_parquet - convert_table_text_to_dataframe - get_spatial_extent_census - read_xlsx_from_url - - subdivide_linestring - - polygons_to_linestring - read_ipums_cached - inflation_adjust - cache_it - get_naics_codes + diff --git a/inst/extdata/naics2007_codes.csv b/inst/extdata/naics2007_codes.csv new file mode 100644 index 0000000..f87513a --- /dev/null +++ b/inst/extdata/naics2007_codes.csv @@ -0,0 +1,2136 @@ +naics_code,naics_label +00,Total for all sectors +11,"Agriculture, forestry, fishing and hunting" +113,Forestry and logging +1131,Timber tract operations +11311,Timber tract operations +113110,Timber tract operations +1132,Forest nurseries and gathering of forest products +11321,Forest nurseries and gathering of forest products +113210,Forest nurseries and gathering of forest products +1133,Logging +11331,Logging +113310,Logging +114,"Fishing, hunting and trapping" +1141,Fishing +11411,Fishing +114111,Finfish fishing +114112,Shellfish fishing +114119,Other marine fishing +1142,Hunting and trapping +11421,Hunting and trapping +114210,Hunting and trapping +115,Support activities for agriculture and forestry +1151,Support activities for crop production +11511,Support activities for crop production +115111,Cotton ginning +115112,"Soil preparation, planting, and cultivating" +115113,"Crop harvesting, primarily by machine" +115114,Postharvest crop activities (except cotton ginning) +115115,Farm labor contractors and crew leaders +115116,Farm management services +1152,Support activities for animal production +11521,Support activities for animal production +115210,Support activities for animal production +1153,Support activities for forestry +11531,Support activities for forestry +115310,Support activities for forestry +21,"Mining, quarrying, and oil and gas extraction" +211,Oil and gas extraction +2111,Oil and gas extraction +21111,Oil and gas extraction +211111,Crude petroleum and natural gas extraction +211112,Natural gas liquid extraction +212,Mining (except oil and gas) +2121,Coal mining +21211,Coal mining +212111,Bituminous coal and lignite surface mining +212112,Bituminous coal underground mining +212113,Anthracite mining +2122,Metal ore mining +21221,Iron ore mining +212210,Iron ore mining +21222,Gold ore and silver ore mining +212221,Gold ore mining +212222,Silver ore mining +21223,"Copper, nickel, lead, and zinc mining" +212231,Lead ore and zinc ore mining +212234,Copper ore and nickel ore mining +21229,Other metal ore mining +212291,Uranium-radium-vanadium ore mining +212299,All other metal ore mining +2123,Nonmetallic mineral mining and quarrying +21231,Stone mining and quarrying +212311,Dimension stone mining and quarrying +212312,Crushed and broken limestone mining and quarrying +212313,Crushed and broken granite mining and quarrying +212319,Other crushed and broken stone mining and quarrying +21232,"Sand, gravel, clay, and ceramic and refractory minerals mining and quarrying" +212321,Construction sand and gravel mining +212322,Industrial sand mining +212324,Kaolin and ball clay mining +212325,Clay and ceramic and refractory minerals mining +21239,Other nonmetallic mineral mining and quarrying +212391,"Potash, soda, and borate mineral mining" +212392,Phosphate rock mining +212393,Other chemical and fertilizer mineral mining +212399,All other nonmetallic mineral mining +213,Support activities for mining +2131,Support activities for mining +21311,Support activities for mining +213111,Drilling oil and gas wells +213112,Support activities for oil and gas operations +213113,Support activities for coal mining +213114,Support activities for metal mining +213115,Support activities for nonmetallic minerals (except fuels) mining +22,Utilities +221,Utilities +2211,"Electric power generation, transmission and distribution" +22111,Electric power generation +221111,Hydroelectric power generation +221112,Fossil fuel electric power generation +221113,Nuclear electric power generation +221119,Other electric power generation +22112,"Electric power transmission, control, and distribution" +221121,Electric bulk power transmission and control +221122,Electric power distribution +2212,Natural gas distribution +22121,Natural gas distribution +221210,Natural gas distribution +2213,"Water, sewage and other systems" +22131,Water supply and irrigation systems +221310,Water supply and irrigation systems +22132,Sewage treatment facilities +221320,Sewage treatment facilities +22133,Steam and air-conditioning supply +221330,Steam and air-conditioning supply +23,Construction +236,Construction of buildings +2361,Residential building construction +23611,Residential building construction +236115,New single-family housing construction (except operative builders) +236116,New multifamily housing construction (except operative builders) +236117,New housing operative builders +236118,Residential remodelers +2362,Nonresidential building construction +23621,Industrial building construction +236210,Industrial building construction +23622,Commercial and institutional building construction +236220,Commercial and institutional building construction +237,Heavy and civil engineering construction +2371,Utility system construction +23711,Water and sewer line and related structures construction +237110,Water and sewer line and related structures construction +23712,Oil and gas pipeline and related structures construction +237120,Oil and gas pipeline and related structures construction +23713,Power and communication line and related structures construction +237130,Power and communication line and related structures construction +2372,Land subdivision +23721,Land subdivision +237210,Land subdivision +2373,"Highway, street, and bridge construction" +23731,"Highway, street, and bridge construction" +237310,"Highway, street, and bridge construction" +2379,Other heavy and civil engineering construction +23799,Other heavy and civil engineering construction +237990,Other heavy and civil engineering construction +238,Specialty trade contractors +2381,"Foundation, structure, and building exterior contractors" +23811,Poured concrete foundation and structure contractors +238110,Poured concrete foundation and structure contractors +23812,Structural steel and precast concrete contractors +238120,Structural steel and precast concrete contractors +23813,Framing contractors +238130,Framing contractors +23814,Masonry contractors +238140,Masonry contractors +23815,Glass and glazing contractors +238150,Glass and glazing contractors +23816,Roofing contractors +238160,Roofing contractors +23817,Siding contractors +238170,Siding contractors +23819,"Other foundation, structure, and building exterior contractors" +238190,"Other foundation, structure, and building exterior contractors" +2382,Building equipment contractors +23821,Electrical contractors and other wiring installation contractors +238210,Electrical contractors and other wiring installation contractors +23822,"Plumbing, heating, and air-conditioning contractors" +238220,"Plumbing, heating, and air-conditioning contractors" +23829,Other building equipment contractors +238290,Other building equipment contractors +2383,Building finishing contractors +23831,Drywall and insulation contractors +238310,Drywall and insulation contractors +23832,Painting and wall covering contractors +238320,Painting and wall covering contractors +23833,Flooring contractors +238330,Flooring contractors +23834,Tile and terrazzo contractors +238340,Tile and terrazzo contractors +23835,Finish carpentry contractors +238350,Finish carpentry contractors +23839,Other building finishing contractors +238390,Other building finishing contractors +2389,Other specialty trade contractors +23891,Site preparation contractors +238910,Site preparation contractors +23899,All other specialty trade contractors +238990,All other specialty trade contractors +31,Manufacturing +311,Food manufacturing +3111,Animal food manufacturing +31111,Animal food manufacturing +311111,Dog and cat food manufacturing +311119,Other animal food manufacturing +3112,Grain and oilseed milling +31121,Flour milling and malt manufacturing +311211,Flour milling +311212,Rice milling +311213,Malt manufacturing +31122,Starch and vegetable fats and oils manufacturing +311221,Wet corn milling +311222,Soybean processing +311223,Other oilseed processing +311225,Fats and oils refining and blending +31123,Breakfast cereal manufacturing +311230,Breakfast cereal manufacturing +3113,Sugar and confectionery product manufacturing +31131,Sugar manufacturing +311311,Sugarcane mills +311312,Cane sugar refining +311313,Beet sugar manufacturing +31132,Chocolate and confectionery manufacturing from cacao beans +311320,Chocolate and confectionery manufacturing from cacao beans +31133,Confectionery manufacturing from purchased chocolate +311330,Confectionery manufacturing from purchased chocolate +31134,Nonchocolate confectionery manufacturing +311340,Nonchocolate confectionery manufacturing +3114,Fruit and vegetable preserving and specialty food manufacturing +31141,Frozen food manufacturing +311411,"Frozen fruit, juice, and vegetable manufacturing" +311412,Frozen specialty food manufacturing +31142,"Fruit and vegetable canning, pickling, and drying" +311421,Fruit and vegetable canning +311422,Specialty canning +311423,Dried and dehydrated food manufacturing +3115,Dairy product manufacturing +31151,Dairy product (except frozen) manufacturing +311511,Fluid milk manufacturing +311512,Creamery butter manufacturing +311513,Cheese manufacturing +311514,"Dry, condensed, and evaporated dairy product manufacturing" +31152,Ice cream and frozen dessert manufacturing +311520,Ice cream and frozen dessert manufacturing +3116,Animal slaughtering and processing +31161,Animal slaughtering and processing +311611,Animal (except poultry) slaughtering +311612,Meat processed from carcasses +311613,Rendering and meat byproduct processing +311615,Poultry processing +3117,Seafood product preparation and packaging +31171,Seafood product preparation and packaging +311711,Seafood canning +311712,Fresh and frozen seafood processing +3118,Bakeries and tortilla manufacturing +31181,Bread and bakery product manufacturing +311811,Retail bakeries +311812,Commercial bakeries +311813,"Frozen cakes, pies, and other pastries manufacturing" +31182,"Cookie, cracker, and pasta manufacturing" +311821,Cookie and cracker manufacturing +311822,Flour mixes and dough manufacturing from purchased flour +311823,Dry pasta manufacturing +31183,Tortilla manufacturing +311830,Tortilla manufacturing +3119,Other food manufacturing +31191,Snack food manufacturing +311911,Roasted nuts and peanut butter manufacturing +311919,Other snack food manufacturing +31192,Coffee and tea manufacturing +311920,Coffee and tea manufacturing +31193,Flavoring syrup and concentrate manufacturing +311930,Flavoring syrup and concentrate manufacturing +31194,Seasoning and dressing manufacturing +311941,"Mayonnaise, dressing, and other prepared sauce manufacturing" +311942,Spice and extract manufacturing +31199,All other food manufacturing +311991,Perishable prepared food manufacturing +311999,All other miscellaneous food manufacturing +312,Beverage and tobacco product manufacturing +3121,Beverage manufacturing +31211,Soft drink and ice manufacturing +312111,Soft drink manufacturing +312112,Bottled water manufacturing +312113,Ice manufacturing +31212,Breweries +312120,Breweries +31213,Wineries +312130,Wineries +31214,Distilleries +312140,Distilleries +3122,Tobacco manufacturing +31221,Tobacco stemming and redrying +312210,Tobacco stemming and redrying +31222,Tobacco product manufacturing +312221,Cigarette manufacturing +312229,Other tobacco product manufacturing +313,Textile mills +3131,"Fiber, yarn, and thread mills" +31311,"Fiber, yarn, and thread mills" +313111,Yarn spinning mills +313112,"Yarn texturizing, throwing, and twisting mills" +313113,Thread mills +3132,Fabric mills +31321,Broadwoven fabric mills +313210,Broadwoven fabric mills +31322,Narrow fabric mills and schiffli machine embroidery +313221,Narrow fabric mills +313222,Schiffli machine embroidery +31323,Nonwoven fabric mills +313230,Nonwoven fabric mills +31324,Knit fabric mills +313241,Weft knit fabric mills +313249,Other knit fabric and lace mills +3133,Textile and fabric finishing and fabric coating mills +31331,Textile and fabric finishing mills +313311,Broadwoven fabric finishing mills +313312,Textile and fabric finishing (except broadwoven fabric) mills +31332,Fabric coating mills +313320,Fabric coating mills +314,Textile product mills +3141,Textile furnishings mills +31411,Carpet and rug mills +314110,Carpet and rug mills +31412,Curtain and linen mills +314121,Curtain and drapery mills +314129,Other household textile product mills +3149,Other textile product mills +31491,Textile bag and canvas mills +314911,Textile bag mills +314912,Canvas and related product mills +31499,All other textile product mills +314991,"Rope, cordage, and twine mills" +314992,Tire cord and tire fabric mills +314999,All other miscellaneous textile product mills +315,Apparel manufacturing +3151,Apparel knitting mills +31511,Hosiery and sock mills +315111,Sheer hosiery mills +315119,Other hosiery and sock mills +31519,Other apparel knitting mills +315191,Outerwear knitting mills +315192,Underwear and nightwear knitting mills +3152,Cut and sew apparel manufacturing +31521,Cut and sew apparel contractors +315211,Men's and boys' cut and sew apparel contractors +315212,"Women's, girls', and infants' cut and sew apparel contractors" +31522,Men's and boys' cut and sew apparel manufacturing +315221,Men's and boys' cut and sew underwear and nightwear manufacturing +315222,"Men's and boys' cut and sew suit, coat, and overcoat manufacturing" +315223,Men's and boys' cut and sew shirt (except work shirt) manufacturing +315224,"Men's and boys' cut and sew trouser, slack, and jean manufacturing" +315225,Men's and boys' cut and sew work clothing manufacturing +315228,Men's and boys' cut and sew other outerwear manufacturing +31523,Women's and girls' cut and sew apparel manufacturing +315231,"Women's and girls' cut and sew lingerie, loungewear, and nightwear manufacturing" +315232,Women's and girls' cut and sew blouse and shirt manufacturing +315233,Women's and girls' cut and sew dress manufacturing +315234,"Women's and girls' cut and sew suit, coat, tailored jacket, and skirt manufacturing" +315239,Women's and girls' cut and sew other outerwear manufacturing +31529,Other cut and sew apparel manufacturing +315291,Infants' cut and sew apparel manufacturing +315292,Fur and leather apparel manufacturing +315299,All other cut and sew apparel manufacturing +3159,Apparel accessories and other apparel manufacturing +31599,Apparel accessories and other apparel manufacturing +315991,"Hat, cap, and millinery manufacturing" +315992,Glove and mitten manufacturing +315993,Men's and boys' neckwear manufacturing +315999,Other apparel accessories and other apparel manufacturing +316,Leather and allied product manufacturing +3161,Leather and hide tanning and finishing +31611,Leather and hide tanning and finishing +316110,Leather and hide tanning and finishing +3162,Footwear manufacturing +31621,Footwear manufacturing +316211,Rubber and plastics footwear manufacturing +316212,House slipper manufacturing +316213,Men's footwear (except athletic) manufacturing +316214,Women's footwear (except athletic) manufacturing +316219,Other footwear manufacturing +3169,Other leather and allied product manufacturing +31699,Other leather and allied product manufacturing +316991,Luggage manufacturing +316992,Women's handbag and purse manufacturing +316993,Personal leather good (except women's handbag and purse) manufacturing +316999,All other leather good and allied product manufacturing +321,Wood product manufacturing +3211,Sawmills and wood preservation +32111,Sawmills and wood preservation +321113,Sawmills +321114,Wood preservation +3212,"Veneer, plywood, and engineered wood product manufacturing" +32121,"Veneer, plywood, and engineered wood product manufacturing" +321211,Hardwood veneer and plywood manufacturing +321212,Softwood veneer and plywood manufacturing +321213,Engineered wood member (except truss) manufacturing +321214,Truss manufacturing +321219,Reconstituted wood product manufacturing +3219,Other wood product manufacturing +32191,Millwork +321911,Wood window and door manufacturing +321912,"Cut stock, resawing lumber, and planing" +321918,Other millwork (including flooring) +32192,Wood container and pallet manufacturing +321920,Wood container and pallet manufacturing +32199,All other wood product manufacturing +321991,Manufactured home (mobile home) manufacturing +321992,Prefabricated wood building manufacturing +321999,All other miscellaneous wood product manufacturing +322,Paper manufacturing +3221,"Pulp, paper, and paperboard mills" +32211,Pulp mills +322110,Pulp mills +32212,Paper mills +322121,Paper (except newsprint) mills +322122,Newsprint mills +32213,Paperboard mills +322130,Paperboard mills +3222,Converted paper product manufacturing +32221,Paperboard container manufacturing +322211,Corrugated and solid fiber box manufacturing +322212,Folding paperboard box manufacturing +322213,Setup paperboard box manufacturing +322214,"Fiber can, tube, drum, and similar products manufacturing" +322215,Nonfolding sanitary food container manufacturing +32222,Paper bag and coated and treated paper manufacturing +322221,Coated and laminated packaging paper manufacturing +322222,Coated and laminated paper manufacturing +322223,Coated paper bag and pouch manufacturing +322224,Uncoated paper and multiwall bag manufacturing +322225,Laminated aluminum foil manufacturing for flexible packaging uses +322226,Surface-coated paperboard manufacturing +32223,Stationery product manufacturing +322231,Die-cut paper and paperboard office supplies manufacturing +322232,Envelope manufacturing +322233,"Stationery, tablet, and related product manufacturing" +32229,Other converted paper product manufacturing +322291,Sanitary paper product manufacturing +322299,All other converted paper product manufacturing +323,Printing and related support activities +3231,Printing and related support activities +32311,Printing +323110,Commercial lithographic printing +323111,Commercial gravure printing +323112,Commercial flexographic printing +323113,Commercial screen printing +323114,Quick printing +323115,Digital printing +323116,Manifold business forms printing +323117,Books printing +323118,"Blankbook, looseleaf binders, and devices manufacturing" +323119,Other commercial printing +32312,Support activities for printing +323121,Tradebinding and related work +323122,Prepress services +324,Petroleum and coal products manufacturing +3241,Petroleum and coal products manufacturing +32411,Petroleum refineries +324110,Petroleum refineries +32412,"Asphalt paving, roofing, and saturated materials manufacturing" +324121,Asphalt paving mixture and block manufacturing +324122,Asphalt shingle and coating materials manufacturing +32419,Other petroleum and coal products manufacturing +324191,Petroleum lubricating oil and grease manufacturing +324199,All other petroleum and coal products manufacturing +325,Chemical manufacturing +3251,Basic chemical manufacturing +32511,Petrochemical manufacturing +325110,Petrochemical manufacturing +32512,Industrial gas manufacturing +325120,Industrial gas manufacturing +32513,Synthetic dye and pigment manufacturing +325131,Inorganic dye and pigment manufacturing +325132,Synthetic organic dye and pigment manufacturing +32518,Other basic inorganic chemical manufacturing +325181,Alkalies and chlorine manufacturing +325182,Carbon black manufacturing +325188,All other basic inorganic chemical manufacturing +32519,Other basic organic chemical manufacturing +325191,Gum and wood chemical manufacturing +325192,Cyclic crude and intermediate manufacturing +325193,Ethyl alcohol manufacturing +325199,All other basic organic chemical manufacturing +3252,"Resin, synthetic rubber, and artificial synthetic fibers and filaments manufacturing" +32521,Resin and synthetic rubber manufacturing +325211,Plastics material and resin manufacturing +325212,Synthetic rubber manufacturing +32522,Artificial and synthetic fibers and filaments manufacturing +325221,Cellulosic organic fiber manufacturing +325222,Noncellulosic organic fiber manufacturing +3253,"Pesticide, fertilizer, and other agricultural chemical manufacturing" +32531,Fertilizer manufacturing +325311,Nitrogenous fertilizer manufacturing +325312,Phosphatic fertilizer manufacturing +325314,Fertilizer (mixing only) manufacturing +32532,Pesticide and other agricultural chemical manufacturing +325320,Pesticide and other agricultural chemical manufacturing +3254,Pharmaceutical and medicine manufacturing +32541,Pharmaceutical and medicine manufacturing +325411,Medicinal and botanical manufacturing +325412,Pharmaceutical preparation manufacturing +325413,In-vitro diagnostic substance manufacturing +325414,Biological product (except diagnostic) manufacturing +3255,"Paint, coating, and adhesive manufacturing" +32551,Paint and coating manufacturing +325510,Paint and coating manufacturing +32552,Adhesive manufacturing +325520,Adhesive manufacturing +3256,"Soap, cleaning compound, and toilet preparation manufacturing" +32561,Soap and cleaning compound manufacturing +325611,Soap and other detergent manufacturing +325612,Polish and other sanitation good manufacturing +325613,Surface active agent manufacturing +32562,Toilet preparation manufacturing +325620,Toilet preparation manufacturing +3259,Other chemical product and preparation manufacturing +32591,Printing ink manufacturing +325910,Printing ink manufacturing +32592,Explosives manufacturing +325920,Explosives manufacturing +32599,All other chemical product and preparation manufacturing +325991,Custom compounding of purchased resins +325992,"Photographic film, paper, plate, and chemical manufacturing" +325998,All other miscellaneous chemical product and preparation manufacturing +326,Plastics and rubber products manufacturing +3261,Plastics product manufacturing +32611,Plastics packaging materials and unlaminated film and sheet manufacturing +326111,Plastics bag and pouch manufacturing +326112,Plastics packaging film and sheet (including laminated) manufacturing +326113,Unlaminated plastics film and sheet (except packaging) manufacturing +32612,"Plastics pipe, pipe fitting, and unlaminated profile shape manufacturing" +326121,Unlaminated plastics profile shape manufacturing +326122,Plastics pipe and pipe fitting manufacturing +32613,"Laminated plastics plate, sheet (except packaging), and shape manufacturing" +326130,"Laminated plastics plate, sheet (except packaging), and shape manufacturing" +32614,Polystyrene foam product manufacturing +326140,Polystyrene foam product manufacturing +32615,Urethane and other foam product (except polystyrene) manufacturing +326150,Urethane and other foam product (except polystyrene) manufacturing +32616,Plastics bottle manufacturing +326160,Plastics bottle manufacturing +32619,Other plastics product manufacturing +326191,Plastics plumbing fixture manufacturing +326192,Resilient floor covering manufacturing +326199,All other plastics product manufacturing +3262,Rubber product manufacturing +32621,Tire manufacturing +326211,Tire manufacturing (except retreading) +326212,Tire retreading +32622,Rubber and plastics hoses and belting manufacturing +326220,Rubber and plastics hoses and belting manufacturing +32629,Other rubber product manufacturing +326291,Rubber product manufacturing for mechanical use +326299,All other rubber product manufacturing +327,Nonmetallic mineral product manufacturing +3271,Clay product and refractory manufacturing +32711,"Pottery, ceramics, and plumbing fixture manufacturing" +327111,Vitreous china plumbing fixture and china and earthenware bathroom accessories manufacturing +327112,"Vitreous china, fine earthenware, and other pottery product manufacturing" +327113,Porcelain electrical supply manufacturing +32712,Clay building material and refractories manufacturing +327121,Brick and structural clay tile manufacturing +327122,Ceramic wall and floor tile manufacturing +327123,Other structural clay product manufacturing +327124,Clay refractory manufacturing +327125,Nonclay refractory manufacturing +3272,Glass and glass product manufacturing +32721,Glass and glass product manufacturing +327211,Flat glass manufacturing +327212,Other pressed and blown glass and glassware manufacturing +327213,Glass container manufacturing +327215,Glass product manufacturing made of purchased glass +3273,Cement and concrete product manufacturing +32731,Cement manufacturing +327310,Cement manufacturing +32732,Ready-mix concrete manufacturing +327320,Ready-mix concrete manufacturing +32733,"Concrete pipe, brick, and block manufacturing" +327331,Concrete block and brick manufacturing +327332,Concrete pipe manufacturing +32739,Other concrete product manufacturing +327390,Other concrete product manufacturing +3274,Lime and gypsum product manufacturing +32741,Lime manufacturing +327410,Lime manufacturing +32742,Gypsum product manufacturing +327420,Gypsum product manufacturing +3279,Other nonmetallic mineral product manufacturing +32791,Abrasive product manufacturing +327910,Abrasive product manufacturing +32799,All other nonmetallic mineral product manufacturing +327991,Cut stone and stone product manufacturing +327992,Ground or treated mineral and earth manufacturing +327993,Mineral wool manufacturing +327999,All other miscellaneous nonmetallic mineral product manufacturing +331,Primary metal manufacturing +3311,Iron and steel mills and ferroalloy manufacturing +33111,Iron and steel mills and ferroalloy manufacturing +331111,Iron and steel mills +331112,Electrometallurgical ferroalloy product manufacturing +3312,Steel product manufacturing from purchased steel +33121,Iron and steel pipe and tube manufacturing from purchased steel +331210,Iron and steel pipe and tube manufacturing from purchased steel +33122,Rolling and drawing of purchased steel +331221,Rolled steel shape manufacturing +331222,Steel wire drawing +3313,Alumina and aluminum production and processing +33131,Alumina and aluminum production and processing +331311,Alumina refining +331312,Primary aluminum production +331314,Secondary smelting and alloying of aluminum +331315,"Aluminum sheet, plate, and foil manufacturing" +331316,Aluminum extruded product manufacturing +331319,Other aluminum rolling and drawing +3314,Nonferrous metal (except aluminum) production and processing +33141,Nonferrous metal (except aluminum) smelting and refining +331411,Primary smelting and refining of copper +331419,Primary smelting and refining of nonferrous metal (except copper and aluminum) +33142,"Copper rolling, drawing, extruding, and alloying" +331421,"Copper rolling, drawing, and extruding" +331422,Copper wire (except mechanical) drawing +331423,"Secondary smelting, refining, and alloying of copper" +33149,"Nonferrous metal (except copper and aluminum) rolling, drawing, extruding, and alloying" +331491,"Nonferrous metal, except Cu and Al, shaping" +331492,"Secondary smelting, refining, and alloying of nonferrous metal (except copper and aluminum)" +3315,Foundries +33151,Ferrous metal foundries +331511,Iron foundries +331512,Steel investment foundries +331513,Steel foundries (except investment) +33152,Nonferrous metal foundries +331521,Aluminum die-casting foundries +331522,Nonferrous (except aluminum) die-casting foundries +331524,Aluminum foundries (except die-casting) +331525,Copper foundries (except die-casting) +331528,Other nonferrous foundries (except die-casting) +332,Fabricated metal product manufacturing +3321,Forging and stamping +33211,Forging and stamping +332111,Iron and steel forging +332112,Nonferrous forging +332114,Custom roll forming +332115,Crown and closure manufacturing +332116,Metal stamping +332117,Powder metallurgy part manufacturing +3322,Cutlery and handtool manufacturing +33221,Cutlery and handtool manufacturing +332211,Cutlery and flatware (except precious) manufacturing +332212,Hand and edge tool manufacturing +332213,Saw blade and handsaw manufacturing +332214,"Kitchen utensil, pot, and pan manufacturing" +3323,Architectural and structural metals manufacturing +33231,Plate work and fabricated structural product manufacturing +332311,Prefabricated metal building and component manufacturing +332312,Fabricated structural metal manufacturing +332313,Plate work manufacturing +33232,Ornamental and architectural metal products manufacturing +332321,Metal window and door manufacturing +332322,Sheet metal work manufacturing +332323,Ornamental and architectural metal work manufacturing +3324,"Boiler, tank, and shipping container manufacturing" +33241,Power boiler and heat exchanger manufacturing +332410,Power boiler and heat exchanger manufacturing +33242,Metal tank (heavy gauge) manufacturing +332420,Metal tank (heavy gauge) manufacturing +33243,"Metal can, box, and other metal container (light gauge) manufacturing" +332431,Metal can manufacturing +332439,Other metal container manufacturing +3325,Hardware manufacturing +33251,Hardware manufacturing +332510,Hardware manufacturing +3326,Spring and wire product manufacturing +33261,Spring and wire product manufacturing +332611,Spring (heavy gauge) manufacturing +332612,Spring (light gauge) manufacturing +332618,Other fabricated wire product manufacturing +3327,"Machine shops; turned product; and screw, nut, and bolt manufacturing" +33271,Machine shops +332710,Machine shops +33272,"Turned product and screw, nut, and bolt manufacturing" +332721,Precision turned product manufacturing +332722,"Bolt, nut, screw, rivet, and washer manufacturing" +3328,"Coating, engraving, heat treating, and allied activities" +33281,"Coating, engraving, heat treating, and allied activities" +332811,Metal heat treating +332812,"Metal coating, engraving (except jewelry and silverware), and allied services to manufacturers" +332813,"Electroplating, plating, polishing, anodizing, and coloring" +3329,Other fabricated metal product manufacturing +33291,Metal valve manufacturing +332911,Industrial valve manufacturing +332912,Fluid power valve and hose fitting manufacturing +332913,Plumbing fixture fitting and trim manufacturing +332919,Other metal valve and pipe fitting manufacturing +33299,All other fabricated metal product manufacturing +332991,Ball and roller bearing manufacturing +332992,Small arms ammunition manufacturing +332993,Ammunition (except small arms) manufacturing +332994,Small arms manufacturing +332995,Other ordnance and accessories manufacturing +332996,Fabricated pipe and pipe fitting manufacturing +332997,Industrial pattern manufacturing +332998,Enameled iron and metal sanitary ware manufacturing +332999,All other miscellaneous fabricated metal product manufacturing +333,Machinery manufacturing +3331,"Agriculture, construction, and mining machinery manufacturing" +33311,Agricultural implement manufacturing +333111,Farm machinery and equipment manufacturing +333112,Lawn and garden tractor and home lawn and garden equipment manufacturing +33312,Construction machinery manufacturing +333120,Construction machinery manufacturing +33313,Mining and oil and gas field machinery manufacturing +333131,Mining machinery and equipment manufacturing +333132,Oil and gas field machinery and equipment manufacturing +3332,Industrial machinery manufacturing +33321,Sawmill and woodworking machinery manufacturing +333210,Sawmill and woodworking machinery manufacturing +33322,Plastics and rubber industry machinery manufacturing +333220,Plastics and rubber industry machinery manufacturing +33329,Other industrial machinery manufacturing +333291,Paper industry machinery manufacturing +333292,Textile machinery manufacturing +333293,Printing machinery and equipment manufacturing +333294,Food product machinery manufacturing +333295,Semiconductor machinery manufacturing +333298,All other industrial machinery manufacturing +3333,Commercial and service industry machinery manufacturing +33331,Commercial and service industry machinery manufacturing +333311,Automatic vending machine manufacturing +333312,"Commercial laundry, drycleaning, and pressing machine manufacturing" +333313,Office machinery manufacturing +333314,Optical instrument and lens manufacturing +333315,Photographic and photocopying equipment manufacturing +333319,Other commercial and service industry machinery manufacturing +3334,"Ventilation, heating, air-conditioning, and commercial refrigeration equipment manufacturing" +33341,HVAC and commercial refrigeration equipment +333411,Air purification equipment manufacturing +333412,Industrial and commercial fan and blower manufacturing +333414,Heating equipment (except warm air furnaces) manufacturing +333415,Air-conditioning and warm air heating equipment and commercial and industrial refrigeration equipment manufacturing +3335,Metalworking machinery manufacturing +33351,Metalworking machinery manufacturing +333511,Industrial mold manufacturing +333512,Machine tool (metal cutting types) manufacturing +333513,Machine tool (metal forming types) manufacturing +333514,"Special die and tool, die set, jig, and fixture manufacturing" +333515,Cutting tool and machine tool accessory manufacturing +333516,Rolling mill machinery and equipment manufacturing +333518,Other metalworking machinery manufacturing +3336,"Engine, turbine, and power transmission equipment manufacturing" +33361,"Engine, turbine, and power transmission equipment manufacturing" +333611,Turbine and turbine generator set units manufacturing +333612,"Speed changer, industrial high-speed drive, and gear manufacturing" +333613,Mechanical power transmission equipment manufacturing +333618,Other engine equipment manufacturing +3339,Other general purpose machinery manufacturing +33391,Pump and compressor manufacturing +333911,Pump and pumping equipment manufacturing +333912,Air and gas compressor manufacturing +333913,Measuring and dispensing pump manufacturing +33392,Material handling equipment manufacturing +333921,Elevator and moving stairway manufacturing +333922,Conveyor and conveying equipment manufacturing +333923,"Overhead traveling crane, hoist, and monorail system manufacturing" +333924,"Industrial truck, tractor, trailer, and stacker machinery manufacturing" +33399,All other general purpose machinery manufacturing +333991,Power-driven handtool manufacturing +333992,Welding and soldering equipment manufacturing +333993,Packaging machinery manufacturing +333994,Industrial process furnace and oven manufacturing +333995,Fluid power cylinder and actuator manufacturing +333996,Fluid power pump and motor manufacturing +333997,Scale and balance manufacturing +333999,All other miscellaneous general purpose machinery manufacturing +334,Computer and electronic product manufacturing +3341,Computer and peripheral equipment manufacturing +33411,Computer and peripheral equipment manufacturing +334111,Electronic computer manufacturing +334112,Computer storage device manufacturing +334113,Computer terminal manufacturing +334119,Other computer peripheral equipment manufacturing +3342,Communications equipment manufacturing +33421,Telephone apparatus manufacturing +334210,Telephone apparatus manufacturing +33422,Radio and television broadcasting and wireless communications equipment manufacturing +334220,Broadcast and wireless communications equip. +33429,Other communications equipment manufacturing +334290,Other communications equipment manufacturing +3343,Audio and video equipment manufacturing +33431,Audio and video equipment manufacturing +334310,Audio and video equipment manufacturing +3344,Semiconductor and other electronic component manufacturing +33441,Semiconductor and other electronic component manufacturing +334411,Electron tube manufacturing +334412,Bare printed circuit board manufacturing +334413,Semiconductor and related device manufacturing +334414,Electronic capacitor manufacturing +334415,Electronic resistor manufacturing +334416,"Electronic coil, transformer, and other inductor manufacturing" +334417,Electronic connector manufacturing +334418,Printed circuit assembly (electronic assembly) manufacturing +334419,Other electronic component manufacturing +3345,"Navigational, measuring, electromedical, and control instruments manufacturing" +33451,Electronic instrument manufacturing +334510,Electromedical and electrotherapeutic apparatus manufacturing +334511,"Search, detection, navigation, guidance, aeronautical, and nautical system and instrument manufacturing" +334512,"Automatic environmental control manufacturing for residential, commercial, and appliance use" +334513,"Instruments and related products manufacturing for measuring, displaying, and controlling industrial process variables" +334514,Totalizing fluid meter and counting device manufacturing +334515,Instrument manufacturing for measuring and testing electricity and electrical signals +334516,Analytical laboratory instrument manufacturing +334517,Irradiation apparatus manufacturing +334518,"Watch, clock, and part manufacturing" +334519,Other measuring and controlling device manufacturing +3346,Manufacturing and reproducing magnetic and optical media +33461,Manufacturing and reproducing magnetic and optical media +334611,Software reproducing +334612,"Prerecorded compact disc (except software), tape, and record reproducing" +334613,Magnetic and optical recording media manufacturing +335,"Electrical equipment, appliance, and component manufacturing" +3351,Electric lighting equipment manufacturing +33511,Electric lamp bulb and part manufacturing +335110,Electric lamp bulb and part manufacturing +33512,Lighting fixture manufacturing +335121,Residential electric lighting fixture manufacturing +335122,"Commercial, industrial, and institutional electric lighting fixture manufacturing" +335129,Other lighting equipment manufacturing +3352,Household appliance manufacturing +33521,Small electrical appliance manufacturing +335211,Electric housewares and household fan manufacturing +335212,Household vacuum cleaner manufacturing +33522,Major appliance manufacturing +335221,Household cooking appliance manufacturing +335222,Household refrigerator and home freezer manufacturing +335224,Household laundry equipment manufacturing +335228,Other major household appliance manufacturing +3353,Electrical equipment manufacturing +33531,Electrical equipment manufacturing +335311,"Power, distribution, and specialty transformer manufacturing" +335312,Motor and generator manufacturing +335313,Switchgear and switchboard apparatus manufacturing +335314,Relay and industrial control manufacturing +3359,Other electrical equipment and component manufacturing +33591,Battery manufacturing +335911,Storage battery manufacturing +335912,Primary battery manufacturing +33592,Communication and energy wire and cable manufacturing +335921,Fiber optic cable manufacturing +335929,Other communication and energy wire manufacturing +33593,Wiring device manufacturing +335931,Current-carrying wiring device manufacturing +335932,Noncurrent-carrying wiring device manufacturing +33599,All other electrical equipment and component manufacturing +335991,Carbon and graphite product manufacturing +335999,All other miscellaneous electrical equipment and component manufacturing +336,Transportation equipment manufacturing +3361,Motor vehicle manufacturing +33611,Automobile and light duty motor vehicle manufacturing +336111,Automobile manufacturing +336112,Light truck and utility vehicle manufacturing +33612,Heavy duty truck manufacturing +336120,Heavy duty truck manufacturing +3362,Motor vehicle body and trailer manufacturing +33621,Motor vehicle body and trailer manufacturing +336211,Motor vehicle body manufacturing +336212,Truck trailer manufacturing +336213,Motor home manufacturing +336214,Travel trailer and camper manufacturing +3363,Motor vehicle parts manufacturing +33631,Motor vehicle gasoline engine and engine parts manufacturing +336311,"Carburetor, piston, piston ring, and valve manufacturing" +336312,Gasoline engine and engine parts manufacturing +33632,Motor vehicle electrical and electronic equipment manufacturing +336321,Vehicular lighting equipment manufacturing +336322,Other motor vehicle electrical and electronic equipment manufacturing +33633,Motor vehicle steering and suspension components (except spring) manufacturing +336330,Motor vehicle steering and suspension components (except spring) manufacturing +33634,Motor vehicle brake system manufacturing +336340,Motor vehicle brake system manufacturing +33635,Motor vehicle transmission and power train parts manufacturing +336350,Motor vehicle transmission and power train parts manufacturing +33636,Motor vehicle seating and interior trim manufacturing +336360,Motor vehicle seating and interior trim manufacturing +33637,Motor vehicle metal stamping +336370,Motor vehicle metal stamping +33639,Other motor vehicle parts manufacturing +336391,Motor vehicle air-conditioning manufacturing +336399,All other motor vehicle parts manufacturing +3364,Aerospace product and parts manufacturing +33641,Aerospace product and parts manufacturing +336411,Aircraft manufacturing +336412,Aircraft engine and engine parts manufacturing +336413,Other aircraft parts and auxiliary equipment manufacturing +336414,Guided missile and space vehicle manufacturing +336415,Guided missile and space vehicle propulsion unit and propulsion unit parts manufacturing +336419,Other guided missile and space vehicle parts and auxiliary equipment manufacturing +3365,Railroad rolling stock manufacturing +33651,Railroad rolling stock manufacturing +336510,Railroad rolling stock manufacturing +3366,Ship and boat building +33661,Ship and boat building +336611,Ship building and repairing +336612,Boat building +3369,Other transportation equipment manufacturing +33699,Other transportation equipment manufacturing +336991,"Motorcycle, bicycle, and parts manufacturing" +336992,"Military armored vehicle, tank, and tank component manufacturing" +336999,All other transportation equipment manufacturing +337,Furniture and related product manufacturing +3371,Household and institutional furniture and kitchen cabinet manufacturing +33711,Wood kitchen cabinet and countertop manufacturing +337110,Wood kitchen cabinet and countertop manufacturing +33712,Household and institutional furniture manufacturing +337121,Upholstered household furniture manufacturing +337122,Nonupholstered wood household furniture manufacturing +337124,Metal household furniture manufacturing +337125,Household furniture (except wood and metal) manufacturing +337127,Institutional furniture manufacturing +337129,"Wood television, radio, and sewing machine cabinet manufacturing" +3372,Office furniture (including fixtures) manufacturing +33721,Office furniture (including fixtures) manufacturing +337211,Wood office furniture manufacturing +337212,Custom architectural woodwork and millwork manufacturing +337214,Office furniture (except wood) manufacturing +337215,"Showcase, partition, shelving, and locker manufacturing" +3379,Other furniture related product manufacturing +33791,Mattress manufacturing +337910,Mattress manufacturing +33792,Blind and shade manufacturing +337920,Blind and shade manufacturing +339,Miscellaneous manufacturing +3391,Medical equipment and supplies manufacturing +33911,Medical equipment and supplies manufacturing +339112,Surgical and medical instrument manufacturing +339113,Surgical appliance and supplies manufacturing +339114,Dental equipment and supplies manufacturing +339115,Ophthalmic goods manufacturing +339116,Dental laboratories +3399,Other miscellaneous manufacturing +33991,Jewelry and silverware manufacturing +339911,Jewelry (except costume) manufacturing +339912,Silverware and hollowware manufacturing +339913,Jewelers' material and lapidary work manufacturing +339914,Costume jewelry and novelty manufacturing +33992,Sporting and athletic goods manufacturing +339920,Sporting and athletic goods manufacturing +33993,"Doll, toy, and game manufacturing" +339931,Doll and stuffed toy manufacturing +339932,"Game, toy, and children's vehicle manufacturing" +33994,Office supplies (except paper) manufacturing +339941,Pen and mechanical pencil manufacturing +339942,Lead pencil and art good manufacturing +339943,Marking device manufacturing +339944,Carbon paper and inked ribbon manufacturing +33995,Sign manufacturing +339950,Sign manufacturing +33999,All other miscellaneous manufacturing +339991,"Gasket, packing, and sealing device manufacturing" +339992,Musical instrument manufacturing +339993,"Fastener, button, needle, and pin manufacturing" +339994,"Broom, brush, and mop manufacturing" +339995,Burial casket manufacturing +339999,All other miscellaneous manufacturing +42,Wholesale trade +423,"Merchant wholesalers, durable goods" +4231,Motor vehicle and motor vehicle parts and supplies merchant wholesalers +42311,Automobile and other motor vehicle merchant wholesalers +423110,Automobile and other motor vehicle merchant wholesalers +42312,Motor vehicle supplies and new parts merchant wholesalers +423120,Motor vehicle supplies and new parts merchant wholesalers +42313,Tire and tube merchant wholesalers +423130,Tire and tube merchant wholesalers +42314,Motor vehicle parts (used) merchant wholesalers +423140,Motor vehicle parts (used) merchant wholesalers +4232,Furniture and home furnishing merchant wholesalers +42321,Furniture merchant wholesalers +423210,Furniture merchant wholesalers +42322,Home furnishing merchant wholesalers +423220,Home furnishing merchant wholesalers +4233,Lumber and other construction materials merchant wholesalers +42331,"Lumber, plywood, millwork, and wood panel merchant wholesalers" +423310,"Lumber, plywood, millwork, and wood panel merchant wholesalers" +42332,"Brick, stone, and related construction material merchant wholesalers" +423320,"Brick, stone, and related construction material merchant wholesalers" +42333,"Roofing, siding, and insulation material merchant wholesalers" +423330,"Roofing, siding, and insulation material merchant wholesalers" +42339,Other construction material merchant wholesalers +423390,Other construction material merchant wholesalers +4234,Professional and commercial equipment and supplies merchant wholesalers +42341,Photographic equipment and supplies merchant wholesalers +423410,Photographic equipment and supplies merchant wholesalers +42342,Office equipment merchant wholesalers +423420,Office equipment merchant wholesalers +42343,Computer and computer peripheral equipment and software merchant wholesalers +423430,Computer and computer peripheral equipment and software merchant wholesalers +42344,Other commercial equipment merchant wholesalers +423440,Other commercial equipment merchant wholesalers +42345,"Medical, dental, and hospital equipment and supplies merchant wholesalers" +423450,"Medical, dental, and hospital equipment and supplies merchant wholesalers" +42346,Ophthalmic goods merchant wholesalers +423460,Ophthalmic goods merchant wholesalers +42349,Other professional equipment and supplies merchant wholesalers +423490,Other professional equipment and supplies merchant wholesalers +4235,Metal and mineral (except petroleum) merchant wholesalers +42351,Metal service centers and other metal merchant wholesalers +423510,Metal service centers and other metal merchant wholesalers +42352,Coal and other mineral and ore merchant wholesalers +423520,Coal and other mineral and ore merchant wholesalers +4236,Electrical and electronic goods merchant wholesalers +42361,"Electrical apparatus and equipment, wiring supplies, and related equipment merchant wholesalers" +423610,"Electrical apparatus and equipment, wiring supplies, and related equipment merchant wholesalers" +42362,"Electrical and electronic appliance, television, and radio set merchant wholesalers" +423620,"Electrical and electronic appliance, television, and radio set merchant wholesalers" +42369,Other electronic parts and equipment merchant wholesalers +423690,Other electronic parts and equipment merchant wholesalers +4237,"Hardware, plumbing and heating equipment and supplies merchant wholesalers" +42371,Hardware merchant wholesalers +423710,Hardware merchant wholesalers +42372,Plumbing and heating equipment and supplies (hydronics) merchant wholesalers +423720,Plumbing and heating equipment and supplies (hydronics) merchant wholesalers +42373,Warm air heating and air-conditioning equipment and supplies merchant wholesalers +423730,Warm air heating and air-conditioning equipment and supplies merchant wholesalers +42374,Refrigeration equipment and supplies merchant wholesalers +423740,Refrigeration equipment and supplies merchant wholesalers +4238,"Machinery, equipment, and supplies merchant wholesalers" +42381,Construction and mining (except oil well) machinery and equipment merchant wholesalers +423810,Construction and mining (except oil well) machinery and equipment merchant wholesalers +42382,Farm and garden machinery and equipment merchant wholesalers +423820,Farm and garden machinery and equipment merchant wholesalers +42383,Industrial machinery and equipment merchant wholesalers +423830,Industrial machinery and equipment merchant wholesalers +42384,Industrial supplies merchant wholesalers +423840,Industrial supplies merchant wholesalers +42385,Service establishment equipment and supplies merchant wholesalers +423850,Service establishment equipment and supplies merchant wholesalers +42386,Transportation equipment and supplies (except motor vehicle) merchant wholesalers +423860,Transportation equipment and supplies (except motor vehicle) merchant wholesalers +4239,Miscellaneous durable goods merchant wholesalers +42391,Sporting and recreational goods and supplies merchant wholesalers +423910,Sporting and recreational goods and supplies merchant wholesalers +42392,Toy and hobby goods and supplies merchant wholesalers +423920,Toy and hobby goods and supplies merchant wholesalers +42393,Recyclable material merchant wholesalers +423930,Recyclable material merchant wholesalers +42394,"Jewelry, watch, precious stone, and precious metal merchant wholesalers" +423940,"Jewelry, watch, precious stone, and precious metal merchant wholesalers" +42399,Other miscellaneous durable goods merchant wholesalers +423990,Other miscellaneous durable goods merchant wholesalers +424,"Merchant wholesalers, nondurable goods" +4241,Paper and paper product merchant wholesalers +42411,Printing and writing paper merchant wholesalers +424110,Printing and writing paper merchant wholesalers +42412,Stationery and office supplies merchant wholesalers +424120,Stationery and office supplies merchant wholesalers +42413,Industrial and personal service paper merchant wholesalers +424130,Industrial and personal service paper merchant wholesalers +4242,Drugs and druggists' sundries merchant wholesalers +42421,Drugs and druggists' sundries merchant wholesalers +424210,Drugs and druggists' sundries merchant wholesalers +4243,"Apparel, piece goods, and notions merchant wholesalers" +42431,"Piece goods, notions, and other dry goods merchant wholesalers" +424310,"Piece goods, notions, and other dry goods merchant wholesalers" +42432,Men's and boys' clothing and furnishings merchant wholesalers +424320,Men's and boys' clothing and furnishings merchant wholesalers +42433,"Women's, children's, and infants' clothing and accessories merchant wholesalers" +424330,"Women's, children's, and infants' clothing and accessories merchant wholesalers" +42434,Footwear merchant wholesalers +424340,Footwear merchant wholesalers +4244,Grocery and related product merchant wholesalers +42441,General line grocery merchant wholesalers +424410,General line grocery merchant wholesalers +42442,Packaged frozen food merchant wholesalers +424420,Packaged frozen food merchant wholesalers +42443,Dairy product (except dried or canned) merchant wholesalers +424430,Dairy product (except dried or canned) merchant wholesalers +42444,Poultry and poultry product merchant wholesalers +424440,Poultry and poultry product merchant wholesalers +42445,Confectionery merchant wholesalers +424450,Confectionery merchant wholesalers +42446,Fish and seafood merchant wholesalers +424460,Fish and seafood merchant wholesalers +42447,Meat and meat product merchant wholesalers +424470,Meat and meat product merchant wholesalers +42448,Fresh fruit and vegetable merchant wholesalers +424480,Fresh fruit and vegetable merchant wholesalers +42449,Other grocery and related products merchant wholesalers +424490,Other grocery and related products merchant wholesalers +4245,Farm product raw material merchant wholesalers +42451,Grain and field bean merchant wholesalers +424510,Grain and field bean merchant wholesalers +42452,Livestock merchant wholesalers +424520,Livestock merchant wholesalers +42459,Other farm product raw material merchant wholesalers +424590,Other farm product raw material merchant wholesalers +4246,Chemical and allied products merchant wholesalers +42461,Plastics materials and basic forms and shapes merchant wholesalers +424610,Plastics materials and basic forms and shapes merchant wholesalers +42469,Other chemical and allied products merchant wholesalers +424690,Other chemical and allied products merchant wholesalers +4247,Petroleum and petroleum products merchant wholesalers +42471,Petroleum bulk stations and terminals +424710,Petroleum bulk stations and terminals +42472,Petroleum and petroleum products merchant wholesalers (except bulk stations and terminals) +424720,Petroleum and petroleum products merchant wholesalers (except bulk stations and terminals) +4248,"Beer, wine, and distilled alcoholic beverage merchant wholesalers" +42481,Beer and ale merchant wholesalers +424810,Beer and ale merchant wholesalers +42482,Wine and distilled alcoholic beverage merchant wholesalers +424820,Wine and distilled alcoholic beverage merchant wholesalers +4249,Miscellaneous nondurable goods merchant wholesalers +42491,Farm supplies merchant wholesalers +424910,Farm supplies merchant wholesalers +42492,"Book, periodical, and newspaper merchant wholesalers" +424920,"Book, periodical, and newspaper merchant wholesalers" +42493,"Flower, nursery stock, and florists' supplies merchant wholesalers" +424930,"Flower, nursery stock, and florists' supplies merchant wholesalers" +42494,Tobacco and tobacco product merchant wholesalers +424940,Tobacco and tobacco product merchant wholesalers +42495,"Paint, varnish, and supplies merchant wholesalers" +424950,"Paint, varnish, and supplies merchant wholesalers" +42499,Other miscellaneous nondurable goods merchant wholesalers +424990,Other miscellaneous nondurable goods merchant wholesalers +425,Wholesale electronic markets and agents and brokers +4251,Wholesale electronic markets and agents and brokers +42511,Business to business electronic markets +425110,Business to business electronic markets +42512,Wholesale trade agents and brokers +425120,Wholesale trade agents and brokers +44,Retail trade +441,Motor vehicle and parts dealers +4411,Automobile dealers +44111,New car dealers +441110,New car dealers +44112,Used car dealers +441120,Used car dealers +4412,Other motor vehicle dealers +44121,Recreational vehicle dealers +441210,Recreational vehicle dealers +44122,"Motorcycle, boat, and other motor vehicle dealers" +441221,"Motorcycle, ATV, and personal watercraft dealers" +441222,Boat dealers +441229,All other motor vehicle dealers +4413,"Automotive parts, accessories, and tire stores" +44131,Automotive parts and accessories stores +441310,Automotive parts and accessories stores +44132,Tire dealers +441320,Tire dealers +442,Furniture and home furnishings stores +4421,Furniture stores +44211,Furniture stores +442110,Furniture stores +4422,Home furnishings stores +44221,Floor covering stores +442210,Floor covering stores +44229,Other home furnishings stores +442291,Window treatment stores +442299,All other home furnishings stores +443,Electronics and appliance stores +4431,Electronics and appliance stores +44311,"Appliance, television, and other electronics stores" +443111,Household appliance stores +443112,"Radio, television, and other electronics stores" +44312,Computer and software stores +443120,Computer and software stores +44313,Camera and photographic supplies stores +443130,Camera and photographic supplies stores +444,Building material and garden equipment and supplies dealers +4441,Building material and supplies dealers +44411,Home centers +444110,Home centers +44412,Paint and wallpaper stores +444120,Paint and wallpaper stores +44413,Hardware stores +444130,Hardware stores +44419,Other building material dealers +444190,Other building material dealers +4442,Lawn and garden equipment and supplies stores +44421,Outdoor power equipment stores +444210,Outdoor power equipment stores +44422,"Nursery, garden center, and farm supply stores" +444220,"Nursery, garden center, and farm supply stores" +445,Food and beverage stores +4451,Grocery stores +44511,Supermarkets and other grocery (except convenience) stores +445110,Supermarkets and other grocery (except convenience) stores +44512,Convenience stores +445120,Convenience stores +4452,Specialty food stores +44521,Meat markets +445210,Meat markets +44522,Fish and seafood markets +445220,Fish and seafood markets +44523,Fruit and vegetable markets +445230,Fruit and vegetable markets +44529,Other specialty food stores +445291,Baked goods stores +445292,Confectionery and nut stores +445299,All other specialty food stores +4453,"Beer, wine, and liquor stores" +44531,"Beer, wine, and liquor stores" +445310,"Beer, wine, and liquor stores" +446,Health and personal care stores +4461,Health and personal care stores +44611,Pharmacies and drug stores +446110,Pharmacies and drug stores +44612,"Cosmetics, beauty supplies, and perfume stores" +446120,"Cosmetics, beauty supplies, and perfume stores" +44613,Optical goods stores +446130,Optical goods stores +44619,Other health and personal care stores +446191,Food (health) supplement stores +446199,All other health and personal care stores +447,Gasoline stations +4471,Gasoline stations +44711,Gasoline stations with convenience stores +447110,Gasoline stations with convenience stores +44719,Other gasoline stations +447190,Other gasoline stations +448,Clothing and clothing accessories stores +4481,Clothing stores +44811,Men's clothing stores +448110,Men's clothing stores +44812,Women's clothing stores +448120,Women's clothing stores +44813,Children's and infants' clothing stores +448130,Children's and infants' clothing stores +44814,Family clothing stores +448140,Family clothing stores +44815,Clothing accessories stores +448150,Clothing accessories stores +44819,Other clothing stores +448190,Other clothing stores +4482,Shoe stores +44821,Shoe stores +448210,Shoe stores +4483,"Jewelry, luggage, and leather goods stores" +44831,Jewelry stores +448310,Jewelry stores +44832,Luggage and leather goods stores +448320,Luggage and leather goods stores +451,"Sporting goods, hobby, book, and music stores" +4511,"Sporting goods, hobby, and musical instrument stores" +45111,Sporting goods stores +451110,Sporting goods stores +45112,"Hobby, toy, and game stores" +451120,"Hobby, toy, and game stores" +45113,"Sewing, needlework, and piece goods stores" +451130,"Sewing, needlework, and piece goods stores" +45114,Musical instrument and supplies stores +451140,Musical instrument and supplies stores +4512,"Book, periodical, and music stores" +45121,Book stores and news dealers +451211,Book stores +451212,News dealers and newsstands +45122,"Prerecorded tape, compact disc, and record stores" +451220,"Prerecorded tape, compact disc, and record stores" +452,General merchandise stores +4521,Department stores +45211,Department stores +452111,Department stores (except discount department stores) +452112,Discount department stores +4529,Other general merchandise stores +45291,Warehouse clubs and supercenters +452910,Warehouse clubs and supercenters +45299,All other general merchandise stores +452990,All other general merchandise stores +453,Miscellaneous store retailers +4531,Florists +45311,Florists +453110,Florists +4532,"Office supplies, stationery, and gift stores" +45321,Office supplies and stationery stores +453210,Office supplies and stationery stores +45322,"Gift, novelty, and souvenir stores" +453220,"Gift, novelty, and souvenir stores" +4533,Used merchandise stores +45331,Used merchandise stores +453310,Used merchandise stores +4539,Other miscellaneous store retailers +45391,Pet and pet supplies stores +453910,Pet and pet supplies stores +45392,Art dealers +453920,Art dealers +45393,Manufactured (mobile) home dealers +453930,Manufactured (mobile) home dealers +45399,All other miscellaneous store retailers +453991,Tobacco stores +453998,All other miscellaneous store retailers (except tobacco stores) +454,Nonstore retailers +4541,Electronic shopping and mail-order houses +45411,Electronic shopping and mail-order houses +454111,Electronic shopping +454112,Electronic auctions +454113,Mail-order houses +4542,Vending machine operators +45421,Vending machine operators +454210,Vending machine operators +4543,Direct selling establishments +45431,Fuel dealers +454311,Heating oil dealers +454312,Liquefied petroleum gas (bottled gas) dealers +454319,Other fuel dealers +45439,Other direct selling establishments +454390,Other direct selling establishments +48,Transportation and warehousing +481,Air transportation +4811,Scheduled air transportation +48111,Scheduled air transportation +481111,Scheduled passenger air transportation +481112,Scheduled freight air transportation +4812,Nonscheduled air transportation +48121,Nonscheduled air transportation +481211,Nonscheduled chartered passenger air transportation +481212,Nonscheduled chartered freight air transportation +481219,Other nonscheduled air transportation +483,Water transportation +4831,"Deep sea, coastal, and great lakes water transportation" +48311,"Deep sea, coastal, and great lakes water transportation" +483111,Deep sea freight transportation +483112,Deep sea passenger transportation +483113,Coastal and great lakes freight transportation +483114,Coastal and great lakes passenger transportation +4832,Inland water transportation +48321,Inland water transportation +483211,Inland water freight transportation +483212,Inland water passenger transportation +484,Truck transportation +4841,General freight trucking +48411,"General freight trucking, local" +484110,"General freight trucking, local" +48412,"General freight trucking, long-distance" +484121,"General freight trucking, long-distance, truckload" +484122,"General freight trucking, long-distance, less than truckload" +4842,Specialized freight trucking +48421,Used household and office goods moving +484210,Used household and office goods moving +48422,"Specialized freight (except used goods) trucking, local" +484220,"Specialized freight (except used goods) trucking, local" +48423,"Specialized freight (except used goods) trucking, long-distance" +484230,"Specialized freight (except used goods) trucking, long-distance" +485,Transit and ground passenger transportation +4851,Urban transit systems +48511,Urban transit systems +485111,Mixed mode transit systems +485112,Commuter rail systems +485113,Bus and other motor vehicle transit systems +485119,Other urban transit systems +4852,Interurban and rural bus transportation +48521,Interurban and rural bus transportation +485210,Interurban and rural bus transportation +4853,Taxi and limousine service +48531,Taxi service +485310,Taxi service +48532,Limousine service +485320,Limousine service +4854,School and employee bus transportation +48541,School and employee bus transportation +485410,School and employee bus transportation +4855,Charter bus industry +48551,Charter bus industry +485510,Charter bus industry +4859,Other transit and ground passenger transportation +48599,Other transit and ground passenger transportation +485991,Special needs transportation +485999,All other transit and ground passenger transportation +486,Pipeline transportation +4861,Pipeline transportation of crude oil +48611,Pipeline transportation of crude oil +486110,Pipeline transportation of crude oil +4862,Pipeline transportation of natural gas +48621,Pipeline transportation of natural gas +486210,Pipeline transportation of natural gas +4869,Other pipeline transportation +48691,Pipeline transportation of refined petroleum products +486910,Pipeline transportation of refined petroleum products +48699,All other pipeline transportation +486990,All other pipeline transportation +487,Scenic and sightseeing transportation +4871,"Scenic and sightseeing transportation, land" +48711,"Scenic and sightseeing transportation, land" +487110,"Scenic and sightseeing transportation, land" +4872,"Scenic and sightseeing transportation, water" +48721,"Scenic and sightseeing transportation, water" +487210,"Scenic and sightseeing transportation, water" +4879,"Scenic and sightseeing transportation, other" +48799,"Scenic and sightseeing transportation, other" +487990,"Scenic and sightseeing transportation, other" +488,Support activities for transportation +4881,Support activities for air transportation +48811,Airport operations +488111,Air traffic control +488119,Other airport operations +48819,Other support activities for air transportation +488190,Other support activities for air transportation +4882,Support activities for rail transportation +48821,Support activities for rail transportation +488210,Support activities for rail transportation +4883,Support activities for water transportation +48831,Port and harbor operations +488310,Port and harbor operations +48832,Marine cargo handling +488320,Marine cargo handling +48833,Navigational services to shipping +488330,Navigational services to shipping +48839,Other support activities for water transportation +488390,Other support activities for water transportation +4884,Support activities for road transportation +48841,Motor vehicle towing +488410,Motor vehicle towing +48849,Other support activities for road transportation +488490,Other support activities for road transportation +4885,Freight transportation arrangement +48851,Freight transportation arrangement +488510,Freight transportation arrangement +4889,Other support activities for transportation +48899,Other support activities for transportation +488991,Packing and crating +488999,All other support activities for transportation +492,Couriers and messengers +4921,Couriers and express delivery services +49211,Couriers and express delivery services +492110,Couriers and express delivery services +4922,Local messengers and local delivery +49221,Local messengers and local delivery +492210,Local messengers and local delivery +493,Warehousing and storage +4931,Warehousing and storage +49311,General warehousing and storage +493110,General warehousing and storage +49312,Refrigerated warehousing and storage +493120,Refrigerated warehousing and storage +49313,Farm product warehousing and storage +493130,Farm product warehousing and storage +49319,Other warehousing and storage +493190,Other warehousing and storage +51,Information +511,Publishing industries (except Internet) +5111,"Newspaper, periodical, book, and directory publishers" +51111,Newspaper publishers +511110,Newspaper publishers +51112,Periodical publishers +511120,Periodical publishers +51113,Book publishers +511130,Book publishers +51114,Directory and mailing list publishers +511140,Directory and mailing list publishers +51119,Other publishers +511191,Greeting card publishers +511199,All other publishers +5112,Software publishers +51121,Software publishers +511210,Software publishers +512,Motion picture and sound recording industries +5121,Motion picture and video industries +51211,Motion picture and video production +512110,Motion picture and video production +51212,Motion picture and video distribution +512120,Motion picture and video distribution +51213,Motion picture and video exhibition +512131,Motion picture theaters (except drive-ins) +512132,Drive-in motion picture theaters +51219,Postproduction services and other motion picture and video industries +512191,Teleproduction and other postproduction services +512199,Other motion picture and video industries +5122,Sound recording industries +51221,Record production +512210,Record production +51222,Integrated record production/distribution +512220,Integrated record production/distribution +51223,Music publishers +512230,Music publishers +51224,Sound recording studios +512240,Sound recording studios +51229,Other sound recording industries +512290,Other sound recording industries +515,Broadcasting (except Internet) +5151,Radio and television broadcasting +51511,Radio broadcasting +515111,Radio networks +515112,Radio stations +51512,Television broadcasting +515120,Television broadcasting +5152,Cable and other subscription programming +51521,Cable and other subscription programming +515210,Cable and other subscription programming +517,Telecommunications +5171,Wired telecommunications carriers +51711,Wired telecommunications carriers +517110,Wired telecommunications carriers +5172,Wireless telecommunications carriers (except satellite) +51721,Wireless telecommunications carriers (except satellite) +517210,Wireless telecommunications carriers (except satellite) +5174,Satellite telecommunications +51741,Satellite telecommunications +517410,Satellite telecommunications +5179,Other telecommunications +51791,Other telecommunications +517911,Telecommunications resellers +517919,All other telecommunications +518,"Data processing, hosting and related services" +5182,"Data processing, hosting, and related services" +51821,"Data processing, hosting, and related services" +518210,"Data processing, hosting, and related services" +519,Other information services +5191,Other information services +51911,News syndicates +519110,News syndicates +51912,Libraries and archives +519120,Libraries and archives +51913,Internet publishing and broadcasting and web search portals +519130,Internet publishing and broadcasting and web search portals +51919,All other information services +519190,All other information services +52,Finance and insurance +521,Monetary authorities- central bank +5211,Monetary authorities- central bank +52111,Monetary authorities- central bank +521110,Monetary authorities- central bank +522,Credit intermediation and related activities +5221,Depository credit intermediation +52211,Commercial banking +522110,Commercial banking +52212,Savings institutions +522120,Savings institutions +52213,Credit unions +522130,Credit unions +52219,Other depository credit intermediation +522190,Other depository credit intermediation +5222,Nondepository credit intermediation +52221,Credit card issuing +522210,Credit card issuing +52222,Sales financing +522220,Sales financing +52229,Other nondepository credit intermediation +522291,Consumer lending +522292,Real estate credit +522293,International trade financing +522294,Secondary market financing +522298,All other nondepository credit intermediation +5223,Activities related to credit intermediation +52231,Mortgage and nonmortgage loan brokers +522310,Mortgage and nonmortgage loan brokers +52232,"Financial transactions processing, reserve, and clearinghouse activities" +522320,"Financial transactions processing, reserve, and clearinghouse activities" +52239,Other activities related to credit intermediation +522390,Other activities related to credit intermediation +523,"Securities, commodity contracts, and other financial investments and related activities" +5231,Securities and commodity contracts intermediation and brokerage +52311,Investment banking and securities dealing +523110,Investment banking and securities dealing +52312,Securities brokerage +523120,Securities brokerage +52313,Commodity contracts dealing +523130,Commodity contracts dealing +52314,Commodity contracts brokerage +523140,Commodity contracts brokerage +5232,Securities and commodity exchanges +52321,Securities and commodity exchanges +523210,Securities and commodity exchanges +5239,Other financial investment activities +52391,Miscellaneous intermediation +523910,Miscellaneous intermediation +52392,Portfolio management +523920,Portfolio management +52393,Investment advice +523930,Investment advice +52399,All other financial investment activities +523991,"Trust, fiduciary, and custody activities" +523999,Miscellaneous financial investment activities +524,Insurance carriers and related activities +5241,Insurance carriers +52411,"Direct life, health, and medical insurance carriers" +524113,Direct life insurance carriers +524114,Direct health and medical insurance carriers +52412,"Direct insurance (except life, health, and medical) carriers" +524126,Direct property and casualty insurance carriers +524127,Direct title insurance carriers +524128,"Other direct insurance (except life, health, and medical) carriers" +52413,Reinsurance carriers +524130,Reinsurance carriers +5242,"Agencies, brokerages, and other insurance related activities" +52421,Insurance agencies and brokerages +524210,Insurance agencies and brokerages +52429,Other insurance related activities +524291,Claims adjusting +524292,Third party administration of insurance and pension funds +524298,All other insurance related activities +525,"Funds, trusts, and other financial vehicles" +5259,Other investment pools and funds +52591,Open-end investment funds +525910,Open-end investment funds +52599,Other financial vehicles +525990,Other financial vehicles +53,Real estate and rental and leasing +531,Real estate +5311,Lessors of real estate +53111,Lessors of residential buildings and dwellings +531110,Lessors of residential buildings and dwellings +53112,Lessors of nonresidential buildings (except miniwarehouses) +531120,Lessors of nonresidential buildings (except miniwarehouses) +53113,Lessors of miniwarehouses and self-storage units +531130,Lessors of miniwarehouses and self-storage units +53119,Lessors of other real estate property +531190,Lessors of other real estate property +5312,Offices of real estate agents and brokers +53121,Offices of real estate agents and brokers +531210,Offices of real estate agents and brokers +5313,Activities related to real estate +53131,Real estate property managers +531311,Residential property managers +531312,Nonresidential property managers +53132,Offices of real estate appraisers +531320,Offices of real estate appraisers +53139,Other activities related to real estate +531390,Other activities related to real estate +532,Rental and leasing services +5321,Automotive equipment rental and leasing +53211,Passenger car rental and leasing +532111,Passenger car rental +532112,Passenger car leasing +53212,"Truck, utility trailer, and RV (recreational vehicle) rental and leasing" +532120,"Truck, utility trailer, and RV (recreational vehicle) rental and leasing" +5322,Consumer goods rental +53221,Consumer electronics and appliances rental +532210,Consumer electronics and appliances rental +53222,Formal wear and costume rental +532220,Formal wear and costume rental +53223,Video tape and disc rental +532230,Video tape and disc rental +53229,Other consumer goods rental +532291,Home health equipment rental +532292,Recreational goods rental +532299,All other consumer goods rental +5323,General rental centers +53231,General rental centers +532310,General rental centers +5324,Commercial and industrial machinery and equipment rental and leasing +53241,"Construction, transportation, mining, and forestry machinery and equipment rental and leasing" +532411,"Commercial air, rail, and water transportation equipment rental and leasing" +532412,"Construction, mining, and forestry machinery and equipment rental and leasing" +53242,Office machinery and equipment rental and leasing +532420,Office machinery and equipment rental and leasing +53249,Other commercial and industrial machinery and equipment rental and leasing +532490,Other commercial and industrial machinery and equipment rental and leasing +533,Lessors of nonfinancial intangible assets (except copyrighted works) +5331,Lessors of nonfinancial intangible assets (except copyrighted works) +53311,Lessors of nonfinancial intangible assets (except copyrighted works) +533110,Lessors of nonfinancial intangible assets (except copyrighted works) +54,"Professional, scientific, and technical services" +541,"Professional, scientific, and technical services" +5411,Legal services +54111,Offices of lawyers +541110,Offices of lawyers +54119,Other legal services +541191,Title abstract and settlement offices +541199,All other legal services +5412,"Accounting, tax preparation, bookkeeping, and payroll services" +54121,"Accounting, tax preparation, bookkeeping, and payroll services" +541211,Offices of certified public accountants +541213,Tax preparation services +541214,Payroll services +541219,Other accounting services +5413,"Architectural, engineering, and related services" +54131,Architectural services +541310,Architectural services +54132,Landscape architectural services +541320,Landscape architectural services +54133,Engineering services +541330,Engineering services +54134,Drafting services +541340,Drafting services +54135,Building inspection services +541350,Building inspection services +54136,Geophysical surveying and mapping services +541360,Geophysical surveying and mapping services +54137,Surveying and mapping (except geophysical) services +541370,Surveying and mapping (except geophysical) services +54138,Testing laboratories +541380,Testing laboratories +5414,Specialized design services +54141,Interior design services +541410,Interior design services +54142,Industrial design services +541420,Industrial design services +54143,Graphic design services +541430,Graphic design services +54149,Other specialized design services +541490,Other specialized design services +5415,Computer systems design and related services +54151,Computer systems design and related services +541511,Custom computer programming services +541512,Computer systems design services +541513,Computer facilities management services +541519,Other computer related services +5416,"Management, scientific, and technical consulting services" +54161,Management consulting services +541611,Administrative management and general management consulting services +541612,Human resources consulting services +541613,Marketing consulting services +541614,"Process, physical distribution, and logistics consulting services" +541618,Other management consulting services +54162,Environmental consulting services +541620,Environmental consulting services +54169,Other scientific and technical consulting services +541690,Other scientific and technical consulting services +5417,Scientific research and development services +54171,"Research and development in the physical, engineering, and life sciences" +541711,Research and development in biotechnology +541712,"Research and development in the physical, engineering, and life sciences (except biotechnology)" +54172,Research and development in the social sciences and humanities +541720,Research and development in the social sciences and humanities +5418,"Advertising, public relations, and related services" +54181,Advertising agencies +541810,Advertising agencies +54182,Public relations agencies +541820,Public relations agencies +54183,Media buying agencies +541830,Media buying agencies +54184,Media representatives +541840,Media representatives +54185,Display advertising +541850,Display advertising +54186,Direct mail advertising +541860,Direct mail advertising +54187,Advertising material distribution services +541870,Advertising material distribution services +54189,Other services related to advertising +541890,Other services related to advertising +5419,"Other professional, scientific, and technical services" +54191,Marketing research and public opinion polling +541910,Marketing research and public opinion polling +54192,Photographic services +541921,"Photography studios, portrait" +541922,Commercial photography +54193,Translation and interpretation services +541930,Translation and interpretation services +54194,Veterinary services +541940,Veterinary services +54199,"All other professional, scientific, and technical services" +541990,"All other professional, scientific, and technical services" +55,Management of companies and enterprises +551,Management of companies and enterprises +5511,Management of companies and enterprises +55111,Management of companies and enterprises +551111,Offices of bank holding companies +551112,Offices of other holding companies +551114,"Corporate, subsidiary, and regional managing offices" +56,Administrative and support and waste management and remediation services +561,Administrative and support services +5611,Office administrative services +56111,Office administrative services +561110,Office administrative services +5612,Facilities support services +56121,Facilities support services +561210,Facilities support services +5613,Employment services +56131,Employment placement agencies and executive search services +561311,Employment placement agencies +561312,Executive search services +56132,Temporary help services +561320,Temporary help services +56133,Professional employer organizations +561330,Professional employer organizations +5614,Business support services +56141,Document preparation services +561410,Document preparation services +56142,Telephone call centers +561421,Telephone answering services +561422,Telemarketing bureaus and other contact centers +56143,Business service centers +561431,Private mail centers +561439,Other business service centers (including copy shops) +56144,Collection agencies +561440,Collection agencies +56145,Credit bureaus +561450,Credit bureaus +56149,Other business support services +561491,Repossession services +561492,Court reporting and stenotype services +561499,All other business support services +5615,Travel arrangement and reservation services +56151,Travel agencies +561510,Travel agencies +56152,Tour operators +561520,Tour operators +56159,Other travel arrangement and reservation services +561591,Convention and visitors bureaus +561599,All other travel arrangement and reservation services +5616,Investigation and security services +56161,"Investigation, guard, and armored car services" +561611,Investigation services +561612,Security guards and patrol services +561613,Armored car services +56162,Security systems services +561621,Security systems services (except locksmiths) +561622,Locksmiths +5617,Services to buildings and dwellings +56171,Exterminating and pest control services +561710,Exterminating and pest control services +56172,Janitorial services +561720,Janitorial services +56173,Landscaping services +561730,Landscaping services +56174,Carpet and upholstery cleaning services +561740,Carpet and upholstery cleaning services +56179,Other services to buildings and dwellings +561790,Other services to buildings and dwellings +5619,Other support services +56191,Packaging and labeling services +561910,Packaging and labeling services +56192,Convention and trade show organizers +561920,Convention and trade show organizers +56199,All other support services +561990,All other support services +562,Waste management and remediation services +5621,Waste collection +56211,Waste collection +562111,Solid waste collection +562112,Hazardous waste collection +562119,Other waste collection +5622,Waste treatment and disposal +56221,Waste treatment and disposal +562211,Hazardous waste treatment and disposal +562212,Solid waste landfill +562213,Solid waste combustors and incinerators +562219,Other nonhazardous waste treatment and disposal +5629,Remediation and other waste management services +56291,Remediation services +562910,Remediation services +56292,Materials recovery facilities +562920,Materials recovery facilities +56299,All other waste management services +562991,Septic tank and related services +562998,All other miscellaneous waste management services +61,Educational services +611,Educational services +6111,Elementary and secondary schools +61111,Elementary and secondary schools +611110,Elementary and secondary schools +6112,Junior colleges +61121,Junior colleges +611210,Junior colleges +6113,"Colleges, universities, and professional schools" +61131,"Colleges, universities, and professional schools" +611310,"Colleges, universities, and professional schools" +6114,Business schools and computer and management training +61141,Business and secretarial schools +611410,Business and secretarial schools +61142,Computer training +611420,Computer training +61143,Professional and management development training +611430,Professional and management development training +6115,Technical and trade schools +61151,Technical and trade schools +611511,Cosmetology and barber schools +611512,Flight training +611513,Apprenticeship training +611519,Other technical and trade schools +6116,Other schools and instruction +61161,Fine arts schools +611610,Fine arts schools +61162,Sports and recreation instruction +611620,Sports and recreation instruction +61163,Language schools +611630,Language schools +61169,All other schools and instruction +611691,Exam preparation and tutoring +611692,Automobile driving schools +611699,All other miscellaneous schools and instruction +6117,Educational support services +61171,Educational support services +611710,Educational support services +62,Health care and social assistance +621,Ambulatory health care services +6211,Offices of physicians +62111,Offices of physicians +621111,Offices of physicians (except mental health specialists) +621112,"Offices of physicians, mental health specialists" +6212,Offices of dentists +62121,Offices of dentists +621210,Offices of dentists +6213,Offices of other health practitioners +62131,Offices of chiropractors +621310,Offices of chiropractors +62132,Offices of optometrists +621320,Offices of optometrists +62133,Offices of mental health practitioners (except physicians) +621330,Offices of mental health practitioners (except physicians) +62134,"Offices of physical, occupational and speech therapists, and audiologists" +621340,"Offices of physical, occupational and speech therapists, and audiologists" +62139,Offices of all other health practitioners +621391,Offices of podiatrists +621399,Offices of all other miscellaneous health practitioners +6214,Outpatient care centers +62141,Family planning centers +621410,Family planning centers +62142,Outpatient mental health and substance abuse centers +621420,Outpatient mental health and substance abuse centers +62149,Other outpatient care centers +621491,HMO medical centers +621492,Kidney dialysis centers +621493,Freestanding ambulatory surgical and emergency centers +621498,All other outpatient care centers +6215,Medical and diagnostic laboratories +62151,Medical and diagnostic laboratories +621511,Medical laboratories +621512,Diagnostic imaging centers +6216,Home health care services +62161,Home health care services +621610,Home health care services +6219,Other ambulatory health care services +62191,Ambulance services +621910,Ambulance services +62199,All other ambulatory health care services +621991,Blood and organ banks +621999,All other miscellaneous ambulatory health care services +622,Hospitals +6221,General medical and surgical hospitals +62211,General medical and surgical hospitals +622110,General medical and surgical hospitals +6222,Psychiatric and substance abuse hospitals +62221,Psychiatric and substance abuse hospitals +622210,Psychiatric and substance abuse hospitals +6223,Specialty (except psychiatric and substance abuse) hospitals +62231,Specialty (except psychiatric and substance abuse) hospitals +622310,Specialty (except psychiatric and substance abuse) hospitals +623,Nursing and residential care facilities +6231,Nursing care facilities +62311,Nursing care facilities +623110,Nursing care facilities +6232,"Residential mental retardation, mental health and substance abuse facilities" +62321,Residential mental retardation facilities +623210,Residential mental retardation facilities +62322,Residential mental health and substance abuse facilities +623220,Residential mental health and substance abuse facilities +6233,Community care facilities for the elderly +62331,Community care facilities for the elderly +623311,Continuing care retirement communities +623312,Homes for the elderly +6239,Other residential care facilities +62399,Other residential care facilities +623990,Other residential care facilities +624,Social assistance +6241,Individual and family services +62411,Child and youth services +624110,Child and youth services +62412,Services for the elderly and persons with disabilities +624120,Services for the elderly and persons with disabilities +62419,Other individual and family services +624190,Other individual and family services +6242,"Community food and housing, and emergency and other relief services" +62421,Community food services +624210,Community food services +62422,Community housing services +624221,Temporary shelters +624229,Other community housing services +62423,Emergency and other relief services +624230,Emergency and other relief services +6243,Vocational rehabilitation services +62431,Vocational rehabilitation services +624310,Vocational rehabilitation services +6244,Child day care services +62441,Child day care services +624410,Child day care services +71,"Arts, entertainment, and recreation" +711,"Performing arts, spectator sports, and related industries" +7111,Performing arts companies +71111,Theater companies and dinner theaters +711110,Theater companies and dinner theaters +71112,Dance companies +711120,Dance companies +71113,Musical groups and artists +711130,Musical groups and artists +71119,Other performing arts companies +711190,Other performing arts companies +7112,Spectator sports +71121,Spectator sports +711211,Sports teams and clubs +711212,Racetracks +711219,Other spectator sports +7113,"Promoters of performing arts, sports, and similar events" +71131,"Promoters of performing arts, sports, and similar events with facilities" +711310,"Promoters of performing arts, sports, and similar events with facilities" +71132,"Promoters of performing arts, sports, and similar events without facilities" +711320,"Promoters of performing arts, sports, and similar events without facilities" +7114,"Agents and managers for artists, athletes, entertainers, and other public figures" +71141,"Agents and managers for artists, athletes, entertainers, and other public figures" +711410,"Agents and managers for artists, athletes, entertainers, and other public figures" +7115,"Independent artists, writers, and performers" +71151,"Independent artists, writers, and performers" +711510,"Independent artists, writers, and performers" +712,"Museums, historical sites, and similar institutions" +7121,"Museums, historical sites, and similar institutions" +71211,Museums +712110,Museums +71212,Historical sites +712120,Historical sites +71213,Zoos and botanical gardens +712130,Zoos and botanical gardens +71219,Nature parks and other similar institutions +712190,Nature parks and other similar institutions +713,"Amusement, gambling, and recreation industries" +7131,Amusement parks and arcades +71311,Amusement and theme parks +713110,Amusement and theme parks +71312,Amusement arcades +713120,Amusement arcades +7132,Gambling industries +71321,Casinos (except casino hotels) +713210,Casinos (except casino hotels) +71329,Other gambling industries +713290,Other gambling industries +7139,Other amusement and recreation industries +71391,Golf courses and country clubs +713910,Golf courses and country clubs +71392,Skiing facilities +713920,Skiing facilities +71393,Marinas +713930,Marinas +71394,Fitness and recreational sports centers +713940,Fitness and recreational sports centers +71395,Bowling centers +713950,Bowling centers +71399,All other amusement and recreation industries +713990,All other amusement and recreation industries +72,Accommodation and food services +721,Accommodation +7211,Traveler accommodation +72111,Hotels (except casino hotels) and motels +721110,Hotels (except casino hotels) and motels +72112,Casino hotels +721120,Casino hotels +72119,Other traveler accommodation +721191,Bed-and-breakfast inns +721199,All other traveler accommodation +7212,RV (recreational vehicle) parks and recreational camps +72121,RV (recreational vehicle) parks and recreational camps +721211,RV (recreational vehicle) parks and campgrounds +721214,Recreational and vacation camps (except campgrounds) +7213,Rooming and boarding houses +72131,Rooming and boarding houses +721310,Rooming and boarding houses +722,Food services and drinking places +7221,Full-service restaurants +72211,Full-service restaurants +722110,Full-service restaurants +7222,Limited-service eating places +72221,Limited-service eating places +722211,Limited-service restaurants +722212,"Cafeterias, grill buffets, and buffets" +722213,Snack and nonalcoholic beverage bars +7223,Special food services +72231,Food service contractors +722310,Food service contractors +72232,Caterers +722320,Caterers +72233,Mobile food services +722330,Mobile food services +7224,Drinking places (alcoholic beverages) +72241,Drinking places (alcoholic beverages) +722410,Drinking places (alcoholic beverages) +81,Other services (except public administration) +811,Repair and maintenance +8111,Automotive repair and maintenance +81111,Automotive mechanical and electrical repair and maintenance +811111,General automotive repair +811112,Automotive exhaust system repair +811113,Automotive transmission repair +811118,Other automotive mechanical and electrical repair and maintenance +81112,"Automotive body, paint, interior, and glass repair" +811121,"Automotive body, paint, and interior repair and maintenance" +811122,Automotive glass replacement shops +81119,Other automotive repair and maintenance +811191,Automotive oil change and lubrication shops +811192,Car washes +811198,All other automotive repair and maintenance +8112,Electronic and precision equipment repair and maintenance +81121,Electronic and precision equipment repair and maintenance +811211,Consumer electronics repair and maintenance +811212,Computer and office machine repair and maintenance +811213,Communication equipment repair and maintenance +811219,Other electronic and precision equipment repair and maintenance +8113,Commercial and industrial machinery and equipment (except automotive and electronic) repair and maintenance +81131,Commercial machinery repair and maintenance +811310,Commercial machinery repair and maintenance +8114,Personal and household goods repair and maintenance +81141,Home and garden equipment and appliance repair and maintenance +811411,Home and garden equipment repair and maintenance +811412,Appliance repair and maintenance +81142,Reupholstery and furniture repair +811420,Reupholstery and furniture repair +81143,Footwear and leather goods repair +811430,Footwear and leather goods repair +81149,Other personal and household goods repair and maintenance +811490,Other personal and household goods repair and maintenance +812,Personal and laundry services +8121,Personal care services +81211,"Hair, nail, and skin care services" +812111,Barber shops +812112,Beauty salons +812113,Nail salons +81219,Other personal care services +812191,Diet and weight reducing centers +812199,Other personal care services +8122,Death care services +81221,Funeral homes and funeral services +812210,Funeral homes and funeral services +81222,Cemeteries and crematories +812220,Cemeteries and crematories +8123,Drycleaning and laundry services +81231,Coin-operated laundries and drycleaners +812310,Coin-operated laundries and drycleaners +81232,Drycleaning and laundry services (except coin-operated) +812320,Drycleaning and laundry services (except coin-operated) +81233,Linen and uniform supply +812331,Linen supply +812332,Industrial launderers +8129,Other personal services +81291,Pet care (except veterinary) services +812910,Pet care (except veterinary) services +81292,Photofinishing +812921,Photofinishing laboratories (except one-hour) +812922,One-hour photofinishing +81293,Parking lots and garages +812930,Parking lots and garages +81299,All other personal services +812990,All other personal services +813,"Religious, grantmaking, civic, professional, and similar organizations" +8131,Religious organizations +81311,Religious organizations +813110,Religious organizations +8132,Grantmaking and giving services +81321,Grantmaking and giving services +813211,Grantmaking foundations +813212,Voluntary health organizations +813219,Other grantmaking and giving services +8133,Social advocacy organizations +81331,Social advocacy organizations +813311,Human rights organizations +813312,"Environment, conservation and wildlife organizations" +813319,Other social advocacy organizations +8134,Civic and social organizations +81341,Civic and social organizations +813410,Civic and social organizations +8139,"Business, professional, labor, political, and similar organizations" +81391,Business associations +813910,Business associations +81392,Professional organizations +813920,Professional organizations +81393,Labor unions and similar labor organizations +813930,Labor unions and similar labor organizations +81394,Political organizations +813940,Political organizations +81399,"Other similar organizations (except business, professional, labor, and political organizations)" +813990,"Other similar organizations (except business, professional, labor, and political organizations)" +99,Industries not classified diff --git a/man/climateapi-package.Rd b/man/climateapi-package.Rd new file mode 100644 index 0000000..f5b4464 --- /dev/null +++ b/man/climateapi-package.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/climateapi-package.R +\docType{package} +\name{climateapi-package} +\alias{climateapi} +\alias{climateapi-package} +\title{climateapi: Climate (and adjacent) data and functions for the C&C practice area} +\description{ +This packages combines a set of utilities for acquiring and processing climate and climate-adjacent datasets under a consistent API. It takes opinionated stances on how to manipulate raw data in an effort to produce standard workflows that enable project teams to devote more time to substantive analysis. +} +\seealso{ +Useful links: +\itemize{ + \item \url{https://ui-research.github.io/climateapi/} +} + +} +\author{ +\strong{Maintainer}: Will Curran-Groome \email{wcurrangroome@urban.org} (\href{https://orcid.org/0000-0001-6432-7561}{ORCID}) + +Authors: +\itemize{ + \item Will Curran-Groome \email{wcurrangroome@urban.org} (\href{https://orcid.org/0000-0001-6432-7561}{ORCID}) + \item Kameron Lloyd +} + +} +\keyword{internal} diff --git a/man/convert_delimited_to_parquet.Rd b/man/convert_delimited_to_parquet.Rd index 519f8a4..144f04d 100644 --- a/man/convert_delimited_to_parquet.Rd +++ b/man/convert_delimited_to_parquet.Rd @@ -21,7 +21,7 @@ convert_delimited_to_parquet( \item{subsetted_columns}{The columns to include in the outputted parquet data.} -\item{dataset}{NULL by default. Alternately, one of c("nfip_policies", "ihp_registrations"). If not null, this will be used to select the columns that are returned.} +\item{dataset}{NULL by default. Alternately, one of c("nfip_policies", "nfip_claims", "ihp_registrations"). If not null, this will be used to select the columns that are returned.} } \value{ NULL (invisibly). This function is called for its side effect of writing a parquet file to disk at the specified \code{outpath} (or a path derived from \code{inpath} with a .parquet extension). The function reads the input file in chunks to handle large files efficiently, optionally subsets to specified columns, and writes the result in Apache Parquet format using \code{arrow::write_parquet()}. diff --git a/man/estimate_units_per_parcel.Rd b/man/estimate_units_per_parcel.Rd deleted file mode 100644 index cd87f3d..0000000 --- a/man/estimate_units_per_parcel.Rd +++ /dev/null @@ -1,41 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/estimate_units_per_parcel.R -\name{estimate_units_per_parcel} -\alias{estimate_units_per_parcel} -\title{Estimate the number and types of structures per parcel} -\usage{ -estimate_units_per_parcel(structures, parcels, zoning, acs = NULL) -} -\arguments{ -\item{structures}{A dataset returned by \code{get_structure()}.} - -\item{parcels}{A spatial (polygon) dataset.} - -\item{zoning}{A spatial (polygon) zoning dataset.} - -\item{acs}{Optionally, a non-spatial dataset, at the tract level, returned from \code{urbnindicators::compile_acs_data()}.} -} -\value{ -An \code{sf} object (point geometry, representing parcel centroids) containing the input parcel data augmented with estimated residential unit information. The returned object includes: -\describe{ -\item{parcel_id}{Character or numeric. The unique parcel identifier from the input data.} -\item{tract_geoid}{Character. The 11-digit Census tract GEOID containing the parcel centroid.} -\item{jurisdiction}{Character. The jurisdiction name associated with the parcel.} -\item{municipality_name}{Character. The municipality name associated with the parcel.} -\item{residential_unit_count}{Numeric. The estimated number of residential units on the parcel, benchmarked against ACS estimates at the tract level.} -\item{residential_unit_categories}{Factor (ordered). Categorical classification of unit counts: "0", "1", "2", "3-4", "5-9", "10-19", "20-49", "50+".} -\item{median_value_improvement_sf}{Numeric. Tract-level median improvement value for single-family parcels.} -\item{median_value_improvement_mh}{Numeric. Tract-level median improvement value for manufactured home parcels.} -\item{acs_units_N}{Numeric columns (acs_units_1, acs_units_2, etc.). ACS-reported housing unit counts by units-in-structure category for the tract.} -\item{zone}{Character. Zoning designation from the zoning dataset.} -\item{zoned_housing_type}{Character. Housing type allowed by zoning.} -\item{far}{Numeric. Floor area ratio.} -\item{setback_front}{Numeric. Front setback requirement in feet.} -\item{setback_rear}{Numeric. Rear setback requirement in feet.} -\item{setback_side}{Numeric. Side setback requirement in feet.} -\item{height_maximum}{Numeric. Maximum building height allowed.} -} -} -\description{ -Estimate the number and types of structures per parcel -} diff --git a/man/get_box_path.Rd b/man/get_box_path.Rd index 8673df7..32a18a9 100644 --- a/man/get_box_path.Rd +++ b/man/get_box_path.Rd @@ -8,8 +8,8 @@ get_box_path() } \value{ A character string containing the full file path to the Climate and Communities (C&C) Box folder. -On Windows, returns "C:/Users/{username}/Box/METRO Climate and Communities Practice Area/github-repository". -On Mac, checks for Box at "/Users/{username}/Box" or "/Users/{username}/Library/CloudStorage/Box-Box", +On Windows, returns "C:/Users/\{username\}/Box/METRO Climate and Communities Practice Area/github-repository". +On Mac, checks for Box at "/Users/\{username\}/Box" or "/Users/\{username\}/Library/CloudStorage/Box-Box", using whichever exists. Throws an error if the Box folder cannot be found. } \description{ diff --git a/man/get_business_patterns.Rd b/man/get_business_patterns.Rd index 0ab0d62..5c7d40e 100644 --- a/man/get_business_patterns.Rd +++ b/man/get_business_patterns.Rd @@ -33,16 +33,21 @@ query all available codes with the specified number of digits. If not NULL, this argument overrides the \code{naics_code_digits} argument.} } \value{ -A tibble with data on county-level employees, employers, and aggregate -annual payrolls by industry and employer size +A tibble with data on employees, employers, and aggregate annual payrolls by +industry and employer size. The geographic columns differ by \code{geo}: \describe{ \item{year}{the year for which CBP data is pulled from} -\item{state}{A two-digit state identifier.} -\item{county}{A three-digit county identifier.} +\item{state}{(geo = "county" only) A two-digit state identifier.} +\item{county}{(geo = "county" only) A three-digit county identifier.} +\item{zip_code}{(geo = "zipcode" only) A five-digit ZIP code.} \item{employees}{number of individual employees employed in that particular industry -and establishment size combination} +and establishment size combination. For geo = "zipcode", this is only published +by Census for \code{naics_code == "00"} (total, all sectors); all other NAICS codes +are NA -- see \verb{@details}.} \item{employers}{number of establishments of each employment size} -\item{annual_payroll}{total annual payroll expenditures measured in $1,000's of USD} +\item{annual_payroll}{total annual payroll expenditures measured in $1,000's of USD. +For geo = "zipcode", this is only published by Census for \code{naics_code == "00"} +(total, all sectors); all other NAICS codes are NA -- see \verb{@details}.} \item{industry}{industry classification according to North American Industry Classification System. Refer to details for additional information} \item{employee_size_range_label}{range for the employment size of establishments included in each @@ -85,6 +90,12 @@ Rail Transportation (NAICS 482); Postal Service (NAICS 491); Pension, Health, We and Other Insurance Funds (NAICS 525110, 525120, 525190); Trusts, Estates, and Agency Accounts (NAICS 525920); Offices of Notaries (NAICS 541120); Private Households (NAICS 814); and Public Administration (NAICS 92) + +For \code{geo = "zipcode"}, Census's ZIP Code Business Patterns (ZBP) only publishes +\code{employees}/\code{annual_payroll} for \code{naics_code == "00"} (total, all sectors); the Census API +returns a literal \code{0} for every other NAICS code at the zip-code level, which reflects a +suppression convention, not a true absence of establishments. This function coerces those +values to \code{NA} and emits a one-time message explaining this. } \examples{ \dontrun{ diff --git a/man/get_dataset_columns.Rd b/man/get_dataset_columns.Rd index cc3b894..507f2b3 100644 --- a/man/get_dataset_columns.Rd +++ b/man/get_dataset_columns.Rd @@ -7,10 +7,10 @@ get_dataset_columns(dataset) } \arguments{ -\item{dataset}{The name of the dataset. One of c('nfip_policies', 'ihp_registrations').} +\item{dataset}{The name of the dataset. One of c('nfip_policies', 'nfip_claims', 'ihp_registrations').} } \value{ -A character vector containing the raw column names (in camelCase format as they appear in the source data) to be selected when reading the specified dataset. The columns returned are curated subsets of the full dataset columns, excluding administrative/metadata fields. For "nfip_policies": 20 columns including location, policy details, and building characteristics. For "ihp_registrations": ~20 columns including disaster info, geographic identifiers, and assistance amounts. +A character vector containing the raw column names (in camelCase format as they appear in the source data) to be selected when reading the specified dataset. The columns returned are curated subsets of the full dataset columns, excluding administrative/metadata fields. For "nfip_policies": 11 columns matching the current per-state parquet schema. For "nfip_claims": 19 columns needed by \code{get_nfip_claims()}'s downstream \code{transmute()}. For "ihp_registrations": ~20 columns including disaster info, geographic identifiers, and assistance amounts. } \description{ Get the raw column names for a specified dataset diff --git a/man/get_disaster_dollar_database.Rd b/man/get_disaster_dollar_database.Rd index b757d1d..dae417a 100644 --- a/man/get_disaster_dollar_database.Rd +++ b/man/get_disaster_dollar_database.Rd @@ -13,13 +13,23 @@ get_disaster_dollar_database( \item{file_path}{The path (on Box) to the file containing the raw data.} } \value{ -A dataframe comprising disaster-level observations with financial assistance metrics from FEMA's Individual and Households Program (IHP), Public Assistance (PA), HUD's Community Development Block Grant Disaster Recovery (CDBG-DR), and SBA disaster loans. +A dataframe comprising disaster-level observations with financial assistance metrics +from FEMA's Individual and Households Program (IHP), Public Assistance (PA), HUD's Community +Development Block Grant Disaster Recovery (CDBG-DR), and SBA disaster loans. +\code{incident_start}, \code{incident_end}, and \code{declaration_date} are returned as \code{Date} objects +(parsed from the raw source's M/D/YY-formatted strings). } \description{ Get Disaster Dollar Database Data } \details{ -These data are sourced from: https://carnegieendowment.org/features/disaster-dollar-database. The data returned from this function are unchanged, though some columns have been renamed slightly for clarity and consistency. +These data are sourced from: https://carnegieendowment.org/features/disaster-dollar-database. +The raw source file has 86 columns; this function returns a curated 17-column subset +(renamed slightly for clarity and consistency). Columns dropped include: the Federal +Register Notice grantee detail columns (\verb{frn\{1-4\}_date}/\verb{_url}, and each FRN's +\verb{grantee\{1-9\}_name}/\verb{_url}/\verb{_amount} columns), \code{declaration_url}, and the SBA home/business +loan split columns (\code{sba_home_approved_loan_amount}, \code{sba_home_loan_count}, +\code{sba_business_approved_loan_amount}, \code{sba_business_loan_count}). } \examples{ \dontrun{ diff --git a/man/get_emergency_management_performance.Rd b/man/get_emergency_management_performance.Rd index a909600..6dadd28 100644 --- a/man/get_emergency_management_performance.Rd +++ b/man/get_emergency_management_performance.Rd @@ -4,34 +4,32 @@ \alias{get_emergency_management_performance} \title{Get Emergency Management Performance Grant (EMPG) data} \usage{ -get_emergency_management_performance( - file_path = file.path(get_box_path(), "hazards", "FEMA", - "emergency-management-performance", - "emergency_management_performance_grants_2025_06_29.csv"), - api = TRUE -) +get_emergency_management_performance(file_path = NULL, api = FALSE) } \arguments{ -\item{file_path}{Path to the downloaded dataset on Box.} +\item{file_path}{Path to the raw data. If NULL (default), reads the most recently +cached file for this dataset from \code{get_openfema_cache_path()}.} \item{api}{Logical indicating whether to use the OpenFEMA API to retrieve the data. -Default is TRUE.} +Default is FALSE (read from \code{file_path}, or the local OpenFEMA cache if NULL).} } \value{ A data frame containing emergency management performance grant (EMPG) data. Columns include: \describe{ \item{id}{Unique identifier for the grant record.} +\item{reporting_period}{The reporting period associated with the record.} \item{state_name}{Full state name.} \item{state_code}{Two-digit state FIPS code.} \item{state_abbreviation}{Two-letter state abbreviation.} -\item{year_project_start}{Year the project started.} +\item{legal_agency_name}{The name of the legal agency administering the grant.} +\item{project_type}{The type of project funded.} +\item{year_project_start}{Year the project started (derived from \code{project_start_date}, +with corrections for a handful of records with typos in the raw data).} \item{project_start_date}{Date the project started.} \item{project_end_date}{Date the project ended.} -\item{grant_amount}{Total grant amount in dollars.} -\item{federal_share}{Federal portion of the grant in dollars.} -\item{non_federal_share}{Non-federal cost share in dollars.} -\item{program}{EMPG program type.} +\item{name_of_program}{The name of the EMPG program.} +\item{funding_amount}{Funding amount in dollars.} } } \description{ diff --git a/man/get_fema_disaster_declarations.Rd b/man/get_fema_disaster_declarations.Rd index ee0e193..6e2d2b1 100644 --- a/man/get_fema_disaster_declarations.Rd +++ b/man/get_fema_disaster_declarations.Rd @@ -4,16 +4,14 @@ \alias{get_fema_disaster_declarations} \title{Get major disaster declarations by county} \usage{ -get_fema_disaster_declarations( - file_path = file.path(get_box_path(), "hazards", "fema", "disaster-declarations", - "raw", "fema_disaster_declarations_county_2024_10_25.csv"), - api = TRUE -) +get_fema_disaster_declarations(file_path = NULL, api = FALSE) } \arguments{ -\item{file_path}{The path (on Box) to the file containing the raw data.} +\item{file_path}{The path to the raw data. If NULL (default), reads the most recently +cached file for this dataset from \code{get_openfema_cache_path()}.} -\item{api}{If TRUE (default), access data from the API. Else, read locally from \code{file_path}.} +\item{api}{If TRUE, access data from the API. Else (default), read from \code{file_path} +(or the local OpenFEMA cache, if \code{file_path} is NULL).} } \value{ A dataframe comprising Major Disaster Declarations by month by year by county. @@ -38,6 +36,13 @@ an attribute. Data are from FEMA's OpenFEMA API. See \url{https://www.fema.gov/openfema-data-page/disaster-declarations-summaries-v2}. Statewide declarations are expanded to all counties in the state. + +Connecticut's pre-2022 counties (FIPS 09001-09015) are crosswalked onto the 2022-vintage +planning regions (09110-09190) using a binary any-overlap assumption: a planning region +is treated as having received a declaration if ANY overlapping pre-2022 county received +it, even if only part of that county's area falls within the region. This is not a +proportional/population-weighted allocation (unlike the crosswalks this package uses for +dollar-valued FEMA datasets), since a declaration is a binary event, not a divisible amount. } \examples{ \dontrun{ diff --git a/man/get_government_finances.Rd b/man/get_government_finances.Rd index 0db9da0..feb9ae0 100644 --- a/man/get_government_finances.Rd +++ b/man/get_government_finances.Rd @@ -49,7 +49,7 @@ Quantitative Research in Public Financial Analysis. PLoS ONE doi: 10.1371/journal.pone.0130119. See \url{https://my.willamette.edu/site/mba/public-datasets}. This is a survey in most years--i.e., only a subset of the full population of governments -comprises the sampling frame--but is a true census with relatively high response rates (90\%\%+) +comprises the sampling frame--but is a true census with relatively high response rates (90\%+) in years ending in 2 and 7. Definitions of key constructs: diff --git a/man/get_hazard_mitigation_assistance.Rd b/man/get_hazard_mitigation_assistance.Rd index 3937063..a50168b 100644 --- a/man/get_hazard_mitigation_assistance.Rd +++ b/man/get_hazard_mitigation_assistance.Rd @@ -5,22 +5,23 @@ \title{Get Hazard Mitigation Assistance (HMA) Project Details} \usage{ get_hazard_mitigation_assistance( - file_path_old_grant_system = file.path(get_box_path(), "hazards", "fema", - "hazard-mitigation-assistance", "raw", - "HazardMitigationAssistanceProjects_2025_09_27.parquet"), - file_path_new_grant_system = file.path(get_box_path(), "hazards", "fema", - "hazard-mitigation-assistance", "raw", "HmaSubapplications_2025_09_27.parquet"), + file_path_old_grant_system = NULL, + file_path_new_grant_system = NULL, state_abbreviations = NULL ) } \arguments{ \item{file_path_old_grant_system}{The file path to raw data for HMA applications from the older grant-reporting system. These data are typically available from: -\url{https://www.fema.gov/openfema-data-page/hazard-mitigation-assistance-projects-v4}} +\url{https://www.fema.gov/openfema-data-page/hazard-mitigation-assistance-projects-v4} +If NULL (default), reads the most recently cached file for this dataset from +\code{get_openfema_cache_path()}.} \item{file_path_new_grant_system}{The file path to raw data for HMA applications from the newer (FEMA GO) grant-reporting system. These data are typically available from: -\url{https://www.fema.gov/openfema-data-page/hma-subapplications-v2}} +\url{https://www.fema.gov/openfema-data-page/hma-subapplications-v2} +If NULL (default), reads the most recently cached file for this dataset from +\code{get_openfema_cache_path()}.} \item{state_abbreviations}{NULL by default, in which case data are returned for all 51 states. Provide a vector of two-character USPS state abbreviations to obtain data for @@ -38,7 +39,8 @@ should be used for county-level aggregations. Columns include: \item{state_name}{Full state name.} \item{county_geoid}{Five-digit county FIPS code.} \item{county_population}{County population used for allocation.} -\item{project_status}{Current project status (e.g., "Closed", "Active").} +\item{project_status}{Current project status (e.g., "Closed", "Active") -- spans the +full application lifecycle; see \verb{@details}.} \item{project_cost_federal}{Total federal cost at project level.} \item{project_cost_federal_split}{Federal cost allocated to this county.} } @@ -52,6 +54,12 @@ at the project-county level. Data are from FEMA's OpenFEMA API, combining two data sources: the legacy Hazard Mitigation Assistance Projects (v4) and the newer HMA Subapplications (v2). Multi-county projects are split across counties based on population proportions. + +Records span the full application lifecycle, not only approved/funded projects -- +this includes Denied, Withdrawn, Void, Not Selected, and other pre-decision statuses +(the FEMA GO source in particular contains no funded/"Selected" status records at all). +Users must filter on \code{project_status} themselves before summing \code{project_cost_federal_split} +if only approved or funded projects are of interest. } \examples{ \dontrun{ diff --git a/man/get_ihp_registrations.Rd b/man/get_ihp_registrations.Rd index 9f859e7..3b0842a 100644 --- a/man/get_ihp_registrations.Rd +++ b/man/get_ihp_registrations.Rd @@ -5,17 +5,19 @@ \title{Get Individuals and Households Program (IHP) registrations} \usage{ get_ihp_registrations( - state_fips = NULL, - file_name = "IndividualsAndHouseholdsProgramValidRegistrationsV2_2025_09_26.parquet", + state_abbreviation = NULL, + file_name = NULL, api = FALSE, outpath = NULL ) } \arguments{ -\item{state_fips}{A character vector of two-letter state abbreviations. If NULL (default), -return data for all 51 states. Otherwise return data for the specified states.} +\item{state_abbreviation}{A character vector of two-letter state abbreviations. If NULL +(default), return data for all 51 states. Otherwise return data for the specified states.} -\item{file_name}{The name (not the full path) of the Box file containing the raw data.} +\item{file_name}{The name (not the full path) of the Box file containing the raw data. +If NULL (default), reads the most recently cached file for this dataset from +\code{get_openfema_cache_path()}.} \item{api}{If TRUE, query the API. If FALSE (default), read from disk.} @@ -57,7 +59,7 @@ Data are from FEMA's OpenFEMA API. See \examples{ \dontrun{ get_ihp_registrations( - state_fips = "NJ", + state_abbreviation = "NJ", api = TRUE) } } diff --git a/man/get_naics_codes.Rd b/man/get_naics_codes.Rd index 0220214..0f4c4c2 100644 --- a/man/get_naics_codes.Rd +++ b/man/get_naics_codes.Rd @@ -7,8 +7,9 @@ get_naics_codes(year = 2023, digits = 3) } \arguments{ -\item{year}{The vintage year for NAICS codes. Data are available from 1986 through 2023. -Default is 2023.} +\item{year}{The vintage year for NAICS codes. Data are available from 2008 through 2023. +Years 1986-2007 use SIC or older NAICS classification systems that are not currently +supported. Default is 2023.} \item{digits}{The number of digits for desired NAICS codes. Must be between 2 and 6. Default is 3. Two-digit codes represent broad industry sectors (20 codes), diff --git a/man/get_national_risk_index.Rd b/man/get_national_risk_index.Rd new file mode 100644 index 0000000..25c6b4a --- /dev/null +++ b/man/get_national_risk_index.Rd @@ -0,0 +1,111 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_national_risk_index.R +\name{get_national_risk_index} +\alias{get_national_risk_index} +\title{Get FEMA National Risk Index scores} +\usage{ +get_national_risk_index(geography = c("tract", "county"), cache_path = NULL) +} +\arguments{ +\item{geography}{The geographic summary level of the results. One of "tract" +(the default) or "county".} + +\item{cache_path}{Optional path to a \code{.parquet} file used as a read-through +cache. If supplied and the file already exists, data are read from it and no +download occurs. If supplied and the file does not exist, freshly downloaded +data are written there for reuse. If \code{NULL} (the default), data are downloaded +fresh and not written to disk. Because the NRI is periodically revised (see +Details), delete a stale cache file to force a refresh.} +} +\value{ +A tibble with one row per census tract or county. Every field published +by the NRI service is returned, with the source's abbreviated field codes expanded +into descriptive snake_case names (see Details). Columns fall into these families: +\describe{ +\item{Identifiers}{\code{geoid} (a standardized, zero-padded 11-digit tract or +5-digit county FIPS join key, prepended by this function), the \code{state_name} +and \code{county_name} labels, and the source version \code{nri_version}. The NRI's +redundant identifier fields (\code{nri_id}, the individual state and county FIPS +codes, and \code{tractfips}) are dropped in favor of \code{geoid}.} +\item{Community totals}{\code{population}, \code{value_building} (building value, dollars), +\code{value_agriculture} (agricultural value, dollars), and \code{area_sq_mi} (square +miles).} +\item{Composite index families}{\verb{risk_*} (overall National Risk Index), +\verb{estimated_annual_loss_*} and \verb{expected_annual_loss_rate_composite_*} +(expected annual loss and its annualized rate), \verb{social_vulnerability_index_*} +(social vulnerability), \verb{resilience_*} (community resilience), and +\code{community_risk_factor_value}. Each family carries some combination of +\verb{_score}/\verb{_state_percentile}/\verb{_national_percentile} (percentile), \verb{_rating} +(rating), and \verb{_value}/\verb{_value_*} (absolute) columns.} +\item{Per-hazard metrics}{One block per hazard, prefixed by the hazard name: +\code{avalanche}, \code{coastal_flood}, \code{cold_wave}, \code{drought}, \code{earthquake}, \code{hail}, +\code{heat_wave}, \code{hurricane}, \code{ice_storm}, \code{landslide}, \code{lightning}, +\code{inland_flood}, \code{severe_wind}, \code{tornado}, \code{tsunami}, \code{volcano}, +\code{wildfire}, and \code{winter_weather}. Within each block, suffixes denote the +metric: \verb{_event_count}/\verb{_annual_frequency} (event count and annualized +frequency), \verb{_exposure_*} and \verb{_exposed_area} (exposure), \verb{_historic_loss_ratio_*} +(historic loss ratio), \verb{_estimated_annual_loss_*} (expected annual loss), +\verb{_expected_annual_loss_rate_*} (annualized loss rate), and \verb{_risk_value}/ +\verb{_risk_score}/\verb{_risk_rating} (hazard risk value, score, and rating).} +} +Coastal or otherwise geographically limited hazards are \code{NA} for communities with +no exposure. +} +\description{ +Downloads the complete FEMA National Risk Index (NRI) for every US +census tract or county. The NRI characterizes a community's relative risk from +18 natural hazards by combining expected annual loss, social vulnerability, and +community resilience. All fields published by the NRI feature service are +returned, with the source's abbreviated field codes expanded into descriptive +snake_case column names (see Details). +} +\details{ +Data are pulled from FEMA's National Risk Index ArcGIS feature services +(one service per geography) and paginated 2,000 records at a time. After +\code{janitor::clean_names()} normalization, the NRI's abbreviated field codes are +expanded into readable snake_case names (for example, \code{WFIR_EALT} becomes +\code{wildfire_estimated_annual_loss_total}, and \code{EAL_SPCTL} becomes +\code{estimated_annual_loss_state_percentile}); the ArcGIS service artifacts +(\code{OBJECTID}, \code{Shape__Area}, \code{Shape__Length}) and redundant source identifier +columns are dropped, and a standardized \code{geoid} join key is prepended. + +Interpreting the fields depends on the suffix: +\itemize{ +\item \verb{*_score}, \verb{*_state_percentile}, and \verb{*_national_percentile} columns are +\strong{values from 0 to 100}: \verb{*_score} and \verb{*_national_percentile} rank a +community against all US communities of the same type (all tracts, or all +counties), while \verb{*_state_percentile} ranks it against communities in the +same state. Because these are ranks rather than additive quantities, they +\strong{cannot be summed or averaged across geographies}; to describe risk for an +area spanning several tracts, request \code{geography = "county"} (or higher) +directly rather than aggregating tract scores. +\item \verb{*_rating} columns are categorical labels (e.g. "Relatively High"). +\item Value and loss columns (\verb{*_estimated_annual_loss_*}, \verb{*_exposure_*}, +\verb{*_exposed_area}, \verb{*_event_count}, and the community totals \code{value_building}, +\code{value_agriculture}, \code{population}, and \code{area_sq_mi}) are absolute quantities +(dollars, counts, or areas) and \emph{are} additive across geographies. +\item Rate and ratio columns (\verb{*_annual_frequency}, \verb{*_historic_loss_ratio_*}, +and \verb{*_expected_annual_loss_rate_*}) are normalized rates rather than absolute +quantities and, like the percentile columns, \strong{cannot be summed across +geographies}. +} + +Field definitions are documented in FEMA's NRI Technical Documentation and data +dictionary at \url{https://hazards.fema.gov/nri/data-resources} (which uses the +original abbreviated field codes). Hazard coverage reflects NRI v1.20 (December +2025), in which inland flooding (the \verb{inland_flood_*} columns) replaced the +earlier riverine flooding hazard; the source version is carried in the +\code{nri_version} column. If a future NRI release changes the schema, the underlying +query surfaces the service error rather than silently truncating results. +} +\examples{ +\dontrun{ +# county-level scores, downloaded fresh +nri_counties <- get_national_risk_index(geography = "county") + +# tract-level scores, cached locally for reuse across sessions +nri_tracts <- get_national_risk_index( + geography = "tract", + cache_path = file.path(tempdir(), "nri_tracts.parquet")) +} +} diff --git a/man/get_nfip_claims.Rd b/man/get_nfip_claims.Rd index 69672b2..9e8dc8b 100644 --- a/man/get_nfip_claims.Rd +++ b/man/get_nfip_claims.Rd @@ -4,17 +4,15 @@ \alias{get_nfip_claims} \title{Access county-level data on NFIP claims} \usage{ -get_nfip_claims( - county_geoids = NULL, - file_name = "fima_nfip_claims_2025_09_09.parquet", - api = FALSE -) +get_nfip_claims(county_geoids = NULL, file_name = NULL, api = FALSE) } \arguments{ \item{county_geoids}{A character vector of five-digit county codes. NULL by default; must be non-NULL if \code{api = TRUE}.} -\item{file_name}{The name (not the full path) of the Box file containing the raw data.} +\item{file_name}{The name (not the full path) of the Box file containing the raw data. +If NULL (default), reads the most recently cached file for this dataset from +\code{get_openfema_cache_path()}.} \item{api}{If TRUE, query the API. FALSE by default.} } @@ -22,7 +20,6 @@ must be non-NULL if \code{api = TRUE}.} A data frame comprising county-level data on current NFIP policies \describe{ \item{state_fips}{A two-digit state identifier.} -\item{state_abbreviation}{The name of the state.} \item{county_geoid}{A five-digit county identifier.} \item{county_name}{The name of the county.} \item{year_construction}{The original year of the construction of the building.} @@ -41,7 +38,7 @@ A data frame comprising county-level data on current NFIP policies \item{damage_contents}{The value of damage to contents.} \item{net_payment_building}{Net building payment amount.} \item{net_payment_contents}{Net contents payment amount.} -\item{net_payment_increased_compliance}{Net Increased Cost of Compliance (ICC) payment amount.} +\item{net_payment_icc}{Net Increased Cost of Compliance (ICC) payment amount.} } } \description{ @@ -71,11 +68,11 @@ and payments in the same time period. test <- get_nfip_claims(county_geoids = c("01001", "48201")) |> dplyr::filter( - year_of_loss >= 2015, ### in the past 10 years + year_loss >= 2015, ### in the past 10 years !occupancy_type \%in\% c("non-residential")) |> ### only residential claims dplyr::summarize( .by = county_geoid, dplyr::across(dplyr::matches("payment"), sum, na.rm = TRUE), - residential_claims = dplyr::n_distinct(nfip_claim_id)) + residential_claims = dplyr::n()) } } diff --git a/man/get_nfip_policies.Rd b/man/get_nfip_policies.Rd index 8ed550e..ec6790f 100644 --- a/man/get_nfip_policies.Rd +++ b/man/get_nfip_policies.Rd @@ -7,7 +7,7 @@ get_nfip_policies( state_abbreviation, county_geoids = NULL, - file_name = "fima_nfip_policies_2025_10_14.parquet", + file_name = NULL, api = FALSE ) } @@ -16,13 +16,19 @@ get_nfip_policies( \item{county_geoids}{A character vector of five-digit county codes.} -\item{file_name}{The name (not the full path) of the Box file containing the raw data.} +\item{file_name}{The name (not the full path) of a per-state Box file containing the raw +data (see \verb{@details}). If NULL (default), reads \code{state_abbreviation}'s records directly +from the most recently cached nationwide file for this dataset (see +\code{get_openfema_cache_path()}), which avoids the cross-border duplication issue described +below entirely.} \item{api}{If TRUE, query the API. If FALSE (default), read from \code{file_name}.} } \value{ A dataframe of project-level funding requests and awards, along with variables that can be aggregated to the county level. \describe{ +\item{id}{Unique identifier for the policy record; use this to de-duplicate +cross-border policies after combining results from multiple states -- see \verb{@details}.} \item{state_fips}{A two-digit state identifier.} \item{state_abbreviation}{The two-character abbreviation of the state.} \item{county_code}{The five-digit county identifier.} @@ -54,6 +60,14 @@ policy_date_termination and policy_date_effective columns. The dataset also contains both residential and commercial policies. In order to filter to residential policies, the analyst can filter out the "non-residential" occupancy type. + +When \code{file_name} is supplied explicitly, per-state files (in the \verb{intermediate/} Box +folder) are not mutually exclusive: a policy whose county sits near a state border can +appear in more than one state's file. When looping this function over multiple states +this way and combining results, run \code{dplyr::distinct(id, .keep_all = TRUE)} on the +combined data to remove these duplicates (verified: 72 Delaware-file rows keyed to +Maryland counties, all also present in Maryland's own file). This does not apply to the +default (cache-backed) mode, which reads directly from the single nationwide file. } \examples{ \dontrun{ @@ -63,7 +77,7 @@ to residential policies, the analyst can filter out the "non-residential" occupa file_name = "fima_nfip_policies_2025_10_14.parquet", api = FALSE) |> dplyr::filter( - !occupancy_type \%in\% c("non-residential"), ### only residential claims, + !building_occupancy_type \%in\% c("non-residential"), ### only residential claims, policy_date_termination >= as.Date("2025-10-15"), policy_date_effective <= as.Date("2025-10-15")) |> dplyr::group_by(county_geoid)|> diff --git a/man/get_nfip_residential_penetration.Rd b/man/get_nfip_residential_penetration.Rd index 717ee91..4a74776 100644 --- a/man/get_nfip_residential_penetration.Rd +++ b/man/get_nfip_residential_penetration.Rd @@ -4,15 +4,13 @@ \alias{get_nfip_residential_penetration} \title{Get the share of residential structures covered by NFIP} \usage{ -get_nfip_residential_penetration( - states = NULL, - file_name = "nfip_residential_penetration_rates_12_12_2025.csv" -) +get_nfip_residential_penetration(states = NULL, file_name = NULL) } \arguments{ \item{states}{NULL by default.} -\item{file_name}{The name (not full path) of the raw dataset.} +\item{file_name}{The name (not full path) of the raw dataset. If NULL (default), +reads the most recently cached file for this dataset from \code{get_openfema_cache_path()}.} } \value{ A tibble with the following columns: diff --git a/man/get_openfema_cache_path.Rd b/man/get_openfema_cache_path.Rd new file mode 100644 index 0000000..900918f --- /dev/null +++ b/man/get_openfema_cache_path.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utilities.R +\name{get_openfema_cache_path} +\alias{get_openfema_cache_path} +\title{Get the path to the local OpenFEMA dataset cache} +\usage{ +get_openfema_cache_path() +} +\value{ +A character string containing the full path to the local cache of +OpenFEMA datasets, populated via \code{download_openfema_datasets()}. This +cache lives at the root of the user's Box folder (\code{data-cache/openfema}), +not under the C&C practice area subfolder returned by \code{get_box_path()}. +} +\description{ +Get the path to the local OpenFEMA dataset cache +} +\examples{ +\dontrun{ +get_openfema_cache_path() +} +} diff --git a/man/get_preliminary_damage_assessments.Rd b/man/get_preliminary_damage_assessments.Rd index 563e5f3..aa8472a 100644 --- a/man/get_preliminary_damage_assessments.Rd +++ b/man/get_preliminary_damage_assessments.Rd @@ -23,23 +23,49 @@ at which to cache the resulting data.} data will be generated anew. Else, if a file exists at \code{file_path}, this file will be returned.} } \value{ -A dataframe of preliminary damage assessment reports. Key columns include: +A dataframe of preliminary damage assessment reports. Columns include: \describe{ +\item{path}{The local file path to the source PDA PDF.} \item{disaster_number}{FEMA disaster number.} \item{event_type}{Type of decision: "approved", "denial", "appeal_approved", or "appeal_denial".} \item{event_title}{Title/description of the disaster event.} \item{event_date_determined}{Date the PDA determination was made.} \item{event_native_flag}{1 if tribal request, 0 otherwise.} +\item{pa_requested}{1 if Public Assistance was requested, 0 otherwise.} +\item{pa_preemptive_declaration}{1 if the joint PDA requirement was waived due to the severity of the event, 0 otherwise.} +\item{pa_primary_impact}{The primary type of impact described for Public Assistance purposes.} +\item{pa_cost_estimate_total}{Estimated total Public Assistance cost.} +\item{pa_per_capita_impact_statewide}{Statewide (or territory/commonwealth) per capita impact amount.} +\item{pa_per_capita_impact_indicator_statewide}{Numeric ratio of the statewide per capita impact +to the applicable threshold -- a decimal ratio (e.g. 1.5, 1.89), not a "Met"/"Not Met" +categorical indicator despite the field's FEMA-assigned name.} +\item{pa_per_capita_impact_countywide}{Raw text of countywide per capita impact ratios (may list +multiple values across affected counties for a multi-county event).} +\item{pa_per_capita_impact_indicator_countywide}{Truncated text of the countywide per capita impact indicator.} +\item{pa_per_capita_impact_countywide_max}{Maximum countywide per capita impact ratio parsed +from \code{pa_per_capita_impact_countywide}.} +\item{pa_per_capita_impact_countywide_min}{Minimum countywide per capita impact ratio parsed +from \code{pa_per_capita_impact_countywide}.} \item{ia_requested}{1 if Individual Assistance was requested, 0 otherwise.} \item{ia_residences_impacted}{Total residences impacted.} \item{ia_residences_destroyed}{Number of residences destroyed.} \item{ia_residences_major_damage}{Number of residences with major damage.} \item{ia_residences_minor_damage}{Number of residences with minor damage.} +\item{ia_residences_affected}{Number of residences affected (lowest damage category).} +\item{ia_residences_insured_total_percent}{Percentage of impacted residences with any insurance coverage.} +\item{ia_residences_insured_flood_percent}{Percentage of impacted residences with flood insurance coverage.} +\item{ia_households_poverty_percent}{Percentage of households in poverty (or low income, +depending on report vintage).} +\item{ia_households_owner_percent}{Percentage of households that are owner-occupied.} +\item{ia_population_other_government_assistance_percent}{Percentage of the population receiving +other government assistance (e.g. SSI, SNAP).} +\item{ia_pre_disaster_unemployment_percent}{Pre-disaster unemployment rate.} +\item{ia_65plus_percent}{Percentage of the population age 65 and older.} +\item{ia_18below_percent}{Percentage of the population age 18 and under.} +\item{ia_disability_percent}{Percentage of the population with a disability.} +\item{ia_ihp_cost_to_capacity_ratio}{Individuals and Households Program (IHP) Cost to Capacity (ICC) ratio.} \item{ia_cost_estimate_total}{Estimated total Individual Assistance cost.} -\item{pa_requested}{1 if Public Assistance was requested, 0 otherwise.} -\item{pa_cost_estimate_total}{Estimated total Public Assistance cost.} -\item{pa_per_capita_impact_statewide}{Statewide per capita impact amount.} -\item{pa_per_capita_impact_indicator_statewide}{Met/Not Met indicator for statewide threshold.} +\item{text}{The cleaned text extracted from the PDA PDF used to derive the fields above.} } } \description{ diff --git a/man/get_public_assistance.Rd b/man/get_public_assistance.Rd index 311a5b5..0082a7e 100644 --- a/man/get_public_assistance.Rd +++ b/man/get_public_assistance.Rd @@ -4,14 +4,12 @@ \alias{get_public_assistance} \title{Get FEMA Public Assistance (PA) funding} \usage{ -get_public_assistance( - file_path = file.path(get_box_path(), "hazards", "fema", "public-assistance", "raw", - "PublicAssistanceFundedProjectsDetailsV2_2025_09_26.parquet"), - state_abbreviations = NULL -) +get_public_assistance(file_path = NULL, state_abbreviations = NULL) } \arguments{ -\item{file_path}{The file path to the raw data contained in a .parquet file.} +\item{file_path}{The file path to the raw data contained in a .parquet file. If NULL +(default), reads the most recently cached file for this dataset from +\code{get_openfema_cache_path()}.} \item{state_abbreviations}{A character vector of state abbreviations. NULL by default, which returns records for all 51 states. Only the 51 states are supported at this time.} diff --git a/man/get_sba_loans.Rd b/man/get_sba_loans.Rd index 51531e6..ce16137 100644 --- a/man/get_sba_loans.Rd +++ b/man/get_sba_loans.Rd @@ -11,15 +11,23 @@ A dataframe comprising city- and zip-level data on SBA loanmaking. Columns include: \describe{ \item{fiscal_year}{The federal fiscal year of the loan.} +\item{disaster_description}{Text description of the disaster (only populated for +older, FY01-FY03 vintages; NA otherwise).} \item{disaster_number_fema}{FEMA disaster number associated with the loan.} \item{disaster_number_sba_physical}{SBA physical disaster declaration number.} +\item{disaster_number_sba}{SBA disaster declaration number (distinct from +\code{disaster_number_sba_physical}).} \item{disaster_number_sba_eidl}{SBA Economic Injury Disaster Loan (EIDL) declaration number.} \item{damaged_property_zip_code}{ZIP code of the damaged property.} \item{damaged_property_city_name}{City name of the damaged property.} \item{damaged_property_state_code}{Two-letter state abbreviation.} \item{verified_loss_total}{Total verified loss amount in dollars.} +\item{verified_loss_real_estate}{Verified loss amount for real estate in dollars.} +\item{verified_loss_content}{Verified loss amount for contents in dollars.} \item{approved_amount_total}{Total approved loan amount in dollars.} \item{approved_amount_real_estate}{Approved loan amount for real estate in dollars.} +\item{approved_amount_content}{Approved loan amount for contents in dollars.} +\item{approved_amount_eidl}{Approved EIDL amount in dollars (business loans only; NA for residential).} \item{loan_type}{Type of loan: "residential" or "business".} } } @@ -30,6 +38,13 @@ for both home and business loans at the city and zip code level. \details{ Data are sourced from the SBA's disaster loan reports. See \url{https://www.sba.gov/funding-programs/disaster-assistance}. + +The FY16 source workbook (\code{sba_disaster_loan_data_fy16.xlsx}) is anomalous: its Home +and Business sheets have identical row counts and dollar totals, suggesting possible +~2x double-counting in the source file itself. This function selects the correct +Home/Business sheet by name (avoiding the sheet-order swap present in this vintage), +but the underlying FY16 data should be manually re-verified against +\url{https://data.sba.gov} before being trusted. } \examples{ \dontrun{ diff --git a/man/get_sheldus.Rd b/man/get_sheldus.Rd index 76caf3f..3729c26 100644 --- a/man/get_sheldus.Rd +++ b/man/get_sheldus.Rd @@ -4,14 +4,12 @@ \alias{get_sheldus} \title{Access temporal county-level SHELDUS hazard damage data} \usage{ -get_sheldus( - file_path = file.path(get_box_path(), "hazards", "sheldus", - "SHELDUS_23.0_12312023_AllCounties_CountyAggregate_YearMonthHazard_2023USD", - "direct_loss_aggregated_output_24075.csv") -) +get_sheldus(file_path = NULL) } \arguments{ -\item{file_path}{The path to the raw SHELDUS data.} +\item{file_path}{The path to the raw SHELDUS data. If NULL (default), the most recently +modified \code{direct_loss_aggregated_output_*.csv} file found under Box's \code{hazards/sheldus} +directory is used, and a message discloses which file/vintage was selected.} } \value{ A dataframe comprising hazard x month x year x county observations of hazard events. @@ -24,8 +22,9 @@ Columns include: \item{year}{Year of the hazard event(s).} \item{month}{Month of the hazard event(s).} \item{hazard}{Type of hazard (e.g., "Flooding", "Hurricane/Tropical Storm").} -\item{damage_property}{Property damage in 2023 inflation-adjusted dollars.} -\item{damage_crop}{Crop damage in 2023 inflation-adjusted dollars.} +\item{damage_property}{Property damage in inflation-adjusted dollars (base year varies +by SHELDUS vintage; see the function's message for the base year used).} +\item{damage_crop}{Crop damage in inflation-adjusted dollars (see \code{damage_property}).} \item{fatalities}{Number of fatalities.} \item{injuries}{Number of injuries.} \item{records}{Number of individual events aggregated into this observation.} diff --git a/man/get_wildfire_burn_zones.Rd b/man/get_wildfire_burn_zones.Rd index 29c119f..f2bbb0d 100644 --- a/man/get_wildfire_burn_zones.Rd +++ b/man/get_wildfire_burn_zones.Rd @@ -14,30 +14,38 @@ get_wildfire_burn_zones( path within Box.} } \value{ -An sf dataframe comprising wildfire burn zone disasters. Each row represents a -single wildfire event, with polygon geometries representing burn zones. +An sf dataframe comprising wildfire burn zone disasters, with one row per +wildfire x affected county (a wildfire spanning multiple counties appears as multiple +rows). \code{geometry}, \code{area_sq_km}, and the other wildfire-level summary columns +(\code{fatalities_total}, \code{injuries_total}, \code{structures_destroyed}, \code{structures_threatened}, +\code{evacuation_total}, \code{wui_type}, \code{density_people_sq_km_wildfire_buffer}) are wildfire-level +and repeat identically across a multi-county wildfire's rows; de-duplicate on +\code{wildfire_id} before summing these columns or unioning geometries (e.g. +\code{sum(area_sq_km[!duplicated(wildfire_id)])}) to avoid over-counting. Columns include: \describe{ \item{wildfire_id}{Unique identifier for the wildfire event.} \item{id_fema}{FEMA disaster identifier (if applicable).} \item{year}{Year of the wildfire.} \item{wildfire_name}{Name of the wildfire or fire complex.} -\item{county_fips}{Pipe-delimited string of five-digit county FIPS codes for all -counties affected by the wildfire.} -\item{county_name}{Pipe-delimited string of county names for all counties -affected by the wildfire.} -\item{area_sq_km}{Burned area in square kilometers.} +\item{state_fips}{Two-digit state FIPS code, derived from \code{county_fips}.} +\item{county_fips}{Five-digit county FIPS code for a single county affected by the wildfire.} +\item{county_name}{Name of a single county affected by the wildfire, sourced from +Census's own canonical county names (joined on \code{county_fips}) rather than the raw +source data, to avoid mangling Mc-prefixed county names.} +\item{area_sq_km}{Burned area in square kilometers (wildfire-level; see above).} \item{wildfire_complex_binary}{Whether the fire is a complex (multiple fires).} \item{date_start}{Ignition date.} \item{date_containment}{Containment date.} -\item{fatalities_total}{Total fatalities.} -\item{injuries_total}{Total injuries.} -\item{structures_destroyed}{Number of structures destroyed.} -\item{structures_threatened}{Number of structures threatened.} -\item{evacuation_total}{Total evacuations.} -\item{wui_type}{Wildland-urban interface type.} -\item{density_people_sq_km_wildfire_buffer}{Population density in wildfire buffer area.} -\item{geometry}{Burn zone polygon geometry.} +\item{fatalities_total}{Total fatalities (wildfire-level; see above).} +\item{injuries_total}{Total injuries (wildfire-level; see above).} +\item{structures_destroyed}{Number of structures destroyed (wildfire-level; see above).} +\item{structures_threatened}{Number of structures threatened (wildfire-level; see above).} +\item{evacuation_total}{Total evacuations (wildfire-level; see above).} +\item{wui_type}{Wildland-urban interface type (wildfire-level; see above).} +\item{density_people_sq_km_wildfire_buffer}{Population density in wildfire buffer +area (wildfire-level; see above).} +\item{geometry}{Burn zone polygon geometry (wildfire-level; see above).} } } \description{ diff --git a/man/inflation_adjust.Rd b/man/inflation_adjust.Rd index 121afe7..9a51ecd 100644 --- a/man/inflation_adjust.Rd +++ b/man/inflation_adjust.Rd @@ -24,7 +24,7 @@ inflation_adjust( \item{base_year}{The year to use as the base for inflation adjustment. If NULL, defaults to the most recent year in the PCE index data.} } \value{ -A tibble identical to the input \code{df} with additional inflation-adjusted columns. For each column specified in \code{dollar_variables}, a new column is created with the same name plus \code{names_suffix} (default: "_{base_year}"). The adjusted values are calculated by multiplying original values by an inflation factor derived from the PCE Price Index ratio between the base year and each observation's year. Original columns are preserved unchanged. +A tibble identical to the input \code{df} with additional inflation-adjusted columns. For each column specified in \code{dollar_variables}, a new column is created with the same name plus \code{names_suffix} (default: "_\{base_year\}"). The adjusted values are calculated by multiplying original values by an inflation factor derived from the PCE Price Index ratio between the base year and each observation's year. Original columns are preserved unchanged. } \description{ The Personal Consumption Expenditures Price Index (PCE Index) is from the diff --git a/man/interpolate_demographics.Rd b/man/interpolate_demographics.Rd deleted file mode 100644 index e688940..0000000 --- a/man/interpolate_demographics.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/interpolate_demographics.R -\name{interpolate_demographics} -\alias{interpolate_demographics} -\title{Interpolate tract-level sociodemographic data to zoning polygons} -\usage{ -interpolate_demographics( - zones_sf, - sociodemographic_tracts_sf = NULL, - id_column, - weights = "population" -) -} -\arguments{ -\item{zones_sf}{A spatial (sf) dataset defining zoning districts.} - -\item{sociodemographic_tracts_sf}{(optional) A tract level spatial (sf) dataset resulting from urbnindicators. If NULL, this function is run behind the scenes for appropriate tracts.} - -\item{id_column}{The name of the column in zones_sf that identifies each unique combination of zoning regulations.} - -\item{weights}{One of c("population", "housing"). The variable to be used as the weight in the interpolation.} -} -\value{ -A spatial (sf) dataset comprising one observation for each level of id_column with interpolated values taken from sociodemographic_tracts_sf. -} -\description{ -Interpolate tract-level sociodemographic data to zoning polygons -} diff --git a/man/polygons_to_linestring.Rd b/man/polygons_to_linestring.Rd deleted file mode 100644 index b4af43c..0000000 --- a/man/polygons_to_linestring.Rd +++ /dev/null @@ -1,24 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/spatial_analysis.R -\name{polygons_to_linestring} -\alias{polygons_to_linestring} -\title{Convert polygons into their component linestrings} -\usage{ -polygons_to_linestring(.sf) -} -\arguments{ -\item{.sf}{The spatial dataframe containing one or more polygons} -} -\value{ -An \code{sf} object (simple feature collection) with geometry type LINESTRING. The returned object contains: -\describe{ -\item{polygon_id}{Integer. The row index of the originating polygon from the input \code{.sf} object, enabling linkage back to the source polygon.} -\item{line_id}{Integer. A sequential identifier for each line segment within its originating polygon. Line segments are ordered according to the vertex sequence of the polygon boundary.} -\item{...}{All original attributes from the input \code{.sf} object are preserved and joined back via \code{polygon_id}.} -\item{geometry}{LINESTRING geometry. Each line segment represents one edge of the original polygon boundary.} -} -The CRS of the output matches the input \code{.sf} object (transformed to EPSG:5070 during processing). -} -\description{ -Convert polygons into their component linestrings -} diff --git a/man/qualtrics_define_missing.Rd b/man/qualtrics_define_missing.Rd deleted file mode 100644 index e7412c1..0000000 --- a/man/qualtrics_define_missing.Rd +++ /dev/null @@ -1,39 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/qualtrics_analysis.R -\name{qualtrics_define_missing} -\alias{qualtrics_define_missing} -\title{Fill in missing and non-missing values across interrelated survey questions} -\usage{ -qualtrics_define_missing( - df, - question_code_include, - question_code_omit = NULL, - default_values = list("No", 0, as.Date(0)), - predicate_question = NULL, - predicate_question_negative_value = NULL -) -} -\arguments{ -\item{df}{A dataframe of survey responses} - -\item{question_code_include}{A regex that matches the columns to include in the missing non-missing value imputation} - -\item{question_code_omit}{A regex that matches the columns to omit from the missing non-missing value imputation} - -\item{default_values}{A list of length three, specifying the default, non-missing values to be used for character, numeric, and Date columns, respectively} - -\item{predicate_question}{Optional. The name of a single column that controls whether columns selected with \code{question_code_include}} - -\item{predicate_question_negative_value}{If \code{predicate_question} is specified, provide the value that indicates a negative response to the predicate question. For responses where the predicate question has this value, this value will be imputed to the specified columns} -} -\value{ -A tibble containing only the columns selected by \code{question_code_include} (excluding those matching \code{question_code_omit}), with missing values handled according to the following logic: -\describe{ -\item{Without predicate_question}{If all selected columns are NA for a row, values remain NA. If any selected column has a non-NA value, NA values in other selected columns are replaced with the appropriate default value from \code{default_values} based on column type.} -\item{With predicate_question}{If the predicate question is NA, all selected columns are set to NA. If the predicate question equals \code{predicate_question_negative_value }, all selected columns are set to the appropriate default value. Otherwise, original values are preserved.} -} -Column types and their default value mappings: character uses \code{default_values[[1]]}, numeric uses \code{default_values[[2]]}, and Date/POSIXct uses \code{default_values[[3]]}. -} -\description{ -Fill in missing and non-missing values across interrelated survey questions -} diff --git a/man/qualtrics_format_metadata.Rd b/man/qualtrics_format_metadata.Rd deleted file mode 100644 index a6d6968..0000000 --- a/man/qualtrics_format_metadata.Rd +++ /dev/null @@ -1,29 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/qualtrics_analysis.R -\name{qualtrics_format_metadata} -\alias{qualtrics_format_metadata} -\title{Prep Qualtrics metadata} -\usage{ -qualtrics_format_metadata(metadata, sections = c(), text_replace = "zzzzz") -} -\arguments{ -\item{metadata}{A dataframe containing unprocessed metadata from the Qualtrics API} - -\item{sections}{A named vector specifying the last question number in each survey section} - -\item{text_replace}{A named character vector of regex patterns to replace in the metadata} -} -\value{ -A tibble containing formatted Qualtrics survey metadata with the following columns: -\describe{ -\item{question_number}{Integer. The sequential position of the question in the survey (1-indexed).} -\item{question_name}{Character. The internal Qualtrics question identifier (e.g., "Q1", "Q2_1").} -\item{text_main}{Character. The primary question text, with any patterns specified in \code{text_replace} substituted.} -\item{text_sub}{Character. The sub-question or response option text, with any patterns specified in \code{text_replace} substituted.} -\item{survey_section}{Character. The name of the survey section to which the question belongs, as defined by the \code{sections} parameter. Filled upward from section boundaries. -} -} -} -\description{ -Prep Qualtrics metadata -} diff --git a/man/qualtrics_get_metadata.Rd b/man/qualtrics_get_metadata.Rd deleted file mode 100644 index 5ccd64b..0000000 --- a/man/qualtrics_get_metadata.Rd +++ /dev/null @@ -1,28 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/qualtrics_analysis.R -\name{qualtrics_get_metadata} -\alias{qualtrics_get_metadata} -\title{Access Qualtrics metadata} -\usage{ -qualtrics_get_metadata( - metadata, - question_name = NULL, - survey_section = NULL, - return_values = "text_sub" -) -} -\arguments{ -\item{metadata}{The dataframe containing the Qualtrics metadata} - -\item{question_name}{A regex pattern to match the question name(s)} - -\item{survey_section}{A regex pattern to match the survey section(s)} - -\item{return_values}{The name of the column (character) to be returned} -} -\value{ -A character vector containing the values from the column specified by \code{return_values} (default: "text_sub"), filtered to rows matching either the \code{question_name} or \code{survey_section} pattern. The length of the vector corresponds to the number of matching rows in the metadata. Returns an empty character vector if no matches are found. -} -\description{ -Access Qualtrics metadata -} diff --git a/man/qualtrics_plot_question.Rd b/man/qualtrics_plot_question.Rd deleted file mode 100644 index 2627cbe..0000000 --- a/man/qualtrics_plot_question.Rd +++ /dev/null @@ -1,57 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/qualtrics_analysis.R -\name{qualtrics_plot_question} -\alias{qualtrics_plot_question} -\title{Plot responses to Qualtrics survey questions} -\usage{ -qualtrics_plot_question( - df, - metadata, - question_code_include, - question_code_omit = "zzzzz", - question_type, - title = "", - subtitle = NULL, - subtitle_replace = c(`\\\\[Field.*\\\\]` = "your community", - `Your best estimate is fine\\\\.` = ""), - text_remove = "please describe|please specify", - text_replace = c(a = "a"), - omit_other = TRUE -) -} -\arguments{ -\item{df}{A dataframe of survey responses} - -\item{metadata}{A dataframe of Qualtrics metadata} - -\item{question_code_include}{A regex that matches the question codes to include in the plot} - -\item{question_code_omit}{A regex that matches the question codes to omit from the plot} - -\item{question_type}{one of c("continuous", "checkbox_single", "checkbox_multi", "checkbox_factor")} - -\item{title}{Plot title} - -\item{subtitle}{Plot subtitle} - -\item{subtitle_replace}{A named character vector of regex patterns to replace in the subtitle} - -\item{text_remove}{A regex pattern to select response options to exclude from the plot} - -\item{text_replace}{A named character vector of regex patterns to replace in the response text} - -\item{omit_other}{Logical; whether to omit the "Other" response option. Default is TRUE.} -} -\value{ -A \code{ggplot2} object representing a visualization of survey responses. The plot type varies based on \code{question_type}: -\describe{ -\item{For "continuous"}{A boxplot showing the distribution of numeric responses, with question sub-text on the y-axis and values on the x-axis. Multiple sub-questions are displayed as separate boxplots. -} -\item{For "checkbox_single" or "checkbox_multi"}{A horizontal bar chart showing response counts. Response options are ordered by total count (descending). For "checkbox_multi", bars are stacked by response type.} -\item{For "checkbox_factor"}{A stacked horizontal bar chart showing response counts by factor level, with response options ordered by total count.} -} -The plot uses Urban Institute theming via \code{urbnthemes::theme_urbn_print()} and includes the specified \code{title} and auto-generated or custom \code{subtitle}. -} -\description{ -Plot responses to Qualtrics survey questions -} diff --git a/man/subdivide_linestring.Rd b/man/subdivide_linestring.Rd deleted file mode 100644 index 6eb0f22..0000000 --- a/man/subdivide_linestring.Rd +++ /dev/null @@ -1,27 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/spatial_analysis.R -\name{subdivide_linestring} -\alias{subdivide_linestring} -\title{Subdivide a linestring into segments of a specified length} -\usage{ -subdivide_linestring(line, max_length, crs = 5070) -} -\arguments{ -\item{line}{A linestring or simple feature collection thereof} - -\item{max_length}{The maximum length of each segment. Segments longer than this value will be subdivided; those that are below this threshold will be returned as-is.} - -\item{crs}{The coordinate reference system to which the linestring should be transformed. Default is 5070.} -} -\value{ -An \code{sf} object (simple feature collection) with geometry type LINESTRING. The returned object contains: -\describe{ -\item{row_id}{Integer. The row index from the original input linestring, allowing linkage back to the input data.} -\item{...}{All original attributes from the input \code{line} object are preserved and joined back via \code{row_id}.} -\item{geometry}{LINESTRING geometry. Each segment is at most \code{max_length} units long (in the CRS units). Segments shorter than \code{max_length} in the input are returned unchanged.} -} -The CRS of the output is set to the value specified by the \code{crs} parameter (default: EPSG:5070). -} -\description{ -Subdivide a linestring into segments of a specified length -} diff --git a/renv.lock b/renv.lock index 98da03a..f645eae 100644 --- a/renv.lock +++ b/renv.lock @@ -1,6254 +1,6415 @@ -{ - "R": { - "Version": "4.5.2", - "Repositories": [ - { - "Name": "CRAN", - "URL": "https://cran.rstudio.com" - } - ] - }, - "Packages": { - "BH": { - "Package": "BH", - "Version": "1.90.0-1", - "Source": "Repository", - "Type": "Package", - "Title": "Boost C++ Header Files", - "Date": "2025-12-13", - "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"John W.\", \"Emerson\", role = \"aut\"), person(\"Michael J.\", \"Kane\", role = \"aut\", comment = c(ORCID = \"0000-0003-1899-6662\")))", - "Description": "Boost provides free peer-reviewed portable C++ source libraries. A large part of Boost is provided as C++ template code which is resolved entirely at compile-time without linking. This package aims to provide the most useful subset of Boost libraries for template use among CRAN packages. By placing these libraries in this package, we offer a more efficient distribution system for CRAN as replication of this code in the sources of other packages is avoided. As of release 1.84.0-0, the following Boost libraries are included: 'accumulators' 'algorithm' 'align' 'any' 'atomic' 'beast' 'bimap' 'bind' 'circular_buffer' 'compute' 'concept' 'config' 'container' 'date_time' 'detail' 'dynamic_bitset' 'exception' 'flyweight' 'foreach' 'functional' 'fusion' 'geometry' 'graph' 'heap' 'icl' 'integer' 'interprocess' 'intrusive' 'io' 'iostreams' 'iterator' 'lambda2' 'math' 'move' 'mp11' 'mpl' 'multiprecision' 'numeric' 'pending' 'phoenix' 'polygon' 'preprocessor' 'process' 'propery_tree' 'qvm' 'random' 'range' 'scope_exit' 'smart_ptr' 'sort' 'spirit' 'tuple' 'type_traits' 'typeof' 'unordered' 'url' 'utility' 'uuid'.", - "License": "BSL-1.0", - "URL": "https://github.com/eddelbuettel/bh, https://dirk.eddelbuettel.com/code/bh.html", - "BugReports": "https://github.com/eddelbuettel/bh/issues", - "NeedsCompilation": "no", - "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), John W. Emerson [aut], Michael J. Kane [aut] (ORCID: )", - "Maintainer": "Dirk Eddelbuettel ", - "Repository": "CRAN" - }, - "DBI": { - "Package": "DBI", - "Version": "1.3.0", - "Source": "Repository", - "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" - ], - "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", - "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" - ], - "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", - "Priority": "recommended", - "Date": "2025-02-19", - "Revision": "$Rev: 3681 $", - "Depends": [ - "R (>= 4.4.0)", - "grDevices", - "graphics", - "stats", - "utils" - ], - "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", - "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)" - ], - "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", - "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)" - ], - "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": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" - }, - "RSQLite": { - "Package": "RSQLite", - "Version": "2.4.6", - "Source": "Repository", - "Title": "SQLite Interface for R", - "Date": "2026-02-05", - "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(c(\"David\", \"A.\"), \"James\", role = \"aut\"), person(\"Seth\", \"Falcon\", role = \"aut\"), person(\"D. Richard\", \"Hipp\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Dan\", \"Kennedy\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Joe\", \"Mistachkin\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(, \"SQLite Authors\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Liam\", \"Healy\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"R Consortium\", role = \"fnd\"), person(, \"RStudio\", role = \"cph\") )", - "Description": "Embeds the SQLite database engine in R and provides an interface compliant with the DBI package. The source for the SQLite engine (version 3.51.2) and for various extensions is included. System libraries will never be consulted because this package relies on static linking for the plugins it includes; this also ensures a consistent experience across all installations.", - "License": "LGPL (>= 2.1)", - "URL": "https://rsqlite.r-dbi.org, https://github.com/r-dbi/RSQLite", - "BugReports": "https://github.com/r-dbi/RSQLite/issues", - "Depends": [ - "R (>= 3.1.0)" - ], - "Imports": [ - "bit64", - "blob (>= 1.2.0)", - "DBI (>= 1.2.0)", - "memoise", - "methods", - "pkgconfig", - "rlang" - ], - "Suggests": [ - "callr", - "cli", - "DBItest (>= 1.8.0)", - "decor", - "gert", - "gh", - "hms", - "knitr", - "magrittr", - "rmarkdown", - "rvest", - "testthat (>= 3.0.0)", - "withr", - "xml2" - ], - "LinkingTo": [ - "cpp11 (>= 0.4.0)" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "r-dbi/dbitemplate", - "Config/autostyle/scope": "line_breaks", - "Config/autostyle/strict": "false", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3.9000", - "Collate": "'SQLiteConnection.R' 'SQLKeywords_SQLiteConnection.R' 'SQLiteDriver.R' 'SQLite.R' 'SQLiteResult.R' 'coerce.R' 'compatRowNames.R' 'copy.R' 'cpp11.R' 'datasetsDb.R' 'dbAppendTable_SQLiteConnection.R' 'dbBeginTransaction.R' 'dbBegin_SQLiteConnection.R' 'dbBind_SQLiteResult.R' 'dbClearResult_SQLiteResult.R' 'dbColumnInfo_SQLiteResult.R' 'dbCommit_SQLiteConnection.R' 'dbConnect_SQLiteConnection.R' 'dbConnect_SQLiteDriver.R' 'dbDataType_SQLiteConnection.R' 'dbDataType_SQLiteDriver.R' 'dbDisconnect_SQLiteConnection.R' 'dbExistsTable_SQLiteConnection_Id.R' 'dbExistsTable_SQLiteConnection_character.R' 'dbFetch_SQLiteResult.R' 'dbGetException_SQLiteConnection.R' 'dbGetInfo_SQLiteConnection.R' 'dbGetInfo_SQLiteDriver.R' 'dbGetPreparedQuery.R' 'dbGetPreparedQuery_SQLiteConnection_character_data.frame.R' 'dbGetRowCount_SQLiteResult.R' 'dbGetRowsAffected_SQLiteResult.R' 'dbGetStatement_SQLiteResult.R' 'dbHasCompleted_SQLiteResult.R' 'dbIsValid_SQLiteConnection.R' 'dbIsValid_SQLiteDriver.R' 'dbIsValid_SQLiteResult.R' 'dbListResults_SQLiteConnection.R' 'dbListTables_SQLiteConnection.R' 'dbQuoteIdentifier_SQLiteConnection_SQL.R' 'dbQuoteIdentifier_SQLiteConnection_character.R' 'dbReadTable_SQLiteConnection_character.R' 'dbRemoveTable_SQLiteConnection_character.R' 'dbRollback_SQLiteConnection.R' 'dbSendPreparedQuery.R' 'dbSendPreparedQuery_SQLiteConnection_character_data.frame.R' 'dbSendQuery_SQLiteConnection_character.R' 'dbUnloadDriver_SQLiteDriver.R' 'dbUnquoteIdentifier_SQLiteConnection_SQL.R' 'dbWriteTable_SQLiteConnection_character_character.R' 'dbWriteTable_SQLiteConnection_character_data.frame.R' 'db_bind.R' 'deprecated.R' 'export.R' 'fetch_SQLiteResult.R' 'import-standalone-check_suggested.R' 'import-standalone-purrr.R' 'initExtension.R' 'initRegExp.R' 'isSQLKeyword_SQLiteConnection_character.R' 'make.db.names_SQLiteConnection_character.R' 'pkgconfig.R' 'show_SQLiteConnection.R' 'sqlData_SQLiteConnection.R' 'table.R' 'transactions.R' 'utils.R' 'version.R' 'zzz.R'", - "NeedsCompilation": "yes", - "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], David A. James [aut], Seth Falcon [aut], D. Richard Hipp [ctb] (for the included SQLite sources), Dan Kennedy [ctb] (for the included SQLite sources), Joe Mistachkin [ctb] (for the included SQLite sources), SQLite Authors [ctb] (for the included SQLite sources), Liam Healy [ctb] (for the included SQLite sources), R Consortium [fnd], RStudio [cph]", - "Maintainer": "Kirill Müller ", - "Repository": "CRAN" - }, - "Rcpp": { - "Package": "Rcpp", - "Version": "1.1.1", - "Source": "Repository", - "Title": "Seamless R and C++ Integration", - "Date": "2026-01-07", - "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" - ], - "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", - "MailingList": "rcpp-devel@lists.r-forge.r-project.org", - "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": "https://packagemanager.posit.co/cran/latest" - }, - "Rttf2pt1": { - "Package": "Rttf2pt1", - "Version": "1.3.12", - "Source": "GitHub", - "Title": "'ttf2pt1' Program", - "Author": "Winston Chang, Andrew Weeks, Frank M. Siegert, Mark Heath, Thomas Henlick, Sergey Babkin, Turgut Uyar, Rihardas Hepas, Szalay Tamas, Johan Vromans, Petr Titera, Lei Wang, Chen Xiangyang, Zvezdan Petkovic, Rigel, I. Lee Hetherington", - "Maintainer": "Winston Chang ", - "Description": "Contains the program 'ttf2pt1', for use with the 'extrafont' package. This product includes software developed by the 'TTF2PT1' Project and its contributors.", - "Depends": [ - "R (>= 2.15)" - ], - "License": "file LICENSE", - "URL": "https://github.com/wch/Rttf2pt1", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.3", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "wch", - "RemoteRepo": "Rttf2pt1", - "RemoteRef": "main", - "RemoteSha": "f625326af9783f6ae4d42cc5302dd6f2968e008f" - }, - "S7": { - "Package": "S7", - "Version": "0.2.1", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "arrow": { - "Package": "arrow", - "Version": "23.0.1.1", - "Source": "Repository", - "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.1)" - ], - "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 (>= 0.9-7)", - "glue", - "methods", - "purrr", - "R6", - "rlang (>= 1.0.0)", - "stats", - "tidyselect (>= 1.0.0)", - "utils", - "vctrs" - ], - "RoxygenNote": "7.3.3", - "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.1.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-bit64.R' 'reexports-tidyselect.R' 'schema.R' 'udf.R' 'util.R'", - "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", - "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" - ], - "Language": "en-US", - "NeedsCompilation": "yes", - "Author": "Jeroen Ooms [aut, cre] ()", - "Maintainer": "Jeroen Ooms ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "assertthat": { - "Package": "assertthat", - "Version": "0.2.1", - "Source": "Repository", - "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" - ], - "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" - }, - "backports": { - "Package": "backports", - "Version": "1.5.0", - "Source": "Repository", - "Type": "Package", - "Title": "Reimplementations of Functions Introduced Since R-3.0.0", - "Authors@R": "c( person(\"Michel\", \"Lang\", NULL, \"michellang@gmail.com\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Duncan\", \"Murdoch\", NULL, \"murdoch.duncan@gmail.com\", role = c(\"aut\")), person(\"R Core Team\", role = \"aut\"))", - "Maintainer": "Michel Lang ", - "Description": "Functions introduced or changed since R v3.0.0 are re-implemented in this package. The backports are conditionally exported in order to let R resolve the function name to either the implemented backport, or the respective base version, if available. Package developers can make use of new functions or arguments by selectively importing specific backports to support older installations.", - "URL": "https://github.com/r-lib/backports", - "BugReports": "https://github.com/r-lib/backports/issues", - "License": "GPL-2 | GPL-3", - "NeedsCompilation": "yes", - "ByteCompile": "yes", - "Depends": [ - "R (>= 3.0.0)" - ], - "Encoding": "UTF-8", - "RoxygenNote": "7.3.1", - "Author": "Michel Lang [cre, aut] (), Duncan Murdoch [aut], R Core Team [aut]", - "Repository": "CRAN" - }, - "base64enc": { - "Package": "base64enc", - "Version": "0.1-6", - "Source": "Repository", - "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" - ], - "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", - "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)" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "bit64": { - "Package": "bit64", - "Version": "4.6.0-1", - "Source": "Repository", - "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\") )", - "Depends": [ - "R (>= 3.4.0)", - "bit (>= 4.0.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", - "Encoding": "UTF-8", - "Imports": [ - "graphics", - "methods", - "stats", - "utils" - ], - "Suggests": [ - "testthat (>= 3.0.3)", - "withr" - ], - "Config/testthat/edition": "3", - "Config/needs/development": "testthat", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "yes", - "Author": "Michael Chirico [aut, cre], Jens Oehlschlägel [aut], Leonardo Silvestri [ctb], Ofek Shilon [ctb]", - "Maintainer": "Michael Chirico ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "blob": { - "Package": "blob", - "Version": "1.3.0", - "Source": "Repository", - "Title": "A Simple S3 Class for Representing Vectors of Binary Data ('BLOBS')", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = \"cre\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", - "Description": "R's raw vector is useful for storing a single binary object. What if you want to put a vector of them in a data frame? The 'blob' package provides the blob object, a list of raw vectors, suitable for use as a column in data frame.", - "License": "MIT + file LICENSE", - "URL": "https://blob.tidyverse.org, https://github.com/tidyverse/blob", - "BugReports": "https://github.com/tidyverse/blob/issues", - "Imports": [ - "methods", - "rlang", - "vctrs (>= 0.2.1)" - ], - "Suggests": [ - "covr", - "crayon", - "pillar (>= 1.2.1)", - "testthat (>= 3.0.0)" - ], - "Config/autostyle/scope": "line_breaks", - "Config/autostyle/strict": "false", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3.9000", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut], Kirill Müller [cre], RStudio [cph, fnd]", - "Maintainer": "Kirill Müller ", - "Repository": "CRAN" - }, - "brio": { - "Package": "brio", - "Version": "1.1.5", - "Source": "Repository", - "Title": "Basic R Input Output", - "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Functions to handle basic input output, these functions always read and write UTF-8 (8-bit Unicode Transformation Format) files and provide more explicit control over line endings.", - "License": "MIT + file LICENSE", - "URL": "https://brio.r-lib.org, https://github.com/r-lib/brio", - "BugReports": "https://github.com/r-lib/brio/issues", - "Depends": [ - "R (>= 3.6)" - ], - "Suggests": [ - "covr", - "testthat (>= 3.0.0)" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.3", - "NeedsCompilation": "yes", - "Author": "Jim Hester [aut] (), Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, - "broom": { - "Package": "broom", - "Version": "1.0.12", - "Source": "Repository", - "Type": "Package", - "Title": "Convert Statistical Objects into Tidy Tibbles", - "Authors@R": "c( person(\"David\", \"Robinson\", , \"admiral.david@gmail.com\", role = \"aut\"), person(\"Alex\", \"Hayes\", , \"alexpghayes@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4985-5160\")), person(\"Simon\", \"Couch\", , \"simon.couch@posit.co\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-5676-5107\")), person(\"Emil\", \"Hvitfeldt\", , \"emil.hvitfeldt@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0679-1945\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Indrajeet\", \"Patil\", , \"patilindrajeet.science@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1995-6531\")), person(\"Derek\", \"Chiu\", , \"dchiu@bccrc.ca\", role = \"ctb\"), person(\"Matthieu\", \"Gomez\", , \"mattg@princeton.edu\", role = \"ctb\"), person(\"Boris\", \"Demeshev\", , \"boris.demeshev@gmail.com\", role = \"ctb\"), person(\"Dieter\", \"Menne\", , \"dieter.menne@menne-biomed.de\", role = \"ctb\"), person(\"Benjamin\", \"Nutter\", , \"nutter@battelle.org\", role = \"ctb\"), person(\"Luke\", \"Johnston\", , \"luke.johnston@mail.utoronto.ca\", role = \"ctb\"), person(\"Ben\", \"Bolker\", , \"bolker@mcmaster.ca\", role = \"ctb\"), person(\"Francois\", \"Briatte\", , \"f.briatte@gmail.com\", role = \"ctb\"), person(\"Jeffrey\", \"Arnold\", , \"jeffrey.arnold@gmail.com\", role = \"ctb\"), person(\"Jonah\", \"Gabry\", , \"jsg2201@columbia.edu\", role = \"ctb\"), person(\"Luciano\", \"Selzer\", , \"luciano.selzer@gmail.com\", role = \"ctb\"), person(\"Gavin\", \"Simpson\", , \"ucfagls@gmail.com\", role = \"ctb\"), person(\"Jens\", \"Preussner\", , \"jens.preussner@mpi-bn.mpg.de\", role = \"ctb\"), person(\"Jay\", \"Hesselberth\", , \"jay.hesselberth@gmail.com\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"ctb\"), person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = \"ctb\"), person(\"Alessandro\", \"Gasparini\", , \"ag475@leicester.ac.uk\", role = \"ctb\"), person(\"Lukasz\", \"Komsta\", , \"lukasz.komsta@umlub.pl\", role = \"ctb\"), person(\"Frederick\", \"Novometsky\", role = \"ctb\"), person(\"Wilson\", \"Freitas\", role = \"ctb\"), person(\"Michelle\", \"Evans\", role = \"ctb\"), person(\"Jason Cory\", \"Brunson\", , \"cornelioid@gmail.com\", role = \"ctb\"), person(\"Simon\", \"Jackson\", , \"drsimonjackson@gmail.com\", role = \"ctb\"), person(\"Ben\", \"Whalley\", , \"ben.whalley@plymouth.ac.uk\", role = \"ctb\"), person(\"Karissa\", \"Whiting\", , \"karissa.whiting@gmail.com\", role = \"ctb\"), person(\"Yves\", \"Rosseel\", , \"yrosseel@gmail.com\", role = \"ctb\"), person(\"Michael\", \"Kuehn\", , \"mkuehn10@gmail.com\", role = \"ctb\"), person(\"Jorge\", \"Cimentada\", , \"cimentadaj@gmail.com\", role = \"ctb\"), person(\"Erle\", \"Holgersen\", , \"erle.holgersen@gmail.com\", role = \"ctb\"), person(\"Karl\", \"Dunkle Werner\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0523-7309\")), person(\"Ethan\", \"Christensen\", , \"christensen.ej@gmail.com\", role = \"ctb\"), person(\"Steven\", \"Pav\", , \"shabbychef@gmail.com\", role = \"ctb\"), person(\"Paul\", \"PJ\", , \"pjpaul.stephens@gmail.com\", role = \"ctb\"), person(\"Ben\", \"Schneider\", , \"benjamin.julius.schneider@gmail.com\", role = \"ctb\"), person(\"Patrick\", \"Kennedy\", , \"pkqstr@protonmail.com\", role = \"ctb\"), person(\"Lily\", \"Medina\", , \"lilymiru@gmail.com\", role = \"ctb\"), person(\"Brian\", \"Fannin\", , \"captain@pirategrunt.com\", role = \"ctb\"), person(\"Jason\", \"Muhlenkamp\", , \"jason.muhlenkamp@gmail.com\", role = \"ctb\"), person(\"Matt\", \"Lehman\", role = \"ctb\"), person(\"Bill\", \"Denney\", , \"wdenney@humanpredictions.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Nic\", \"Crane\", role = \"ctb\"), person(\"Andrew\", \"Bates\", role = \"ctb\"), person(\"Vincent\", \"Arel-Bundock\", , \"vincent.arel-bundock@umontreal.ca\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2042-7063\")), person(\"Hideaki\", \"Hayashi\", role = \"ctb\"), person(\"Luis\", \"Tobalina\", role = \"ctb\"), person(\"Annie\", \"Wang\", , \"anniewang.uc@gmail.com\", role = \"ctb\"), person(\"Wei Yang\", \"Tham\", , \"weiyang.tham@gmail.com\", role = \"ctb\"), person(\"Clara\", \"Wang\", , \"clara.wang.94@gmail.com\", role = \"ctb\"), person(\"Abby\", \"Smith\", , \"als1@u.northwestern.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3207-0375\")), person(\"Jasper\", \"Cooper\", , \"jaspercooper@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8639-3188\")), person(\"E Auden\", \"Krauska\", , \"krauskae@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-1466-5850\")), person(\"Alex\", \"Wang\", , \"x249wang@uwaterloo.ca\", role = \"ctb\"), person(\"Malcolm\", \"Barrett\", , \"malcolmbarrett@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Charles\", \"Gray\", , \"charlestigray@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9978-011X\")), person(\"Jared\", \"Wilber\", role = \"ctb\"), person(\"Vilmantas\", \"Gegzna\", , \"GegznaV@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9500-5167\")), person(\"Eduard\", \"Szoecs\", , \"eduardszoecs@gmail.com\", role = \"ctb\"), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Angus\", \"Moore\", , \"angusmoore9@gmail.com\", role = \"ctb\"), person(\"Nick\", \"Williams\", , \"ntwilliams.personal@gmail.com\", role = \"ctb\"), person(\"Marius\", \"Barth\", , \"marius.barth.uni.koeln@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3421-6665\")), person(\"Bruna\", \"Wundervald\", , \"brunadaviesw@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8163-220X\")), person(\"Joyce\", \"Cahoon\", , \"joyceyu48@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7217-4702\")), person(\"Grant\", \"McDermott\", , \"grantmcd@uoregon.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7883-8573\")), person(\"Kevin\", \"Zarca\", , \"kevin.zarca@gmail.com\", role = \"ctb\"), person(\"Shiro\", \"Kuriwaki\", , \"shirokuriwaki@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5687-2647\")), person(\"Lukas\", \"Wallrich\", , \"lukas.wallrich@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2121-5177\")), person(\"James\", \"Martherus\", , \"james@martherus.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8285-3300\")), person(\"Chuliang\", \"Xiao\", , \"cxiao@umich.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8466-9398\")), person(\"Joseph\", \"Larmarange\", , \"joseph@larmarange.net\", role = \"ctb\"), person(\"Max\", \"Kuhn\", , \"max@posit.co\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", , \"michal2992@gmail.com\", role = \"ctb\"), person(\"Hakon\", \"Malmedal\", , \"hmalmedal@gmail.com\", role = \"ctb\"), person(\"Clara\", \"Wang\", role = \"ctb\"), person(\"Sergio\", \"Oller\", , \"sergioller@gmail.com\", role = \"ctb\"), person(\"Luke\", \"Sonnet\", , \"luke.sonnet@gmail.com\", role = \"ctb\"), person(\"Jim\", \"Hester\", , \"jim.hester@posit.co\", role = \"ctb\"), person(\"Ben\", \"Schneider\", , \"benjamin.julius.schneider@gmail.com\", role = \"ctb\"), person(\"Bernie\", \"Gray\", , \"bfgray3@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9190-6032\")), person(\"Mara\", \"Averick\", , \"mara@posit.co\", role = \"ctb\"), person(\"Aaron\", \"Jacobs\", , \"atheriel@gmail.com\", role = \"ctb\"), person(\"Andreas\", \"Bender\", , \"bender.at.R@gmail.com\", role = \"ctb\"), person(\"Sven\", \"Templer\", , \"sven.templer@gmail.com\", role = \"ctb\"), person(\"Paul-Christian\", \"Buerkner\", , \"paul.buerkner@gmail.com\", role = \"ctb\"), person(\"Matthew\", \"Kay\", , \"mjskay@umich.edu\", role = \"ctb\"), person(\"Erwan\", \"Le Pennec\", , \"lepennec@gmail.com\", role = \"ctb\"), person(\"Johan\", \"Junkka\", , \"johan.junkka@umu.se\", role = \"ctb\"), person(\"Hao\", \"Zhu\", , \"haozhu233@gmail.com\", role = \"ctb\"), person(\"Benjamin\", \"Soltoff\", , \"soltoffbc@uchicago.edu\", role = \"ctb\"), person(\"Zoe\", \"Wilkinson Saldana\", , \"zoewsaldana@gmail.com\", role = \"ctb\"), person(\"Tyler\", \"Littlefield\", , \"tylurp1@gmail.com\", role = \"ctb\"), person(\"Charles T.\", \"Gray\", , \"charlestigray@gmail.com\", role = \"ctb\"), person(\"Shabbh E.\", \"Banks\", role = \"ctb\"), person(\"Serina\", \"Robinson\", , \"robi0916@umn.edu\", role = \"ctb\"), person(\"Roger\", \"Bivand\", , \"Roger.Bivand@nhh.no\", role = \"ctb\"), person(\"Riinu\", \"Ots\", , \"riinuots@gmail.com\", role = \"ctb\"), person(\"Nicholas\", \"Williams\", , \"ntwilliams.personal@gmail.com\", role = \"ctb\"), person(\"Nina\", \"Jakobsen\", role = \"ctb\"), person(\"Michael\", \"Weylandt\", , \"michael.weylandt@gmail.com\", role = \"ctb\"), person(\"Lisa\", \"Lendway\", , \"llendway@macalester.edu\", role = \"ctb\"), person(\"Karl\", \"Hailperin\", , \"khailper@gmail.com\", role = \"ctb\"), person(\"Josue\", \"Rodriguez\", , \"jerrodriguez@ucdavis.edu\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", , \"jenny@posit.co\", role = \"ctb\"), person(\"Chris\", \"Jarvis\", , \"Christopher1.jarvis@gmail.com\", role = \"ctb\"), person(\"Greg\", \"Macfarlane\", , \"gregmacfarlane@gmail.com\", role = \"ctb\"), person(\"Brian\", \"Mannakee\", , \"bmannakee@gmail.com\", role = \"ctb\"), person(\"Drew\", \"Tyre\", , \"atyre2@unl.edu\", role = \"ctb\"), person(\"Shreyas\", \"Singh\", , \"shreyas.singh.298@gmail.com\", role = \"ctb\"), person(\"Laurens\", \"Geffert\", , \"laurensgeffert@gmail.com\", role = \"ctb\"), person(\"Hong\", \"Ooi\", , \"hongooi@microsoft.com\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", , \"henrikb@braju.com\", role = \"ctb\"), person(\"Eduard\", \"Szocs\", , \"eduardszoecs@gmail.com\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", , \"davidhughjones@gmail.com\", role = \"ctb\"), person(\"Matthieu\", \"Stigler\", , \"Matthieu.Stigler@gmail.com\", role = \"ctb\"), person(\"Hugo\", \"Tavares\", , \"hm533@cam.ac.uk\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9373-2726\")), person(\"R. Willem\", \"Vervoort\", , \"Willemvervoort@gmail.com\", role = \"ctb\"), person(\"Brenton M.\", \"Wiernik\", , \"brenton@wiernik.org\", role = \"ctb\"), person(\"Josh\", \"Yamamoto\", , \"joshuayamamoto5@gmail.com\", role = \"ctb\"), person(\"Jasme\", \"Lee\", role = \"ctb\"), person(\"Taren\", \"Sanders\", , \"taren.sanders@acu.edu.au\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4504-6008\")), person(\"Ilaria\", \"Prosdocimi\", , \"prosdocimi.ilaria@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8565-094X\")), person(\"Daniel D.\", \"Sjoberg\", , \"danield.sjoberg@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0862-2018\")), person(\"Alex\", \"Reinhart\", , \"areinhar@stat.cmu.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-6658-514X\")) )", - "Description": "Summarizes key information about statistical objects in tidy tibbles. This makes it easy to report results, create plots and consistently work with large numbers of models at once. Broom provides three verbs that each provide different types of information about a model. tidy() summarizes information about model components such as coefficients of a regression. glance() reports information about an entire model, such as goodness of fit measures like AIC and BIC. augment() adds information about individual observations to a dataset, such as fitted values or influence measures.", - "License": "MIT + file LICENSE", - "URL": "https://broom.tidymodels.org/, https://github.com/tidymodels/broom", - "BugReports": "https://github.com/tidymodels/broom/issues", - "Depends": [ - "R (>= 4.1)" - ], - "Imports": [ - "backports", - "cli", - "dplyr (>= 1.0.0)", - "generics (>= 0.0.2)", - "glue", - "lifecycle", - "purrr", - "rlang (>= 1.1.0)", - "stringr", - "tibble (>= 3.0.0)", - "tidyr (>= 1.0.0)" - ], - "Suggests": [ - "AER", - "AUC", - "bbmle", - "betareg (>= 3.2-1)", - "biglm", - "binGroup", - "boot", - "btergm (>= 1.10.6)", - "car (>= 3.1-2)", - "carData", - "caret", - "cluster", - "cmprsk", - "coda", - "covr", - "drc", - "e1071", - "emmeans", - "epiR (>= 2.0.85)", - "ergm (>= 3.10.4)", - "fixest (>= 0.9.0)", - "gam (>= 1.15)", - "gee", - "geepack", - "ggplot2", - "glmnet", - "glmnetUtils", - "gmm", - "Hmisc", - "interp", - "irlba", - "joineRML", - "Kendall", - "knitr", - "ks", - "Lahman", - "lavaan (>= 0.6.18)", - "leaps", - "lfe", - "lm.beta", - "lme4", - "lmodel2", - "lmtest (>= 0.9.38)", - "lsmeans", - "maps", - "margins", - "MASS", - "mclust", - "mediation", - "metafor", - "mfx", - "mgcv", - "mlogit", - "modeldata", - "modeltests (>= 0.1.6)", - "muhaz", - "multcomp", - "network", - "nnet", - "ordinal", - "plm", - "poLCA", - "psych", - "quantreg", - "rmarkdown", - "robust", - "robustbase", - "rsample", - "sandwich", - "spatialreg", - "spdep (>= 1.1)", - "speedglm", - "spelling", - "stats4", - "survey", - "survival (>= 3.6-4)", - "systemfit", - "testthat (>= 3.0.0)", - "tseries", - "vars", - "zoo" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/usethis/last-upkeep": "2025-04-25", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.3.3", - "Collate": "'aaa-documentation-helper.R' 'null-and-default.R' 'aer.R' 'auc.R' 'base.R' 'bbmle.R' 'betareg.R' 'biglm.R' 'bingroup.R' 'boot.R' 'broom-package.R' 'broom.R' 'btergm.R' 'car.R' 'caret.R' 'cluster.R' 'cmprsk.R' 'data-frame.R' 'deprecated-0-7-0.R' 'drc.R' 'emmeans.R' 'epiR.R' 'ergm.R' 'fixest.R' 'gam.R' 'geepack.R' 'glmnet-cv-glmnet.R' 'glmnet-glmnet.R' 'gmm.R' 'hmisc.R' 'import-standalone-obj-type.R' 'import-standalone-types-check.R' 'joinerml.R' 'kendall.R' 'ks.R' 'lavaan.R' 'leaps.R' 'lfe.R' 'list-irlba.R' 'list-optim.R' 'list-svd.R' 'list-xyz.R' 'list.R' 'lm-beta.R' 'lmodel2.R' 'lmtest.R' 'maps.R' 'margins.R' 'mass-fitdistr.R' 'mass-negbin.R' 'mass-polr.R' 'mass-ridgelm.R' 'stats-lm.R' 'mass-rlm.R' 'mclust.R' 'mediation.R' 'metafor.R' 'mfx.R' 'mgcv.R' 'mlogit.R' 'muhaz.R' 'multcomp.R' 'nnet.R' 'nobs.R' 'ordinal-clm.R' 'ordinal-clmm.R' 'plm.R' 'polca.R' 'psych.R' 'stats-nls.R' 'quantreg-nlrq.R' 'quantreg-rq.R' 'quantreg-rqs.R' 'robust-glmrob.R' 'robust-lmrob.R' 'robustbase-glmrob.R' 'robustbase-lmrob.R' 'sp.R' 'spdep.R' 'speedglm-speedglm.R' 'speedglm-speedlm.R' 'stats-anova.R' 'stats-arima.R' 'stats-decompose.R' 'stats-factanal.R' 'stats-glm.R' 'stats-htest.R' 'stats-kmeans.R' 'stats-loess.R' 'stats-mlm.R' 'stats-prcomp.R' 'stats-smooth.spline.R' 'stats-summary-lm.R' 'stats-time-series.R' 'survey.R' 'survival-aareg.R' 'survival-cch.R' 'survival-coxph.R' 'survival-pyears.R' 'survival-survdiff.R' 'survival-survexp.R' 'survival-survfit.R' 'survival-survreg.R' 'systemfit.R' 'tseries.R' 'utilities.R' 'vars.R' 'zoo.R' 'zzz.R'", - "NeedsCompilation": "no", - "Author": "David Robinson [aut], Alex Hayes [aut] (ORCID: ), Simon Couch [aut] (ORCID: ), Emil Hvitfeldt [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Indrajeet Patil [ctb] (ORCID: ), Derek Chiu [ctb], Matthieu Gomez [ctb], Boris Demeshev [ctb], Dieter Menne [ctb], Benjamin Nutter [ctb], Luke Johnston [ctb], Ben Bolker [ctb], Francois Briatte [ctb], Jeffrey Arnold [ctb], Jonah Gabry [ctb], Luciano Selzer [ctb], Gavin Simpson [ctb], Jens Preussner [ctb], Jay Hesselberth [ctb], Hadley Wickham [ctb], Matthew Lincoln [ctb], Alessandro Gasparini [ctb], Lukasz Komsta [ctb], Frederick Novometsky [ctb], Wilson Freitas [ctb], Michelle Evans [ctb], Jason Cory Brunson [ctb], Simon Jackson [ctb], Ben Whalley [ctb], Karissa Whiting [ctb], Yves Rosseel [ctb], Michael Kuehn [ctb], Jorge Cimentada [ctb], Erle Holgersen [ctb], Karl Dunkle Werner [ctb] (ORCID: ), Ethan Christensen [ctb], Steven Pav [ctb], Paul PJ [ctb], Ben Schneider [ctb], Patrick Kennedy [ctb], Lily Medina [ctb], Brian Fannin [ctb], Jason Muhlenkamp [ctb], Matt Lehman [ctb], Bill Denney [ctb] (ORCID: ), Nic Crane [ctb], Andrew Bates [ctb], Vincent Arel-Bundock [ctb] (ORCID: ), Hideaki Hayashi [ctb], Luis Tobalina [ctb], Annie Wang [ctb], Wei Yang Tham [ctb], Clara Wang [ctb], Abby Smith [ctb] (ORCID: ), Jasper Cooper [ctb] (ORCID: ), E Auden Krauska [ctb] (ORCID: ), Alex Wang [ctb], Malcolm Barrett [ctb] (ORCID: ), Charles Gray [ctb] (ORCID: ), Jared Wilber [ctb], Vilmantas Gegzna [ctb] (ORCID: ), Eduard Szoecs [ctb], Frederik Aust [ctb] (ORCID: ), Angus Moore [ctb], Nick Williams [ctb], Marius Barth [ctb] (ORCID: ), Bruna Wundervald [ctb] (ORCID: ), Joyce Cahoon [ctb] (ORCID: ), Grant McDermott [ctb] (ORCID: ), Kevin Zarca [ctb], Shiro Kuriwaki [ctb] (ORCID: ), Lukas Wallrich [ctb] (ORCID: ), James Martherus [ctb] (ORCID: ), Chuliang Xiao [ctb] (ORCID: ), Joseph Larmarange [ctb], Max Kuhn [ctb], Michal Bojanowski [ctb], Hakon Malmedal [ctb], Clara Wang [ctb], Sergio Oller [ctb], Luke Sonnet [ctb], Jim Hester [ctb], Ben Schneider [ctb], Bernie Gray [ctb] (ORCID: ), Mara Averick [ctb], Aaron Jacobs [ctb], Andreas Bender [ctb], Sven Templer [ctb], Paul-Christian Buerkner [ctb], Matthew Kay [ctb], Erwan Le Pennec [ctb], Johan Junkka [ctb], Hao Zhu [ctb], Benjamin Soltoff [ctb], Zoe Wilkinson Saldana [ctb], Tyler Littlefield [ctb], Charles T. Gray [ctb], Shabbh E. Banks [ctb], Serina Robinson [ctb], Roger Bivand [ctb], Riinu Ots [ctb], Nicholas Williams [ctb], Nina Jakobsen [ctb], Michael Weylandt [ctb], Lisa Lendway [ctb], Karl Hailperin [ctb], Josue Rodriguez [ctb], Jenny Bryan [ctb], Chris Jarvis [ctb], Greg Macfarlane [ctb], Brian Mannakee [ctb], Drew Tyre [ctb], Shreyas Singh [ctb], Laurens Geffert [ctb], Hong Ooi [ctb], Henrik Bengtsson [ctb], Eduard Szocs [ctb], David Hugh-Jones [ctb], Matthieu Stigler [ctb], Hugo Tavares [ctb] (ORCID: ), R. Willem Vervoort [ctb], Brenton M. Wiernik [ctb], Josh Yamamoto [ctb], Jasme Lee [ctb], Taren Sanders [ctb] (ORCID: ), Ilaria Prosdocimi [ctb] (ORCID: ), Daniel D. Sjoberg [ctb] (ORCID: ), Alex Reinhart [ctb] (ORCID: )", - "Maintainer": "Emil Hvitfeldt ", - "Repository": "CRAN" - }, - "bslib": { - "Package": "bslib", - "Version": "0.10.0", - "Source": "Repository", - "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 (>= 1.1.1)", - "grDevices", - "htmltools (>= 0.5.8)", - "jquerylib (>= 0.1.3)", - "jsonlite", - "lifecycle", - "memoise (>= 2.0.1)", - "mime", - "rlang", - "sass (>= 0.4.9)" - ], - "Suggests": [ - "brand.yml", - "bsicons", - "curl", - "fontawesome", - "future", - "ggplot2", - "knitr", - "lattice", - "magrittr", - "rappdirs", - "rmarkdown (>= 2.7)", - "shiny (>= 1.11.1)", - "testthat", - "thematic", - "tools", - "utils", - "withr", - "yaml" - ], - "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/testthat/edition": "3", - "Config/testthat/parallel": "true", - "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "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' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'toast.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", - "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)" - ], - "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" - }, - "callr": { - "Package": "callr", - "Version": "3.7.6", - "Source": "Repository", - "Title": "Call R from R", - "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\")), person(\"Ascent Digital Services\", role = c(\"cph\", \"fnd\")) )", - "Description": "It is sometimes useful to perform a computation in a separate R process, without affecting the current R process at all. This packages does exactly that.", - "License": "MIT + file LICENSE", - "URL": "https://callr.r-lib.org, https://github.com/r-lib/callr", - "BugReports": "https://github.com/r-lib/callr/issues", - "Depends": [ - "R (>= 3.4)" - ], - "Imports": [ - "processx (>= 3.6.1)", - "R6", - "utils" - ], - "Suggests": [ - "asciicast (>= 2.3.1)", - "cli (>= 1.1.0)", - "mockery", - "ps", - "rprojroot", - "spelling", - "testthat (>= 3.2.0)", - "withr (>= 2.3.0)" - ], - "Config/Needs/website": "r-lib/asciicast, glue, htmlwidgets, igraph, tibble, tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.3.1.9000", - "NeedsCompilation": "no", - "Author": "Gábor Csárdi [aut, cre, cph] (), Winston Chang [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, - "cellranger": { - "Package": "cellranger", - "Version": "1.1.0", - "Source": "Repository", - "Title": "Translate Spreadsheet Cell Ranges to Rows and Columns", - "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@stat.ubc.ca\", c(\"cre\", \"aut\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", \"ctb\") )", - "Description": "Helper functions to work with spreadsheets and the \"A1:D10\" style of cell range specification.", - "Depends": [ - "R (>= 3.0.0)" - ], - "License": "MIT + file LICENSE", - "LazyData": "true", - "URL": "https://github.com/rsheets/cellranger", - "BugReports": "https://github.com/rsheets/cellranger/issues", - "Suggests": [ - "covr", - "testthat (>= 1.0.0)", - "knitr", - "rmarkdown" - ], - "RoxygenNote": "5.0.1.9000", - "VignetteBuilder": "knitr", - "Imports": [ - "rematch", - "tibble" - ], - "NeedsCompilation": "no", - "Author": "Jennifer Bryan [cre, aut], Hadley Wickham [ctb]", - "Maintainer": "Jennifer Bryan ", - "Repository": "CRAN" - }, - "censusapi": { - "Package": "censusapi", - "Version": "0.9.0", - "Source": "Repository", - "Title": "Retrieve Data from the Census APIs", - "Authors@R": "person(\"Hannah\", \"Recht\", email = \"censusapi.rstats@gmail.com\", role = c(\"aut\", \"cre\"))", - "Description": "A wrapper for the U.S. Census Bureau APIs that returns data frames of Census data and metadata. Available datasets include the Decennial Census, American Community Survey, Small Area Health Insurance Estimates, Small Area Income and Poverty Estimates, Population Estimates and Projections, and more.", - "URL": "https://www.hrecht.com/censusapi/, https://github.com/hrecht/censusapi", - "BugReports": "https://github.com/hrecht/censusapi/issues", - "Depends": [ - "R (>= 3.5)" - ], - "License": "GPL-3", - "LazyData": "true", - "RoxygenNote": "7.3.2", - "Imports": [ - "httr", - "jsonlite", - "rlang" - ], - "Suggests": [ - "knitr", - "rmarkdown" - ], - "Encoding": "UTF-8", - "VignetteBuilder": "knitr", - "NeedsCompilation": "no", - "Author": "Hannah Recht [aut, cre]", - "Maintainer": "Hannah Recht ", - "Repository": "RSPM" - }, - "class": { - "Package": "class", - "Version": "7.3-23", - "Source": "Repository", - "Priority": "recommended", - "Date": "2025-01-01", - "Depends": [ - "R (>= 3.0.0)", - "stats", - "utils" - ], - "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", - "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", - "e1071", - "class", - "KernSmooth" - ], - "Suggests": [ - "spData (>= 0.2.6.2)", - "units", - "knitr", - "rmarkdown", - "tinytest" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "cli": { - "Package": "cli", - "Version": "3.6.5", - "Source": "Repository", - "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\")) )", - "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" - ], - "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", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "yes", - "Author": "Gábor Csárdi [aut, cre], Hadley Wickham [ctb], Kirill Müller [ctb], Salim Brüggemann [ctb] (), Posit Software, PBC [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, - "clipr": { - "Package": "clipr", - "Version": "0.8.0", - "Source": "Repository", - "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" - ], - "Suggests": [ - "covr", - "knitr", - "rmarkdown", - "rstudioapi (>= 0.5)", - "testthat (>= 2.0.0)" - ], - "VignetteBuilder": "knitr", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.1.2", - "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] (), Louis Maddox [ctb], Steve Simpson [ctb], Jennifer Bryan [ctb]", - "Maintainer": "Matthew Lincoln ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "conflicted": { - "Package": "conflicted", - "Version": "1.2.0", - "Source": "Repository", - "Title": "An Alternative Conflict Resolution Strategy", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", - "Description": "R's default conflict management system gives the most recently loaded package precedence. This can make it hard to detect conflicts, particularly when they arise because a package update creates ambiguity that did not previously exist. 'conflicted' takes a different approach, making every conflict an error and forcing you to choose which function to use.", - "License": "MIT + file LICENSE", - "URL": "https://conflicted.r-lib.org/, https://github.com/r-lib/conflicted", - "BugReports": "https://github.com/r-lib/conflicted/issues", - "Depends": [ - "R (>= 3.2)" - ], - "Imports": [ - "cli (>= 3.4.0)", - "memoise", - "rlang (>= 1.0.0)" - ], - "Suggests": [ - "callr", - "covr", - "dplyr", - "Matrix", - "methods", - "pkgload", - "testthat (>= 3.0.0)", - "withr" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.3", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], RStudio [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "coro": { - "Package": "coro", - "Version": "1.1.0", - "Source": "Repository", - "Title": "'Coroutines' for R", - "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Provides 'coroutines' for R, a family of functions that can be suspended and resumed later on. This includes 'async' functions (which await) and generators (which yield). 'Async' functions are based on the concurrency framework of the 'promises' package. Generators are based on a dependency free iteration protocol defined in 'coro' and are compatible with iterators from the 'reticulate' package.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/r-lib/coro, https://coro.r-lib.org/", - "BugReports": "https://github.com/r-lib/coro/issues", - "Depends": [ - "R (>= 3.5.0)" - ], - "Imports": [ - "rlang (>= 0.4.12)" - ], - "Suggests": [ - "knitr", - "later (>= 1.1.0)", - "magrittr (>= 2.0.0)", - "promises", - "reticulate", - "rmarkdown", - "testthat (>= 3.0.0)" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "no", - "Author": "Lionel Henry [aut, cre], Posit Software, PBC [cph, fnd]", - "Maintainer": "Lionel Henry ", - "Repository": "RSPM" - }, - "cpp11": { - "Package": "cpp11", - "Version": "0.5.3", - "Source": "Repository", - "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" - ], - "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.2", - "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": "https://packagemanager.posit.co/cran/latest" - }, - "crayon": { - "Package": "crayon", - "Version": "1.5.3", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "curl": { - "Package": "curl", - "Version": "7.0.0", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "data.table": { - "Package": "data.table", - "Version": "1.18.2.1", - "Source": "Repository", - "Title": "Extension of `data.frame`", - "Depends": [ - "R (>= 3.4.0)" - ], - "Imports": [ - "methods" - ], - "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\") )", - "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]", - "Maintainer": "Tyson Barrett ", - "Repository": "RSPM" - }, - "dbplyr": { - "Package": "dbplyr", - "Version": "2.5.2", - "Source": "Repository", - "Type": "Package", - "Title": "A 'dplyr' Back End for Databases", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Edgar\", \"Ruiz\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "A 'dplyr' back end for databases that allows you to work with remote database tables as if they are in-memory data frames. Basic features works with any database that has a 'DBI' back end; more advanced features require 'SQL' translation to be provided by the package author.", - "License": "MIT + file LICENSE", - "URL": "https://dbplyr.tidyverse.org/, https://github.com/tidyverse/dbplyr", - "BugReports": "https://github.com/tidyverse/dbplyr/issues", - "Depends": [ - "R (>= 3.6)" - ], - "Imports": [ - "blob (>= 1.2.0)", - "cli (>= 3.6.1)", - "DBI (>= 1.1.3)", - "dplyr (>= 1.1.2)", - "glue (>= 1.6.2)", - "lifecycle (>= 1.0.3)", - "magrittr", - "methods", - "pillar (>= 1.9.0)", - "purrr (>= 1.0.1)", - "R6 (>= 2.2.2)", - "rlang (>= 1.1.1)", - "tibble (>= 3.2.1)", - "tidyr (>= 1.3.0)", - "tidyselect (>= 1.2.1)", - "utils", - "vctrs (>= 0.6.3)", - "withr (>= 2.5.0)" - ], - "Suggests": [ - "bit64", - "covr", - "knitr", - "Lahman", - "nycflights13", - "odbc (>= 1.4.2)", - "RMariaDB (>= 1.2.2)", - "rmarkdown", - "RPostgres (>= 1.4.5)", - "RPostgreSQL", - "RSQLite (>= 2.3.8)", - "testthat (>= 3.1.10)" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "TRUE", - "Encoding": "UTF-8", - "Language": "en-gb", - "RoxygenNote": "7.3.3", - "Collate": "'db-sql.R' 'utils-check.R' 'import-standalone-types-check.R' 'import-standalone-obj-type.R' 'utils.R' 'sql.R' 'escape.R' 'translate-sql-cut.R' 'translate-sql-quantile.R' 'translate-sql-string.R' 'translate-sql-paste.R' 'translate-sql-helpers.R' 'translate-sql-window.R' 'translate-sql-conditional.R' 'backend-.R' 'backend-access.R' 'backend-hana.R' 'backend-hive.R' 'backend-impala.R' 'verb-copy-to.R' 'backend-mssql.R' 'backend-mysql.R' 'backend-odbc.R' 'backend-oracle.R' 'backend-postgres.R' 'backend-postgres-old.R' 'backend-redshift.R' 'backend-snowflake.R' 'backend-spark-sql.R' 'backend-sqlite.R' 'backend-teradata.R' 'build-sql.R' 'data-cache.R' 'data-lahman.R' 'data-nycflights13.R' 'db-escape.R' 'db-io.R' 'db.R' 'dbplyr.R' 'explain.R' 'ident.R' 'import-standalone-s3-register.R' 'join-by-compat.R' 'join-cols-compat.R' 'lazy-join-query.R' 'lazy-ops.R' 'lazy-query.R' 'lazy-select-query.R' 'lazy-set-op-query.R' 'memdb.R' 'optimise-utils.R' 'pillar.R' 'progress.R' 'sql-build.R' 'query-join.R' 'query-select.R' 'query-semi-join.R' 'query-set-op.R' 'query.R' 'reexport.R' 'remote.R' 'rows.R' 'schema.R' 'simulate.R' 'sql-clause.R' 'sql-expr.R' 'src-sql.R' 'src_dbi.R' 'table-name.R' 'tbl-lazy.R' 'tbl-sql.R' 'test-frame.R' 'testthat.R' 'tidyeval-across.R' 'tidyeval.R' 'translate-sql.R' 'utils-format.R' 'verb-arrange.R' 'verb-compute.R' 'verb-count.R' 'verb-distinct.R' 'verb-do-query.R' 'verb-do.R' 'verb-expand.R' 'verb-fill.R' 'verb-filter.R' 'verb-group_by.R' 'verb-head.R' 'verb-joins.R' 'verb-mutate.R' 'verb-pivot-longer.R' 'verb-pivot-wider.R' 'verb-pull.R' 'verb-select.R' 'verb-set-ops.R' 'verb-slice.R' 'verb-summarise.R' 'verb-uncount.R' 'verb-window.R' 'zzz.R'", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Maximilian Girlich [aut], Edgar Ruiz [aut], Posit Software, PBC [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "desc": { - "Package": "desc", - "Version": "1.4.3", - "Source": "Repository", - "Title": "Manipulate DESCRIPTION Files", - "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", role = \"aut\"), person(\"Jim\", \"Hester\", , \"james.f.hester@gmail.com\", role = \"aut\"), person(\"Maëlle\", \"Salmon\", role = \"ctb\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Maintainer": "Gábor Csárdi ", - "Description": "Tools to read, write, create, and manipulate DESCRIPTION files. It is intended for packages that create or manipulate other packages.", - "License": "MIT + file LICENSE", - "URL": "https://desc.r-lib.org/, https://github.com/r-lib/desc", - "BugReports": "https://github.com/r-lib/desc/issues", - "Depends": [ - "R (>= 3.4)" - ], - "Imports": [ - "cli", - "R6", - "utils" - ], - "Suggests": [ - "callr", - "covr", - "gh", - "spelling", - "testthat", - "whoami", - "withr" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.2.3", - "Collate": "'assertions.R' 'authors-at-r.R' 'built.R' 'classes.R' 'collate.R' 'constants.R' 'deps.R' 'desc-package.R' 'description.R' 'encoding.R' 'find-package-root.R' 'latex.R' 'non-oo-api.R' 'package-archives.R' 'read.R' 'remotes.R' 'str.R' 'syntax_checks.R' 'urls.R' 'utils.R' 'validate.R' 'version.R'", - "NeedsCompilation": "no", - "Author": "Gábor Csárdi [aut, cre], Kirill Müller [aut], Jim Hester [aut], Maëlle Salmon [ctb] (), Posit Software, PBC [cph, fnd]", - "Repository": "CRAN" - }, - "diffobj": { - "Package": "diffobj", - "Version": "0.3.6", - "Source": "Repository", - "Type": "Package", - "Title": "Diffs for R Objects", - "Description": "Generate a colorized diff of two R objects for an intuitive visualization of their differences.", - "Authors@R": "c( person( \"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\", role=c(\"aut\", \"cre\")), person( \"Michael B.\", \"Allen\", email=\"ioplex@gmail.com\", role=c(\"ctb\", \"cph\"), comment=\"Original C implementation of Myers Diff Algorithm\"))", - "Depends": [ - "R (>= 3.1.0)" - ], - "License": "GPL-2 | GPL-3", - "URL": "https://github.com/brodieG/diffobj", - "BugReports": "https://github.com/brodieG/diffobj/issues", - "RoxygenNote": "7.2.3", - "VignetteBuilder": "knitr", - "Encoding": "UTF-8", - "Suggests": [ - "knitr", - "rmarkdown" - ], - "Collate": "'capt.R' 'options.R' 'pager.R' 'check.R' 'finalizer.R' 'misc.R' 'html.R' 'styles.R' 's4.R' 'core.R' 'diff.R' 'get.R' 'guides.R' 'hunks.R' 'layout.R' 'myerssimple.R' 'rdiff.R' 'rds.R' 'set.R' 'subset.R' 'summmary.R' 'system.R' 'text.R' 'tochar.R' 'trim.R' 'word.R'", - "Imports": [ - "crayon (>= 1.3.2)", - "tools", - "methods", - "utils", - "stats" - ], - "NeedsCompilation": "yes", - "Author": "Brodie Gaslam [aut, cre], Michael B. Allen [ctb, cph] (Original C implementation of Myers Diff Algorithm)", - "Maintainer": "Brodie Gaslam ", - "Repository": "CRAN" - }, - "digest": { - "Package": "digest", - "Version": "0.6.39", - "Source": "Repository", - "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" - ], - "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" - }, - "downlit": { - "Package": "downlit", - "Version": "0.4.5", - "Source": "Repository", - "Title": "Syntax Highlighting and Automatic Linking", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Syntax highlighting of R code, specifically designed for the needs of 'RMarkdown' packages like 'pkgdown', 'hugodown', and 'bookdown'. It includes linking of function calls to their documentation on the web, and automatic translation of ANSI escapes in output to the equivalent HTML.", - "License": "MIT + file LICENSE", - "URL": "https://downlit.r-lib.org/, https://github.com/r-lib/downlit", - "BugReports": "https://github.com/r-lib/downlit/issues", - "Depends": [ - "R (>= 4.0.0)" - ], - "Imports": [ - "brio", - "desc", - "digest", - "evaluate", - "fansi", - "memoise", - "rlang", - "vctrs", - "withr", - "yaml" - ], - "Suggests": [ - "covr", - "htmltools", - "jsonlite", - "MASS", - "MassSpecWavelet", - "pkgload", - "rmarkdown", - "testthat (>= 3.0.0)", - "xml2" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "dplyr": { - "Package": "dplyr", - "Version": "1.2.0", - "Source": "Repository", - "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 (>= 1.3.2)", - "lifecycle (>= 1.0.5)", - "magrittr (>= 1.5)", - "methods", - "pillar (>= 1.9.0)", - "R6", - "rlang (>= 1.1.7)", - "tibble (>= 3.2.0)", - "tidyselect (>= 1.2.0)", - "utils", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "dtplyr": { - "Package": "dtplyr", - "Version": "1.3.3", - "Source": "Repository", - "Title": "Data Table Back-End for 'dplyr'", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"cre\", \"aut\")), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Mark\", \"Fairbanks\", role = \"aut\"), person(\"Ryan\", \"Dickerson\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Provides a data.table backend for 'dplyr'. The goal of 'dtplyr' is to allow you to write 'dplyr' code that is automatically translated to the equivalent, but usually much faster, data.table code.", - "License": "MIT + file LICENSE", - "URL": "https://dtplyr.tidyverse.org, https://github.com/tidyverse/dtplyr", - "BugReports": "https://github.com/tidyverse/dtplyr/issues", - "Depends": [ - "R (>= 4.0)" - ], - "Imports": [ - "cli (>= 3.4.0)", - "data.table (>= 1.13.0)", - "dplyr (>= 1.1.0)", - "glue", - "lifecycle", - "rlang (>= 1.0.4)", - "tibble", - "tidyselect (>= 1.2.0)", - "vctrs (>= 0.4.1)" - ], - "Suggests": [ - "bench", - "covr", - "knitr", - "rmarkdown", - "testthat (>= 3.1.2)", - "tidyr (>= 1.1.0)", - "waldo (>= 0.3.1)" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [cre, aut], Maximilian Girlich [aut], Mark Fairbanks [aut], Ryan Dickerson [aut], Posit Software, PBC [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "e1071": { - "Package": "e1071", - "Version": "1.7-17", - "Source": "Repository", - "Title": "Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien", - "Imports": [ - "graphics", - "grDevices", - "class", - "stats", - "methods", - "utils", - "proxy" - ], - "Suggests": [ - "cluster", - "mlbench", - "nnet", - "randomForest", - "rpart", - "SparseM", - "xtable", - "Matrix", - "MASS", - "slam" - ], - "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": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" - }, - "ellmer": { - "Package": "ellmer", - "Version": "0.4.0", - "Source": "Repository", - "Title": "Chat with Large Language Models", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Joe\", \"Cheng\", role = \"aut\"), person(\"Aaron\", \"Jacobs\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", - "Description": "Chat with large language models from a range of providers including 'Claude' , 'OpenAI' , and more. Supports streaming, asynchronous calls, tool calling, and structured data extraction.", - "License": "MIT + file LICENSE", - "URL": "https://ellmer.tidyverse.org, https://github.com/tidyverse/ellmer", - "BugReports": "https://github.com/tidyverse/ellmer/issues", - "Depends": [ - "R (>= 4.1)" - ], - "Imports": [ - "cli", - "coro (>= 1.1.0)", - "glue", - "httr2 (>= 1.2.1)", - "jsonlite", - "later (>= 1.4.0)", - "lifecycle", - "promises (>= 1.3.1)", - "R6", - "rlang (>= 1.1.0)", - "S7 (>= 0.2.0)", - "tibble", - "vctrs" - ], - "Suggests": [ - "connectcreds", - "curl (>= 6.0.1)", - "gargle", - "gitcreds", - "jose", - "knitr", - "magick", - "openssl", - "paws.common", - "png", - "rmarkdown", - "shiny", - "shinychat (>= 0.2.0)", - "testthat (>= 3.0.0)", - "vcr (>= 2.0.0)", - "withr" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate, rmarkdown", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "true", - "Config/testthat/start-first": "chat, provider*", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "Collate": "'utils-S7.R' 'types.R' 'ellmer-package.R' 'tools-def.R' 'content.R' 'provider.R' 'as-json.R' 'batch-chat.R' 'chat-structured.R' 'chat-tools-content.R' 'turns.R' 'chat-tools.R' 'chat-utils.R' 'utils-coro.R' 'chat.R' 'content-image.R' 'content-pdf.R' 'content-replay.R' 'httr2.R' 'import-standalone-obj-type.R' 'import-standalone-purrr.R' 'import-standalone-types-check.R' 'interpolate.R' 'live.R' 'parallel-chat.R' 'params.R' 'provider-any.R' 'provider-aws.R' 'provider-openai-compatible.R' 'provider-azure.R' 'provider-claude-files.R' 'provider-claude-tools.R' 'provider-claude.R' 'provider-google.R' 'provider-cloudflare.R' 'provider-databricks.R' 'provider-deepseek.R' 'provider-github.R' 'provider-google-tools.R' 'provider-google-upload.R' 'provider-groq.R' 'provider-huggingface.R' 'provider-mistral.R' 'provider-ollama.R' 'provider-openai-tools.R' 'provider-openai.R' 'provider-openrouter.R' 'provider-perplexity.R' 'provider-portkey.R' 'provider-snowflake.R' 'provider-vllm.R' 'schema.R' 'tokens.R' 'tools-built-in.R' 'tools-def-auto.R' 'utils-auth.R' 'utils-callbacks.R' 'utils-cat.R' 'utils-merge.R' 'utils-prettytime.R' 'utils.R' 'zzz.R'", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre] (ORCID: ), Joe Cheng [aut], Aaron Jacobs [aut], Garrick Aden-Buie [aut] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Hadley Wickham ", - "Repository": "RSPM" - }, - "esri2sf": { - "Package": "esri2sf", - "Version": "0.1.1", - "Source": "GitHub", - "Type": "Package", - "Title": "Create Simple Features from ArcGIS Server REST API", - "Authors@R": "c( person(\"Yongha\", \"Hwang\", email = \"yongha.hwang@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Cazelles\", \"Kevin\", role = c(\"aut\", \"ctb\")), person(\"Peterson\", \"Jacob\", role = c(\"aut\", \"ctb\")) )", - "Description": "This package enables you to scrape geographic features directly from ArcGIS servers REST API into R as simple features.", - "License": "MIT + file LICENSE", - "Encoding": "UTF-8", - "LazyData": "true", - "Depends": [ - "R (>= 3.1.0)" - ], - "Imports": [ - "dplyr", - "jsonlite", - "httr", - "rstudioapi", - "sf (>= 1.0.1)", - "DBI", - "RSQLite", - "crayon", - "stats" - ], - "Suggests": [ - "rmarkdown", - "knitr", - "pbapply", - "testthat (>= 3.0.0)" - ], - "RoxygenNote": "7.1.2", - "Roxygen": "list(markdown = TRUE)", - "VignetteBuilder": "knitr", - "Config/testthat/edition": "3", - "Author": "Yongha Hwang [aut, cre], Cazelles Kevin [aut, ctb], Peterson Jacob [aut, ctb]", - "Maintainer": "Yongha Hwang ", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "yonghah", - "RemoteRepo": "esri2sf", - "RemoteRef": "master", - "RemoteSha": "f47eda534b22de0bc903def20ac45397295333dc" - }, - "evaluate": { - "Package": "evaluate", - "Version": "1.0.5", - "Source": "Repository", - "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" - ], - "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" - }, - "extrafont": { - "Package": "extrafont", - "Version": "0.19", - "Source": "GitHub", - "Title": "Tools for Using Fonts", - "Author": "Winston Chang ", - "Maintainer": "Winston Chang ", - "Description": "Tools to using fonts other than the standard PostScript fonts. This package makes it easy to use system TrueType fonts and with PDF or PostScript output files, and with bitmap output files in Windows. extrafont can also be used with fonts packaged specifically to be used with, such as the fontcm package, which has Computer Modern PostScript fonts with math symbols.", - "Depends": [ - "R (>= 2.15)" - ], - "Imports": [ - "extrafontdb", - "grDevices", - "utils", - "Rttf2pt1" - ], - "Suggests": [ - "fontcm" - ], - "License": "GPL-2", - "URL": "https://github.com/wch/extrafont", - "RoxygenNote": "7.1.2", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "wch", - "RemoteRepo": "extrafont", - "RemoteRef": "master", - "RemoteSha": "028fc67103b14318410ad84fa182acc3975b54f2", - "Remotes": "Rttf2pt1=github::wch/Rttf2pt1" - }, - "extrafontdb": { - "Package": "extrafontdb", - "Version": "1.1", - "Source": "Repository", - "Type": "Package", - "Title": "Holding the Database for the 'extrafont' Package", - "Date": "2025-09-25", - "Depends": [ - "R (>= 2.14)" - ], - "Suggests": [ - "testthat (>= 3.0.0)" - ], - "Authors@R": "c( person(given = \"Winston\", family= \"Chang\", role = c(\"aut\")), person(given = \"Frederic\", family= \"Bertrand\", role = c(\"cre\"), email = \"frederic.bertrand@lecnam.net\", comment = c(ORCID = \"0000-0002-0837-8281\")) )", - "Author": "Winston Chang [aut], Frederic Bertrand [cre] (ORCID: )", - "Maintainer": "Frederic Bertrand ", - "Description": "It is meant to be used with the 'extrafont' package. The 'extrafont' package contains the code to install and use fonts, while the 'extrafontdb' package contains the font database.", - "License": "GPL-2", - "LazyLoad": "yes", - "NeedsCompilation": "no", - "URL": "https://github.com/fbertran/extrafontdb", - "BugReports": "https://github.com/fbertran/extrafontdb/issues", - "RoxygenNote": "7.3.3", - "Encoding": "UTF-8", - "Config/testthat/edition": "3", - "Collate": "'extrafontdb.r'", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "fansi": { - "Package": "fansi", - "Version": "1.0.7", - "Source": "Repository", - "Title": "ANSI Control Sequence Aware String Functions", - "Description": "Counterparts to R string manipulation functions that account for the effects of ANSI text formatting control sequences.", - "Authors@R": "c( person(\"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\", role=c(\"aut\", \"cre\")), person(\"Elliott\", \"Sales De Andrade\", role=\"ctb\"), person(given=\"R Core Team\", email=\"R-core@r-project.org\", role=\"cph\", comment=\"UTF8 byte length calcs from src/util.c\" ), person(\"Michael\",\"Chirico\", role=\"ctb\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\") ), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database derivative data in src/width.c\") )", - "Depends": [ - "R (>= 3.1.0)" - ], - "License": "GPL-2 | GPL-3", - "URL": "https://github.com/brodieG/fansi", - "BugReports": "https://github.com/brodieG/fansi/issues", - "VignetteBuilder": "knitr", - "Suggests": [ - "unitizer", - "knitr", - "rmarkdown" - ], - "Imports": [ - "grDevices", - "utils" - ], - "RoxygenNote": "7.3.3", - "Encoding": "UTF-8", - "Collate": "'constants.R' 'fansi-package.R' 'internal.R' 'load.R' 'misc.R' 'nchar.R' 'strwrap.R' 'strtrim.R' 'strsplit.R' 'substr2.R' 'trimws.R' 'tohtml.R' 'unhandled.R' 'normalize.R' 'sgr.R'", - "NeedsCompilation": "yes", - "Author": "Brodie Gaslam [aut, cre], Elliott Sales De Andrade [ctb], R Core Team [cph] (UTF8 byte length calcs from src/util.c), Michael Chirico [ctb] (ORCID: ), Unicode, Inc. [cph, dtc] (Unicode Character Database derivative data in src/width.c)", - "Maintainer": "Brodie Gaslam ", - "Repository": "CRAN" - }, - "farver": { - "Package": "farver", - "Version": "2.1.2", - "Source": "Repository", - "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": "https://packagemanager.posit.co/cran/latest" - }, - "fastmap": { - "Package": "fastmap", - "Version": "1.2.0", - "Source": "Repository", - "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", - "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)" - ], - "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" - }, - "forcats": { - "Package": "forcats", - "Version": "1.0.1", - "Source": "Repository", - "Title": "Tools for Working with Categorical Variables (Factors)", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", - "Description": "Helpers for reordering factor levels (including moving specified levels to front, ordering by first appearance, reversing, and randomly shuffling), and tools for modifying factor levels (including collapsing rare levels into other, 'anonymising', and manually 'recoding').", - "License": "MIT + file LICENSE", - "URL": "https://forcats.tidyverse.org/, https://github.com/tidyverse/forcats", - "BugReports": "https://github.com/tidyverse/forcats/issues", - "Depends": [ - "R (>= 4.1)" - ], - "Imports": [ - "cli (>= 3.4.0)", - "glue", - "lifecycle", - "magrittr", - "rlang (>= 1.0.0)", - "tibble" - ], - "Suggests": [ - "covr", - "dplyr", - "ggplot2", - "knitr", - "readr", - "rmarkdown", - "testthat (>= 3.0.0)", - "withr" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "LazyData": "true", - "RoxygenNote": "7.3.3", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Hadley Wickham ", - "Repository": "RSPM" - }, - "fs": { - "Package": "fs", - "Version": "1.6.6", - "Source": "Repository", - "Title": "Cross-Platform File System Operations Based on 'libuv'", - "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"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\")) )", - "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 (>= 3.6)" - ], - "Imports": [ - "methods" - ], - "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", - "ByteCompile": "true", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Copyright": "file COPYRIGHTS", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.2.3", - "SystemRequirements": "GNU make", - "NeedsCompilation": "yes", - "Author": "Jim Hester [aut], Hadley Wickham [aut], Gábor Csárdi [aut, cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, - "gargle": { - "Package": "gargle", - "Version": "1.6.1", - "Source": "Repository", - "Title": "Utilities for Working with Google APIs", - "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Craig\", \"Citro\", , \"craigcitro@google.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Google Inc\", role = \"cph\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Provides utilities for working with Google APIs . This includes functions and classes for handling common credential types and for preparing, executing, and processing HTTP requests.", - "License": "MIT + file LICENSE", - "URL": "https://gargle.r-lib.org, https://github.com/r-lib/gargle", - "BugReports": "https://github.com/r-lib/gargle/issues", - "Depends": [ - "R (>= 4.1)" - ], - "Imports": [ - "cli (>= 3.0.1)", - "fs (>= 1.3.1)", - "glue (>= 1.3.0)", - "httr (>= 1.4.5)", - "jsonlite", - "lifecycle (>= 0.2.0)", - "openssl", - "rappdirs", - "rlang (>= 1.1.0)", - "stats", - "utils", - "withr" - ], - "Suggests": [ - "aws.ec2metadata", - "aws.signature", - "covr", - "httpuv", - "knitr", - "rmarkdown", - "sodium", - "spelling", - "testthat (>= 3.1.7)" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.3.3", - "NeedsCompilation": "no", - "Author": "Jennifer Bryan [aut, cre] (ORCID: ), Craig Citro [aut], Hadley Wickham [aut] (ORCID: ), Google Inc [cph], Posit Software, PBC [cph, fnd]", - "Maintainer": "Jennifer Bryan ", - "Repository": "CRAN" - }, - "generics": { - "Package": "generics", - "Version": "0.1.4", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "ggplot2": { - "Package": "ggplot2", - "Version": "4.0.2", - "Source": "Repository", - "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 (>= 0.3.6)", - "isoband", - "lifecycle (> 1.0.1)", - "rlang (>= 1.1.0)", - "S7", - "scales (>= 1.4.0)", - "stats", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "ggrepel": { - "Package": "ggrepel", - "Version": "0.9.7", - "Source": "Repository", - "Authors@R": "c( person(\"Kamil\", \"Slowikowski\", email = \"kslowikowski@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-2843-6370\")), person(\"Teun\", \"van den Brand\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9335-7468\")), person(\"Alicia\", \"Schep\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3915-0618\")), person(\"Sean\", \"Hughes\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9409-9405\")), person(\"Trung Kien\", \"Dang\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7562-6495\")), person(\"Saulius\", \"Lukauskas\", role = \"ctb\"), person(\"Jean-Olivier\", \"Irisson\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4920-3880\")), person(\"Zhian N\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(\"Thompson\", \"Ryan\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0450-8181\")), person(\"Dervieux\", \"Christophe\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Yutani\", \"Hiroaki\", role = \"ctb\"), person(\"Pierre\", \"Gramme\", role = \"ctb\"), person(\"Amir Masoud\", \"Abdol\", role = \"ctb\"), person(\"Malcolm\", \"Barrett\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Robrecht\", \"Cannoodt\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3641-729X\")), person(\"Michał\", \"Krassowski\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9638-7785\")), person(\"Michael\", \"Chirico\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Pedro\", \"Aphalo\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3385-972X\")), person(\"Francis\", \"Barton\", role = \"ctb\") )", - "Title": "Automatically Position Non-Overlapping Text Labels with 'ggplot2'", - "Description": "Provides text and label geoms for 'ggplot2' that help to avoid overlapping text labels. Labels repel away from each other and away from the data points.", - "Depends": [ - "R (>= 4.5.0)", - "ggplot2 (>= 3.5.2)" - ], - "Imports": [ - "grid", - "Rcpp", - "rlang (>= 1.1.6)", - "S7", - "scales (>= 1.4.0)", - "withr (>= 3.0.2)" - ], - "Suggests": [ - "knitr", - "rmarkdown", - "testthat", - "svglite", - "vdiffr", - "gridExtra", - "ggpp", - "patchwork", - "devtools", - "prettydoc", - "ggbeeswarm", - "dplyr", - "magrittr", - "readr", - "stringr", - "marquee", - "rsvg", - "sf" - ], - "VignetteBuilder": "knitr", - "License": "GPL-3 | file LICENSE", - "URL": "https://ggrepel.slowkow.com/, https://github.com/slowkow/ggrepel", - "BugReports": "https://github.com/slowkow/ggrepel/issues", - "RoxygenNote": "7.3.3", - "LinkingTo": [ - "Rcpp" - ], - "Encoding": "UTF-8", - "NeedsCompilation": "yes", - "Author": "Kamil Slowikowski [aut, cre] (ORCID: ), Teun van den Brand [ctb] (ORCID: ), Alicia Schep [ctb] (ORCID: ), Sean Hughes [ctb] (ORCID: ), Trung Kien Dang [ctb] (ORCID: ), Saulius Lukauskas [ctb], Jean-Olivier Irisson [ctb] (ORCID: ), Zhian N Kamvar [ctb] (ORCID: ), Thompson Ryan [ctb] (ORCID: ), Dervieux Christophe [ctb] (ORCID: ), Yutani Hiroaki [ctb], Pierre Gramme [ctb], Amir Masoud Abdol [ctb], Malcolm Barrett [ctb] (ORCID: ), Robrecht Cannoodt [ctb] (ORCID: ), Michał Krassowski [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Pedro Aphalo [ctb] (ORCID: ), Francis Barton [ctb]", - "Maintainer": "Kamil Slowikowski ", - "Repository": "CRAN" - }, - "glue": { - "Package": "glue", - "Version": "1.8.0", - "Source": "Repository", - "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\")) )", - "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 (>= 3.6)" - ], - "Imports": [ - "methods" - ], - "Suggests": [ - "crayon", - "DBI (>= 1.2.0)", - "dplyr", - "knitr", - "magrittr", - "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", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "yes", - "Author": "Jim Hester [aut] (), Jennifer Bryan [aut, cre] (), Posit Software, PBC [cph, fnd]", - "Maintainer": "Jennifer Bryan ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "googledrive": { - "Package": "googledrive", - "Version": "2.1.2", - "Source": "Repository", - "Title": "An Interface to Google Drive", - "Authors@R": "c( person(\"Lucy\", \"D'Agostino McGowan\", , role = \"aut\"), 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\")) )", - "Description": "Manage Google Drive files from R.", - "License": "MIT + file LICENSE", - "URL": "https://googledrive.tidyverse.org, https://github.com/tidyverse/googledrive", - "BugReports": "https://github.com/tidyverse/googledrive/issues", - "Depends": [ - "R (>= 4.1)" - ], - "Imports": [ - "cli (>= 3.0.0)", - "gargle (>= 1.6.0)", - "glue (>= 1.4.2)", - "httr", - "jsonlite", - "lifecycle", - "magrittr", - "pillar (>= 1.9.0)", - "purrr (>= 1.0.1)", - "rlang (>= 1.0.2)", - "tibble (>= 2.0.0)", - "utils", - "uuid", - "vctrs (>= 0.3.0)", - "withr" - ], - "Suggests": [ - "curl", - "dplyr (>= 1.0.0)", - "knitr", - "rmarkdown", - "spelling", - "testthat (>= 3.1.5)" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.3.3", - "NeedsCompilation": "no", - "Author": "Lucy D'Agostino McGowan [aut], Jennifer Bryan [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd]", - "Maintainer": "Jennifer Bryan ", - "Repository": "RSPM" - }, - "googlesheets4": { - "Package": "googlesheets4", - "Version": "1.1.2", - "Source": "Repository", - "Title": "Access Google Sheets using the Sheets API V4", - "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Interact with Google Sheets through the Sheets API v4 . \"API\" is an acronym for \"application programming interface\"; the Sheets API allows users to interact with Google Sheets programmatically, instead of via a web browser. The \"v4\" refers to the fact that the Sheets API is currently at version 4. This package can read and write both the metadata and the cell data in a Sheet.", - "License": "MIT + file LICENSE", - "URL": "https://googlesheets4.tidyverse.org, https://github.com/tidyverse/googlesheets4", - "BugReports": "https://github.com/tidyverse/googlesheets4/issues", - "Depends": [ - "R (>= 3.6)" - ], - "Imports": [ - "cellranger", - "cli (>= 3.0.0)", - "curl", - "gargle (>= 1.6.0)", - "glue (>= 1.3.0)", - "googledrive (>= 2.1.0)", - "httr", - "ids", - "lifecycle", - "magrittr", - "methods", - "purrr", - "rematch2", - "rlang (>= 1.0.2)", - "tibble (>= 2.1.1)", - "utils", - "vctrs (>= 0.2.3)", - "withr" - ], - "Suggests": [ - "readr", - "rmarkdown", - "spelling", - "testthat (>= 3.1.7)" - ], - "ByteCompile": "true", - "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.3.2.9000", - "NeedsCompilation": "no", - "Author": "Jennifer Bryan [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd]", - "Maintainer": "Jennifer Bryan ", - "Repository": "RSPM" - }, - "gridExtra": { - "Package": "gridExtra", - "Version": "2.3", - "Source": "Repository", - "Authors@R": "c(person(\"Baptiste\", \"Auguie\", email = \"baptiste.auguie@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Anton\", \"Antonov\", email = \"tonytonov@gmail.com\", role = c(\"ctb\")))", - "License": "GPL (>= 2)", - "Title": "Miscellaneous Functions for \"Grid\" Graphics", - "Type": "Package", - "Description": "Provides a number of user-level functions to work with \"grid\" graphics, notably to arrange multiple grid-based plots on a page, and draw tables.", - "VignetteBuilder": "knitr", - "Imports": [ - "gtable", - "grid", - "grDevices", - "graphics", - "utils" - ], - "Suggests": [ - "ggplot2", - "egg", - "lattice", - "knitr", - "testthat" - ], - "RoxygenNote": "6.0.1", - "NeedsCompilation": "no", - "Author": "Baptiste Auguie [aut, cre], Anton Antonov [ctb]", - "Maintainer": "Baptiste Auguie ", - "Repository": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" - }, - "gtable": { - "Package": "gtable", - "Version": "0.3.6", - "Source": "Repository", - "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 (>= 1.1.0)", - "stats" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "haven": { - "Package": "haven", - "Version": "2.5.5", - "Source": "Repository", - "Title": "Import and Export 'SPSS', 'Stata' and 'SAS' Files", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Evan\", \"Miller\", role = c(\"aut\", \"cph\"), comment = \"Author of included ReadStat code\"), person(\"Danny\", \"Smith\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Import foreign statistical formats into R via the embedded 'ReadStat' C library, .", - "License": "MIT + file LICENSE", - "URL": "https://haven.tidyverse.org, https://github.com/tidyverse/haven, https://github.com/WizardMac/ReadStat", - "BugReports": "https://github.com/tidyverse/haven/issues", - "Depends": [ - "R (>= 3.6)" - ], - "Imports": [ - "cli (>= 3.0.0)", - "forcats (>= 0.2.0)", - "hms", - "lifecycle", - "methods", - "readr (>= 0.1.0)", - "rlang (>= 0.4.0)", - "tibble", - "tidyselect", - "vctrs (>= 0.3.0)" - ], - "Suggests": [ - "covr", - "crayon", - "fs", - "knitr", - "pillar (>= 1.4.0)", - "rmarkdown", - "testthat (>= 3.0.0)", - "utf8" - ], - "LinkingTo": [ - "cpp11" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "SystemRequirements": "GNU make, zlib: zlib1g-dev (deb), zlib-devel (rpm)", - "NeedsCompilation": "yes", - "Author": "Hadley Wickham [aut, cre], Evan Miller [aut, cph] (Author of included ReadStat code), Danny Smith [aut], Posit Software, PBC [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "highr": { - "Package": "highr", - "Version": "0.11", - "Source": "Repository", - "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)" - ], - "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.1", - "NeedsCompilation": "no", - "Author": "Yihui Xie [aut, cre] (), Yixuan Qiu [aut], Christopher Gandrud [ctb], Qiang Li [ctb]", - "Maintainer": "Yihui Xie ", - "Repository": "CRAN" - }, - "hipread": { - "Package": "hipread", - "Version": "0.2.5", - "Source": "Repository", - "Type": "Package", - "Title": "Read Hierarchical Fixed Width Files", - "Authors@R": "c( person(\"Greg\", \"Freedman Ellis\", role = \"aut\"), person(\"Derek Burk\", email = \"ipums+cran@umn.edu\", role = c(\"aut\", \"cre\")), person(\"Joe Grover\", role = \"ctb\"), person(\"Mark Padgham\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", \"ctb\", comment = \"Code adapted from readr\"), person(\"Jim\", \"Hester\", , \"james.hester@rstudio.com\", c(\"ctb\"), comment = \"Code adapted from readr\"), person(\"Romain\", \"Francois\", role = \"ctb\", comment = \"Code adapted from readr\"), person(\"R Core Team\", role = \"ctb\", comment = \"Code adapted from readr\"), person(\"RStudio\", role = c(\"cph\", \"fnd\"), comment = \"Code adapted from readr\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"Code adapted from readr\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"Code adapted from readr\"), person(\"University of Minnesota\", role = \"cph\"))", - "Contact": "ipums@umn.edu", - "Description": "Read hierarchical fixed width files like those commonly used by many census data providers. Also allows for reading of data in chunks, and reading 'gzipped' files without storing the full file in memory.", - "License": "GPL (>= 2) | file LICENSE", - "Encoding": "UTF-8", - "Depends": [ - "R (>= 3.0.2)" - ], - "LinkingTo": [ - "Rcpp (>= 1.0.12)", - "BH" - ], - "Imports": [ - "Rcpp (>= 1.0.12)", - "R6", - "rlang", - "tibble" - ], - "Suggests": [ - "dplyr", - "readr", - "testthat" - ], - "RoxygenNote": "7.3.2", - "URL": "https://github.com/ipums/hipread", - "BugReports": "https://github.com/ipums/hipread/issues", - "NeedsCompilation": "yes", - "Author": "Greg Freedman Ellis [aut], Derek Burk [aut, cre], Joe Grover [ctb], Mark Padgham [ctb], Hadley Wickham [ctb] (Code adapted from readr), Jim Hester [ctb] (Code adapted from readr), Romain Francois [ctb] (Code adapted from readr), R Core Team [ctb] (Code adapted from readr), RStudio [cph, fnd] (Code adapted from readr), Jukka Jylänki [ctb, cph] (Code adapted from readr), Mikkel Jørgensen [ctb, cph] (Code adapted from readr), University of Minnesota [cph]", - "Maintainer": "Derek Burk ", - "Repository": "RSPM" - }, - "hms": { - "Package": "hms", - "Version": "1.1.4", - "Source": "Repository", - "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 (>= 1.0.2)", - "vctrs (>= 0.3.8)" - ], - "Suggests": [ - "crayon", - "lubridate", - "pillar (>= 1.1.0)", - "testthat (>= 3.0.0)" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "htmltools": { - "Package": "htmltools", - "Version": "0.5.9", - "Source": "Repository", - "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 (>= 1.1.0)", - "grDevices", - "rlang (>= 1.0.0)", - "utils" - ], - "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" - }, - "httr": { - "Package": "httr", - "Version": "1.4.8", - "Source": "Repository", - "Title": "Tools for Working with URLs and HTTP", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Useful tools for working with HTTP organised by HTTP verbs (GET(), POST(), etc). Configuration functions make it easy to control additional request components (authenticate(), add_headers() and so on).", - "License": "MIT + file LICENSE", - "URL": "https://httr.r-lib.org/, https://github.com/r-lib/httr", - "BugReports": "https://github.com/r-lib/httr/issues", - "Depends": [ - "R (>= 3.6)" - ], - "Imports": [ - "curl (>= 5.1.0)", - "jsonlite", - "mime", - "openssl (>= 0.8)", - "R6" - ], - "Suggests": [ - "covr", - "httpuv", - "jpeg", - "knitr", - "png", - "readr", - "rmarkdown", - "testthat (>= 0.8.0)", - "xml2" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "httr2": { - "Package": "httr2", - "Version": "1.2.2", - "Source": "Repository", - "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", - "R6", - "rappdirs", - "rlang (>= 1.1.0)", - "vctrs (>= 0.6.3)", - "withr" - ], - "Suggests": [ - "askpass", - "bench", - "clipr", - "covr", - "docopt", - "httpuv", - "jose", - "jsonlite", - "knitr", - "later (>= 1.4.0)", - "nanonext", - "otel (>= 0.2.0)", - "otelsdk (>= 0.2.0)", - "paws.common (>= 0.8.0)", - "promises", - "rmarkdown", - "testthat (>= 3.1.8)", - "tibble", - "webfakes (>= 1.4.0)", - "xml2" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "true", - "Config/testthat/start-first": "resp-stream, req-perform", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], Maximilian Girlich [ctb]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "ids": { - "Package": "ids", - "Version": "1.0.1", - "Source": "Repository", - "Title": "Generate Random Identifiers", - "Authors@R": "person(\"Rich\", \"FitzJohn\", role = c(\"aut\", \"cre\"), email = \"rich.fitzjohn@gmail.com\")", - "Description": "Generate random or human readable and pronounceable identifiers.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/richfitz/ids", - "BugReports": "https://github.com/richfitz/ids/issues", - "Imports": [ - "openssl", - "uuid" - ], - "Suggests": [ - "knitr", - "rcorpora", - "rmarkdown", - "testthat" - ], - "RoxygenNote": "6.0.1", - "VignetteBuilder": "knitr", - "NeedsCompilation": "no", - "Author": "Rich FitzJohn [aut, cre]", - "Maintainer": "Rich FitzJohn ", - "Repository": "CRAN" - }, - "ipumsr": { - "Package": "ipumsr", - "Version": "0.9.0", - "Source": "Repository", - "Title": "An R Interface for Downloading, Reading, and Handling IPUMS Data", - "Authors@R": "c( person(\"Greg Freedman Ellis\", role = \"aut\"), person(\"Derek Burk\", , , \"ipums+cran@umn.edu\", role = c(\"aut\", \"cre\")), person(\"Finn Roberts\", role = \"aut\"), person(\"Joe Grover\", role = \"ctb\"), person(\"Dan Ehrlich\", role = \"ctb\"), person(\"Renae Rodgers\", role = \"ctb\"), person(\"Institute for Social Research and Data Innovation\", , , \"ipums@umn.edu\", role = \"cph\") )", - "Description": "An easy way to work with census, survey, and geographic data provided by IPUMS in R. Generate and download data through the IPUMS API and load IPUMS files into R with their associated metadata to make analysis easier. IPUMS data describing 1.4 billion individuals drawn from over 750 censuses and surveys is available free of charge from the IPUMS website .", - "License": "Mozilla Public License 2.0", - "URL": "https://tech.popdata.org/ipumsr/, https://github.com/ipums/ipumsr, https://www.ipums.org", - "BugReports": "https://github.com/ipums/ipumsr/issues", - "Depends": [ - "R (>= 3.6)" - ], - "Imports": [ - "dplyr (>= 0.7.0)", - "haven (>= 2.2.0)", - "hipread (>= 0.2.0)", - "httr", - "jsonlite", - "lifecycle", - "purrr", - "R6", - "readr", - "rlang", - "tibble", - "tidyselect", - "xml2", - "zeallot" - ], - "Suggests": [ - "biglm", - "covr", - "crayon", - "DBI", - "dbplyr", - "DT", - "ggplot2", - "htmltools", - "knitr", - "rmapshaper", - "rmarkdown", - "RSQLite (>= 2.3.3)", - "rstudioapi", - "scales", - "sf", - "shiny", - "testthat (>= 3.2.0)", - "tidyr", - "vcr (>= 0.6.0)", - "withr" - ], - "VignetteBuilder": "knitr", - "Contact": "ipums@umn.edu", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "Config/testthat/edition": "3", - "NeedsCompilation": "no", - "Author": "Greg Freedman Ellis [aut], Derek Burk [aut, cre], Finn Roberts [aut], Joe Grover [ctb], Dan Ehrlich [ctb], Renae Rodgers [ctb], Institute for Social Research and Data Innovation [cph]", - "Maintainer": "Derek Burk ", - "Repository": "RSPM" - }, - "isoband": { - "Package": "isoband", - "Version": "0.3.0", - "Source": "Repository", - "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", - "grid", - "rlang", - "utils" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "janitor": { - "Package": "janitor", - "Version": "2.2.1", - "Source": "Repository", - "Title": "Simple Tools for Examining and Cleaning Dirty Data", - "Authors@R": "c(person(\"Sam\", \"Firke\", email = \"samuel.firke@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Bill\", \"Denney\", email = \"wdenney@humanpredictions.com\", role = \"ctb\"), person(\"Chris\", \"Haid\", email = \"chrishaid@gmail.com\", role = \"ctb\"), person(\"Ryan\", \"Knight\", email = \"ryangknight@gmail.com\", role = \"ctb\"), person(\"Malte\", \"Grosser\", email = \"malte.grosser@gmail.com\", role = \"ctb\"), person(\"Jonathan\", \"Zadra\", email = \"jonathan.zadra@sorensonimpact.com\", role = \"ctb\"))", - "Description": "The main janitor functions can: perfectly format data.frame column names; provide quick counts of variable combinations (i.e., frequency tables and crosstabs); and explore duplicate records. Other janitor functions nicely format the tabulation results. These tabulate-and-report functions approximate popular features of SPSS and Microsoft Excel. This package follows the principles of the \"tidyverse\" and works well with the pipe function %>%. janitor was built with beginning-to-intermediate R users in mind and is optimized for user-friendliness.", - "URL": "https://github.com/sfirke/janitor, https://sfirke.github.io/janitor/", - "BugReports": "https://github.com/sfirke/janitor/issues", - "Depends": [ - "R (>= 3.1.2)" - ], - "Imports": [ - "dplyr (>= 1.0.0)", - "hms", - "lifecycle", - "lubridate", - "magrittr", - "purrr", - "rlang", - "stringi", - "stringr", - "snakecase (>= 0.9.2)", - "tidyselect (>= 1.0.0)", - "tidyr (>= 0.7.0)" - ], - "License": "MIT + file LICENSE", - "RoxygenNote": "7.2.3", - "Suggests": [ - "dbplyr", - "knitr", - "rmarkdown", - "RSQLite", - "sf", - "testthat (>= 3.0.0)", - "tibble", - "tidygraph" - ], - "VignetteBuilder": "knitr", - "Encoding": "UTF-8", - "Config/testthat/edition": "3", - "NeedsCompilation": "no", - "Author": "Sam Firke [aut, cre], Bill Denney [ctb], Chris Haid [ctb], Ryan Knight [ctb], Malte Grosser [ctb], Jonathan Zadra [ctb]", - "Maintainer": "Sam Firke ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "jquerylib": { - "Package": "jquerylib", - "Version": "0.1.4", - "Source": "Repository", - "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" - ], - "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", - "Title": "A Simple and Robust JSON Parser and Generator for R", - "License": "MIT + file LICENSE", - "Depends": [ - "methods" - ], - "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", - "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 (>= 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" - ], - "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", - "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" - ], - "Repository": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" - }, - "later": { - "Package": "later", - "Version": "1.4.7", - "Source": "Repository", - "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" - ], - "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" - }, - "lehdr": { - "Package": "lehdr", - "Version": "1.1.4", - "Source": "Repository", - "Type": "Package", - "Title": "Grab Longitudinal Employer-Household Dynamics (LEHD) Flat Files", - "Authors@R": "c(person(given=\"Jamaal\", family=\"Green\", role = c(\"cre\",\"aut\"), email=\"jamaal.green@gmail.com\"), person(given=\"Liming\", family=\"Wang\", role =c(\"aut\"), email=\"lmwang@pdx.edu\"), person(given=\"Dillon\", family=\"Mahmoudi\", role =c(\"aut\"), email=\"dillonm@umbc.edu\"), person(given=\"Matthew\",family=\"Rogers\", role=c(\"ctb\"), email = \"matthew.rogers09@gmail.com\"), person(given=\"Kyle\", family=\"Walker\", role=c(\"ctb\"), email=\"kyle@walker-data.com\"))", - "Maintainer": "Jamaal Green ", - "Description": "Designed to query Longitudinal Employer-Household Dynamics (LEHD) workplace/residential association and origin-destination flat files and optionally aggregate Census block-level data to block group, tract, county, or state. Data comes from the LODES FTP server .", - "Depends": [ - "R (>= 4.0.0)" - ], - "License": "MIT + file LICENSE", - "Encoding": "UTF-8", - "Imports": [ - "readr", - "rlang", - "stringr", - "glue", - "httr2", - "dplyr", - "magrittr" - ], - "Suggests": [ - "testthat (>= 3.0.0)", - "knitr", - "rmarkdown", - "devtools", - "pacman" - ], - "VignetteBuilder": "knitr", - "RoxygenNote": "7.3.2", - "URL": "https://github.com/jamgreen/lehdr/", - "BugReports": "https://github.com/jamgreen/lehdr/issues/", - "Config/testthat/edition": "3", - "NeedsCompilation": "no", - "Author": "Jamaal Green [cre, aut], Liming Wang [aut], Dillon Mahmoudi [aut], Matthew Rogers [ctb], Kyle Walker [ctb]", - "Repository": "RSPM" - }, - "lifecycle": { - "Package": "lifecycle", - "Version": "1.0.5", - "Source": "Repository", - "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)" - ], - "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" - }, - "lubridate": { - "Package": "lubridate", - "Version": "1.9.5", - "Source": "Repository", - "Type": "Package", - "Title": "Make Dealing with Dates a Little Easier", - "Authors@R": "c( person(\"Vitalie\", \"Spinu\", , \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Garrett\", \"Grolemund\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Davis\", \"Vaughan\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Imanuel\", \"Costigan\", role = \"ctb\"), person(\"Jason\", \"Law\", role = \"ctb\"), person(\"Doug\", \"Mitarotonda\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Jonathan\", \"Boiser\", role = \"ctb\"), person(\"Chel Hee\", \"Lee\", role = \"ctb\") )", - "Maintainer": "Vitalie Spinu ", - "Description": "Functions to work with date-times and time-spans: fast and user friendly parsing of date-time data, extraction and updating of components of a date-time (years, months, days, hours, minutes, and seconds), algebraic manipulation on date-time and time-span objects. The 'lubridate' package has a consistent and memorable syntax that makes working with dates easy and fun.", - "License": "MIT + file LICENSE", - "URL": "https://lubridate.tidyverse.org, https://github.com/tidyverse/lubridate", - "BugReports": "https://github.com/tidyverse/lubridate/issues", - "Depends": [ - "methods", - "R (>= 3.2)" - ], - "Imports": [ - "generics", - "timechange (>= 0.4.0)" - ], - "Suggests": [ - "covr", - "knitr", - "rmarkdown", - "testthat (>= 2.1.0)", - "vctrs (>= 0.6.5)" - ], - "Enhances": [ - "chron", - "data.table", - "timeDate", - "tis", - "zoo" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "LazyData": "true", - "RoxygenNote": "7.3.3", - "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", - "Collate": "'Dates.r' 'POSIXt.r' 'util.r' 'parse.r' 'timespans.r' 'intervals.r' 'difftimes.r' 'durations.r' 'periods.r' 'accessors-date.R' 'accessors-day.r' 'accessors-dst.r' 'accessors-hour.r' 'accessors-minute.r' 'accessors-month.r' 'accessors-quarter.r' 'accessors-second.r' 'accessors-tz.r' 'accessors-week.r' 'accessors-year.r' 'am-pm.r' 'time-zones.r' 'numeric.r' 'coercion.r' 'constants.r' 'cyclic_encoding.r' 'data.r' 'decimal-dates.r' 'deprecated.r' 'format_ISO8601.r' 'guess.r' 'hidden.r' 'instants.r' 'leap-years.r' 'ops-addition.r' 'ops-compare.r' 'ops-division.r' 'ops-integer-division.r' 'ops-m+.r' 'ops-modulo.r' 'ops-multiplication.r' 'ops-subtraction.r' 'package.r' 'pretty.r' 'round.r' 'stamp.r' 'tzdir.R' 'update.r' 'vctrs.R' 'zzz.R'", - "NeedsCompilation": "yes", - "Author": "Vitalie Spinu [aut, cre], Garrett Grolemund [aut], Hadley Wickham [aut], Davis Vaughan [ctb], Ian Lyttle [ctb], Imanuel Costigan [ctb], Jason Law [ctb], Doug Mitarotonda [ctb], Joseph Larmarange [ctb], Jonathan Boiser [ctb], Chel Hee Lee [ctb]", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "magrittr": { - "Package": "magrittr", - "Version": "2.0.4", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "memoise": { - "Package": "memoise", - "Version": "2.0.1", - "Source": "Repository", - "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" - ], - "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", - "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" - ], - "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" - }, - "modelr": { - "Package": "modelr", - "Version": "0.1.11", - "Source": "Repository", - "Title": "Modelling Functions that Work with the Pipe", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Functions for modelling that help you seamlessly integrate modelling into a pipeline of data manipulation and visualisation.", - "License": "GPL-3", - "URL": "https://modelr.tidyverse.org, https://github.com/tidyverse/modelr", - "BugReports": "https://github.com/tidyverse/modelr/issues", - "Depends": [ - "R (>= 3.2)" - ], - "Imports": [ - "broom", - "magrittr", - "purrr (>= 0.2.2)", - "rlang (>= 1.0.6)", - "tibble", - "tidyr (>= 0.8.0)", - "tidyselect", - "vctrs" - ], - "Suggests": [ - "compiler", - "covr", - "ggplot2", - "testthat (>= 3.0.0)" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Encoding": "UTF-8", - "LazyData": "true", - "RoxygenNote": "7.2.3", - "Config/testthat/edition": "3", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "openssl": { - "Package": "openssl", - "Version": "2.3.5", - "Source": "Repository", - "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" - ], - "Suggests": [ - "curl", - "testthat (>= 2.1.0)", - "digest", - "knitr", - "rmarkdown", - "jsonlite", - "jose", - "sodium" - ], - "RoxygenNote": "7.3.2", - "Encoding": "UTF-8", - "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", - "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" - ], - "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": "RSPM" - }, - "otel": { - "Package": "otel", - "Version": "0.2.0", - "Source": "Repository", - "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" - ], - "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" - }, - "pdftools": { - "Package": "pdftools", - "Version": "3.7.0", - "Source": "Repository", - "Type": "Package", - "Title": "Text Extraction, Rendering and Converting of PDF Documents", - "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", - "Description": "Utilities based on 'libpoppler' for extracting text, fonts, attachments and metadata from a PDF file. Also supports high quality rendering of PDF documents into PNG, JPEG, TIFF format, or into raw bitmap vectors for further processing in R.", - "License": "MIT + file LICENSE", - "URL": "https://ropensci.r-universe.dev/pdftools, https://docs.ropensci.org/pdftools/", - "BugReports": "https://github.com/ropensci/pdftools/issues", - "SystemRequirements": "Poppler C++ API: libpoppler-cpp-dev (deb) or poppler-cpp-devel (rpm), and poppler-data (rpm/deb) package.", - "Encoding": "UTF-8", - "Imports": [ - "Rcpp (>= 0.12.12)", - "qpdf" - ], - "LinkingTo": [ - "Rcpp" - ], - "Suggests": [ - "png", - "webp", - "tesseract", - "testthat" - ], - "RoxygenNote": "7.3.2", - "NeedsCompilation": "yes", - "Author": "Jeroen Ooms [aut, cre] (ORCID: )", - "Maintainer": "Jeroen Ooms ", - "Repository": "RSPM" - }, - "pillar": { - "Package": "pillar", - "Version": "1.11.1", - "Source": "Repository", - "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 (>= 1.0.2)", - "utf8 (>= 1.1.0)", - "utils", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "pkgbuild": { - "Package": "pkgbuild", - "Version": "1.4.8", - "Source": "Repository", - "Title": "Find Tools Needed to Build R Packages", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", 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": "Provides functions used to build R packages. Locates compilers needed to build R packages on various platforms and ensures the PATH is configured appropriately so R can use them.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/r-lib/pkgbuild, https://pkgbuild.r-lib.org", - "BugReports": "https://github.com/r-lib/pkgbuild/issues", - "Depends": [ - "R (>= 3.5)" - ], - "Imports": [ - "callr (>= 3.2.0)", - "cli (>= 3.4.0)", - "desc", - "processx", - "R6" - ], - "Suggests": [ - "covr", - "cpp11", - "knitr", - "Rcpp", - "rmarkdown", - "testthat (>= 3.2.0)", - "withr (>= 2.3.0)" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/usethis/last-upkeep": "2025-04-30", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut], Jim Hester [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, - "pkgconfig": { - "Package": "pkgconfig", - "Version": "2.0.3", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "pkgdown": { - "Package": "pkgdown", - "Version": "2.2.0", - "Source": "Repository", - "Title": "Make Static HTML Documentation for a Package", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jay\", \"Hesselberth\", role = \"aut\", comment = c(ORCID = \"0000-0002-6299-179X\")), person(\"Maëlle\", \"Salmon\", role = \"aut\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(\"Olivier\", \"Roy\", role = \"aut\"), person(\"Salim\", \"Brüggemann\", role = \"aut\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", - "Description": "Generate an attractive and useful website from a source package. 'pkgdown' converts your documentation, vignettes, 'README', and more to 'HTML' making it easy to share information about your package online.", - "License": "MIT + file LICENSE", - "URL": "https://pkgdown.r-lib.org/, https://github.com/r-lib/pkgdown", - "BugReports": "https://github.com/r-lib/pkgdown/issues", - "Depends": [ - "R (>= 4.1)" - ], - "Imports": [ - "bslib (>= 0.5.1)", - "callr (>= 3.7.3)", - "cli (>= 3.6.1)", - "desc (>= 1.4.0)", - "downlit (>= 0.4.4)", - "fontawesome", - "fs (>= 1.4.0)", - "httr2 (>= 1.0.2)", - "jsonlite", - "lifecycle", - "openssl", - "purrr (>= 1.0.0)", - "ragg (>= 1.4.0)", - "rlang (>= 1.1.4)", - "rmarkdown (>= 2.27)", - "tibble", - "whisker", - "withr (>= 2.4.3)", - "xml2 (>= 1.3.1)", - "yaml (>= 2.3.9)" - ], - "Suggests": [ - "covr", - "diffviewer", - "evaluate (>= 0.24.0)", - "gert", - "gt", - "htmltools", - "htmlwidgets", - "knitr (>= 1.50)", - "magick", - "methods", - "pkgload (>= 1.0.2)", - "quarto", - "rsconnect", - "rstudioapi", - "rticles", - "sass", - "testthat (>= 3.1.3)", - "tools" - ], - "VignetteBuilder": "knitr, quarto", - "Config/Needs/website": "usethis, servr", - "Config/potools/style": "explicit", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "true", - "Config/testthat/start-first": "build-article, build-quarto-article, build-reference, build", - "Config/usethis/last-upkeep": "2025-09-07", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "SystemRequirements": "pandoc", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre] (ORCID: ), Jay Hesselberth [aut] (ORCID: ), Maëlle Salmon [aut] (ORCID: ), Olivier Roy [aut], Salim Brüggemann [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "pkgload": { - "Package": "pkgload", - "Version": "1.5.0", - "Source": "Repository", - "Title": "Simulate Package Installation and Attach", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Core team\", role = \"ctb\", comment = \"Some namespace and vignette code extracted from base R\") )", - "Description": "Simulates the process of installing a package and then attaching it. This is a key part of the 'devtools' package as it allows you to rapidly iterate while developing a package.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/r-lib/pkgload, https://pkgload.r-lib.org", - "BugReports": "https://github.com/r-lib/pkgload/issues", - "Depends": [ - "R (>= 3.4.0)" - ], - "Imports": [ - "cli (>= 3.3.0)", - "desc", - "fs", - "glue", - "lifecycle", - "methods", - "pkgbuild", - "processx", - "rlang (>= 1.1.1)", - "rprojroot", - "utils" - ], - "Suggests": [ - "bitops", - "jsonlite", - "mathjaxr", - "pak", - "Rcpp", - "remotes", - "rstudioapi", - "testthat (>= 3.2.1.1)", - "usethis", - "withr" - ], - "Config/Needs/website": "tidyverse/tidytemplate, ggplot2", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "TRUE", - "Config/testthat/start-first": "dll", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut], Winston Chang [aut], Jim Hester [aut], Lionel Henry [aut, cre], Posit Software, PBC [cph, fnd], R Core team [ctb] (Some namespace and vignette code extracted from base R)", - "Maintainer": "Lionel Henry ", - "Repository": "CRAN" - }, - "plyr": { - "Package": "plyr", - "Version": "1.8.9", - "Source": "Repository", - "Title": "Tools for Splitting, Applying and Combining Data", - "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"))", - "Description": "A set of tools that solves a common set of problems: you need to break a big problem down into manageable pieces, operate on each piece and then put all the pieces back together. For example, you might want to fit a model to each spatial location or time point in your study, summarise data by panels or collapse high-dimensional arrays to simpler summary statistics. The development of 'plyr' has been generously supported by 'Becton Dickinson'.", - "License": "MIT + file LICENSE", - "URL": "http://had.co.nz/plyr, https://github.com/hadley/plyr", - "BugReports": "https://github.com/hadley/plyr/issues", - "Depends": [ - "R (>= 3.1.0)" - ], - "Imports": [ - "Rcpp (>= 0.11.0)" - ], - "Suggests": [ - "abind", - "covr", - "doParallel", - "foreach", - "iterators", - "itertools", - "tcltk", - "testthat" - ], - "LinkingTo": [ - "Rcpp" - ], - "Encoding": "UTF-8", - "LazyData": "true", - "RoxygenNote": "7.2.3", - "NeedsCompilation": "yes", - "Author": "Hadley Wickham [aut, cre]", - "Maintainer": "Hadley Wickham ", - "Repository": "RSPM" - }, - "praise": { - "Package": "praise", - "Version": "1.0.0", - "Source": "Repository", - "Title": "Praise Users", - "Author": "Gabor Csardi, Sindre Sorhus", - "Maintainer": "Gabor Csardi ", - "Description": "Build friendly R packages that praise their users if they have done something good, or they just need it to feel better.", - "License": "MIT + file LICENSE", - "LazyData": "true", - "URL": "https://github.com/gaborcsardi/praise", - "BugReports": "https://github.com/gaborcsardi/praise/issues", - "Suggests": [ - "testthat" - ], - "Collate": "'adjective.R' 'adverb.R' 'exclamation.R' 'verb.R' 'rpackage.R' 'package.R'", - "NeedsCompilation": "no", - "Repository": "CRAN" - }, - "prettyunits": { - "Package": "prettyunits", - "Version": "1.2.0", - "Source": "Repository", - "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)" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "processx": { - "Package": "processx", - "Version": "3.8.6", - "Source": "Repository", - "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\")), 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.2.0)", - "R6", - "utils" - ], - "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", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.1.9000", - "NeedsCompilation": "yes", - "Author": "Gábor Csárdi [aut, cre, cph] (), Winston Chang [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, - "progress": { - "Package": "progress", - "Version": "1.2.3", - "Source": "Repository", - "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", - "R6" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "promises": { - "Package": "promises", - "Version": "1.5.0", - "Source": "Repository", - "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 (>= 1.5)", - "otel (>= 0.2.0)", - "R6", - "rlang" - ], - "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", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" - }, - "ps": { - "Package": "ps", - "Version": "1.9.1", - "Source": "Repository", - "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\")) )", - "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" - ], - "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", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "yes", - "Author": "Jay Loden [aut], Dave Daeschler [aut], Giampaolo Rodola' [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, - "purrr": { - "Package": "purrr", - "Version": "1.2.1", - "Source": "Repository", - "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)" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "qpdf": { - "Package": "qpdf", - "Version": "1.4.1", - "Source": "Repository", - "Type": "Package", - "Title": "Split, Combine and Compress PDF Files", - "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Ben\", \"Raymond\", role = \"ctb\"), person(\"Jay Berkenbilt\", role = \"cph\", comment = \"Author of libqpdf\"))", - "Description": "Content-preserving transformations transformations of PDF files such as split, combine, and compress. This package interfaces directly to the 'qpdf' C++ library and does not require any command line utilities. Note that 'qpdf' does not read actual content from PDF files: to extract text and data you need the 'pdftools' package.", - "License": "Apache License 2.0", - "URL": "https://docs.ropensci.org/qpdf/ https://ropensci.r-universe.dev/qpdf", - "BugReports": "https://github.com/ropensci/qpdf/issues", - "Encoding": "UTF-8", - "Imports": [ - "Rcpp", - "askpass", - "curl" - ], - "LinkingTo": [ - "Rcpp" - ], - "RoxygenNote": "7.2.1", - "Suggests": [ - "testthat" - ], - "SystemRequirements": "libjpeg", - "NeedsCompilation": "yes", - "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Ben Raymond [ctb], Jay Berkenbilt [cph] (Author of libqpdf)", - "Maintainer": "Jeroen Ooms ", - "Repository": "RSPM" - }, - "ragg": { - "Package": "ragg", - "Version": "1.5.0", - "Source": "Repository", - "Type": "Package", - "Title": "Graphic Devices Based on AGG", - "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Maxim\", \"Shemanarev\", role = c(\"aut\", \"cph\"), comment = \"Author of AGG\"), person(\"Tony\", \"Juricic\", , \"tonygeek@yahoo.com\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Milan\", \"Marusinec\", , \"milan@marusinec.sk\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Spencer\", \"Garrett\", role = \"ctb\", comment = \"Contributor to AGG\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", - "Maintainer": "Thomas Lin Pedersen ", - "Description": "Anti-Grain Geometry (AGG) is a high-quality and high-performance 2D drawing library. The 'ragg' package provides a set of graphic devices based on AGG to use as alternative to the raster devices provided through the 'grDevices' package.", - "License": "MIT + file LICENSE", - "URL": "https://ragg.r-lib.org, https://github.com/r-lib/ragg", - "BugReports": "https://github.com/r-lib/ragg/issues", - "Imports": [ - "systemfonts (>= 1.0.3)", - "textshaping (>= 0.3.0)" - ], - "Suggests": [ - "covr", - "graphics", - "grid", - "testthat (>= 3.0.0)" - ], - "LinkingTo": [ - "systemfonts", - "textshaping" - ], - "Config/build/compilation-database": "true", - "Config/Needs/website": "ggplot2, devoid, magick, bench, tidyr, ggridges, hexbin, sessioninfo, pkgdown, tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/usethis/last-upkeep": "2025-04-25", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "SystemRequirements": "freetype2, libpng, libtiff, libjpeg, libwebp, libwebpmux", - "NeedsCompilation": "yes", - "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), Maxim Shemanarev [aut, cph] (Author of AGG), Tony Juricic [ctb, cph] (Contributor to AGG), Milan Marusinec [ctb, cph] (Contributor to AGG), Spencer Garrett [ctb] (Contributor to AGG), Posit Software, PBC [cph, fnd] (ROR: )", - "Repository": "CRAN" - }, - "rappdirs": { - "Package": "rappdirs", - "Version": "0.3.4", - "Source": "Repository", - "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)" - ], - "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", - "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", - "crayon", - "glue", - "hms (>= 0.4.1)", - "lifecycle", - "methods", - "R6", - "rlang", - "tibble", - "utils", - "vroom (>= 1.7.0)", - "withr" - ], - "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" - }, - "readxl": { - "Package": "readxl", - "Version": "1.4.5", - "Source": "Repository", - "Title": "Read Excel Files", - "Authors@R": "c( 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(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = \"Copyright holder of all R code and all C/C++ code without explicit copyright attribution\"), person(\"Marcin\", \"Kalicinski\", role = c(\"ctb\", \"cph\"), comment = \"Author of included RapidXML code\"), person(\"Komarov Valery\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Christophe Leitienne\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Bob Colbert\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"David Hoerl\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Evan Miller\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\") )", - "Description": "Import excel files into R. Supports '.xls' via the embedded 'libxls' C library and '.xlsx' via the embedded 'RapidXML' C++ library . Works on Windows, Mac and Linux without external dependencies.", - "License": "MIT + file LICENSE", - "URL": "https://readxl.tidyverse.org, https://github.com/tidyverse/readxl", - "BugReports": "https://github.com/tidyverse/readxl/issues", - "Depends": [ - "R (>= 3.6)" - ], - "Imports": [ - "cellranger", - "tibble (>= 2.0.1)", - "utils" - ], - "Suggests": [ - "covr", - "knitr", - "rmarkdown", - "testthat (>= 3.1.6)", - "withr" - ], - "LinkingTo": [ - "cpp11 (>= 0.4.0)", - "progress" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate, tidyverse", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "Note": "libxls v1.6.3 c199d13", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "yes", - "Author": "Hadley Wickham [aut] (), Jennifer Bryan [aut, cre] (), Posit, PBC [cph, fnd] (Copyright holder of all R code and all C/C++ code without explicit copyright attribution), Marcin Kalicinski [ctb, cph] (Author of included RapidXML code), Komarov Valery [ctb, cph] (Author of included libxls code), Christophe Leitienne [ctb, cph] (Author of included libxls code), Bob Colbert [ctb, cph] (Author of included libxls code), David Hoerl [ctb, cph] (Author of included libxls code), Evan Miller [ctb, cph] (Author of included libxls code)", - "Maintainer": "Jennifer Bryan ", - "Repository": "CRAN" - }, - "rematch": { - "Package": "rematch", - "Version": "2.0.0", - "Source": "Repository", - "Title": "Match Regular Expressions with a Nicer 'API'", - "Author": "Gabor Csardi", - "Maintainer": "Gabor Csardi ", - "Description": "A small wrapper on 'regexpr' to extract the matches and captured groups from the match of a regular expression to a character vector.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/gaborcsardi/rematch", - "BugReports": "https://github.com/gaborcsardi/rematch/issues", - "RoxygenNote": "5.0.1.9000", - "Suggests": [ - "covr", - "testthat" - ], - "Encoding": "UTF-8", - "NeedsCompilation": "no", - "Repository": "CRAN" - }, - "rematch2": { - "Package": "rematch2", - "Version": "2.1.2", - "Source": "Repository", - "Title": "Tidy Output from Regular Expression Matching", - "Authors@R": "c( person(\"Gábor\", \"Csárdi\", email = \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Matthew\", \"Lincoln\", email = \"matthew.d.lincoln@gmail.com\", role = c(\"ctb\")))", - "Description": "Wrappers on 'regexpr' and 'gregexpr' to return the match results in tidy data frames.", - "License": "MIT + file LICENSE", - "LazyData": "true", - "URL": "https://github.com/r-lib/rematch2#readme", - "BugReports": "https://github.com/r-lib/rematch2/issues", - "RoxygenNote": "7.1.0", - "Imports": [ - "tibble" - ], - "Suggests": [ - "covr", - "testthat" - ], - "Encoding": "UTF-8", - "NeedsCompilation": "no", - "Author": "Gábor Csárdi [aut, cre], Matthew Lincoln [ctb]", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - }, - "renv": { - "Package": "renv", - "Version": "1.1.7", - "Source": "Repository", - "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" - ], - "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" - }, - "reprex": { - "Package": "reprex", - "Version": "2.1.1", - "Source": "Repository", - "Title": "Prepare Reproducible Example Code via the Clipboard", - "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"David\", \"Robinson\", , \"admiral.david@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Convenience wrapper that uses the 'rmarkdown' package to render small snippets of code to target formats that include both code and output. The goal is to encourage the sharing of small, reproducible, and runnable examples on code-oriented websites, such as and , or in email. The user's clipboard is the default source of input code and the default target for rendered output. 'reprex' also extracts clean, runnable R code from various common formats, such as copy/paste from an R session.", - "License": "MIT + file LICENSE", - "URL": "https://reprex.tidyverse.org, https://github.com/tidyverse/reprex", - "BugReports": "https://github.com/tidyverse/reprex/issues", - "Depends": [ - "R (>= 3.6)" - ], - "Imports": [ - "callr (>= 3.6.0)", - "cli (>= 3.2.0)", - "clipr (>= 0.4.0)", - "fs", - "glue", - "knitr (>= 1.23)", - "lifecycle", - "rlang (>= 1.0.0)", - "rmarkdown", - "rstudioapi", - "utils", - "withr (>= 2.3.0)" - ], - "Suggests": [ - "covr", - "fortunes", - "miniUI", - "rprojroot", - "sessioninfo", - "shiny", - "spelling", - "styler (>= 1.2.0)", - "testthat (>= 3.2.1)" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "dplyr, tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "TRUE", - "Config/testthat/start-first": "knitr-options, venues, reprex", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.3.2", - "SystemRequirements": "pandoc (>= 2.0) - https://pandoc.org/", - "NeedsCompilation": "no", - "Author": "Jennifer Bryan [aut, cre] (), Jim Hester [aut] (), David Robinson [aut], Hadley Wickham [aut] (), Christophe Dervieux [aut] (), Posit Software, PBC [cph, fnd]", - "Maintainer": "Jennifer Bryan ", - "Repository": "CRAN" - }, - "rfema": { - "Package": "rfema", - "Version": "1.0.1", - "Source": "GitHub", - "Title": "Access the openFEMA API", - "Authors@R": "c(person(given = \"Dylan\", family = \"Turner\", role = c(\"aut\", \"cre\"), email = \"dylan.turner3@outlook.com\", comment = c(ORCID = \"0000-0002-0915-7384\")), person(given = \"François\", family = \"Michonneau\", role = c(\"rev\",\"ctb\"), email = \"francois.michonneau@gmail.com\", comment = \"reviewed the package for rOpenSci and patched several bugs in the prelease code, see https://github.com/ropensci/software-review/issues/484.\"), person(given = \"Marcus\", family = \"Beck\", role = c(\"rev\",\"ctb\"), comment = \"reviewed the package for rOpenSci, see https://github.com/ropensci/software-review/issues/484.\"))", - "Description": "`rfema` allows users to access The Federal Emergency Management Agency's (FEMA) publicly available data through their API. The package provides a set of functions to easily navigate and access data from the National Flood Insurance Program along with FEMA's various disaster aid programs, including the Hazard Mitigation Grant Program, the Public Assistance Grant Program, and the Individual Assistance Grant Program.", - "License": "MIT + file LICENSE", - "Encoding": "UTF-8", - "LazyData": "true", - "Roxygen": "list(markdown = TRUE)", - "RoxygenNote": "7.3.2", - "Imports": [ - "dplyr", - "memoise", - "utils", - "httr", - "plyr", - "tibble" - ], - "Suggests": [ - "rmarkdown", - "knitr", - "testthat (>= 3.0.0)", - "covr", - "vcr (>= 0.6.0)" - ], - "Config/testthat/edition": "3", - "VignetteBuilder": "knitr", - "URL": "https://github.com/dylan-turner25/rfema", - "BugReports": "https://github.com/dylan-turner25/rfema/issues", - "Author": "Dylan Turner [aut, cre] (ORCID: ), François Michonneau [rev, ctb] (reviewed the package for rOpenSci and patched several bugs in the prelease code, see https://github.com/ropensci/software-review/issues/484.), Marcus Beck [rev, ctb] (reviewed the package for rOpenSci, see https://github.com/ropensci/software-review/issues/484.)", - "Maintainer": "Dylan Turner ", - "RemoteType": "github", - "RemoteUsername": "ropensci", - "RemoteRepo": "rfema", - "RemoteRef": "main", - "RemoteSha": "1d7f85ff9838211e7aa27a051cde444a9a5894f9", - "RemoteHost": "api.github.com" - }, - "rlang": { - "Package": "rlang", - "Version": "1.1.7", - "Source": "Repository", - "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", - "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", - "Authors@R": "c( person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"), person(given = \"mikefc\", email = \"mikefc@coolbutuseless.com\", role = \"cph\", comment = \"Hash implementation based on Mike's xxhashlite\"), person(given = \"Yann\", family = \"Collet\", role = \"cph\", comment = \"Author of the embedded xxHash library\"), person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", - "License": "MIT + file LICENSE", - "ByteCompile": "true", - "Biarch": "true", - "Depends": [ - "R (>= 4.0.0)" - ], - "Imports": [ - "utils" - ], - "Suggests": [ - "cli (>= 3.1.0)", - "covr", - "crayon", - "desc", - "fs", - "glue", - "knitr", - "magrittr", - "methods", - "pillar", - "pkgload", - "rmarkdown", - "stats", - "testthat (>= 3.2.0)", - "tibble", - "usethis", - "vctrs (>= 0.2.3)", - "withr" - ], - "Enhances": [ - "winch" - ], - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", - "BugReports": "https://github.com/r-lib/rlang/issues", - "Config/build/compilation-database": "true", - "Config/testthat/edition": "3", - "Config/Needs/website": "dplyr, tidyverse/tidytemplate", - "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.30", - "Source": "Repository", - "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 (>= 1.43)", - "methods", - "tinytex (>= 0.31)", - "tools", - "utils", - "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" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "rstudio/quillt, pkgdown", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "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" - }, - "rprojroot": { - "Package": "rprojroot", - "Version": "2.1.1", - "Source": "Repository", - "Title": "Finding Files in Project Subdirectories", - "Authors@R": "person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\"))", - "Description": "Robust, reliable and flexible paths to files below a project root. The 'root' of a project is defined as a directory that matches a certain criterion, e.g., it contains a certain regular file.", - "License": "MIT + file LICENSE", - "URL": "https://rprojroot.r-lib.org/, https://github.com/r-lib/rprojroot", - "BugReports": "https://github.com/r-lib/rprojroot/issues", - "Depends": [ - "R (>= 3.0.0)" - ], - "Suggests": [ - "covr", - "knitr", - "lifecycle", - "rlang", - "rmarkdown", - "testthat (>= 3.2.0)", - "withr" - ], - "VignetteBuilder": "knitr", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2.9000", - "Config/autostyle/scope": "line_breaks", - "Config/autostyle/strict": "true", - "Config/Needs/website": "tidyverse/tidytemplate", - "NeedsCompilation": "no", - "Author": "Kirill Müller [aut, cre] (ORCID: )", - "Maintainer": "Kirill Müller ", - "Repository": "CRAN" - }, - "rstudioapi": { - "Package": "rstudioapi", - "Version": "0.18.0", - "Source": "Repository", - "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", - "RoxygenNote": "7.3.3", - "Suggests": [ - "testthat", - "knitr", - "rmarkdown", - "clipr", - "covr", - "curl", - "jsonlite", - "withr" - ], - "VignetteBuilder": "knitr", - "Encoding": "UTF-8", - "NeedsCompilation": "no", - "Author": "Kevin Ushey [aut, cre], JJ Allaire [aut], Hadley Wickham [aut], Gary Ritchie [aut], RStudio [cph]", - "Repository": "CRAN" - }, - "rvest": { - "Package": "rvest", - "Version": "1.0.5", - "Source": "Repository", - "Title": "Easily Harvest (Scrape) Web Pages", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", - "Description": "Wrappers around the 'xml2' and 'httr' packages to make it easy to download, then manipulate, HTML and XML.", - "License": "MIT + file LICENSE", - "URL": "https://rvest.tidyverse.org/, https://github.com/tidyverse/rvest", - "BugReports": "https://github.com/tidyverse/rvest/issues", - "Depends": [ - "R (>= 4.1)" - ], - "Imports": [ - "cli", - "glue", - "httr (>= 0.5)", - "lifecycle (>= 1.0.3)", - "magrittr", - "rlang (>= 1.1.0)", - "selectr", - "tibble", - "xml2 (>= 1.4.0)" - ], - "Suggests": [ - "chromote", - "covr", - "knitr", - "purrr", - "R6", - "readr", - "repurrrsive", - "rmarkdown", - "spelling", - "stringi (>= 0.3.1)", - "testthat (>= 3.0.2)", - "tidyr", - "webfakes" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "true", - "Encoding": "UTF-8", - "Language": "en-US", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Hadley Wickham ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "s2": { - "Package": "s2", - "Version": "1.1.9", - "Source": "Repository", - "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", - "RoxygenNote": "7.3.2", - "SystemRequirements": "cmake, OpenSSL >= 1.0.1, Abseil >= 20230802.0", - "LinkingTo": [ - "Rcpp", - "wk" - ], - "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, http://s2geometry.io/", - "BugReports": "https://github.com/r-spatial/s2/issues", - "Depends": [ - "R (>= 3.0.0)" - ], - "Config/testthat/edition": "3", - "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": "https://packagemanager.posit.co/cran/latest" - }, - "sass": { - "Package": "sass", - "Version": "0.4.10", - "Source": "Repository", - "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", - "rappdirs" - ], - "Suggests": [ - "testthat", - "knitr", - "rmarkdown", - "withr", - "shiny", - "curl" - ], - "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", - "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 (>= 2.0.3)", - "glue", - "labeling", - "lifecycle", - "R6", - "RColorBrewer", - "rlang (>= 1.1.0)", - "viridisLite" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "selectr": { - "Package": "selectr", - "Version": "0.5-1", - "Source": "Repository", - "Type": "Package", - "Title": "Translate CSS Selectors to XPath Expressions", - "Authors@R": "c(person(\"Simon\", \"Potter\", role = c(\"aut\", \"trl\", \"cre\"), email = \"simon@sjp.co.nz\"), person(\"Simon\", \"Sapin\", role = \"aut\"), person(\"Ian\", \"Bicking\", role = \"aut\"))", - "License": "BSD_3_clause + file LICENCE", - "Depends": [ - "R (>= 3.0)" - ], - "Imports": [ - "methods", - "stringr", - "R6" - ], - "Suggests": [ - "testthat", - "XML", - "xml2" - ], - "URL": "https://sjp.co.nz/projects/selectr/", - "BugReports": "https://github.com/sjp/selectr/issues", - "Description": "Translates a CSS selector into an equivalent XPath expression. This allows us to use CSS selectors when working with the XML package as it can only evaluate XPath expressions. Also provided are convenience functions useful for using CSS selectors on XML nodes. This package is a port of the Python package 'cssselect' ().", - "NeedsCompilation": "no", - "Author": "Simon Potter [aut, trl, cre], Simon Sapin [aut], Ian Bicking [aut]", - "Maintainer": "Simon Potter ", - "Repository": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" - }, - "sf": { - "Package": "sf", - "Version": "1.1-0", - "Source": "Repository", - "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\")) )", - "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 (>= 3.3.0)" - ], - "Imports": [ - "classInt (>= 0.4-1)", - "DBI (>= 0.8)", - "graphics", - "grDevices", - "grid", - "magrittr", - "s2 (>= 1.1.0)", - "stats", - "tools", - "units (>= 0.7-0)", - "utils" - ], - "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", - "RoxygenNote": "7.3.3", - "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'", - "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: )", - "Maintainer": "Edzer Pebesma ", - "Repository": "CRAN" - }, - "sfarrow": { - "Package": "sfarrow", - "Version": "0.4.1", - "Source": "Repository", - "Title": "Read/Write Simple Feature Objects ('sf') with 'Apache' 'Arrow'", - "Date": "2021-10-25", - "Authors@R": "person(given = \"Chris\", family = \"Jochem\", role = c(\"aut\", \"cre\"), email = \"w.c.jochem@soton.ac.uk\", comment = c(ORCID = \"0000-0003-2192-5988\"))", - "Description": "Support for reading/writing simple feature ('sf') spatial objects from/to 'Parquet' files. 'Parquet' files are an open-source, column-oriented data storage format from Apache (), now popular across programming languages. This implementation converts simple feature list geometries into well-known binary format for use by 'arrow', and coordinate reference system information is maintained in a standard metadata format.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/wcjochem/sfarrow, https://wcjochem.github.io/sfarrow/", - "BugReports": "https://github.com/wcjochem/sfarrow/issues", - "Encoding": "UTF-8", - "RoxygenNote": "7.1.1", - "Imports": [ - "sf", - "arrow", - "jsonlite", - "dplyr" - ], - "Suggests": [ - "knitr", - "rmarkdown" - ], - "VignetteBuilder": "knitr", - "NeedsCompilation": "no", - "Author": "Chris Jochem [aut, cre] ()", - "Maintainer": "Chris Jochem ", - "Repository": "CRAN" - }, - "snakecase": { - "Package": "snakecase", - "Version": "0.11.1", - "Source": "Repository", - "Date": "2023-08-27", - "Title": "Convert Strings into any Case", - "Description": "A consistent, flexible and easy to use tool to parse and convert strings into cases like snake or camel among others.", - "Authors@R": "c( person(\"Malte\", \"Grosser\", , \"malte.grosser@gmail.com\", role = c(\"aut\", \"cre\")))", - "Maintainer": "Malte Grosser ", - "Depends": [ - "R (>= 3.2)" - ], - "Imports": [ - "stringr", - "stringi" - ], - "Suggests": [ - "testthat", - "covr", - "tibble", - "purrrlyr", - "knitr", - "rmarkdown", - "magrittr" - ], - "URL": "https://github.com/Tazinho/snakecase", - "BugReports": "https://github.com/Tazinho/snakecase/issues", - "Encoding": "UTF-8", - "License": "GPL-3", - "RoxygenNote": "6.1.1", - "VignetteBuilder": "knitr", - "NeedsCompilation": "no", - "Author": "Malte Grosser [aut, cre]", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "stringi": { - "Package": "stringi", - "Version": "1.8.7", - "Source": "Repository", - "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", - "stats" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "stringr": { - "Package": "stringr", - "Version": "1.6.0", - "Source": "Repository", - "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 (>= 1.6.1)", - "lifecycle (>= 1.0.3)", - "magrittr", - "rlang (>= 1.0.0)", - "stringi (>= 1.5.3)", - "vctrs (>= 0.4.0)" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "sys": { - "Package": "sys", - "Version": "3.4.3", - "Source": "Repository", - "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": "https://packagemanager.posit.co/cran/latest" - }, - "systemfonts": { - "Package": "systemfonts", - "Version": "1.3.1", - "Source": "Repository", - "Type": "Package", - "Title": "System Native Font Finding", - "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Jeroen\", \"Ooms\", , \"jeroen@berkeley.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Devon\", \"Govett\", role = \"aut\", comment = \"Author of font-manager\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", - "Description": "Provides system native access to the font catalogue. As font handling varies between systems it is difficult to correctly locate installed fonts across different operating systems. The 'systemfonts' package provides bindings to the native libraries on Windows, macOS and Linux for finding font files that can then be used further by e.g. graphic devices. The main use is intended to be from compiled code but 'systemfonts' also provides access from R.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/r-lib/systemfonts, https://systemfonts.r-lib.org", - "BugReports": "https://github.com/r-lib/systemfonts/issues", - "Depends": [ - "R (>= 3.2.0)" - ], - "Imports": [ - "base64enc", - "grid", - "jsonlite", - "lifecycle", - "tools", - "utils" - ], - "Suggests": [ - "covr", - "farver", - "ggplot2", - "graphics", - "knitr", - "ragg", - "rmarkdown", - "svglite", - "testthat (>= 2.1.0)" - ], - "LinkingTo": [ - "cpp11 (>= 0.2.1)" - ], - "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/usethis/last-upkeep": "2025-04-23", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "SystemRequirements": "fontconfig, freetype2", - "NeedsCompilation": "yes", - "Author": "Thomas Lin Pedersen [aut, cre] (ORCID: ), Jeroen Ooms [aut] (ORCID: ), Devon Govett [aut] (Author of font-manager), Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Thomas Lin Pedersen ", - "Repository": "CRAN" - }, - "testthat": { - "Package": "testthat", - "Version": "3.3.2", - "Source": "Repository", - "Title": "Unit Testing for R", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Core team\", role = \"ctb\", comment = \"Implementation of utils::recover()\") )", - "Description": "Software testing is important, but, in part because it is frustrating and boring, many of us avoid it. 'testthat' is a testing framework for R that is easy to learn and use, and integrates with your existing 'workflow'.", - "License": "MIT + file LICENSE", - "URL": "https://testthat.r-lib.org, https://github.com/r-lib/testthat", - "BugReports": "https://github.com/r-lib/testthat/issues", - "Depends": [ - "R (>= 4.1.0)" - ], - "Imports": [ - "brio (>= 1.1.5)", - "callr (>= 3.7.6)", - "cli (>= 3.6.5)", - "desc (>= 1.4.3)", - "evaluate (>= 1.0.4)", - "jsonlite (>= 2.0.0)", - "lifecycle (>= 1.0.4)", - "magrittr (>= 2.0.3)", - "methods", - "pkgload (>= 1.4.0)", - "praise (>= 1.0.0)", - "processx (>= 3.8.6)", - "ps (>= 1.9.1)", - "R6 (>= 2.6.1)", - "rlang (>= 1.1.6)", - "utils", - "waldo (>= 0.6.2)", - "withr (>= 3.0.2)" - ], - "Suggests": [ - "covr", - "curl (>= 0.9.5)", - "diffviewer (>= 0.1.0)", - "digest (>= 0.6.33)", - "gh", - "knitr", - "otel", - "otelsdk", - "rmarkdown", - "rstudioapi", - "S7", - "shiny", - "usethis", - "vctrs (>= 0.1.0)", - "xml2" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "true", - "Config/testthat/start-first": "watcher, parallel*", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.3", - "NeedsCompilation": "yes", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], R Core team [ctb] (Implementation of utils::recover())", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "textshaping": { - "Package": "textshaping", - "Version": "1.0.4", - "Source": "Repository", - "Title": "Bindings to the 'HarfBuzz' and 'Fribidi' Libraries for Text Shaping", - "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", - "Description": "Provides access to the text shaping functionality in the 'HarfBuzz' library and the bidirectional algorithm in the 'Fribidi' library. 'textshaping' is a low-level utility package mainly for graphic devices that expands upon the font tool-set provided by the 'systemfonts' package.", - "License": "MIT + file LICENSE", - "URL": "https://github.com/r-lib/textshaping", - "BugReports": "https://github.com/r-lib/textshaping/issues", - "Depends": [ - "R (>= 3.2.0)" - ], - "Imports": [ - "lifecycle", - "stats", - "stringi", - "systemfonts (>= 1.3.0)", - "utils" - ], - "Suggests": [ - "covr", - "grDevices", - "grid", - "knitr", - "rmarkdown", - "testthat (>= 3.0.0)" - ], - "LinkingTo": [ - "cpp11 (>= 0.2.1)", - "systemfonts (>= 1.0.0)" - ], - "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", - "Config/testthat/edition": "3", - "Config/usethis/last-upkeep": "2025-04-23", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "SystemRequirements": "freetype2, harfbuzz, fribidi", - "NeedsCompilation": "yes", - "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Thomas Lin Pedersen ", - "Repository": "CRAN" - }, - "tibble": { - "Package": "tibble", - "Version": "3.3.1", - "Source": "Repository", - "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 (>= 1.0.0)", - "magrittr", - "methods", - "pillar (>= 1.8.1)", - "pkgconfig", - "rlang (>= 1.0.2)", - "utils", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "tidycensus": { - "Package": "tidycensus", - "Version": "1.7.5", - "Source": "Repository", - "Type": "Package", - "Title": "Load US Census Boundary and Attribute Data as 'tidyverse' and 'sf'-Ready Data Frames", - "Authors@R": "c( person(given = \"Kyle\", family = \"Walker\", email=\"kyle@walker-data.com\", role=c(\"aut\", \"cre\")), person(given = \"Matt\", family = \"Herman\", email = \"mfherman@gmail.com\", role = \"aut\"), person(given = \"Kris\", family = \"Eberwein\", email = \"eberwein@knights.ucf.edu\", role = \"ctb\"))", - "Date": "2026-02-09", - "URL": "https://walker-data.com/tidycensus/", - "BugReports": "https://github.com/walkerke/tidycensus/issues", - "Description": "An integrated R interface to several United States Census Bureau APIs () and the US Census Bureau's geographic boundary files. Allows R users to return Census and ACS data as tidyverse-ready data frames, and optionally returns a list-column with feature geometry for mapping and spatial analysis.", - "License": "MIT + file LICENSE", - "Encoding": "UTF-8", - "LazyData": "true", - "Depends": [ - "R (>= 3.3.0)" - ], - "Imports": [ - "httr", - "sf", - "dplyr (>= 1.0.0)", - "tigris", - "stringr", - "jsonlite (>= 1.5.0)", - "purrr", - "rvest", - "tidyr (>= 1.0.0)", - "rappdirs", - "readr", - "xml2", - "units", - "utils", - "rlang", - "crayon", - "tidyselect" - ], - "Suggests": [ - "ggplot2", - "survey", - "srvyr", - "terra" - ], - "RoxygenNote": "7.3.3", - "NeedsCompilation": "no", - "Author": "Kyle Walker [aut, cre], Matt Herman [aut], Kris Eberwein [ctb]", - "Maintainer": "Kyle Walker ", - "Repository": "CRAN" - }, - "tidyr": { - "Package": "tidyr", - "Version": "1.3.2", - "Source": "Repository", - "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 (>= 1.0.3)", - "magrittr", - "purrr (>= 1.0.1)", - "rlang (>= 1.1.1)", - "stringr (>= 1.5.0)", - "tibble (>= 2.1.1)", - "tidyselect (>= 1.2.1)", - "utils", - "vctrs (>= 0.5.2)" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "tidyselect": { - "Package": "tidyselect", - "Version": "1.2.1", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "tidytable": { - "Package": "tidytable", - "Version": "0.11.2", - "Source": "Repository", - "Title": "Tidy Interface to 'data.table'", - "Authors@R": "c( person(\"Mark\", \"Fairbanks\", role = c(\"aut\", \"cre\"), email = \"mark.t.fairbanks@gmail.com\"), person(\"Abdessabour\", \"Moutik\", role = \"ctb\"), person(\"Matt\", \"Carlson\", role = \"ctb\"), person(\"Ivan\", \"Leung\", role = \"ctb\"), person(\"Ross\", \"Kennedy\", role = \"ctb\"), person(\"Robert\", \"On\", role = \"ctb\"), person(\"Alexander\", \"Sevostianov\", role = \"ctb\"), person(\"Koen\", \"ter Berg\", role = \"ctb\") )", - "Description": "A tidy interface to 'data.table', giving users the speed of 'data.table' while using tidyverse-like syntax.", - "License": "MIT + file LICENSE", - "Encoding": "UTF-8", - "Imports": [ - "data.table (>= 1.16.0)", - "glue (>= 1.4.0)", - "lifecycle (>= 1.0.3)", - "magrittr (>= 2.0.3)", - "pillar (>= 1.8.0)", - "rlang (>= 1.1.0)", - "tidyselect (>= 1.2.0)", - "vctrs (>= 0.6.0)" - ], - "RoxygenNote": "7.3.2", - "Config/testthat/edition": "3", - "URL": "https://markfairbanks.github.io/tidytable/, https://github.com/markfairbanks/tidytable", - "BugReports": "https://github.com/markfairbanks/tidytable/issues", - "Suggests": [ - "testthat (>= 2.1.0)", - "bit64", - "knitr", - "rmarkdown", - "crayon" - ], - "NeedsCompilation": "no", - "Author": "Mark Fairbanks [aut, cre], Abdessabour Moutik [ctb], Matt Carlson [ctb], Ivan Leung [ctb], Ross Kennedy [ctb], Robert On [ctb], Alexander Sevostianov [ctb], Koen ter Berg [ctb]", - "Maintainer": "Mark Fairbanks ", - "Repository": "CRAN" - }, - "tidyverse": { - "Package": "tidyverse", - "Version": "2.0.0", - "Source": "Repository", - "Title": "Easily Install and Load the 'Tidyverse'", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", - "Description": "The 'tidyverse' is a set of packages that work in harmony because they share common data representations and 'API' design. This package is designed to make it easy to install and load multiple 'tidyverse' packages in a single step. Learn more about the 'tidyverse' at .", - "License": "MIT + file LICENSE", - "URL": "https://tidyverse.tidyverse.org, https://github.com/tidyverse/tidyverse", - "BugReports": "https://github.com/tidyverse/tidyverse/issues", - "Depends": [ - "R (>= 3.3)" - ], - "Imports": [ - "broom (>= 1.0.3)", - "conflicted (>= 1.2.0)", - "cli (>= 3.6.0)", - "dbplyr (>= 2.3.0)", - "dplyr (>= 1.1.0)", - "dtplyr (>= 1.2.2)", - "forcats (>= 1.0.0)", - "ggplot2 (>= 3.4.1)", - "googledrive (>= 2.0.0)", - "googlesheets4 (>= 1.0.1)", - "haven (>= 2.5.1)", - "hms (>= 1.1.2)", - "httr (>= 1.4.4)", - "jsonlite (>= 1.8.4)", - "lubridate (>= 1.9.2)", - "magrittr (>= 2.0.3)", - "modelr (>= 0.1.10)", - "pillar (>= 1.8.1)", - "purrr (>= 1.0.1)", - "ragg (>= 1.2.5)", - "readr (>= 2.1.4)", - "readxl (>= 1.4.2)", - "reprex (>= 2.0.2)", - "rlang (>= 1.0.6)", - "rstudioapi (>= 0.14)", - "rvest (>= 1.0.3)", - "stringr (>= 1.5.0)", - "tibble (>= 3.1.8)", - "tidyr (>= 1.3.0)", - "xml2 (>= 1.3.3)" - ], - "Suggests": [ - "covr (>= 3.6.1)", - "feather (>= 0.3.5)", - "glue (>= 1.6.2)", - "mockr (>= 0.2.0)", - "knitr (>= 1.41)", - "rmarkdown (>= 2.20)", - "testthat (>= 3.1.6)" - ], - "VignetteBuilder": "knitr", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.2.3", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], RStudio [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "tigris": { - "Package": "tigris", - "Version": "2.2.1", - "Source": "Repository", - "Type": "Package", - "Title": "Load Census TIGER/Line Shapefiles", - "Date": "2025-04-15", - "Authors@R": "c( person(given=\"Kyle\", family=\"Walker\", email=\"kyle@walker-data.com\", role=c(\"aut\", \"cre\")), person(given=\"Bob\", family=\"Rudis\", email=\"bob@rudis.net\", role=\"ctb\") )", - "URL": "https://github.com/walkerke/tigris", - "BugReports": "https://github.com/walkerke/tigris/issues", - "Description": "Download TIGER/Line shapefiles from the United States Census Bureau () and load into R as 'sf' objects.", - "License": "MIT + file LICENSE", - "LazyData": "TRUE", - "Encoding": "UTF-8", - "Depends": [ - "R (>= 3.3.0)" - ], - "Suggests": [ - "testthat", - "ggplot2", - "ggthemes", - "leaflet", - "knitr", - "tidycensus", - "sp" - ], - "Imports": [ - "stringr", - "magrittr", - "utils", - "rappdirs", - "httr", - "uuid", - "sf", - "dplyr", - "methods" - ], - "RoxygenNote": "7.3.2", - "NeedsCompilation": "no", - "Author": "Kyle Walker [aut, cre], Bob Rudis [ctb]", - "Maintainer": "Kyle Walker ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "timechange": { - "Package": "timechange", - "Version": "0.4.0", - "Source": "Repository", - "Title": "Efficient Manipulation of Date-Times", - "Authors@R": "c(person(\"Vitalie\", \"Spinu\", email = \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Google Inc.\", role = c(\"ctb\", \"cph\")))", - "Description": "Efficient routines for manipulation of date-time objects while accounting for time-zones and daylight saving times. The package includes utilities for updating of date-time components (year, month, day etc.), modification of time-zones, rounding of date-times, period addition and subtraction etc. Parts of the 'CCTZ' source code, released under the Apache 2.0 License, are included in this package. See for more details.", - "Depends": [ - "R (>= 3.3)" - ], - "License": "GPL (>= 3)", - "Encoding": "UTF-8", - "LinkingTo": [ - "cpp11 (>= 0.2.7)" - ], - "Suggests": [ - "testthat (>= 0.7.1.99)", - "knitr" - ], - "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", - "BugReports": "https://github.com/vspinu/timechange/issues", - "URL": "https://github.com/vspinu/timechange/", - "RoxygenNote": "7.2.1", - "NeedsCompilation": "yes", - "Author": "Vitalie Spinu [aut, cre], Google Inc. [ctb, cph]", - "Maintainer": "Vitalie Spinu ", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "tinytex": { - "Package": "tinytex", - "Version": "0.58", - "Source": "Repository", - "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" - ], - "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", - "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)" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "units": { - "Package": "units", - "Version": "1.0-0", - "Source": "Repository", - "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" - ], - "LinkingTo": [ - "Rcpp (>= 0.12.10)" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "urbnindicators": { - "Package": "urbnindicators", - "Version": "0.0.0.9401", - "Source": "GitHub", - "Type": "Package", - "Title": "Out of the Box Social Science Indicators from the American Community Survey (ACS)", - "Authors@R": "person(\"Will\", \"Curran-Groome\", email = \"wcurrangroome@gmail.com\", role = c(\"aut\", \"cre\"))", - "Description": "There are many packages available that facilitate queries to the Census Bureau API, but subsequent steps in the analysis workflow still require significant work (much of which must be repeated from analysis to analysis), such as identifying and selecting relevant variables, determining how to accurately calculate derived measures (e.g., percentages), and naming variables semantically. urbnindicators abstracts much of this process away and provides users a simple interface to obtain commonly-used social sciences measures from the ACS.", - "Encoding": "UTF-8", - "LazyData": "true", - "Imports": [ - "dplyr", - "janitor", - "lifecycle", - "magrittr", - "purrr", - "stats", - "stringr", - "tidycensus", - "tidyr", - "tigris", - "rlang", - "tibble", - "sf" - ], - "Suggests": [ - "distributional", - "ggdist", - "ggplot2", - "gridExtra", - "knitr", - "reactable", - "remotes", - "rmarkdown", - "testthat (>= 3.0.0)", - "scales", - "urbnthemes (>= 0.0.2)" - ], - "RoxygenNote": "7.3.3", - "URL": "https://ui-research.github.io/urbnindicators/", - "VignetteBuilder": "knitr, rmarkdown", - "Config/testthat/edition": "3", - "Roxygen": "list(markdown = TRUE)", - "License": "GPL (>= 3) + file LICENSE", - "Author": "Will Curran-Groome [aut, cre]", - "Maintainer": "Will Curran-Groome ", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "UI-Research", - "RemoteRepo": "urbnindicators", - "RemoteRef": "main", - "RemoteSha": "6283b2eb3956e0c3c157257204fbd92989971e4c", - "Remotes": "UrbanInstitute/urbnthemes" - }, - "urbnthemes": { - "Package": "urbnthemes", - "Version": "0.0.3", - "Source": "GitHub", - "Type": "Package", - "Title": "Additional theme and utilities for \"ggplot2\" in the Urban Institute style", - "Authors@R": "c( person(given = \"Aaron\", family = \"Williams\", middle = \"R.\", email = \"awilliams@urban.org\", role = c(\"aut\", \"cre\")), person(given = \"Kyle\", family = \"Ueyama\", email = \"kueyama@urban.org\", role = \"aut\"), person(given = \"Ajjit\", family = \"Narayanan\", email = \"anarayanan@urban.org\", role = \"aut\"), person(given = \"Ben\", family = \"Chartoff\", email = \"bchartoff@urban.org\", role = \"aut\") )", - "Description": "Align \"ggplot2\" output more closely with the Urban Institute Data Visualization style guide .", - "Depends": [ - "R (>= 3.1.0)" - ], - "Imports": [ - "extrafont", - "ggplot2 (>= 3.3.0)", - "ggrepel", - "grid", - "gridExtra", - "lifecycle", - "scales", - "conflicted", - "tibble", - "purrr", - "stringr", - "systemfonts" - ], - "License": "GPL-3", - "URL": "https://github.com/UrbanInstitute/urbnthemes", - "BugReports": "https://github.com/UrbanInstitute/urbnthemes/issues", - "Encoding": "UTF-8", - "LazyData": "true", - "RoxygenNote": "7.3.2", - "Suggests": [ - "knitr", - "rmarkdown", - "testthat" - ], - "VignetteBuilder": "knitr", - "Roxygen": "list(markdown = TRUE)", - "Author": "Aaron R. Williams [aut, cre], Kyle Ueyama [aut], Ajjit Narayanan [aut], Ben Chartoff [aut]", - "Maintainer": "Aaron R. Williams ", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "UrbanInstitute", - "RemoteRepo": "urbnthemes", - "RemoteRef": "main", - "RemoteSha": "c7c37dd1ce8d1fee7eb7e1aed7f4eb7dcaf4d5b4", - "Remotes": "extrafont=github::wch/extrafont" - }, - "utf8": { - "Package": "utf8", - "Version": "1.2.6", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "uuid": { - "Package": "uuid", - "Version": "1.2-2", - "Source": "Repository", - "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)" - ], - "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": "https://packagemanager.posit.co/cran/latest", - "Encoding": "UTF-8" - }, - "vctrs": { - "Package": "vctrs", - "Version": "0.7.1", - "Source": "Repository", - "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 (>= 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" - ], - "VignetteBuilder": "knitr", - "Config/build/compilation-database": "true", - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/testthat/parallel": "true", - "Encoding": "UTF-8", - "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": "https://packagemanager.posit.co/cran/latest" - }, - "viridisLite": { - "Package": "viridisLite", - "Version": "0.4.3", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "vroom": { - "Package": "vroom", - "Version": "1.7.0", - "Source": "Repository", - "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 (>= 3.2.0)", - "crayon", - "glue", - "hms", - "lifecycle (>= 1.0.3)", - "methods", - "rlang (>= 1.1.0)", - "stats", - "tibble (>= 2.0.0)", - "tidyselect", - "tzdb (>= 0.1.1)", - "vctrs (>= 0.2.0)", - "withr" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "waldo": { - "Package": "waldo", - "Version": "0.6.2", - "Source": "Repository", - "Title": "Find Differences Between R Objects", - "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", - "Description": "Compare complex R objects and reveal the key differences. Designed particularly for use in testing packages where being able to quickly isolate key differences makes understanding test failures much easier.", - "License": "MIT + file LICENSE", - "URL": "https://waldo.r-lib.org, https://github.com/r-lib/waldo", - "BugReports": "https://github.com/r-lib/waldo/issues", - "Depends": [ - "R (>= 4.0)" - ], - "Imports": [ - "cli", - "diffobj (>= 0.3.4)", - "glue", - "methods", - "rlang (>= 1.1.0)" - ], - "Suggests": [ - "bit64", - "R6", - "S7", - "testthat (>= 3.0.0)", - "withr", - "xml2" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "NeedsCompilation": "no", - "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", - "Maintainer": "Hadley Wickham ", - "Repository": "CRAN" - }, - "whisker": { - "Package": "whisker", - "Version": "0.4.1", - "Source": "Repository", - "Maintainer": "Edwin de Jonge ", - "License": "GPL-3", - "Title": "{{mustache}} for R, Logicless Templating", - "Type": "Package", - "LazyLoad": "yes", - "Author": "Edwin de Jonge", - "Description": "Implements 'Mustache' logicless templating.", - "URL": "https://github.com/edwindj/whisker", - "Suggests": [ - "markdown" - ], - "RoxygenNote": "6.1.1", - "NeedsCompilation": "no", - "Repository": "CRAN" - }, - "withr": { - "Package": "withr", - "Version": "3.0.2", - "Source": "Repository", - "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" - ], - "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": "https://packagemanager.posit.co/cran/latest" - }, - "wk": { - "Package": "wk", - "Version": "0.9.5", - "Source": "Repository", - "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)" - ], - "LazyData": "true", - "NeedsCompilation": "yes", - "Author": "Dewey Dunnington [aut, cre] (ORCID: ), Edzer Pebesma [aut] (ORCID: ), Anthony North [ctb]", - "Repository": "https://packagemanager.posit.co/cran/latest" - }, - "xfun": { - "Package": "xfun", - "Version": "0.56", - "Source": "Repository", - "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" - ], - "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", - "RoxygenNote": "7.3.3", - "VignetteBuilder": "litedown", - "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.5.2", - "Source": "Repository", - "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 (>= 1.1.0)" - ], - "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' 'zzz.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": "https://packagemanager.posit.co/cran/latest" - }, - "yaml": { - "Package": "yaml", - "Version": "2.3.12", - "Source": "Repository", - "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" - }, - "zeallot": { - "Package": "zeallot", - "Version": "0.2.0", - "Source": "Repository", - "Type": "Package", - "Title": "Multiple, Unpacking, and Destructuring Assignment", - "Authors@R": "c( person(\"Nathan\", \"Teetor\", email = \"nate@haufin.ch\", role = c(\"aut\", \"cre\")), person(\"Paul\", \"Teetor\", role = \"ctb\"))", - "Description": "Provides a %<-% operator to perform multiple, unpacking, and destructuring assignment in R. The operator unpacks the right-hand side of an assignment into multiple values and assigns these values to variables on the left-hand side of the assignment.", - "URL": "https://github.com/r-lib/zeallot", - "BugReports": "https://github.com/r-lib/zeallot/issues", - "License": "MIT + file LICENSE", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2", - "VignetteBuilder": "knitr", - "Depends": [ - "R (>= 3.2)" - ], - "Suggests": [ - "codetools", - "testthat", - "knitr", - "rmarkdown", - "purrr" - ], - "NeedsCompilation": "no", - "Author": "Nathan Teetor [aut, cre], Paul Teetor [ctb]", - "Maintainer": "Nathan Teetor ", - "Repository": "RSPM" - }, - "zip": { - "Package": "zip", - "Version": "2.3.3", - "Source": "Repository", - "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(\"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", - "Suggests": [ - "covr", - "pillar", - "processx", - "R6", - "testthat", - "withr" - ], - "Config/Needs/website": "tidyverse/tidytemplate", - "Config/testthat/edition": "3", - "Config/usethis/last-upkeep": "2025-05-07", - "Encoding": "UTF-8", - "RoxygenNote": "7.3.2.9000", - "NeedsCompilation": "yes", - "Author": "Gábor Csárdi [aut, cre], Kuba Podgórski [ctb], Rich Geldreich [ctb], Posit Software, PBC [cph, fnd] (ROR: )", - "Maintainer": "Gábor Csárdi ", - "Repository": "CRAN" - } - } -} +{ + "R": { + "Version": "4.5.3", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cran.rstudio.com" + } + ] + }, + "Packages": { + "BH": { + "Package": "BH", + "Version": "1.90.0-1", + "Source": "Repository", + "Type": "Package", + "Title": "Boost C++ Header Files", + "Date": "2025-12-13", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"John W.\", \"Emerson\", role = \"aut\"), person(\"Michael J.\", \"Kane\", role = \"aut\", comment = c(ORCID = \"0000-0003-1899-6662\")))", + "Description": "Boost provides free peer-reviewed portable C++ source libraries. A large part of Boost is provided as C++ template code which is resolved entirely at compile-time without linking. This package aims to provide the most useful subset of Boost libraries for template use among CRAN packages. By placing these libraries in this package, we offer a more efficient distribution system for CRAN as replication of this code in the sources of other packages is avoided. As of release 1.84.0-0, the following Boost libraries are included: 'accumulators' 'algorithm' 'align' 'any' 'atomic' 'beast' 'bimap' 'bind' 'circular_buffer' 'compute' 'concept' 'config' 'container' 'date_time' 'detail' 'dynamic_bitset' 'exception' 'flyweight' 'foreach' 'functional' 'fusion' 'geometry' 'graph' 'heap' 'icl' 'integer' 'interprocess' 'intrusive' 'io' 'iostreams' 'iterator' 'lambda2' 'math' 'move' 'mp11' 'mpl' 'multiprecision' 'numeric' 'pending' 'phoenix' 'polygon' 'preprocessor' 'process' 'propery_tree' 'qvm' 'random' 'range' 'scope_exit' 'smart_ptr' 'sort' 'spirit' 'tuple' 'type_traits' 'typeof' 'unordered' 'url' 'utility' 'uuid'.", + "License": "BSL-1.0", + "URL": "https://github.com/eddelbuettel/bh, https://dirk.eddelbuettel.com/code/bh.html", + "BugReports": "https://github.com/eddelbuettel/bh/issues", + "NeedsCompilation": "no", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), John W. Emerson [aut], Michael J. Kane [aut] (ORCID: )", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" + }, + "DBI": { + "Package": "DBI", + "Version": "1.3.0", + "Source": "Repository", + "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" + ], + "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", + "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" + ], + "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", + "Priority": "recommended", + "Date": "2025-02-19", + "Revision": "$Rev: 3681 $", + "Depends": [ + "R (>= 4.4.0)", + "grDevices", + "graphics", + "stats", + "utils" + ], + "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", + "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)" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "RColorBrewer": { + "Package": "RColorBrewer", + "Version": "1.1-3", + "Source": "Repository", + "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)" + ], + "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": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, + "RSQLite": { + "Package": "RSQLite", + "Version": "3.53.3", + "Source": "Repository", + "Title": "SQLite Interface for R", + "Date": "2026-06-28", + "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(c(\"David\", \"A.\"), \"James\", role = \"aut\"), person(\"Seth\", \"Falcon\", role = \"aut\"), person(\"D. Richard\", \"Hipp\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Dan\", \"Kennedy\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Joe\", \"Mistachkin\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(, \"SQLite Authors\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"Liam\", \"Healy\", role = \"ctb\", comment = \"for the included SQLite sources\"), person(\"R Consortium\", role = \"fnd\"), person(, \"RStudio\", role = \"cph\") )", + "Description": "Embeds the SQLite database engine in R and provides an interface compliant with the DBI package. The source for the SQLite engine and for various extensions is included. System libraries will never be consulted because this package relies on static linking for the plugins it includes; this also ensures a consistent experience across all installations. Optionally, when libcurl is available at build time, an experimental HTTP/HTTPS virtual file system (VFS) can be enabled to allow read-only access to remote immutable SQLite database files via URIs.", + "License": "LGPL (>= 2.1)", + "URL": "https://rsqlite.r-dbi.org, https://github.com/r-dbi/RSQLite", + "BugReports": "https://github.com/r-dbi/RSQLite/issues", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "bit64", + "blob (>= 1.2.0)", + "DBI (>= 1.2.0)", + "memoise", + "methods", + "pkgconfig", + "rlang" + ], + "Suggests": [ + "callr", + "cli", + "DBItest (>= 1.8.0)", + "decor", + "gert", + "gh", + "hms", + "httpuv", + "knitr", + "magrittr", + "rmarkdown", + "rvest", + "testthat (>= 3.0.0)", + "withr", + "xml2" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "r-dbi/dbitemplate", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Collate": "'SQLiteConnection.R' 'SQLKeywords_SQLiteConnection.R' 'SQLiteDriver.R' 'SQLite.R' 'SQLiteResult.R' 'coerce.R' 'compatRowNames.R' 'copy.R' 'cpp11.R' 'datasetsDb.R' 'dbAppendTable_SQLiteConnection.R' 'dbBeginTransaction.R' 'dbBegin_SQLiteConnection.R' 'dbBind_SQLiteResult.R' 'dbClearResult_SQLiteResult.R' 'dbColumnInfo_SQLiteResult.R' 'dbCommit_SQLiteConnection.R' 'dbConnect_SQLiteConnection.R' 'dbConnect_SQLiteDriver.R' 'dbDataType_SQLiteConnection.R' 'dbDataType_SQLiteDriver.R' 'dbDisconnect_SQLiteConnection.R' 'dbExistsTable_SQLiteConnection_Id.R' 'dbExistsTable_SQLiteConnection_character.R' 'dbFetch_SQLiteResult.R' 'dbGetException_SQLiteConnection.R' 'dbGetInfo_SQLiteConnection.R' 'dbGetInfo_SQLiteDriver.R' 'dbGetPreparedQuery.R' 'dbGetPreparedQuery_SQLiteConnection_character_data.frame.R' 'dbGetRowCount_SQLiteResult.R' 'dbGetRowsAffected_SQLiteResult.R' 'dbGetStatement_SQLiteResult.R' 'dbHasCompleted_SQLiteResult.R' 'dbIsValid_SQLiteConnection.R' 'dbIsValid_SQLiteDriver.R' 'dbIsValid_SQLiteResult.R' 'dbListObjects_SQLiteConnection.R' 'dbListResults_SQLiteConnection.R' 'dbListTables_SQLiteConnection.R' 'dbQuoteIdentifier_SQLiteConnection_SQL.R' 'dbQuoteIdentifier_SQLiteConnection_character.R' 'dbReadTable_SQLiteConnection_character.R' 'dbRemoveTable_SQLiteConnection_character.R' 'dbRollback_SQLiteConnection.R' 'dbSendPreparedQuery.R' 'dbSendPreparedQuery_SQLiteConnection_character_data.frame.R' 'dbSendQuery_SQLiteConnection_character.R' 'dbUnloadDriver_SQLiteDriver.R' 'dbUnquoteIdentifier_SQLiteConnection_SQL.R' 'dbWriteTable_SQLiteConnection_character_character.R' 'dbWriteTable_SQLiteConnection_character_data.frame.R' 'db_bind.R' 'deprecated.R' 'export.R' 'fetch_SQLiteResult.R' 'httpvfs.R' 'httpvfs_config.R' 'import-standalone-check_suggested.R' 'import-standalone-purrr.R' 'initExtension.R' 'initRegExp.R' 'isSQLKeyword_SQLiteConnection_character.R' 'make.db.names_SQLiteConnection_character.R' 'pkgconfig.R' 'show_SQLiteConnection.R' 'sqlData_SQLiteConnection.R' 'table.R' 'transactions.R' 'utils.R' 'version.R' 'zzz.R'", + "Config/roxygen2/version": "8.0.0.9000", + "NeedsCompilation": "yes", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], David A. James [aut], Seth Falcon [aut], D. Richard Hipp [ctb] (for the included SQLite sources), Dan Kennedy [ctb] (for the included SQLite sources), Joe Mistachkin [ctb] (for the included SQLite sources), SQLite Authors [ctb] (for the included SQLite sources), Liam Healy [ctb] (for the included SQLite sources), R Consortium [fnd], RStudio [cph]", + "Maintainer": "Kirill Müller ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "Rcpp": { + "Package": "Rcpp", + "Version": "1.1.2", + "Source": "Repository", + "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" + ], + "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" + }, + "Rttf2pt1": { + "Package": "Rttf2pt1", + "Version": "1.3.14", + "Source": "Repository", + "Type": "Package", + "Title": "'ttf2pt1' Program", + "Date": "2025-09-24", + "Depends": [ + "R (>= 2.15)" + ], + "Suggests": [ + "testthat", + "withr (>= 2.5.0)" + ], + "Authors@R": "c(person(given = \"Winston\", family = \"Chang\", role = c(\"aut\"), email = \"winston@stdout.org\"), person(given = \"Andrew\", family = \"Weeks\", role = \"aut\"), person(given = c(\"Frank\", \"M.\"), family = \"Siegert\", role = \"aut\"), person(given = \"Mark\", family = \"Heath\", role = \"aut\"), person(given = \"Thomas\", family = \"Henlick\", role = \"aut\"), person(given = \"Sergey\", family = \"Babkin\", role = \"aut\"), person(given = \"Turgut\", family = \"Uyar\", role = \"aut\"), person(given = \"Rihardas\", family = \"Hepas\", role = \"aut\"), person(given = \"Szalay\", family = \"Tamas\", role = \"aut\"), person(given = \"Johan\", family = \"Vromans\", role = \"aut\"), person(given = \"Petr\", family = \"Titera\", role = \"aut\"), person(given = \"Lei\", family = \"Wang\", role = \"aut\"), person(given = \"Chen\", family = \"Xiangyang\", role = \"aut\"), person(given = \"Zvezdan\", family = \"Petkovic\", role = \"aut\"), person(family = \"Rigel\", role = \"aut\"), person(given = c(\"I.\", \"Lee\"), family = \"Hetherington\", role = \"aut\"), person(given = \"Frederic\", family= \"Bertrand\", role = c(\"cre\"), email = \"frederic.bertrand@lecnam.net\", comment = c(ORCID = \"0000-0002-0837-8281\")) )", + "Author": "Winston Chang [aut], Andrew Weeks [aut], Frank M. Siegert [aut], Mark Heath [aut], Thomas Henlick [aut], Sergey Babkin [aut], Turgut Uyar [aut], Rihardas Hepas [aut], Szalay Tamas [aut], Johan Vromans [aut], Petr Titera [aut], Lei Wang [aut], Chen Xiangyang [aut], Zvezdan Petkovic [aut], Rigel [aut], I. Lee Hetherington [aut], Frederic Bertrand [cre] (ORCID: )", + "Maintainer": "Frederic Bertrand ", + "Description": "Contains the program 'ttf2pt1', for use with the 'extrafont' package. This product includes software developed by the 'TTF2PT1' Project and its contributors.", + "License": "file LICENSE", + "URL": "https://github.com/fbertran/Rttf2pt1", + "BugReports": "https://github.com/fbertran/Rttf2pt1/issues", + "LazyLoad": "yes", + "NeedsCompilation": "yes", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "3", + "License_is_FOSS": "yes", + "Repository": "CRAN" + }, + "S7": { + "Package": "S7", + "Version": "0.2.2", + "Source": "Repository", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "arrow": { + "Package": "arrow", + "Version": "25.0.0", + "Source": "Repository", + "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 (>= 0.9-7)", + "glue", + "methods", + "purrr", + "R6", + "rlang (>= 1.0.0)", + "stats", + "tidyselect (>= 1.0.0)", + "utils", + "vctrs" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "askpass": { + "Package": "askpass", + "Version": "1.2.1", + "Source": "Repository", + "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" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "assertthat": { + "Package": "assertthat", + "Version": "0.2.1", + "Source": "Repository", + "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" + ], + "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": "RSPM", + "Encoding": "UTF-8" + }, + "backports": { + "Package": "backports", + "Version": "1.5.1", + "Source": "Repository", + "Type": "Package", + "Title": "Reimplementations of Functions Introduced Since R-3.0.0", + "Authors@R": "c( person(\"Michel\", \"Lang\", NULL, \"michellang@gmail.com\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Duncan\", \"Murdoch\", NULL, \"murdoch.duncan@gmail.com\", role = c(\"aut\")), person(\"R Core Team\", role = \"aut\"))", + "Maintainer": "Michel Lang ", + "Description": "Functions introduced or changed since R v3.0.0 are re-implemented in this package. The backports are conditionally exported in order to let R resolve the function name to either the implemented backport, or the respective base version, if available. Package developers can make use of new functions or arguments by selectively importing specific backports to support older installations.", + "URL": "https://github.com/r-lib/backports", + "BugReports": "https://github.com/r-lib/backports/issues", + "License": "GPL-2 | GPL-3", + "NeedsCompilation": "yes", + "ByteCompile": "yes", + "Depends": [ + "R (>= 3.0.0)" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Author": "Michel Lang [cre, aut] (ORCID: ), Duncan Murdoch [aut], R Core Team [aut]", + "Repository": "CRAN" + }, + "base64enc": { + "Package": "base64enc", + "Version": "0.1-6", + "Source": "Repository", + "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" + ], + "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", + "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)" + ], + "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", + "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" + ], + "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" + }, + "blob": { + "Package": "blob", + "Version": "1.3.0", + "Source": "Repository", + "Title": "A Simple S3 Class for Representing Vectors of Binary Data ('BLOBS')", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = \"cre\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "R's raw vector is useful for storing a single binary object. What if you want to put a vector of them in a data frame? The 'blob' package provides the blob object, a list of raw vectors, suitable for use as a column in data frame.", + "License": "MIT + file LICENSE", + "URL": "https://blob.tidyverse.org, https://github.com/tidyverse/blob", + "BugReports": "https://github.com/tidyverse/blob/issues", + "Imports": [ + "methods", + "rlang", + "vctrs (>= 0.2.1)" + ], + "Suggests": [ + "covr", + "crayon", + "pillar (>= 1.2.1)", + "testthat (>= 3.0.0)" + ], + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Kirill Müller [cre], RStudio [cph, fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "brio": { + "Package": "brio", + "Version": "1.1.5", + "Source": "Repository", + "Title": "Basic R Input Output", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Functions to handle basic input output, these functions always read and write UTF-8 (8-bit Unicode Transformation Format) files and provide more explicit control over line endings.", + "License": "MIT + file LICENSE", + "URL": "https://brio.r-lib.org, https://github.com/r-lib/brio", + "BugReports": "https://github.com/r-lib/brio/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (), Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "broom": { + "Package": "broom", + "Version": "1.0.13", + "Source": "Repository", + "Type": "Package", + "Title": "Convert Statistical Objects into Tidy Tibbles", + "Authors@R": "c( person(\"David\", \"Robinson\", , \"admiral.david@gmail.com\", role = \"aut\"), person(\"Alex\", \"Hayes\", , \"alexpghayes@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4985-5160\")), person(\"Simon\", \"Couch\", , \"simon.couch@posit.co\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-5676-5107\")), person(\"Emil\", \"Hvitfeldt\", , \"emil.hvitfeldt@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0679-1945\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Indrajeet\", \"Patil\", , \"patilindrajeet.science@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1995-6531\")), person(\"Derek\", \"Chiu\", , \"dchiu@bccrc.ca\", role = \"ctb\"), person(\"Matthieu\", \"Gomez\", , \"mattg@princeton.edu\", role = \"ctb\"), person(\"Boris\", \"Demeshev\", , \"boris.demeshev@gmail.com\", role = \"ctb\"), person(\"Dieter\", \"Menne\", , \"dieter.menne@menne-biomed.de\", role = \"ctb\"), person(\"Benjamin\", \"Nutter\", , \"nutter@battelle.org\", role = \"ctb\"), person(\"Luke\", \"Johnston\", , \"luke.johnston@mail.utoronto.ca\", role = \"ctb\"), person(\"Ben\", \"Bolker\", , \"bolker@mcmaster.ca\", role = \"ctb\"), person(\"Francois\", \"Briatte\", , \"f.briatte@gmail.com\", role = \"ctb\"), person(\"Jeffrey\", \"Arnold\", , \"jeffrey.arnold@gmail.com\", role = \"ctb\"), person(\"Jonah\", \"Gabry\", , \"jsg2201@columbia.edu\", role = \"ctb\"), person(\"Luciano\", \"Selzer\", , \"luciano.selzer@gmail.com\", role = \"ctb\"), person(\"Gavin\", \"Simpson\", , \"ucfagls@gmail.com\", role = \"ctb\"), person(\"Jens\", \"Preussner\", , \"jens.preussner@mpi-bn.mpg.de\", role = \"ctb\"), person(\"Jay\", \"Hesselberth\", , \"jay.hesselberth@gmail.com\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"ctb\"), person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = \"ctb\"), person(\"Alessandro\", \"Gasparini\", , \"ag475@leicester.ac.uk\", role = \"ctb\"), person(\"Lukasz\", \"Komsta\", , \"lukasz.komsta@umlub.pl\", role = \"ctb\"), person(\"Frederick\", \"Novometsky\", role = \"ctb\"), person(\"Wilson\", \"Freitas\", role = \"ctb\"), person(\"Michelle\", \"Evans\", role = \"ctb\"), person(\"Jason Cory\", \"Brunson\", , \"cornelioid@gmail.com\", role = \"ctb\"), person(\"Simon\", \"Jackson\", , \"drsimonjackson@gmail.com\", role = \"ctb\"), person(\"Ben\", \"Whalley\", , \"ben.whalley@plymouth.ac.uk\", role = \"ctb\"), person(\"Karissa\", \"Whiting\", , \"karissa.whiting@gmail.com\", role = \"ctb\"), person(\"Yves\", \"Rosseel\", , \"yrosseel@gmail.com\", role = \"ctb\"), person(\"Michael\", \"Kuehn\", , \"mkuehn10@gmail.com\", role = \"ctb\"), person(\"Jorge\", \"Cimentada\", , \"cimentadaj@gmail.com\", role = \"ctb\"), person(\"Erle\", \"Holgersen\", , \"erle.holgersen@gmail.com\", role = \"ctb\"), person(\"Karl\", \"Dunkle Werner\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0523-7309\")), person(\"Ethan\", \"Christensen\", , \"christensen.ej@gmail.com\", role = \"ctb\"), person(\"Steven\", \"Pav\", , \"shabbychef@gmail.com\", role = \"ctb\"), person(\"Paul\", \"PJ\", , \"pjpaul.stephens@gmail.com\", role = \"ctb\"), person(\"Ben\", \"Schneider\", , \"benjamin.julius.schneider@gmail.com\", role = \"ctb\"), person(\"Patrick\", \"Kennedy\", , \"pkqstr@protonmail.com\", role = \"ctb\"), person(\"Lily\", \"Medina\", , \"lilymiru@gmail.com\", role = \"ctb\"), person(\"Brian\", \"Fannin\", , \"captain@pirategrunt.com\", role = \"ctb\"), person(\"Jason\", \"Muhlenkamp\", , \"jason.muhlenkamp@gmail.com\", role = \"ctb\"), person(\"Matt\", \"Lehman\", role = \"ctb\"), person(\"Bill\", \"Denney\", , \"wdenney@humanpredictions.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Nic\", \"Crane\", role = \"ctb\"), person(\"Andrew\", \"Bates\", role = \"ctb\"), person(\"Vincent\", \"Arel-Bundock\", , \"vincent.arel-bundock@umontreal.ca\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2042-7063\")), person(\"Hideaki\", \"Hayashi\", role = \"ctb\"), person(\"Luis\", \"Tobalina\", role = \"ctb\"), person(\"Annie\", \"Wang\", , \"anniewang.uc@gmail.com\", role = \"ctb\"), person(\"Wei Yang\", \"Tham\", , \"weiyang.tham@gmail.com\", role = \"ctb\"), person(\"Clara\", \"Wang\", , \"clara.wang.94@gmail.com\", role = \"ctb\"), person(\"Abby\", \"Smith\", , \"als1@u.northwestern.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3207-0375\")), person(\"Jasper\", \"Cooper\", , \"jaspercooper@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8639-3188\")), person(\"E Auden\", \"Krauska\", , \"krauskae@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-1466-5850\")), person(\"Alex\", \"Wang\", , \"x249wang@uwaterloo.ca\", role = \"ctb\"), person(\"Malcolm\", \"Barrett\", , \"malcolmbarrett@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Charles\", \"Gray\", , \"charlestigray@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9978-011X\")), person(\"Jared\", \"Wilber\", role = \"ctb\"), person(\"Vilmantas\", \"Gegzna\", , \"GegznaV@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9500-5167\")), person(\"Eduard\", \"Szoecs\", , \"eduardszoecs@gmail.com\", role = \"ctb\"), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Angus\", \"Moore\", , \"angusmoore9@gmail.com\", role = \"ctb\"), person(\"Nick\", \"Williams\", , \"ntwilliams.personal@gmail.com\", role = \"ctb\"), person(\"Marius\", \"Barth\", , \"marius.barth.uni.koeln@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3421-6665\")), person(\"Bruna\", \"Wundervald\", , \"brunadaviesw@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8163-220X\")), person(\"Joyce\", \"Cahoon\", , \"joyceyu48@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7217-4702\")), person(\"Grant\", \"McDermott\", , \"grantmcd@uoregon.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7883-8573\")), person(\"Kevin\", \"Zarca\", , \"kevin.zarca@gmail.com\", role = \"ctb\"), person(\"Shiro\", \"Kuriwaki\", , \"shirokuriwaki@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5687-2647\")), person(\"Lukas\", \"Wallrich\", , \"lukas.wallrich@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2121-5177\")), person(\"James\", \"Martherus\", , \"james@martherus.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8285-3300\")), person(\"Chuliang\", \"Xiao\", , \"cxiao@umich.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8466-9398\")), person(\"Joseph\", \"Larmarange\", , \"joseph@larmarange.net\", role = \"ctb\"), person(\"Max\", \"Kuhn\", , \"max@posit.co\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", , \"michal2992@gmail.com\", role = \"ctb\"), person(\"Hakon\", \"Malmedal\", , \"hmalmedal@gmail.com\", role = \"ctb\"), person(\"Clara\", \"Wang\", role = \"ctb\"), person(\"Sergio\", \"Oller\", , \"sergioller@gmail.com\", role = \"ctb\"), person(\"Luke\", \"Sonnet\", , \"luke.sonnet@gmail.com\", role = \"ctb\"), person(\"Jim\", \"Hester\", , \"jim.hester@posit.co\", role = \"ctb\"), person(\"Ben\", \"Schneider\", , \"benjamin.julius.schneider@gmail.com\", role = \"ctb\"), person(\"Bernie\", \"Gray\", , \"bfgray3@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9190-6032\")), person(\"Mara\", \"Averick\", , \"mara@posit.co\", role = \"ctb\"), person(\"Aaron\", \"Jacobs\", , \"atheriel@gmail.com\", role = \"ctb\"), person(\"Andreas\", \"Bender\", , \"bender.at.R@gmail.com\", role = \"ctb\"), person(\"Sven\", \"Templer\", , \"sven.templer@gmail.com\", role = \"ctb\"), person(\"Paul-Christian\", \"Buerkner\", , \"paul.buerkner@gmail.com\", role = \"ctb\"), person(\"Matthew\", \"Kay\", , \"mjskay@umich.edu\", role = \"ctb\"), person(\"Erwan\", \"Le Pennec\", , \"lepennec@gmail.com\", role = \"ctb\"), person(\"Johan\", \"Junkka\", , \"johan.junkka@umu.se\", role = \"ctb\"), person(\"Hao\", \"Zhu\", , \"haozhu233@gmail.com\", role = \"ctb\"), person(\"Benjamin\", \"Soltoff\", , \"soltoffbc@uchicago.edu\", role = \"ctb\"), person(\"Zoe\", \"Wilkinson Saldana\", , \"zoewsaldana@gmail.com\", role = \"ctb\"), person(\"Tyler\", \"Littlefield\", , \"tylurp1@gmail.com\", role = \"ctb\"), person(\"Charles T.\", \"Gray\", , \"charlestigray@gmail.com\", role = \"ctb\"), person(\"Shabbh E.\", \"Banks\", role = \"ctb\"), person(\"Serina\", \"Robinson\", , \"robi0916@umn.edu\", role = \"ctb\"), person(\"Roger\", \"Bivand\", , \"Roger.Bivand@nhh.no\", role = \"ctb\"), person(\"Riinu\", \"Ots\", , \"riinuots@gmail.com\", role = \"ctb\"), person(\"Nicholas\", \"Williams\", , \"ntwilliams.personal@gmail.com\", role = \"ctb\"), person(\"Nina\", \"Jakobsen\", role = \"ctb\"), person(\"Michael\", \"Weylandt\", , \"michael.weylandt@gmail.com\", role = \"ctb\"), person(\"Lisa\", \"Lendway\", , \"llendway@macalester.edu\", role = \"ctb\"), person(\"Karl\", \"Hailperin\", , \"khailper@gmail.com\", role = \"ctb\"), person(\"Josue\", \"Rodriguez\", , \"jerrodriguez@ucdavis.edu\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", , \"jenny@posit.co\", role = \"ctb\"), person(\"Chris\", \"Jarvis\", , \"Christopher1.jarvis@gmail.com\", role = \"ctb\"), person(\"Greg\", \"Macfarlane\", , \"gregmacfarlane@gmail.com\", role = \"ctb\"), person(\"Brian\", \"Mannakee\", , \"bmannakee@gmail.com\", role = \"ctb\"), person(\"Drew\", \"Tyre\", , \"atyre2@unl.edu\", role = \"ctb\"), person(\"Shreyas\", \"Singh\", , \"shreyas.singh.298@gmail.com\", role = \"ctb\"), person(\"Laurens\", \"Geffert\", , \"laurensgeffert@gmail.com\", role = \"ctb\"), person(\"Hong\", \"Ooi\", , \"hongooi@microsoft.com\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", , \"henrikb@braju.com\", role = \"ctb\"), person(\"Eduard\", \"Szocs\", , \"eduardszoecs@gmail.com\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", , \"davidhughjones@gmail.com\", role = \"ctb\"), person(\"Matthieu\", \"Stigler\", , \"Matthieu.Stigler@gmail.com\", role = \"ctb\"), person(\"Hugo\", \"Tavares\", , \"hm533@cam.ac.uk\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9373-2726\")), person(\"R. Willem\", \"Vervoort\", , \"Willemvervoort@gmail.com\", role = \"ctb\"), person(\"Brenton M.\", \"Wiernik\", , \"brenton@wiernik.org\", role = \"ctb\"), person(\"Josh\", \"Yamamoto\", , \"joshuayamamoto5@gmail.com\", role = \"ctb\"), person(\"Jasme\", \"Lee\", role = \"ctb\"), person(\"Taren\", \"Sanders\", , \"taren.sanders@acu.edu.au\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4504-6008\")), person(\"Ilaria\", \"Prosdocimi\", , \"prosdocimi.ilaria@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8565-094X\")), person(\"Daniel D.\", \"Sjoberg\", , \"danield.sjoberg@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0862-2018\")), person(\"Alex\", \"Reinhart\", , \"areinhar@stat.cmu.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-6658-514X\")) )", + "Description": "Summarizes key information about statistical objects in tidy tibbles. This makes it easy to report results, create plots and consistently work with large numbers of models at once. Broom provides three verbs that each provide different types of information about a model. tidy() summarizes information about model components such as coefficients of a regression. glance() reports information about an entire model, such as goodness of fit measures like AIC and BIC. augment() adds information about individual observations to a dataset, such as fitted values or influence measures.", + "License": "MIT + file LICENSE", + "URL": "https://broom.tidymodels.org/, https://github.com/tidymodels/broom", + "BugReports": "https://github.com/tidymodels/broom/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "backports", + "cli", + "dplyr (>= 1.0.0)", + "generics (>= 0.0.2)", + "glue", + "lifecycle", + "purrr", + "rlang (>= 1.1.0)", + "stringr", + "tibble (>= 3.0.0)", + "tidyr (>= 1.0.0)" + ], + "Suggests": [ + "AER", + "AUC", + "bbmle", + "betareg (>= 3.2-1)", + "biglm", + "binGroup", + "boot", + "btergm (>= 1.10.6)", + "car (>= 3.1-2)", + "carData", + "caret", + "cluster", + "cmprsk", + "coda", + "covr", + "drc", + "e1071", + "emmeans", + "epiR (>= 2.0.85)", + "ergm (>= 3.10.4)", + "fixest (>= 0.9.0)", + "gam (>= 1.15)", + "gee", + "geepack", + "ggplot2", + "glmnet", + "glmnetUtils", + "gmm", + "Hmisc", + "interp", + "irlba", + "joineRML", + "Kendall", + "knitr", + "ks", + "Lahman", + "lavaan (>= 0.6.18)", + "leaps", + "lfe", + "lm.beta", + "lme4", + "lmodel2", + "lmtest (>= 0.9.38)", + "lsmeans", + "maps", + "margins", + "MASS", + "mclust", + "mediation", + "metafor", + "mfx", + "mgcv", + "mlogit", + "modeldata", + "modeltests (>= 0.1.6)", + "muhaz", + "multcomp", + "network", + "nnet", + "ordinal", + "plm", + "poLCA", + "psych", + "quantreg", + "rmarkdown", + "robust", + "robustbase", + "rsample", + "sandwich", + "spatialreg", + "spdep (>= 1.1)", + "speedglm", + "spelling", + "stats4", + "survey", + "survival (>= 3.6-4)", + "systemfit", + "testthat (>= 3.0.0)", + "tseries", + "vars", + "zoo" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "Collate": "'aaa-documentation-helper.R' 'null-and-default.R' 'aer.R' 'auc.R' 'base.R' 'bbmle.R' 'betareg.R' 'biglm.R' 'bingroup.R' 'boot.R' 'broom-package.R' 'broom.R' 'btergm.R' 'car.R' 'caret.R' 'cluster.R' 'cmprsk.R' 'data-frame.R' 'deprecated-0-7-0.R' 'drc.R' 'emmeans.R' 'epiR.R' 'ergm.R' 'fixest.R' 'gam.R' 'geepack.R' 'glmnet-cv-glmnet.R' 'glmnet-glmnet.R' 'gmm.R' 'hmisc.R' 'import-standalone-obj-type.R' 'import-standalone-types-check.R' 'joinerml.R' 'kendall.R' 'ks.R' 'lavaan.R' 'leaps.R' 'lfe.R' 'list-irlba.R' 'list-optim.R' 'list-svd.R' 'list-xyz.R' 'list.R' 'lm-beta.R' 'lmodel2.R' 'lmtest.R' 'maps.R' 'margins.R' 'mass-fitdistr.R' 'mass-negbin.R' 'mass-polr.R' 'mass-ridgelm.R' 'stats-lm.R' 'mass-rlm.R' 'mclust.R' 'mediation.R' 'metafor.R' 'mfx.R' 'mgcv.R' 'mlogit.R' 'muhaz.R' 'multcomp.R' 'nnet.R' 'nobs.R' 'ordinal-clm.R' 'ordinal-clmm.R' 'plm.R' 'polca.R' 'psych.R' 'stats-nls.R' 'quantreg-nlrq.R' 'quantreg-rq.R' 'quantreg-rqs.R' 'robust-glmrob.R' 'robust-lmrob.R' 'robustbase-glmrob.R' 'robustbase-lmrob.R' 'sp.R' 'spdep.R' 'speedglm-speedglm.R' 'speedglm-speedlm.R' 'stats-anova.R' 'stats-arima.R' 'stats-decompose.R' 'stats-factanal.R' 'stats-glm.R' 'stats-htest.R' 'stats-kmeans.R' 'stats-loess.R' 'stats-mlm.R' 'stats-prcomp.R' 'stats-smooth.spline.R' 'stats-summary-lm.R' 'stats-time-series.R' 'survey.R' 'survival-aareg.R' 'survival-cch.R' 'survival-coxph.R' 'survival-pyears.R' 'survival-survdiff.R' 'survival-survexp.R' 'survival-survfit.R' 'survival-survreg.R' 'systemfit.R' 'tseries.R' 'utilities.R' 'vars.R' 'zoo.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "David Robinson [aut], Alex Hayes [aut] (ORCID: ), Simon Couch [aut] (ORCID: ), Emil Hvitfeldt [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Indrajeet Patil [ctb] (ORCID: ), Derek Chiu [ctb], Matthieu Gomez [ctb], Boris Demeshev [ctb], Dieter Menne [ctb], Benjamin Nutter [ctb], Luke Johnston [ctb], Ben Bolker [ctb], Francois Briatte [ctb], Jeffrey Arnold [ctb], Jonah Gabry [ctb], Luciano Selzer [ctb], Gavin Simpson [ctb], Jens Preussner [ctb], Jay Hesselberth [ctb], Hadley Wickham [ctb], Matthew Lincoln [ctb], Alessandro Gasparini [ctb], Lukasz Komsta [ctb], Frederick Novometsky [ctb], Wilson Freitas [ctb], Michelle Evans [ctb], Jason Cory Brunson [ctb], Simon Jackson [ctb], Ben Whalley [ctb], Karissa Whiting [ctb], Yves Rosseel [ctb], Michael Kuehn [ctb], Jorge Cimentada [ctb], Erle Holgersen [ctb], Karl Dunkle Werner [ctb] (ORCID: ), Ethan Christensen [ctb], Steven Pav [ctb], Paul PJ [ctb], Ben Schneider [ctb], Patrick Kennedy [ctb], Lily Medina [ctb], Brian Fannin [ctb], Jason Muhlenkamp [ctb], Matt Lehman [ctb], Bill Denney [ctb] (ORCID: ), Nic Crane [ctb], Andrew Bates [ctb], Vincent Arel-Bundock [ctb] (ORCID: ), Hideaki Hayashi [ctb], Luis Tobalina [ctb], Annie Wang [ctb], Wei Yang Tham [ctb], Clara Wang [ctb], Abby Smith [ctb] (ORCID: ), Jasper Cooper [ctb] (ORCID: ), E Auden Krauska [ctb] (ORCID: ), Alex Wang [ctb], Malcolm Barrett [ctb] (ORCID: ), Charles Gray [ctb] (ORCID: ), Jared Wilber [ctb], Vilmantas Gegzna [ctb] (ORCID: ), Eduard Szoecs [ctb], Frederik Aust [ctb] (ORCID: ), Angus Moore [ctb], Nick Williams [ctb], Marius Barth [ctb] (ORCID: ), Bruna Wundervald [ctb] (ORCID: ), Joyce Cahoon [ctb] (ORCID: ), Grant McDermott [ctb] (ORCID: ), Kevin Zarca [ctb], Shiro Kuriwaki [ctb] (ORCID: ), Lukas Wallrich [ctb] (ORCID: ), James Martherus [ctb] (ORCID: ), Chuliang Xiao [ctb] (ORCID: ), Joseph Larmarange [ctb], Max Kuhn [ctb], Michal Bojanowski [ctb], Hakon Malmedal [ctb], Clara Wang [ctb], Sergio Oller [ctb], Luke Sonnet [ctb], Jim Hester [ctb], Ben Schneider [ctb], Bernie Gray [ctb] (ORCID: ), Mara Averick [ctb], Aaron Jacobs [ctb], Andreas Bender [ctb], Sven Templer [ctb], Paul-Christian Buerkner [ctb], Matthew Kay [ctb], Erwan Le Pennec [ctb], Johan Junkka [ctb], Hao Zhu [ctb], Benjamin Soltoff [ctb], Zoe Wilkinson Saldana [ctb], Tyler Littlefield [ctb], Charles T. Gray [ctb], Shabbh E. Banks [ctb], Serina Robinson [ctb], Roger Bivand [ctb], Riinu Ots [ctb], Nicholas Williams [ctb], Nina Jakobsen [ctb], Michael Weylandt [ctb], Lisa Lendway [ctb], Karl Hailperin [ctb], Josue Rodriguez [ctb], Jenny Bryan [ctb], Chris Jarvis [ctb], Greg Macfarlane [ctb], Brian Mannakee [ctb], Drew Tyre [ctb], Shreyas Singh [ctb], Laurens Geffert [ctb], Hong Ooi [ctb], Henrik Bengtsson [ctb], Eduard Szocs [ctb], David Hugh-Jones [ctb], Matthieu Stigler [ctb], Hugo Tavares [ctb] (ORCID: ), R. Willem Vervoort [ctb], Brenton M. Wiernik [ctb], Josh Yamamoto [ctb], Jasme Lee [ctb], Taren Sanders [ctb] (ORCID: ), Ilaria Prosdocimi [ctb] (ORCID: ), Daniel D. Sjoberg [ctb] (ORCID: ), Alex Reinhart [ctb] (ORCID: )", + "Maintainer": "Emil Hvitfeldt ", + "Repository": "CRAN" + }, + "bslib": { + "Package": "bslib", + "Version": "0.11.0", + "Source": "Repository", + "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 (>= 1.1.1)", + "grDevices", + "htmltools (>= 0.5.8)", + "jquerylib (>= 0.1.3)", + "jsonlite", + "lifecycle", + "memoise (>= 2.0.1)", + "mime", + "rlang", + "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" + ], + "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' '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": "https://packagemanager.posit.co/cran/latest" + }, + "cachem": { + "Package": "cachem", + "Version": "1.1.0", + "Source": "Repository", + "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)" + ], + "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" + }, + "callr": { + "Package": "callr", + "Version": "3.8.0", + "Source": "Repository", + "Title": "Call R from R", + "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": "It is sometimes useful to perform a computation in a separate R process, without affecting the current R process at all. This packages does exactly that.", + "License": "MIT + file LICENSE", + "URL": "https://callr.r-lib.org, https://github.com/r-lib/callr", + "BugReports": "https://github.com/r-lib/callr/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "otel (>= 0.2.0)", + "processx (>= 3.6.1)", + "R6", + "utils" + ], + "Suggests": [ + "asciicast (>= 2.3.1)", + "carrier", + "cli (>= 1.1.0)", + "otelsdk (>= 0.2.0)", + "ps", + "rprojroot", + "spelling", + "testthat (>= 3.2.0)", + "withr (>= 2.3.0)" + ], + "Config/Needs/website": "r-lib/asciicast, glue, htmlwidgets, igraph, tibble, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-28", + "Encoding": "UTF-8", + "Language": "en-US", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "no", + "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" + }, + "cellranger": { + "Package": "cellranger", + "Version": "1.1.0", + "Source": "Repository", + "Title": "Translate Spreadsheet Cell Ranges to Rows and Columns", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@stat.ubc.ca\", c(\"cre\", \"aut\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", \"ctb\") )", + "Description": "Helper functions to work with spreadsheets and the \"A1:D10\" style of cell range specification.", + "Depends": [ + "R (>= 3.0.0)" + ], + "License": "MIT + file LICENSE", + "LazyData": "true", + "URL": "https://github.com/rsheets/cellranger", + "BugReports": "https://github.com/rsheets/cellranger/issues", + "Suggests": [ + "covr", + "testthat (>= 1.0.0)", + "knitr", + "rmarkdown" + ], + "RoxygenNote": "5.0.1.9000", + "VignetteBuilder": "knitr", + "Imports": [ + "rematch", + "tibble" + ], + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [cre, aut], Hadley Wickham [ctb]", + "Maintainer": "Jennifer Bryan ", + "Repository": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, + "censusapi": { + "Package": "censusapi", + "Version": "0.10.0", + "Source": "Repository", + "Title": "Retrieve Data from the Census APIs", + "Authors@R": "person(\"Hannah\", \"Recht\", email = \"censusapi.rstats@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "A wrapper for the U.S. Census Bureau APIs that returns data frames of Census data and metadata. Available datasets include the Decennial Census, American Community Survey, Small Area Health Insurance Estimates, Small Area Income and Poverty Estimates, Population Estimates and Projections, and more.", + "URL": "https://www.hrecht.com/censusapi/, https://github.com/hrecht/censusapi", + "BugReports": "https://github.com/hrecht/censusapi/issues", + "Depends": [ + "R (>= 3.5)" + ], + "License": "GPL-3", + "LazyData": "true", + "Imports": [ + "httr", + "jsonlite", + "rlang" + ], + "Suggests": [ + "knitr", + "rmarkdown" + ], + "Encoding": "UTF-8", + "VignetteBuilder": "knitr", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "no", + "Author": "Hannah Recht [aut, cre]", + "Maintainer": "Hannah Recht ", + "Repository": "CRAN" + }, + "class": { + "Package": "class", + "Version": "7.3-23", + "Source": "Repository", + "Priority": "recommended", + "Date": "2025-01-01", + "Depends": [ + "R (>= 3.0.0)", + "stats", + "utils" + ], + "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", + "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", + "e1071", + "class", + "KernSmooth" + ], + "Suggests": [ + "spData (>= 0.2.6.2)", + "units", + "knitr", + "rmarkdown", + "tinytest" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "cli": { + "Package": "cli", + "Version": "3.6.6", + "Source": "Repository", + "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" + ], + "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", + "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" + ], + "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" + }, + "clisymbols": { + "Package": "clisymbols", + "Version": "1.2.0", + "Source": "Repository", + "Title": "Unicode Symbols at the R Prompt", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Sindre\", \"Sorhus\", role = \"aut\") )", + "Description": "A small subset of Unicode symbols, that are useful when building command line applications. They fall back to alternatives on terminals that do not support Unicode. Many symbols were taken from the 'figures' 'npm' package (see ).", + "License": "MIT + file LICENSE", + "URL": "https://github.com/gaborcsardi/clisymbols", + "BugReports": "https://github.com/gaborcsardi/clisymbols/issues", + "Suggests": [ + "testthat" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Sindre Sorhus [aut]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" + }, + "conflicted": { + "Package": "conflicted", + "Version": "1.2.0", + "Source": "Repository", + "Title": "An Alternative Conflict Resolution Strategy", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "R's default conflict management system gives the most recently loaded package precedence. This can make it hard to detect conflicts, particularly when they arise because a package update creates ambiguity that did not previously exist. 'conflicted' takes a different approach, making every conflict an error and forcing you to choose which function to use.", + "License": "MIT + file LICENSE", + "URL": "https://conflicted.r-lib.org/, https://github.com/r-lib/conflicted", + "BugReports": "https://github.com/r-lib/conflicted/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "memoise", + "rlang (>= 1.0.0)" + ], + "Suggests": [ + "callr", + "covr", + "dplyr", + "Matrix", + "methods", + "pkgload", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "coro": { + "Package": "coro", + "Version": "1.1.0", + "Source": "Repository", + "Title": "'Coroutines' for R", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides 'coroutines' for R, a family of functions that can be suspended and resumed later on. This includes 'async' functions (which await) and generators (which yield). 'Async' functions are based on the concurrency framework of the 'promises' package. Generators are based on a dependency free iteration protocol defined in 'coro' and are compatible with iterators from the 'reticulate' package.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/coro, https://coro.r-lib.org/", + "BugReports": "https://github.com/r-lib/coro/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "rlang (>= 0.4.12)" + ], + "Suggests": [ + "knitr", + "later (>= 1.1.0)", + "magrittr (>= 2.0.0)", + "promises", + "reticulate", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Lionel Henry [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" + }, + "cpp11": { + "Package": "cpp11", + "Version": "0.5.5", + "Source": "Repository", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.3", + "Source": "Repository", + "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" + ], + "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" + }, + "crosswalk": { + "Package": "crosswalk", + "Version": "0.0.0.9002", + "Source": "GitHub", + "Type": "Package", + "Title": "Translate Data across Space and Time", + "Description": "Provides a standardized interface for accessing and applying geographic crosswalks between United States Census geographies, both across geographies (e.g., tracts to ZIP Code Tabulation Areas) and across time (e.g., 2010 tracts to 2020 tracts). Also supports interpolating crosswalked data, with built-in diagnostics describing join quality.", + "License": "MIT + file LICENSE", + "Authors@R": "person(given = \"Will\", family = \"Curran-Groome\", email = \"wcurrangroome@urban.org\", role = c(\"aut\", \"cre\"))", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.3", + "URL": "https://ui-research.github.io/crosswalk/, https://github.com/UI-Research/crosswalk", + "BugReports": "https://github.com/UI-Research/crosswalk/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "dplyr (>= 1.1.0)", + "httr", + "httr2", + "janitor", + "purrr", + "readr", + "rlang", + "rvest", + "stats", + "stringr", + "tibble", + "tidyr", + "tidytable", + "utils" + ], + "Suggests": [ + "ggplot2", + "scales", + "testthat (>= 3.0.0)", + "tidycensus", + "knitr", + "rmarkdown" + ], + "Config/testthat/edition": "3", + "VignetteBuilder": "knitr", + "Author": "Will Curran-Groome [aut, cre]", + "Maintainer": "Will Curran-Groome ", + "RemoteType": "github", + "RemoteUsername": "UI-Research", + "RemoteRepo": "crosswalk", + "RemoteRef": "main", + "RemoteSha": "3c126d0845b177a777235579e81b11c225626ef4", + "RemoteHost": "api.github.com" + }, + "curl": { + "Package": "curl", + "Version": "7.1.0", + "Source": "Repository", + "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" + ], + "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", + "Title": "Extension of `data.frame`", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "methods" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "dbplyr": { + "Package": "dbplyr", + "Version": "2.6.0", + "Source": "Repository", + "Type": "Package", + "Title": "A 'dplyr' Back End for Databases", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Edgar\", \"Ruiz\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A 'dplyr' back end for databases that allows you to work with remote database tables as if they are in-memory data frames. Basic features work with any database that has a 'DBI' back end; more advanced features require 'SQL' translation to be provided by the package author.", + "License": "MIT + file LICENSE", + "URL": "https://dbplyr.tidyverse.org/, https://github.com/tidyverse/dbplyr", + "BugReports": "https://github.com/tidyverse/dbplyr/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "blob (>= 1.2.0)", + "cli (>= 3.6.1)", + "DBI (>= 1.1.3)", + "dplyr (>= 1.1.2)", + "glue (>= 1.6.2)", + "lifecycle (>= 1.0.3)", + "magrittr", + "methods", + "pillar (>= 1.9.0)", + "purrr (>= 1.0.1)", + "R6 (>= 2.2.2)", + "rlang (>= 1.1.1)", + "tibble (>= 3.2.1)", + "tidyr (>= 1.3.0)", + "tidyselect (>= 1.2.1)", + "utils", + "vctrs (>= 0.6.3)", + "withr (>= 2.5.0)" + ], + "Suggests": [ + "adbcdrivermanager", + "adbcsqlite", + "adbi", + "bit64", + "covr", + "knitr", + "Lahman", + "nycflights13", + "odbc (>= 1.4.2)", + "RJDBC", + "RMariaDB (>= 1.2.2)", + "rmarkdown", + "RPostgres (>= 1.4.5)", + "RPostgreSQL", + "RSQLite (>= 2.3.8)", + "testthat (>= 3.1.10)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Encoding": "UTF-8", + "Language": "en-gb", + "Collate": "'verb-copy-inline.R' 'verb-copy-to.R' 'db-sql.R' 'db.R' 'utils-check.R' 'import-standalone-types-check.R' 'import-standalone-obj-type.R' 'utils.R' 'sql.R' 'escape.R' 'translate-sql-cut.R' 'translate-sql-string.R' 'translate-sql-aggregate.R' 'translate-sql-scalar.R' 'translate-sql-helpers.R' 'translate-sql-window.R' 'translate-sql-conditional.R' 'backend-.R' 'backend-access.R' 'backend-adbc.R' 'backend-db2.R' 'backend-hana.R' 'backend-hive.R' 'backend-impala.R' 'backend-jdbc.R' 'backend-mssql.R' 'backend-mysql.R' 'backend-odbc.R' 'backend-oracle.R' 'backend-postgres.R' 'backend-postgres-old.R' 'backend-redshift.R' 'backend-snowflake.R' 'backend-spark-sql.R' 'backend-sqlite.R' 'backend-teradata.R' 'backward-compatibility.R' 'bind-queries.R' 'data-cache.R' 'data-lahman.R' 'data-nycflights13.R' 'db-io.R' 'dbplyr.R' 'ident.R' 'import-standalone-s3-register.R' 'join-by-compat.R' 'join-cols-compat.R' 'lazy-ops.R' 'memdb.R' 'optimise-utils.R' 'progress.R' 'query-base.R' 'query-join.R' 'query-rf-join.R' 'query-select.R' 'query-semi-join.R' 'query-set-op.R' 'query-union.R' 'query.R' 'remote.R' 'rows.R' 'schema.R' 'sql-build.R' 'sql-clause.R' 'sql-dialect.R' 'sql-glue.R' 'sql-quote.R' 'sql-superseded.R' 'src-sql.R' 'src_dbi.R' 'table-name.R' 'tbl-lazy.R' 'tbl-sql.R' 'tidyeval-across.R' 'tidyeval.R' 'translate-sql.R' 'utils-format.R' 'verb-arrange.R' 'verb-collapse.R' 'verb-collect.R' 'verb-compute.R' 'verb-count.R' 'verb-distinct.R' 'verb-do-query.R' 'verb-do.R' 'verb-expand.R' 'verb-explain.R' 'verb-fill.R' 'verb-filter.R' 'verb-group_by.R' 'verb-head.R' 'verb-joins.R' 'verb-mutate.R' 'verb-pivot-longer.R' 'verb-pivot-wider.R' 'verb-pull.R' 'verb-select.R' 'verb-set-ops.R' 'verb-slice.R' 'verb-summarise.R' 'verb-uncount.R' 'verb-window.R' 'with-dialect.R' 'zzz.R'", + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Maximilian Girlich [aut], Edgar Ruiz [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "desc": { + "Package": "desc", + "Version": "1.4.3", + "Source": "Repository", + "Title": "Manipulate DESCRIPTION Files", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", role = \"aut\"), person(\"Jim\", \"Hester\", , \"james.f.hester@gmail.com\", role = \"aut\"), person(\"Maëlle\", \"Salmon\", role = \"ctb\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Maintainer": "Gábor Csárdi ", + "Description": "Tools to read, write, create, and manipulate DESCRIPTION files. It is intended for packages that create or manipulate other packages.", + "License": "MIT + file LICENSE", + "URL": "https://desc.r-lib.org/, https://github.com/r-lib/desc", + "BugReports": "https://github.com/r-lib/desc/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "cli", + "R6", + "utils" + ], + "Suggests": [ + "callr", + "covr", + "gh", + "spelling", + "testthat", + "whoami", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "Collate": "'assertions.R' 'authors-at-r.R' 'built.R' 'classes.R' 'collate.R' 'constants.R' 'deps.R' 'desc-package.R' 'description.R' 'encoding.R' 'find-package-root.R' 'latex.R' 'non-oo-api.R' 'package-archives.R' 'read.R' 'remotes.R' 'str.R' 'syntax_checks.R' 'urls.R' 'utils.R' 'validate.R' 'version.R'", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Kirill Müller [aut], Jim Hester [aut], Maëlle Salmon [ctb] (), Posit Software, PBC [cph, fnd]", + "Repository": "CRAN" + }, + "diffobj": { + "Package": "diffobj", + "Version": "0.3.8", + "Source": "Repository", + "Type": "Package", + "Title": "Diffs for R Objects", + "Description": "Generate a colorized diff of two R objects for an intuitive visualization of their differences.", + "Authors@R": "c( person( \"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\", role=c(\"aut\", \"cre\")), person( \"Michael B.\", \"Allen\", email=\"ioplex@gmail.com\", role=c(\"ctb\", \"cph\"), comment=\"Original C implementation of Myers Diff Algorithm\"))", + "Depends": [ + "R (>= 4.1.0)" + ], + "License": "GPL-2 | GPL-3", + "URL": "https://github.com/brodieG/diffobj", + "BugReports": "https://github.com/brodieG/diffobj/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Suggests": [ + "knitr", + "rmarkdown" + ], + "Collate": "'capt.R' 'options.R' 'pager.R' 'check.R' 'finalizer.R' 'misc.R' 'html.R' 'styles.R' 's4.R' 'core.R' 'diff.R' 'get.R' 'guides.R' 'hunks.R' 'layout.R' 'myerssimple.R' 'rdiff.R' 'rds.R' 'set.R' 'subset.R' 'summmary.R' 'system.R' 'text.R' 'tochar.R' 'trim.R' 'word.R'", + "Imports": [ + "crayon (>= 1.3.2)", + "tools", + "methods", + "utils", + "stats" + ], + "Config/roxygen2/version": "8.0.0", + "NeedsCompilation": "yes", + "Author": "Brodie Gaslam [aut, cre], Michael B. Allen [ctb, cph] (Original C implementation of Myers Diff Algorithm)", + "Maintainer": "Brodie Gaslam ", + "Repository": "CRAN" + }, + "digest": { + "Package": "digest", + "Version": "0.6.39", + "Source": "Repository", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "downlit": { + "Package": "downlit", + "Version": "0.4.5", + "Source": "Repository", + "Title": "Syntax Highlighting and Automatic Linking", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Syntax highlighting of R code, specifically designed for the needs of 'RMarkdown' packages like 'pkgdown', 'hugodown', and 'bookdown'. It includes linking of function calls to their documentation on the web, and automatic translation of ANSI escapes in output to the equivalent HTML.", + "License": "MIT + file LICENSE", + "URL": "https://downlit.r-lib.org/, https://github.com/r-lib/downlit", + "BugReports": "https://github.com/r-lib/downlit/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "brio", + "desc", + "digest", + "evaluate", + "fansi", + "memoise", + "rlang", + "vctrs", + "withr", + "yaml" + ], + "Suggests": [ + "covr", + "htmltools", + "jsonlite", + "MASS", + "MassSpecWavelet", + "pkgload", + "rmarkdown", + "testthat (>= 3.0.0)", + "xml2" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "dplyr": { + "Package": "dplyr", + "Version": "1.2.1", + "Source": "Repository", + "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 (>= 1.3.2)", + "lifecycle (>= 1.0.5)", + "magrittr (>= 1.5)", + "methods", + "pillar (>= 1.9.0)", + "R6", + "rlang (>= 1.1.7)", + "tibble (>= 3.2.0)", + "tidyselect (>= 1.2.0)", + "utils", + "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" + ], + "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" + }, + "dtplyr": { + "Package": "dtplyr", + "Version": "1.3.3", + "Source": "Repository", + "Title": "Data Table Back-End for 'dplyr'", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"cre\", \"aut\")), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Mark\", \"Fairbanks\", role = \"aut\"), person(\"Ryan\", \"Dickerson\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a data.table backend for 'dplyr'. The goal of 'dtplyr' is to allow you to write 'dplyr' code that is automatically translated to the equivalent, but usually much faster, data.table code.", + "License": "MIT + file LICENSE", + "URL": "https://dtplyr.tidyverse.org, https://github.com/tidyverse/dtplyr", + "BugReports": "https://github.com/tidyverse/dtplyr/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "data.table (>= 1.13.0)", + "dplyr (>= 1.1.0)", + "glue", + "lifecycle", + "rlang (>= 1.0.4)", + "tibble", + "tidyselect (>= 1.2.0)", + "vctrs (>= 0.4.1)" + ], + "Suggests": [ + "bench", + "covr", + "knitr", + "rmarkdown", + "testthat (>= 3.1.2)", + "tidyr (>= 1.1.0)", + "waldo (>= 0.3.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [cre, aut], Maximilian Girlich [aut], Mark Fairbanks [aut], Ryan Dickerson [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "e1071": { + "Package": "e1071", + "Version": "1.7-17", + "Source": "Repository", + "Title": "Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien", + "Imports": [ + "graphics", + "grDevices", + "class", + "stats", + "methods", + "utils", + "proxy" + ], + "Suggests": [ + "cluster", + "mlbench", + "nnet", + "randomForest", + "rpart", + "SparseM", + "xtable", + "Matrix", + "MASS", + "slam" + ], + "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" + }, + "ellmer": { + "Package": "ellmer", + "Version": "0.4.2", + "Source": "Repository", + "Title": "Chat with Large Language Models", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Joe\", \"Cheng\", role = \"aut\"), person(\"Aaron\", \"Jacobs\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Chat with large language models from a range of providers including 'Claude' , 'OpenAI' , and more. Supports streaming, asynchronous calls, tool calling, and structured data extraction.", + "License": "MIT + file LICENSE", + "URL": "https://ellmer.tidyverse.org, https://github.com/tidyverse/ellmer", + "BugReports": "https://github.com/tidyverse/ellmer/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli", + "coro (>= 1.1.0)", + "glue", + "httr2 (>= 1.2.3)", + "jsonlite", + "later (>= 1.4.0)", + "lifecycle", + "promises (>= 1.5.0)", + "R6", + "rlang (>= 1.3.0)", + "S7 (>= 0.2.0)", + "tibble", + "vctrs" + ], + "Suggests": [ + "connectcreds", + "curl (>= 6.0.1)", + "gargle", + "gitcreds", + "jose", + "knitr", + "magick", + "openssl", + "otel (>= 0.2.0)", + "otelsdk (>= 0.2.0)", + "paws.common", + "png", + "rmarkdown", + "shiny", + "shinychat (>= 0.3.0)", + "testthat (>= 3.0.0)", + "vcr (>= 2.0.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/prices": "cli, dplyr, jsonlite, jsonvalidate, stringr, tidyr, usethis", + "Config/Needs/website": "tidyverse/tidytemplate, rmarkdown", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "chat, provider*", + "Encoding": "UTF-8", + "Collate": "'utils-S7.R' 'types.R' 'ellmer-package.R' 'tools-def.R' 'content.R' 'provider.R' 'as-json.R' 'batch-chat.R' 'chat-structured.R' 'chat-tools-content.R' 'turns.R' 'chat-tools.R' 'chat-utils.R' 'utils-coro.R' 'chat.R' 'content-image.R' 'content-pdf.R' 'content-replay.R' 'httr2.R' 'import-standalone-defer.R' 'import-standalone-obj-type.R' 'import-standalone-purrr.R' 'import-standalone-types-check.R' 'interpolate.R' 'live.R' 'otel.R' 'parallel-chat.R' 'params.R' 'provider-any.R' 'provider-aws.R' 'provider-openai-compatible.R' 'provider-azure.R' 'provider-claude-files.R' 'provider-claude-tools.R' 'provider-claude.R' 'provider-google.R' 'provider-cloudflare.R' 'provider-databricks.R' 'provider-deepseek.R' 'provider-github.R' 'provider-google-tools.R' 'provider-google-upload.R' 'provider-groq.R' 'provider-huggingface.R' 'provider-lmstudio.R' 'provider-mistral.R' 'provider-ollama.R' 'provider-openai-tools.R' 'provider-openai.R' 'provider-openrouter.R' 'provider-perplexity.R' 'provider-portkey.R' 'provider-posit.R' 'provider-snowflake.R' 'provider-vllm.R' 'schema.R' 'stream-controller.R' 'tokens.R' 'tools-built-in.R' 'tools-def-auto.R' 'utils-auth.R' 'utils-callbacks.R' 'utils-cat.R' 'utils-merge.R' 'utils-prettytime.R' 'utils.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Joe Cheng [aut], Aaron Jacobs [aut], Garrick Aden-Buie [aut] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "esri2sf": { + "Package": "esri2sf", + "Version": "0.1.1", + "Source": "GitHub", + "Type": "Package", + "Title": "Create Simple Features from ArcGIS Server REST API", + "Authors@R": "c( person(\"Yongha\", \"Hwang\", email = \"yongha.hwang@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Cazelles\", \"Kevin\", role = c(\"aut\", \"ctb\")), person(\"Peterson\", \"Jacob\", role = c(\"aut\", \"ctb\")) )", + "Description": "This package enables you to scrape geographic features directly from ArcGIS servers REST API into R as simple features.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "dplyr", + "jsonlite", + "httr", + "rstudioapi", + "sf (>= 1.0.1)", + "DBI", + "RSQLite", + "crayon", + "stats" + ], + "Suggests": [ + "rmarkdown", + "knitr", + "pbapply", + "testthat (>= 3.0.0)" + ], + "RoxygenNote": "7.1.2", + "Roxygen": "list(markdown = TRUE)", + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "Author": "Yongha Hwang [aut, cre], Cazelles Kevin [aut, ctb], Peterson Jacob [aut, ctb]", + "Maintainer": "Yongha Hwang ", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteUsername": "yonghah", + "RemoteRepo": "esri2sf", + "RemoteRef": "master", + "RemoteSha": "f47eda534b22de0bc903def20ac45397295333dc" + }, + "evaluate": { + "Package": "evaluate", + "Version": "1.0.5", + "Source": "Repository", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "extrafont": { + "Package": "extrafont", + "Version": "0.20", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for Using Fonts", + "Date": "2025-09-24", + "Depends": [ + "R (>= 2.15)" + ], + "Imports": [ + "extrafontdb", + "grDevices", + "utils", + "Rttf2pt1" + ], + "Suggests": [ + "fontcm", + "testthat", + "withr (>= 2.5.0)" + ], + "Authors@R": "c( person(given = \"Winston\", family= \"Chang\", role = c(\"aut\")), person(given = \"Frederic\", family= \"Bertrand\", role = c(\"cre\"), email = \"frederic.bertrand@lecnam.net\", comment = c(ORCID = \"0000-0002-0837-8281\")) )", + "Author": "Winston Chang [aut], Frederic Bertrand [cre] (ORCID: )", + "Maintainer": "Frederic Bertrand ", + "Description": "Tools to using fonts other than the standard PostScript fonts. This package makes it easy to use system TrueType fonts and with PDF or PostScript output files, and with bitmap output files in Windows. extrafont can also be used with fonts packaged specifically to be used with, such as the fontcm package, which has Computer Modern PostScript fonts with math symbols.", + "License": "GPL-2", + "LazyLoad": "yes", + "NeedsCompilation": "no", + "URL": "https://github.com/fbertran/extrafont", + "BugReports": "https://github.com/fbertran/extrafont/issues", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "Repository": "CRAN" + }, + "extrafontdb": { + "Package": "extrafontdb", + "Version": "1.1", + "Source": "Repository", + "Type": "Package", + "Title": "Holding the Database for the 'extrafont' Package", + "Date": "2025-09-25", + "Depends": [ + "R (>= 2.14)" + ], + "Suggests": [ + "testthat (>= 3.0.0)" + ], + "Authors@R": "c( person(given = \"Winston\", family= \"Chang\", role = c(\"aut\")), person(given = \"Frederic\", family= \"Bertrand\", role = c(\"cre\"), email = \"frederic.bertrand@lecnam.net\", comment = c(ORCID = \"0000-0002-0837-8281\")) )", + "Author": "Winston Chang [aut], Frederic Bertrand [cre] (ORCID: )", + "Maintainer": "Frederic Bertrand ", + "Description": "It is meant to be used with the 'extrafont' package. The 'extrafont' package contains the code to install and use fonts, while the 'extrafontdb' package contains the font database.", + "License": "GPL-2", + "LazyLoad": "yes", + "NeedsCompilation": "no", + "URL": "https://github.com/fbertran/extrafontdb", + "BugReports": "https://github.com/fbertran/extrafontdb/issues", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "Collate": "'extrafontdb.r'", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "fansi": { + "Package": "fansi", + "Version": "1.0.7", + "Source": "Repository", + "Title": "ANSI Control Sequence Aware String Functions", + "Description": "Counterparts to R string manipulation functions that account for the effects of ANSI text formatting control sequences.", + "Authors@R": "c( person(\"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\", role=c(\"aut\", \"cre\")), person(\"Elliott\", \"Sales De Andrade\", role=\"ctb\"), person(given=\"R Core Team\", email=\"R-core@r-project.org\", role=\"cph\", comment=\"UTF8 byte length calcs from src/util.c\" ), person(\"Michael\",\"Chirico\", role=\"ctb\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\") ), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database derivative data in src/width.c\") )", + "Depends": [ + "R (>= 3.1.0)" + ], + "License": "GPL-2 | GPL-3", + "URL": "https://github.com/brodieG/fansi", + "BugReports": "https://github.com/brodieG/fansi/issues", + "VignetteBuilder": "knitr", + "Suggests": [ + "unitizer", + "knitr", + "rmarkdown" + ], + "Imports": [ + "grDevices", + "utils" + ], + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Collate": "'constants.R' 'fansi-package.R' 'internal.R' 'load.R' 'misc.R' 'nchar.R' 'strwrap.R' 'strtrim.R' 'strsplit.R' 'substr2.R' 'trimws.R' 'tohtml.R' 'unhandled.R' 'normalize.R' 'sgr.R'", + "NeedsCompilation": "yes", + "Author": "Brodie Gaslam [aut, cre], Elliott Sales De Andrade [ctb], R Core Team [cph] (UTF8 byte length calcs from src/util.c), Michael Chirico [ctb] (ORCID: ), Unicode, Inc. [cph, dtc] (Unicode Character Database derivative data in src/width.c)", + "Maintainer": "Brodie Gaslam ", + "Repository": "CRAN" + }, + "farver": { + "Package": "farver", + "Version": "2.1.2", + "Source": "Repository", + "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", + "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", + "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)" + ], + "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" + }, + "forcats": { + "Package": "forcats", + "Version": "1.0.1", + "Source": "Repository", + "Title": "Tools for Working with Categorical Variables (Factors)", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Helpers for reordering factor levels (including moving specified levels to front, ordering by first appearance, reversing, and randomly shuffling), and tools for modifying factor levels (including collapsing rare levels into other, 'anonymising', and manually 'recoding').", + "License": "MIT + file LICENSE", + "URL": "https://forcats.tidyverse.org/, https://github.com/tidyverse/forcats", + "BugReports": "https://github.com/tidyverse/forcats/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "glue", + "lifecycle", + "magrittr", + "rlang (>= 1.0.0)", + "tibble" + ], + "Suggests": [ + "covr", + "dplyr", + "ggplot2", + "knitr", + "readr", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "fs": { + "Package": "fs", + "Version": "2.1.0", + "Source": "Repository", + "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" + ], + "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" + }, + "gargle": { + "Package": "gargle", + "Version": "1.6.1", + "Source": "Repository", + "Title": "Utilities for Working with Google APIs", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Craig\", \"Citro\", , \"craigcitro@google.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Google Inc\", role = \"cph\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides utilities for working with Google APIs . This includes functions and classes for handling common credential types and for preparing, executing, and processing HTTP requests.", + "License": "MIT + file LICENSE", + "URL": "https://gargle.r-lib.org, https://github.com/r-lib/gargle", + "BugReports": "https://github.com/r-lib/gargle/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.1)", + "fs (>= 1.3.1)", + "glue (>= 1.3.0)", + "httr (>= 1.4.5)", + "jsonlite", + "lifecycle (>= 0.2.0)", + "openssl", + "rappdirs", + "rlang (>= 1.1.0)", + "stats", + "utils", + "withr" + ], + "Suggests": [ + "aws.ec2metadata", + "aws.signature", + "covr", + "httpuv", + "knitr", + "rmarkdown", + "sodium", + "spelling", + "testthat (>= 3.1.7)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [aut, cre] (ORCID: ), Craig Citro [aut], Hadley Wickham [aut] (ORCID: ), Google Inc [cph], Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "generics": { + "Package": "generics", + "Version": "0.1.4", + "Source": "Repository", + "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" + ], + "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", + "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 (>= 0.3.6)", + "isoband", + "lifecycle (> 1.0.1)", + "rlang (>= 1.1.0)", + "S7", + "scales (>= 1.4.0)", + "stats", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "ggrepel": { + "Package": "ggrepel", + "Version": "0.9.8", + "Source": "Repository", + "Authors@R": "c( person(\"Kamil\", \"Slowikowski\", email = \"kslowikowski@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-2843-6370\")), person(\"Teun\", \"van den Brand\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9335-7468\")), person(\"Alicia\", \"Schep\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3915-0618\")), person(\"Sean\", \"Hughes\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9409-9405\")), person(\"Trung Kien\", \"Dang\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7562-6495\")), person(\"Saulius\", \"Lukauskas\", role = \"ctb\"), person(\"Jean-Olivier\", \"Irisson\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4920-3880\")), person(\"Zhian N\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(\"Thompson\", \"Ryan\", role = \"ctb\", comment = c(ORCID = \"0000-0002-0450-8181\")), person(\"Dervieux\", \"Christophe\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Yutani\", \"Hiroaki\", role = \"ctb\"), person(\"Pierre\", \"Gramme\", role = \"ctb\"), person(\"Amir Masoud\", \"Abdol\", role = \"ctb\"), person(\"Malcolm\", \"Barrett\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Robrecht\", \"Cannoodt\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3641-729X\")), person(\"Michał\", \"Krassowski\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9638-7785\")), person(\"Michael\", \"Chirico\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Pedro\", \"Aphalo\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3385-972X\")), person(\"Francis\", \"Barton\", role = \"ctb\") )", + "Title": "Automatically Position Non-Overlapping Text Labels with 'ggplot2'", + "Description": "Provides text and label geoms for 'ggplot2' that help to avoid overlapping text labels. Labels repel away from each other and away from the data points.", + "Depends": [ + "R (>= 4.1.0)", + "ggplot2 (>= 3.5.2)" + ], + "Imports": [ + "grid", + "Rcpp", + "rlang (>= 1.1.6)", + "S7", + "scales (>= 1.4.0)", + "withr (>= 3.0.2)" + ], + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "svglite", + "vdiffr", + "gridExtra", + "ggpp", + "patchwork", + "devtools", + "prettydoc", + "ggbeeswarm", + "dplyr", + "magrittr", + "readr", + "stringr", + "marquee", + "rsvg", + "sf" + ], + "VignetteBuilder": "knitr", + "License": "GPL-3 | file LICENSE", + "URL": "https://ggrepel.slowkow.com/, https://github.com/slowkow/ggrepel", + "BugReports": "https://github.com/slowkow/ggrepel/issues", + "RoxygenNote": "7.3.3", + "LinkingTo": [ + "Rcpp" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Kamil Slowikowski [aut, cre] (ORCID: ), Teun van den Brand [ctb] (ORCID: ), Alicia Schep [ctb] (ORCID: ), Sean Hughes [ctb] (ORCID: ), Trung Kien Dang [ctb] (ORCID: ), Saulius Lukauskas [ctb], Jean-Olivier Irisson [ctb] (ORCID: ), Zhian N Kamvar [ctb] (ORCID: ), Thompson Ryan [ctb] (ORCID: ), Dervieux Christophe [ctb] (ORCID: ), Yutani Hiroaki [ctb], Pierre Gramme [ctb], Amir Masoud Abdol [ctb], Malcolm Barrett [ctb] (ORCID: ), Robrecht Cannoodt [ctb] (ORCID: ), Michał Krassowski [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Pedro Aphalo [ctb] (ORCID: ), Francis Barton [ctb]", + "Maintainer": "Kamil Slowikowski ", + "Repository": "CRAN" + }, + "glue": { + "Package": "glue", + "Version": "1.8.1", + "Source": "Repository", + "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" + ], + "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" + }, + "googledrive": { + "Package": "googledrive", + "Version": "2.1.2", + "Source": "Repository", + "Title": "An Interface to Google Drive", + "Authors@R": "c( person(\"Lucy\", \"D'Agostino McGowan\", , role = \"aut\"), 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\")) )", + "Description": "Manage Google Drive files from R.", + "License": "MIT + file LICENSE", + "URL": "https://googledrive.tidyverse.org, https://github.com/tidyverse/googledrive", + "BugReports": "https://github.com/tidyverse/googledrive/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "gargle (>= 1.6.0)", + "glue (>= 1.4.2)", + "httr", + "jsonlite", + "lifecycle", + "magrittr", + "pillar (>= 1.9.0)", + "purrr (>= 1.0.1)", + "rlang (>= 1.0.2)", + "tibble (>= 2.0.0)", + "utils", + "uuid", + "vctrs (>= 0.3.0)", + "withr" + ], + "Suggests": [ + "curl", + "dplyr (>= 1.0.0)", + "knitr", + "rmarkdown", + "spelling", + "testthat (>= 3.1.5)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Lucy D'Agostino McGowan [aut], Jennifer Bryan [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "googlesheets4": { + "Package": "googlesheets4", + "Version": "1.1.2", + "Source": "Repository", + "Title": "Access Google Sheets using the Sheets API V4", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Interact with Google Sheets through the Sheets API v4 . \"API\" is an acronym for \"application programming interface\"; the Sheets API allows users to interact with Google Sheets programmatically, instead of via a web browser. The \"v4\" refers to the fact that the Sheets API is currently at version 4. This package can read and write both the metadata and the cell data in a Sheet.", + "License": "MIT + file LICENSE", + "URL": "https://googlesheets4.tidyverse.org, https://github.com/tidyverse/googlesheets4", + "BugReports": "https://github.com/tidyverse/googlesheets4/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cellranger", + "cli (>= 3.0.0)", + "curl", + "gargle (>= 1.6.0)", + "glue (>= 1.3.0)", + "googledrive (>= 2.1.0)", + "httr", + "ids", + "lifecycle", + "magrittr", + "methods", + "purrr", + "rematch2", + "rlang (>= 1.0.2)", + "tibble (>= 2.1.1)", + "utils", + "vctrs (>= 0.2.3)", + "withr" + ], + "Suggests": [ + "readr", + "rmarkdown", + "spelling", + "testthat (>= 3.1.7)" + ], + "ByteCompile": "true", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "gridExtra": { + "Package": "gridExtra", + "Version": "2.3.1", + "Source": "Repository", + "Authors@R": "c(person(\"Baptiste\", \"Auguie\", email = \"baptiste.auguie@vuw.ac.nz\", role = c(\"aut\", \"cre\")), person(\"Anton\", \"Antonov\", email = \"tonytonov@gmail.com\", role = c(\"ctb\")))", + "License": "GPL (>= 2)", + "Title": "Miscellaneous Functions for \"Grid\" Graphics", + "Type": "Package", + "Description": "Provides a number of user-level functions to work with \"grid\" graphics, notably to arrange multiple grid-based plots on a page, and draw tables.", + "VignetteBuilder": "knitr", + "Imports": [ + "gtable", + "grid", + "grDevices", + "graphics", + "utils" + ], + "Suggests": [ + "ggplot2", + "egg", + "lattice", + "knitr", + "testthat" + ], + "RoxygenNote": "6.0.1", + "NeedsCompilation": "no", + "Author": "Baptiste Auguie [aut, cre], Anton Antonov [ctb]", + "Maintainer": "Baptiste Auguie ", + "Repository": "CRAN" + }, + "gtable": { + "Package": "gtable", + "Version": "0.3.6", + "Source": "Repository", + "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 (>= 1.1.0)", + "stats" + ], + "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" + }, + "haven": { + "Package": "haven", + "Version": "2.5.5", + "Source": "Repository", + "Title": "Import and Export 'SPSS', 'Stata' and 'SAS' Files", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Evan\", \"Miller\", role = c(\"aut\", \"cph\"), comment = \"Author of included ReadStat code\"), person(\"Danny\", \"Smith\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Import foreign statistical formats into R via the embedded 'ReadStat' C library, .", + "License": "MIT + file LICENSE", + "URL": "https://haven.tidyverse.org, https://github.com/tidyverse/haven, https://github.com/WizardMac/ReadStat", + "BugReports": "https://github.com/tidyverse/haven/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "forcats (>= 0.2.0)", + "hms", + "lifecycle", + "methods", + "readr (>= 0.1.0)", + "rlang (>= 0.4.0)", + "tibble", + "tidyselect", + "vctrs (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "crayon", + "fs", + "knitr", + "pillar (>= 1.4.0)", + "rmarkdown", + "testthat (>= 3.0.0)", + "utf8" + ], + "LinkingTo": [ + "cpp11" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make, zlib: zlib1g-dev (deb), zlib-devel (rpm)", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Evan Miller [aut, cph] (Author of included ReadStat code), Danny Smith [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "highr": { + "Package": "highr", + "Version": "0.12", + "Source": "Repository", + "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)" + ], + "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" + }, + "hipread": { + "Package": "hipread", + "Version": "0.2.6", + "Source": "Repository", + "Type": "Package", + "Title": "Read Hierarchical Fixed Width Files", + "Authors@R": "c( person(\"Greg\", \"Freedman Ellis\", role = \"aut\"), person(\"Derek Burk\", email = \"ipums+cran@umn.edu\", role = c(\"aut\", \"cre\")), person(\"Joe Grover\", role = \"ctb\"), person(\"Mark Padgham\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", \"ctb\", comment = \"Code adapted from readr\"), person(\"Jim\", \"Hester\", , \"james.hester@rstudio.com\", c(\"ctb\"), comment = \"Code adapted from readr\"), person(\"Romain\", \"Francois\", role = \"ctb\", comment = \"Code adapted from readr\"), person(\"R Core Team\", role = \"ctb\", comment = \"Code adapted from readr\"), person(\"RStudio\", role = c(\"cph\", \"fnd\"), comment = \"Code adapted from readr\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"Code adapted from readr\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"Code adapted from readr\"), person(\"University of Minnesota\", role = \"cph\"))", + "Contact": "ipums@umn.edu", + "Description": "Read hierarchical fixed width files like those commonly used by many census data providers. Also allows for reading of data in chunks, and reading 'gzipped' files without storing the full file in memory.", + "License": "GPL (>= 2) | file LICENSE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.0.2)" + ], + "LinkingTo": [ + "Rcpp (>= 1.0.12)", + "BH" + ], + "Imports": [ + "Rcpp (>= 1.0.12)", + "R6", + "rlang", + "tibble" + ], + "Suggests": [ + "dplyr", + "readr", + "testthat" + ], + "RoxygenNote": "7.3.3", + "URL": "https://github.com/ipums/hipread", + "BugReports": "https://github.com/ipums/hipread/issues", + "NeedsCompilation": "yes", + "Author": "Greg Freedman Ellis [aut], Derek Burk [aut, cre], Joe Grover [ctb], Mark Padgham [ctb], Hadley Wickham [ctb] (Code adapted from readr), Jim Hester [ctb] (Code adapted from readr), Romain Francois [ctb] (Code adapted from readr), R Core Team [ctb] (Code adapted from readr), RStudio [cph, fnd] (Code adapted from readr), Jukka Jylänki [ctb, cph] (Code adapted from readr), Mikkel Jørgensen [ctb, cph] (Code adapted from readr), University of Minnesota [cph]", + "Maintainer": "Derek Burk ", + "Repository": "CRAN" + }, + "hms": { + "Package": "hms", + "Version": "1.1.4", + "Source": "Repository", + "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 (>= 1.0.2)", + "vctrs (>= 0.3.8)" + ], + "Suggests": [ + "crayon", + "lubridate", + "pillar (>= 1.1.0)", + "testthat (>= 3.0.0)" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "htmltools": { + "Package": "htmltools", + "Version": "0.5.9", + "Source": "Repository", + "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 (>= 1.1.0)", + "grDevices", + "rlang (>= 1.0.0)", + "utils" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "httr": { + "Package": "httr", + "Version": "1.4.8", + "Source": "Repository", + "Title": "Tools for Working with URLs and HTTP", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Useful tools for working with HTTP organised by HTTP verbs (GET(), POST(), etc). Configuration functions make it easy to control additional request components (authenticate(), add_headers() and so on).", + "License": "MIT + file LICENSE", + "URL": "https://httr.r-lib.org/, https://github.com/r-lib/httr", + "BugReports": "https://github.com/r-lib/httr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "curl (>= 5.1.0)", + "jsonlite", + "mime", + "openssl (>= 0.8)", + "R6" + ], + "Suggests": [ + "covr", + "httpuv", + "jpeg", + "knitr", + "png", + "readr", + "rmarkdown", + "testthat (>= 0.8.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "httr2": { + "Package": "httr2", + "Version": "1.3.0", + "Source": "Repository", + "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", + "R6", + "rlang (>= 1.3.0)", + "vctrs (>= 0.6.3)", + "withr" + ], + "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" + }, + "ids": { + "Package": "ids", + "Version": "1.0.1", + "Source": "Repository", + "Title": "Generate Random Identifiers", + "Authors@R": "person(\"Rich\", \"FitzJohn\", role = c(\"aut\", \"cre\"), email = \"rich.fitzjohn@gmail.com\")", + "Description": "Generate random or human readable and pronounceable identifiers.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/richfitz/ids", + "BugReports": "https://github.com/richfitz/ids/issues", + "Imports": [ + "openssl", + "uuid" + ], + "Suggests": [ + "knitr", + "rcorpora", + "rmarkdown", + "testthat" + ], + "RoxygenNote": "6.0.1", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Rich FitzJohn [aut, cre]", + "Maintainer": "Rich FitzJohn ", + "Repository": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, + "ipumsr": { + "Package": "ipumsr", + "Version": "0.10.0", + "Source": "Repository", + "Title": "An R Interface for Downloading, Reading, and Handling IPUMS Data", + "Authors@R": "c( person(\"Greg Freedman Ellis\", role = \"aut\"), person(\"Derek Burk\", , , \"ipums+cran@umn.edu\", role = c(\"aut\", \"cre\")), person(\"Finn Roberts\", role = \"aut\"), person(\"Joe Grover\", role = \"ctb\"), person(\"Dan Ehrlich\", role = \"ctb\"), person(\"Renae Rodgers\", role = \"ctb\"), person(\"Institute for Social Research and Data Innovation\", , , \"ipums@umn.edu\", role = \"cph\") )", + "Description": "An easy way to work with census, survey, and geographic data provided by IPUMS in R. Generate and download data through the IPUMS API and load IPUMS files into R with their associated metadata to make analysis easier. IPUMS data describing 1.4 billion individuals drawn from over 750 censuses and surveys is available free of charge from the IPUMS website .", + "License": "Mozilla Public License 2.0", + "URL": "https://tech.popdata.org/ipumsr/, https://github.com/ipums/ipumsr, https://www.ipums.org", + "BugReports": "https://github.com/ipums/ipumsr/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "dplyr (>= 0.7.0)", + "haven (>= 2.2.0)", + "hipread (>= 0.2.0)", + "httr", + "jsonlite", + "lifecycle", + "purrr", + "R6", + "readr", + "rlang", + "tibble", + "tidyselect", + "xml2", + "zeallot" + ], + "Suggests": [ + "biglm", + "covr", + "crayon", + "DBI", + "dbplyr", + "DT", + "ggplot2", + "htmltools", + "knitr", + "rmapshaper", + "rmarkdown", + "RSQLite (>= 2.3.3)", + "rstudioapi", + "scales", + "sf", + "shiny", + "testthat (>= 3.2.0)", + "tidyr", + "vcr (>= 0.6.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Contact": "ipums@umn.edu", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Greg Freedman Ellis [aut], Derek Burk [aut, cre], Finn Roberts [aut], Joe Grover [ctb], Dan Ehrlich [ctb], Renae Rodgers [ctb], Institute for Social Research and Data Innovation [cph]", + "Maintainer": "Derek Burk ", + "Repository": "CRAN" + }, + "isoband": { + "Package": "isoband", + "Version": "0.3.0", + "Source": "Repository", + "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", + "grid", + "rlang", + "utils" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "janitor": { + "Package": "janitor", + "Version": "2.2.1", + "Source": "Repository", + "Title": "Simple Tools for Examining and Cleaning Dirty Data", + "Authors@R": "c(person(\"Sam\", \"Firke\", email = \"samuel.firke@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Bill\", \"Denney\", email = \"wdenney@humanpredictions.com\", role = \"ctb\"), person(\"Chris\", \"Haid\", email = \"chrishaid@gmail.com\", role = \"ctb\"), person(\"Ryan\", \"Knight\", email = \"ryangknight@gmail.com\", role = \"ctb\"), person(\"Malte\", \"Grosser\", email = \"malte.grosser@gmail.com\", role = \"ctb\"), person(\"Jonathan\", \"Zadra\", email = \"jonathan.zadra@sorensonimpact.com\", role = \"ctb\"))", + "Description": "The main janitor functions can: perfectly format data.frame column names; provide quick counts of variable combinations (i.e., frequency tables and crosstabs); and explore duplicate records. Other janitor functions nicely format the tabulation results. These tabulate-and-report functions approximate popular features of SPSS and Microsoft Excel. This package follows the principles of the \"tidyverse\" and works well with the pipe function %>%. janitor was built with beginning-to-intermediate R users in mind and is optimized for user-friendliness.", + "URL": "https://github.com/sfirke/janitor, https://sfirke.github.io/janitor/", + "BugReports": "https://github.com/sfirke/janitor/issues", + "Depends": [ + "R (>= 3.1.2)" + ], + "Imports": [ + "dplyr (>= 1.0.0)", + "hms", + "lifecycle", + "lubridate", + "magrittr", + "purrr", + "rlang", + "stringi", + "stringr", + "snakecase (>= 0.9.2)", + "tidyselect (>= 1.0.0)", + "tidyr (>= 0.7.0)" + ], + "License": "MIT + file LICENSE", + "RoxygenNote": "7.2.3", + "Suggests": [ + "dbplyr", + "knitr", + "rmarkdown", + "RSQLite", + "sf", + "testthat (>= 3.0.0)", + "tibble", + "tidygraph" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Sam Firke [aut, cre], Bill Denney [ctb], Chris Haid [ctb], Ryan Knight [ctb], Malte Grosser [ctb], Jonathan Zadra [ctb]", + "Maintainer": "Sam Firke ", + "Repository": "CRAN" + }, + "jquerylib": { + "Package": "jquerylib", + "Version": "0.1.4", + "Source": "Repository", + "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" + ], + "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", + "Title": "A Simple and Robust JSON Parser and Generator for R", + "License": "MIT + file LICENSE", + "Depends": [ + "methods" + ], + "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", + "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 (>= 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" + ], + "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", + "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" + ], + "Repository": "CRAN" + }, + "later": { + "Package": "later", + "Version": "1.4.8", + "Source": "Repository", + "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" + ], + "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" + }, + "lehdr": { + "Package": "lehdr", + "Version": "1.1.4", + "Source": "Repository", + "Type": "Package", + "Title": "Grab Longitudinal Employer-Household Dynamics (LEHD) Flat Files", + "Authors@R": "c(person(given=\"Jamaal\", family=\"Green\", role = c(\"cre\",\"aut\"), email=\"jamaal.green@gmail.com\"), person(given=\"Liming\", family=\"Wang\", role =c(\"aut\"), email=\"lmwang@pdx.edu\"), person(given=\"Dillon\", family=\"Mahmoudi\", role =c(\"aut\"), email=\"dillonm@umbc.edu\"), person(given=\"Matthew\",family=\"Rogers\", role=c(\"ctb\"), email = \"matthew.rogers09@gmail.com\"), person(given=\"Kyle\", family=\"Walker\", role=c(\"ctb\"), email=\"kyle@walker-data.com\"))", + "Maintainer": "Jamaal Green ", + "Description": "Designed to query Longitudinal Employer-Household Dynamics (LEHD) workplace/residential association and origin-destination flat files and optionally aggregate Census block-level data to block group, tract, county, or state. Data comes from the LODES FTP server .", + "Depends": [ + "R (>= 4.0.0)" + ], + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Imports": [ + "readr", + "rlang", + "stringr", + "glue", + "httr2", + "dplyr", + "magrittr" + ], + "Suggests": [ + "testthat (>= 3.0.0)", + "knitr", + "rmarkdown", + "devtools", + "pacman" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.2", + "URL": "https://github.com/jamgreen/lehdr/", + "BugReports": "https://github.com/jamgreen/lehdr/issues/", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Jamaal Green [cre, aut], Liming Wang [aut], Dillon Mahmoudi [aut], Matthew Rogers [ctb], Kyle Walker [ctb]", + "Repository": "RSPM" + }, + "lifecycle": { + "Package": "lifecycle", + "Version": "1.0.5", + "Source": "Repository", + "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)" + ], + "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" + }, + "lubridate": { + "Package": "lubridate", + "Version": "1.9.5", + "Source": "Repository", + "Type": "Package", + "Title": "Make Dealing with Dates a Little Easier", + "Authors@R": "c( person(\"Vitalie\", \"Spinu\", , \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Garrett\", \"Grolemund\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Davis\", \"Vaughan\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Imanuel\", \"Costigan\", role = \"ctb\"), person(\"Jason\", \"Law\", role = \"ctb\"), person(\"Doug\", \"Mitarotonda\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Jonathan\", \"Boiser\", role = \"ctb\"), person(\"Chel Hee\", \"Lee\", role = \"ctb\") )", + "Maintainer": "Vitalie Spinu ", + "Description": "Functions to work with date-times and time-spans: fast and user friendly parsing of date-time data, extraction and updating of components of a date-time (years, months, days, hours, minutes, and seconds), algebraic manipulation on date-time and time-span objects. The 'lubridate' package has a consistent and memorable syntax that makes working with dates easy and fun.", + "License": "MIT + file LICENSE", + "URL": "https://lubridate.tidyverse.org, https://github.com/tidyverse/lubridate", + "BugReports": "https://github.com/tidyverse/lubridate/issues", + "Depends": [ + "methods", + "R (>= 3.2)" + ], + "Imports": [ + "generics", + "timechange (>= 0.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "testthat (>= 2.1.0)", + "vctrs (>= 0.6.5)" + ], + "Enhances": [ + "chron", + "data.table", + "timeDate", + "tis", + "zoo" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "Collate": "'Dates.r' 'POSIXt.r' 'util.r' 'parse.r' 'timespans.r' 'intervals.r' 'difftimes.r' 'durations.r' 'periods.r' 'accessors-date.R' 'accessors-day.r' 'accessors-dst.r' 'accessors-hour.r' 'accessors-minute.r' 'accessors-month.r' 'accessors-quarter.r' 'accessors-second.r' 'accessors-tz.r' 'accessors-week.r' 'accessors-year.r' 'am-pm.r' 'time-zones.r' 'numeric.r' 'coercion.r' 'constants.r' 'cyclic_encoding.r' 'data.r' 'decimal-dates.r' 'deprecated.r' 'format_ISO8601.r' 'guess.r' 'hidden.r' 'instants.r' 'leap-years.r' 'ops-addition.r' 'ops-compare.r' 'ops-division.r' 'ops-integer-division.r' 'ops-m+.r' 'ops-modulo.r' 'ops-multiplication.r' 'ops-subtraction.r' 'package.r' 'pretty.r' 'round.r' 'stamp.r' 'tzdir.R' 'update.r' 'vctrs.R' 'zzz.R'", + "NeedsCompilation": "yes", + "Author": "Vitalie Spinu [aut, cre], Garrett Grolemund [aut], Hadley Wickham [aut], Davis Vaughan [ctb], Ian Lyttle [ctb], Imanuel Costigan [ctb], Jason Law [ctb], Doug Mitarotonda [ctb], Joseph Larmarange [ctb], Jonathan Boiser [ctb], Chel Hee Lee [ctb]", + "Repository": "CRAN" + }, + "magrittr": { + "Package": "magrittr", + "Version": "2.0.5", + "Source": "Repository", + "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" + ], + "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", + "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" + ], + "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", + "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" + ], + "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" + }, + "modelr": { + "Package": "modelr", + "Version": "0.1.11", + "Source": "Repository", + "Title": "Modelling Functions that Work with the Pipe", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Functions for modelling that help you seamlessly integrate modelling into a pipeline of data manipulation and visualisation.", + "License": "GPL-3", + "URL": "https://modelr.tidyverse.org, https://github.com/tidyverse/modelr", + "BugReports": "https://github.com/tidyverse/modelr/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ + "broom", + "magrittr", + "purrr (>= 0.2.2)", + "rlang (>= 1.0.6)", + "tibble", + "tidyr (>= 0.8.0)", + "tidyselect", + "vctrs" + ], + "Suggests": [ + "compiler", + "covr", + "ggplot2", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "openssl": { + "Package": "openssl", + "Version": "2.4.2", + "Source": "Repository", + "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" + ], + "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", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "otel": { + "Package": "otel", + "Version": "0.2.0", + "Source": "Repository", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "pdftools": { + "Package": "pdftools", + "Version": "3.9.0", + "Source": "Repository", + "Type": "Package", + "Title": "Text Extraction, Rendering and Converting of PDF Documents", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Utilities based on 'libpoppler' for extracting text, fonts, attachments and metadata from a PDF file. Also supports high quality rendering of PDF documents into PNG, JPEG, TIFF format, or into raw bitmap vectors for further processing in R.", + "License": "MIT + file LICENSE", + "URL": "https://ropensci.r-universe.dev/pdftools, https://docs.ropensci.org/pdftools/", + "BugReports": "https://github.com/ropensci/pdftools/issues", + "SystemRequirements": "Poppler C++ API: libpoppler-cpp-dev (deb) or poppler-cpp-devel (rpm), and poppler-data (rpm/deb) package.", + "Encoding": "UTF-8", + "Imports": [ + "Rcpp (>= 0.12.12)", + "qpdf" + ], + "LinkingTo": [ + "Rcpp" + ], + "Suggests": [ + "png", + "webp", + "tesseract", + "testthat" + ], + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: )", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "pillar": { + "Package": "pillar", + "Version": "1.11.1", + "Source": "Repository", + "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 (>= 1.0.2)", + "utf8 (>= 1.1.0)", + "utils", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "pkgbuild": { + "Package": "pkgbuild", + "Version": "1.4.8", + "Source": "Repository", + "Title": "Find Tools Needed to Build R Packages", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", 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": "Provides functions used to build R packages. Locates compilers needed to build R packages on various platforms and ensures the PATH is configured appropriately so R can use them.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/pkgbuild, https://pkgbuild.r-lib.org", + "BugReports": "https://github.com/r-lib/pkgbuild/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "callr (>= 3.2.0)", + "cli (>= 3.4.0)", + "desc", + "processx", + "R6" + ], + "Suggests": [ + "covr", + "cpp11", + "knitr", + "Rcpp", + "rmarkdown", + "testthat (>= 3.2.0)", + "withr (>= 2.3.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-30", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "pkgconfig": { + "Package": "pkgconfig", + "Version": "2.0.3", + "Source": "Repository", + "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" + ], + "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" + }, + "pkgdown": { + "Package": "pkgdown", + "Version": "2.2.1", + "Source": "Repository", + "Title": "Make Static HTML Documentation for a Package", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jay\", \"Hesselberth\", role = \"aut\", comment = c(ORCID = \"0000-0002-6299-179X\")), person(\"Maëlle\", \"Salmon\", role = \"aut\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(\"Olivier\", \"Roy\", role = \"aut\"), person(\"Salim\", \"Brüggemann\", role = \"aut\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Generate an attractive and useful website from a source package. 'pkgdown' converts your documentation, vignettes, 'README', and more to 'HTML' making it easy to share information about your package online.", + "License": "MIT + file LICENSE", + "URL": "https://pkgdown.r-lib.org/, https://github.com/r-lib/pkgdown", + "BugReports": "https://github.com/r-lib/pkgdown/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "bslib (>= 0.5.1)", + "callr (>= 3.7.3)", + "cli (>= 3.6.1)", + "desc (>= 1.4.0)", + "downlit (>= 0.4.4)", + "fontawesome", + "fs (>= 1.4.0)", + "httr2 (>= 1.0.2)", + "jsonlite", + "lifecycle", + "openssl", + "purrr (>= 1.0.0)", + "ragg (>= 1.4.0)", + "rlang (>= 1.1.4)", + "rmarkdown (>= 2.27)", + "tibble", + "whisker", + "withr (>= 2.4.3)", + "xml2 (>= 1.3.1)", + "yaml (>= 2.3.9)" + ], + "Suggests": [ + "covr", + "diffviewer", + "evaluate (>= 0.24.0)", + "gert", + "gt", + "htmltools", + "htmlwidgets", + "knitr (>= 1.50)", + "magick", + "methods", + "nanonext (>= 1.8.0)", + "pkgload (>= 1.0.2)", + "quarto", + "rsconnect", + "rstudioapi", + "rticles", + "sass", + "testthat (>= 3.1.3)", + "tools" + ], + "VignetteBuilder": "knitr, quarto", + "Config/Needs/website": "usethis, servr", + "Config/potools/style": "explicit", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "build-article, build-quarto-article, build-reference, build", + "Config/usethis/last-upkeep": "2025-09-07", + "Encoding": "UTF-8", + "SystemRequirements": "pandoc (>= 2.10.1)", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Jay Hesselberth [aut] (ORCID: ), Maëlle Salmon [aut] (ORCID: ), Olivier Roy [aut], Salim Brüggemann [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "pkgload": { + "Package": "pkgload", + "Version": "1.5.3", + "Source": "Repository", + "Title": "Simulate Package Installation and Attach", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Core team\", role = \"ctb\", comment = \"Some namespace and vignette code extracted from base R\") )", + "Description": "Simulates the process of installing a package and then attaching it. This is a key part of the 'devtools' package as it allows you to rapidly iterate while developing a package.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/pkgload, https://pkgload.r-lib.org", + "BugReports": "https://github.com/r-lib/pkgload/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "cli (>= 3.3.0)", + "desc", + "fs", + "glue", + "lifecycle", + "methods", + "pkgbuild", + "processx", + "rlang (>= 1.1.1)", + "rprojroot", + "utils" + ], + "Suggests": [ + "bitops", + "jsonlite", + "mathjaxr", + "pak", + "Rcpp", + "remotes", + "rstudioapi", + "testthat (>= 3.2.1.1)", + "usethis", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate, ggplot2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "dll", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Winston Chang [aut], Jim Hester [aut], Lionel Henry [aut, cre], Posit Software, PBC [cph, fnd], R Core team [ctb] (Some namespace and vignette code extracted from base R)", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" + }, + "plyr": { + "Package": "plyr", + "Version": "1.8.9", + "Source": "Repository", + "Title": "Tools for Splitting, Applying and Combining Data", + "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"))", + "Description": "A set of tools that solves a common set of problems: you need to break a big problem down into manageable pieces, operate on each piece and then put all the pieces back together. For example, you might want to fit a model to each spatial location or time point in your study, summarise data by panels or collapse high-dimensional arrays to simpler summary statistics. The development of 'plyr' has been generously supported by 'Becton Dickinson'.", + "License": "MIT + file LICENSE", + "URL": "http://had.co.nz/plyr, https://github.com/hadley/plyr", + "BugReports": "https://github.com/hadley/plyr/issues", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "Rcpp (>= 0.11.0)" + ], + "Suggests": [ + "abind", + "covr", + "doParallel", + "foreach", + "iterators", + "itertools", + "tcltk", + "testthat" + ], + "LinkingTo": [ + "Rcpp" + ], + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre]", + "Maintainer": "Hadley Wickham ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "praise": { + "Package": "praise", + "Version": "1.0.0", + "Source": "Repository", + "Title": "Praise Users", + "Author": "Gabor Csardi, Sindre Sorhus", + "Maintainer": "Gabor Csardi ", + "Description": "Build friendly R packages that praise their users if they have done something good, or they just need it to feel better.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "URL": "https://github.com/gaborcsardi/praise", + "BugReports": "https://github.com/gaborcsardi/praise/issues", + "Suggests": [ + "testthat" + ], + "Collate": "'adjective.R' 'adverb.R' 'exclamation.R' 'verb.R' 'rpackage.R' 'package.R'", + "NeedsCompilation": "no", + "Repository": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.2.0", + "Source": "Repository", + "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)" + ], + "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", + "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", + "utils" + ], + "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", + "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", + "R6" + ], + "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", + "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 (>= 1.5)", + "otel (>= 0.2.0)", + "R6", + "rlang" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "proxy": { + "Package": "proxy", + "Version": "0.4-29", + "Source": "Repository", + "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" + ], + "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", + "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" + ], + "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", + "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)" + ], + "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" + }, + "qpdf": { + "Package": "qpdf", + "Version": "1.4.1", + "Source": "Repository", + "Type": "Package", + "Title": "Split, Combine and Compress PDF Files", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Ben\", \"Raymond\", role = \"ctb\"), person(\"Jay Berkenbilt\", role = \"cph\", comment = \"Author of libqpdf\"))", + "Description": "Content-preserving transformations transformations of PDF files such as split, combine, and compress. This package interfaces directly to the 'qpdf' C++ library and does not require any command line utilities. Note that 'qpdf' does not read actual content from PDF files: to extract text and data you need the 'pdftools' package.", + "License": "Apache License 2.0", + "URL": "https://docs.ropensci.org/qpdf/ https://ropensci.r-universe.dev/qpdf", + "BugReports": "https://github.com/ropensci/qpdf/issues", + "Encoding": "UTF-8", + "Imports": [ + "Rcpp", + "askpass", + "curl" + ], + "LinkingTo": [ + "Rcpp" + ], + "RoxygenNote": "7.2.1", + "Suggests": [ + "testthat" + ], + "SystemRequirements": "libjpeg", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Ben Raymond [ctb], Jay Berkenbilt [cph] (Author of libqpdf)", + "Maintainer": "Jeroen Ooms ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "ragg": { + "Package": "ragg", + "Version": "1.5.2", + "Source": "Repository", + "Type": "Package", + "Title": "Graphic Devices Based on AGG", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Maxim\", \"Shemanarev\", role = c(\"aut\", \"cph\"), comment = \"Author of AGG\"), person(\"Tony\", \"Juricic\", , \"tonygeek@yahoo.com\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Milan\", \"Marusinec\", , \"milan@marusinec.sk\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Spencer\", \"Garrett\", role = \"ctb\", comment = \"Contributor to AGG\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Maintainer": "Thomas Lin Pedersen ", + "Description": "Anti-Grain Geometry (AGG) is a high-quality and high-performance 2D drawing library. The 'ragg' package provides a set of graphic devices based on AGG to use as alternative to the raster devices provided through the 'grDevices' package.", + "License": "MIT + file LICENSE", + "URL": "https://ragg.r-lib.org, https://github.com/r-lib/ragg", + "BugReports": "https://github.com/r-lib/ragg/issues", + "Imports": [ + "systemfonts (>= 1.0.3)", + "textshaping (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "graphics", + "grid", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "systemfonts", + "textshaping" + ], + "Config/build/compilation-database": "true", + "Config/Needs/website": "ggplot2, devoid, magick, bench, tidyr, ggridges, hexbin, sessioninfo, pkgdown, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "freetype2, libpng, libtiff, libjpeg, libwebp, libwebpmux", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), Maxim Shemanarev [aut, cph] (Author of AGG), Tony Juricic [ctb, cph] (Contributor to AGG), Milan Marusinec [ctb, cph] (Contributor to AGG), Spencer Garrett [ctb] (Contributor to AGG), Posit Software, PBC [cph, fnd] (ROR: )", + "Repository": "CRAN" + }, + "rappdirs": { + "Package": "rappdirs", + "Version": "0.3.4", + "Source": "Repository", + "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)" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "readr": { + "Package": "readr", + "Version": "2.2.0", + "Source": "Repository", + "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", + "crayon", + "glue", + "hms (>= 0.4.1)", + "lifecycle", + "methods", + "R6", + "rlang", + "tibble", + "utils", + "vroom (>= 1.7.0)", + "withr" + ], + "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" + }, + "readxl": { + "Package": "readxl", + "Version": "1.5.0", + "Source": "Repository", + "Title": "Read Excel Files", + "Authors@R": "c( 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(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = \"Copyright holder of all R code and all C/C++ code without explicit copyright attribution\"), person(\"Marcin\", \"Kalicinski\", role = c(\"ctb\", \"cph\"), comment = \"Author of included RapidXML code\"), person(\"Komarov Valery\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Christophe Leitienne\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Bob Colbert\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"David Hoerl\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Evan Miller\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\") )", + "Description": "Import excel files into R. Supports '.xls' via the embedded 'libxls' C library and '.xlsx' via the embedded 'RapidXML' C++ library . Works on Windows, Mac and Linux without external dependencies.", + "License": "MIT + file LICENSE", + "URL": "https://readxl.tidyverse.org, https://github.com/tidyverse/readxl", + "BugReports": "https://github.com/tidyverse/readxl/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cellranger", + "tibble (>= 2.0.1)", + "utils" + ], + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "testthat (>= 3.1.6)", + "withr" + ], + "LinkingTo": [ + "cpp11 (>= 0.5.5)", + "progress" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate, tidyverse", + "Config/roxygen2/version": "8.0.0", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Note": "libxls v1.6.3 c199d13", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Posit, PBC [cph, fnd] (Copyright holder of all R code and all C/C++ code without explicit copyright attribution), Marcin Kalicinski [ctb, cph] (Author of included RapidXML code), Komarov Valery [ctb, cph] (Author of included libxls code), Christophe Leitienne [ctb, cph] (Author of included libxls code), Bob Colbert [ctb, cph] (Author of included libxls code), David Hoerl [ctb, cph] (Author of included libxls code), Evan Miller [ctb, cph] (Author of included libxls code)", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "rematch": { + "Package": "rematch", + "Version": "2.0.0", + "Source": "Repository", + "Title": "Match Regular Expressions with a Nicer 'API'", + "Author": "Gabor Csardi", + "Maintainer": "Gabor Csardi ", + "Description": "A small wrapper on 'regexpr' to extract the matches and captured groups from the match of a regular expression to a character vector.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/gaborcsardi/rematch", + "BugReports": "https://github.com/gaborcsardi/rematch/issues", + "RoxygenNote": "5.0.1.9000", + "Suggests": [ + "covr", + "testthat" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "rematch2": { + "Package": "rematch2", + "Version": "2.1.2", + "Source": "Repository", + "Title": "Tidy Output from Regular Expression Matching", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", email = \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Matthew\", \"Lincoln\", email = \"matthew.d.lincoln@gmail.com\", role = c(\"ctb\")))", + "Description": "Wrappers on 'regexpr' and 'gregexpr' to return the match results in tidy data frames.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "URL": "https://github.com/r-lib/rematch2#readme", + "BugReports": "https://github.com/r-lib/rematch2/issues", + "RoxygenNote": "7.1.0", + "Imports": [ + "tibble" + ], + "Suggests": [ + "covr", + "testthat" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Matthew Lincoln [ctb]", + "Maintainer": "Gábor Csárdi ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "renv": { + "Package": "renv", + "Version": "1.2.3", + "Source": "Repository", + "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" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "reprex": { + "Package": "reprex", + "Version": "2.1.1", + "Source": "Repository", + "Title": "Prepare Reproducible Example Code via the Clipboard", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"David\", \"Robinson\", , \"admiral.david@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Convenience wrapper that uses the 'rmarkdown' package to render small snippets of code to target formats that include both code and output. The goal is to encourage the sharing of small, reproducible, and runnable examples on code-oriented websites, such as and , or in email. The user's clipboard is the default source of input code and the default target for rendered output. 'reprex' also extracts clean, runnable R code from various common formats, such as copy/paste from an R session.", + "License": "MIT + file LICENSE", + "URL": "https://reprex.tidyverse.org, https://github.com/tidyverse/reprex", + "BugReports": "https://github.com/tidyverse/reprex/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "callr (>= 3.6.0)", + "cli (>= 3.2.0)", + "clipr (>= 0.4.0)", + "fs", + "glue", + "knitr (>= 1.23)", + "lifecycle", + "rlang (>= 1.0.0)", + "rmarkdown", + "rstudioapi", + "utils", + "withr (>= 2.3.0)" + ], + "Suggests": [ + "covr", + "fortunes", + "miniUI", + "rprojroot", + "sessioninfo", + "shiny", + "spelling", + "styler (>= 1.2.0)", + "testthat (>= 3.2.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "knitr-options, venues, reprex", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2", + "SystemRequirements": "pandoc (>= 2.0) - https://pandoc.org/", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [aut, cre] (), Jim Hester [aut] (), David Robinson [aut], Hadley Wickham [aut] (), Christophe Dervieux [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "rfema": { + "Package": "rfema", + "Version": "1.0.1", + "Source": "GitHub", + "Title": "Access the openFEMA API", + "Authors@R": "c(person(given = \"Dylan\", family = \"Turner\", role = c(\"aut\", \"cre\"), email = \"dylan.turner3@outlook.com\", comment = c(ORCID = \"0000-0002-0915-7384\")), person(given = \"François\", family = \"Michonneau\", role = c(\"rev\",\"ctb\"), email = \"francois.michonneau@gmail.com\", comment = \"reviewed the package for rOpenSci and patched several bugs in the prelease code, see https://github.com/ropensci/software-review/issues/484.\"), person(given = \"Marcus\", family = \"Beck\", role = c(\"rev\",\"ctb\"), comment = \"reviewed the package for rOpenSci, see https://github.com/ropensci/software-review/issues/484.\"))", + "Description": "`rfema` allows users to access The Federal Emergency Management Agency's (FEMA) publicly available data through their API. The package provides a set of functions to easily navigate and access data from the National Flood Insurance Program along with FEMA's various disaster aid programs, including the Hazard Mitigation Grant Program, the Public Assistance Grant Program, and the Individual Assistance Grant Program.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2", + "Imports": [ + "dplyr", + "memoise", + "utils", + "httr", + "plyr", + "tibble" + ], + "Suggests": [ + "rmarkdown", + "knitr", + "testthat (>= 3.0.0)", + "covr", + "vcr (>= 0.6.0)" + ], + "Config/testthat/edition": "3", + "VignetteBuilder": "knitr", + "URL": "https://github.com/dylan-turner25/rfema", + "BugReports": "https://github.com/dylan-turner25/rfema/issues", + "Author": "Dylan Turner [aut, cre] (ORCID: ), François Michonneau [rev, ctb] (reviewed the package for rOpenSci and patched several bugs in the prelease code, see https://github.com/ropensci/software-review/issues/484.), Marcus Beck [rev, ctb] (reviewed the package for rOpenSci, see https://github.com/ropensci/software-review/issues/484.)", + "Maintainer": "Dylan Turner ", + "RemoteType": "github", + "RemoteUsername": "ropensci", + "RemoteRepo": "rfema", + "RemoteRef": "main", + "RemoteSha": "1d7f85ff9838211e7aa27a051cde444a9a5894f9", + "RemoteHost": "api.github.com" + }, + "rlang": { + "Package": "rlang", + "Version": "1.3.0", + "Source": "Repository", + "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" + ], + "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", + "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 (>= 1.43)", + "methods", + "tinytex (>= 0.31)", + "tools", + "utils", + "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" + ], + "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" + }, + "rprojroot": { + "Package": "rprojroot", + "Version": "2.1.1", + "Source": "Repository", + "Title": "Finding Files in Project Subdirectories", + "Authors@R": "person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\"))", + "Description": "Robust, reliable and flexible paths to files below a project root. The 'root' of a project is defined as a directory that matches a certain criterion, e.g., it contains a certain regular file.", + "License": "MIT + file LICENSE", + "URL": "https://rprojroot.r-lib.org/, https://github.com/r-lib/rprojroot", + "BugReports": "https://github.com/r-lib/rprojroot/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Suggests": [ + "covr", + "knitr", + "lifecycle", + "rlang", + "rmarkdown", + "testthat (>= 3.2.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: )", + "Maintainer": "Kirill Müller ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "rstudioapi": { + "Package": "rstudioapi", + "Version": "0.19.0", + "Source": "Repository", + "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" + }, + "rvest": { + "Package": "rvest", + "Version": "1.0.5", + "Source": "Repository", + "Title": "Easily Harvest (Scrape) Web Pages", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Wrappers around the 'xml2' and 'httr' packages to make it easy to download, then manipulate, HTML and XML.", + "License": "MIT + file LICENSE", + "URL": "https://rvest.tidyverse.org/, https://github.com/tidyverse/rvest", + "BugReports": "https://github.com/tidyverse/rvest/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli", + "glue", + "httr (>= 0.5)", + "lifecycle (>= 1.0.3)", + "magrittr", + "rlang (>= 1.1.0)", + "selectr", + "tibble", + "xml2 (>= 1.4.0)" + ], + "Suggests": [ + "chromote", + "covr", + "knitr", + "purrr", + "R6", + "readr", + "repurrrsive", + "rmarkdown", + "spelling", + "stringi (>= 0.3.1)", + "testthat (>= 3.0.2)", + "tidyr", + "webfakes" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "s2": { + "Package": "s2", + "Version": "1.1.11", + "Source": "Repository", + "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" + ], + "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", + "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", + "rappdirs" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "withr", + "shiny", + "curl" + ], + "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", + "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 (>= 2.0.3)", + "glue", + "labeling", + "lifecycle", + "R6", + "RColorBrewer", + "rlang (>= 1.1.0)", + "viridisLite" + ], + "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" + }, + "selectr": { + "Package": "selectr", + "Version": "0.6-0", + "Source": "Repository", + "Type": "Package", + "Title": "Translate CSS Selectors to XPath Expressions", + "Authors@R": "c(person(\"Simon\", \"Potter\", role = c(\"aut\", \"trl\", \"cre\"), email = \"simon@sjp.co.nz\"), person(\"Simon\", \"Sapin\", role = \"aut\"), person(\"Ian\", \"Bicking\", role = \"aut\"))", + "License": "BSD_3_clause + file LICENCE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.3)" + ], + "Imports": [ + "R6" + ], + "Suggests": [ + "testthat", + "XML", + "xml2" + ], + "URL": "https://sjp.co.nz/projects/selectr/", + "BugReports": "https://github.com/sjp/selectr/issues", + "Description": "Translates a CSS selector into an equivalent XPath expression. This allows us to use CSS selectors when working with the XML package as it can only evaluate XPath expressions. Also provided are convenience functions useful for using CSS selectors on XML nodes. This package is a port of the Python package 'cssselect' ().", + "NeedsCompilation": "no", + "Author": "Simon Potter [aut, trl, cre], Simon Sapin [aut], Ian Bicking [aut]", + "Maintainer": "Simon Potter ", + "Repository": "CRAN" + }, + "sf": { + "Package": "sf", + "Version": "1.1-1", + "Source": "Repository", + "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", + "s2 (>= 1.1.0)", + "stats", + "tools", + "units (>= 0.7-0)", + "utils" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "sfarrow": { + "Package": "sfarrow", + "Version": "0.4.1", + "Source": "Repository", + "Title": "Read/Write Simple Feature Objects ('sf') with 'Apache' 'Arrow'", + "Date": "2021-10-25", + "Authors@R": "person(given = \"Chris\", family = \"Jochem\", role = c(\"aut\", \"cre\"), email = \"w.c.jochem@soton.ac.uk\", comment = c(ORCID = \"0000-0003-2192-5988\"))", + "Description": "Support for reading/writing simple feature ('sf') spatial objects from/to 'Parquet' files. 'Parquet' files are an open-source, column-oriented data storage format from Apache (), now popular across programming languages. This implementation converts simple feature list geometries into well-known binary format for use by 'arrow', and coordinate reference system information is maintained in a standard metadata format.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/wcjochem/sfarrow, https://wcjochem.github.io/sfarrow/", + "BugReports": "https://github.com/wcjochem/sfarrow/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "Imports": [ + "sf", + "arrow", + "jsonlite", + "dplyr" + ], + "Suggests": [ + "knitr", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Chris Jochem [aut, cre] ()", + "Maintainer": "Chris Jochem ", + "Repository": "CRAN" + }, + "snakecase": { + "Package": "snakecase", + "Version": "0.11.1", + "Source": "Repository", + "Date": "2023-08-27", + "Title": "Convert Strings into any Case", + "Description": "A consistent, flexible and easy to use tool to parse and convert strings into cases like snake or camel among others.", + "Authors@R": "c( person(\"Malte\", \"Grosser\", , \"malte.grosser@gmail.com\", role = c(\"aut\", \"cre\")))", + "Maintainer": "Malte Grosser ", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ + "stringr", + "stringi" + ], + "Suggests": [ + "testthat", + "covr", + "tibble", + "purrrlyr", + "knitr", + "rmarkdown", + "magrittr" + ], + "URL": "https://github.com/Tazinho/snakecase", + "BugReports": "https://github.com/Tazinho/snakecase/issues", + "Encoding": "UTF-8", + "License": "GPL-3", + "RoxygenNote": "6.1.1", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Malte Grosser [aut, cre]", + "Repository": "CRAN" + }, + "stringi": { + "Package": "stringi", + "Version": "1.8.7", + "Source": "Repository", + "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", + "stats" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "stringr": { + "Package": "stringr", + "Version": "1.6.0", + "Source": "Repository", + "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 (>= 1.6.1)", + "lifecycle (>= 1.0.3)", + "magrittr", + "rlang (>= 1.0.0)", + "stringi (>= 1.5.3)", + "vctrs (>= 0.4.0)" + ], + "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": "https://packagemanager.posit.co/cran/latest" + }, + "sys": { + "Package": "sys", + "Version": "3.4.3", + "Source": "Repository", + "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": "https://packagemanager.posit.co/cran/latest" + }, + "systemfonts": { + "Package": "systemfonts", + "Version": "1.3.2", + "Source": "Repository", + "Type": "Package", + "Title": "System Native Font Finding", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Jeroen\", \"Ooms\", , \"jeroen@berkeley.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Devon\", \"Govett\", role = \"aut\", comment = \"Author of font-manager\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides system native access to the font catalogue. As font handling varies between systems it is difficult to correctly locate installed fonts across different operating systems. The 'systemfonts' package provides bindings to the native libraries on Windows, macOS and Linux for finding font files that can then be used further by e.g. graphic devices. The main use is intended to be from compiled code but 'systemfonts' also provides access from R.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/systemfonts, https://systemfonts.r-lib.org", + "BugReports": "https://github.com/r-lib/systemfonts/issues", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "base64enc", + "grid", + "jsonlite", + "lifecycle", + "tools", + "utils" + ], + "Suggests": [ + "covr", + "farver", + "ggplot2", + "graphics", + "knitr", + "ragg", + "rmarkdown", + "svglite", + "testthat (>= 2.1.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.1)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "fontconfig, freetype2", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [aut, cre] (ORCID: ), Jeroen Ooms [aut] (ORCID: ), Devon Govett [aut] (Author of font-manager), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "testthat": { + "Package": "testthat", + "Version": "3.3.2", + "Source": "Repository", + "Title": "Unit Testing for R", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Core team\", role = \"ctb\", comment = \"Implementation of utils::recover()\") )", + "Description": "Software testing is important, but, in part because it is frustrating and boring, many of us avoid it. 'testthat' is a testing framework for R that is easy to learn and use, and integrates with your existing 'workflow'.", + "License": "MIT + file LICENSE", + "URL": "https://testthat.r-lib.org, https://github.com/r-lib/testthat", + "BugReports": "https://github.com/r-lib/testthat/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "brio (>= 1.1.5)", + "callr (>= 3.7.6)", + "cli (>= 3.6.5)", + "desc (>= 1.4.3)", + "evaluate (>= 1.0.4)", + "jsonlite (>= 2.0.0)", + "lifecycle (>= 1.0.4)", + "magrittr (>= 2.0.3)", + "methods", + "pkgload (>= 1.4.0)", + "praise (>= 1.0.0)", + "processx (>= 3.8.6)", + "ps (>= 1.9.1)", + "R6 (>= 2.6.1)", + "rlang (>= 1.1.6)", + "utils", + "waldo (>= 0.6.2)", + "withr (>= 3.0.2)" + ], + "Suggests": [ + "covr", + "curl (>= 0.9.5)", + "diffviewer (>= 0.1.0)", + "digest (>= 0.6.33)", + "gh", + "knitr", + "otel", + "otelsdk", + "rmarkdown", + "rstudioapi", + "S7", + "shiny", + "usethis", + "vctrs (>= 0.1.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "watcher, parallel*", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], R Core team [ctb] (Implementation of utils::recover())", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "textshaping": { + "Package": "textshaping", + "Version": "1.0.5", + "Source": "Repository", + "Title": "Bindings to the 'HarfBuzz' and 'Fribidi' Libraries for Text Shaping", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides access to the text shaping functionality in the 'HarfBuzz' library and the bidirectional algorithm in the 'Fribidi' library. 'textshaping' is a low-level utility package mainly for graphic devices that expands upon the font tool-set provided by the 'systemfonts' package.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/textshaping", + "BugReports": "https://github.com/r-lib/textshaping/issues", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "lifecycle", + "stats", + "stringi", + "systemfonts (>= 1.3.0)", + "utils" + ], + "Suggests": [ + "covr", + "grDevices", + "grid", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.1)", + "systemfonts (>= 1.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "freetype2, harfbuzz, fribidi", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "tibble": { + "Package": "tibble", + "Version": "3.3.1", + "Source": "Repository", + "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 (>= 1.0.0)", + "magrittr", + "methods", + "pillar (>= 1.8.1)", + "pkgconfig", + "rlang (>= 1.0.2)", + "utils", + "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" + ], + "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" + }, + "tidycensus": { + "Package": "tidycensus", + "Version": "1.8.1", + "Source": "Repository", + "Type": "Package", + "Title": "Load US Census Boundary and Attribute Data as 'tidyverse' and 'sf'-Ready Data Frames", + "Authors@R": "c( person(given = \"Kyle\", family = \"Walker\", email=\"kyle@walker-data.com\", role=c(\"aut\", \"cre\")), person(given = \"Matt\", family = \"Herman\", email = \"mfherman@gmail.com\", role = \"aut\"), person(given = \"Kris\", family = \"Eberwein\", email = \"eberwein@knights.ucf.edu\", role = \"ctb\"))", + "Date": "2026-05-25", + "URL": "https://walker-data.com/tidycensus/", + "BugReports": "https://github.com/walkerke/tidycensus/issues", + "Description": "An integrated R interface to several United States Census Bureau APIs () and the US Census Bureau's geographic boundary files. Allows R users to return Census and ACS data as tidyverse-ready data frames, and optionally returns a list-column with feature geometry for mapping and spatial analysis.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "LazyData": "true", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "httr", + "sf", + "dplyr (>= 1.0.0)", + "tigris", + "stringr", + "jsonlite (>= 1.5.0)", + "purrr", + "rvest", + "tidyr (>= 1.0.0)", + "readr", + "xml2", + "units", + "utils", + "rlang", + "crayon", + "tidyselect" + ], + "Suggests": [ + "ggplot2", + "survey", + "srvyr", + "terra", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/testthat/edition": "3", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Kyle Walker [aut, cre], Matt Herman [aut], Kris Eberwein [ctb]", + "Maintainer": "Kyle Walker ", + "Repository": "CRAN" + }, + "tidylog": { + "Package": "tidylog", + "Version": "1.1.0", + "Source": "Repository", + "Type": "Package", + "Title": "Logging for 'dplyr' and 'tidyr' Functions", + "Authors@R": "c( person(\"Benjamin\", \"Elbers\", email = \"elbersb@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-5392-3448\")), person(\"Damiano\", \"Oldoni\", email = \"damiano.oldoni@inbo.be\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0003-3445-7562\")) )", + "Description": "Provides feedback about 'dplyr' and 'tidyr' operations.", + "License": "MIT + file LICENSE", + "Imports": [ + "dplyr", + "tidyr", + "glue", + "clisymbols", + "rlang (>= 0.4.3)" + ], + "Suggests": [ + "testthat", + "units", + "nycflights13", + "covr", + "forcats", + "knitr", + "rmarkdown", + "bench" + ], + "Encoding": "UTF-8", + "URL": "https://github.com/elbersb/tidylog/", + "BugReports": "https://github.com/elbersb/tidylog/issues", + "RoxygenNote": "7.3.1", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Benjamin Elbers [aut, cre] (), Damiano Oldoni [ctb] ()", + "Maintainer": "Benjamin Elbers ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "tidyr": { + "Package": "tidyr", + "Version": "1.3.2", + "Source": "Repository", + "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 (>= 1.0.3)", + "magrittr", + "purrr (>= 1.0.1)", + "rlang (>= 1.1.1)", + "stringr (>= 1.5.0)", + "tibble (>= 2.1.1)", + "tidyselect (>= 1.2.1)", + "utils", + "vctrs (>= 0.5.2)" + ], + "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", + "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" + ], + "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" + }, + "tidytable": { + "Package": "tidytable", + "Version": "0.11.2", + "Source": "Repository", + "Title": "Tidy Interface to 'data.table'", + "Authors@R": "c( person(\"Mark\", \"Fairbanks\", role = c(\"aut\", \"cre\"), email = \"mark.t.fairbanks@gmail.com\"), person(\"Abdessabour\", \"Moutik\", role = \"ctb\"), person(\"Matt\", \"Carlson\", role = \"ctb\"), person(\"Ivan\", \"Leung\", role = \"ctb\"), person(\"Ross\", \"Kennedy\", role = \"ctb\"), person(\"Robert\", \"On\", role = \"ctb\"), person(\"Alexander\", \"Sevostianov\", role = \"ctb\"), person(\"Koen\", \"ter Berg\", role = \"ctb\") )", + "Description": "A tidy interface to 'data.table', giving users the speed of 'data.table' while using tidyverse-like syntax.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Imports": [ + "data.table (>= 1.16.0)", + "glue (>= 1.4.0)", + "lifecycle (>= 1.0.3)", + "magrittr (>= 2.0.3)", + "pillar (>= 1.8.0)", + "rlang (>= 1.1.0)", + "tidyselect (>= 1.2.0)", + "vctrs (>= 0.6.0)" + ], + "RoxygenNote": "7.3.2", + "Config/testthat/edition": "3", + "URL": "https://markfairbanks.github.io/tidytable/, https://github.com/markfairbanks/tidytable", + "BugReports": "https://github.com/markfairbanks/tidytable/issues", + "Suggests": [ + "testthat (>= 2.1.0)", + "bit64", + "knitr", + "rmarkdown", + "crayon" + ], + "NeedsCompilation": "no", + "Author": "Mark Fairbanks [aut, cre], Abdessabour Moutik [ctb], Matt Carlson [ctb], Ivan Leung [ctb], Ross Kennedy [ctb], Robert On [ctb], Alexander Sevostianov [ctb], Koen ter Berg [ctb]", + "Maintainer": "Mark Fairbanks ", + "Repository": "CRAN" + }, + "tidyverse": { + "Package": "tidyverse", + "Version": "2.0.0", + "Source": "Repository", + "Title": "Easily Install and Load the 'Tidyverse'", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "The 'tidyverse' is a set of packages that work in harmony because they share common data representations and 'API' design. This package is designed to make it easy to install and load multiple 'tidyverse' packages in a single step. Learn more about the 'tidyverse' at .", + "License": "MIT + file LICENSE", + "URL": "https://tidyverse.tidyverse.org, https://github.com/tidyverse/tidyverse", + "BugReports": "https://github.com/tidyverse/tidyverse/issues", + "Depends": [ + "R (>= 3.3)" + ], + "Imports": [ + "broom (>= 1.0.3)", + "conflicted (>= 1.2.0)", + "cli (>= 3.6.0)", + "dbplyr (>= 2.3.0)", + "dplyr (>= 1.1.0)", + "dtplyr (>= 1.2.2)", + "forcats (>= 1.0.0)", + "ggplot2 (>= 3.4.1)", + "googledrive (>= 2.0.0)", + "googlesheets4 (>= 1.0.1)", + "haven (>= 2.5.1)", + "hms (>= 1.1.2)", + "httr (>= 1.4.4)", + "jsonlite (>= 1.8.4)", + "lubridate (>= 1.9.2)", + "magrittr (>= 2.0.3)", + "modelr (>= 0.1.10)", + "pillar (>= 1.8.1)", + "purrr (>= 1.0.1)", + "ragg (>= 1.2.5)", + "readr (>= 2.1.4)", + "readxl (>= 1.4.2)", + "reprex (>= 2.0.2)", + "rlang (>= 1.0.6)", + "rstudioapi (>= 0.14)", + "rvest (>= 1.0.3)", + "stringr (>= 1.5.0)", + "tibble (>= 3.1.8)", + "tidyr (>= 1.3.0)", + "xml2 (>= 1.3.3)" + ], + "Suggests": [ + "covr (>= 3.6.1)", + "feather (>= 0.3.5)", + "glue (>= 1.6.2)", + "mockr (>= 0.2.0)", + "knitr (>= 1.41)", + "rmarkdown (>= 2.20)", + "testthat (>= 3.1.6)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "tigris": { + "Package": "tigris", + "Version": "2.2.1", + "Source": "Repository", + "Type": "Package", + "Title": "Load Census TIGER/Line Shapefiles", + "Date": "2025-04-15", + "Authors@R": "c( person(given=\"Kyle\", family=\"Walker\", email=\"kyle@walker-data.com\", role=c(\"aut\", \"cre\")), person(given=\"Bob\", family=\"Rudis\", email=\"bob@rudis.net\", role=\"ctb\") )", + "URL": "https://github.com/walkerke/tigris", + "BugReports": "https://github.com/walkerke/tigris/issues", + "Description": "Download TIGER/Line shapefiles from the United States Census Bureau () and load into R as 'sf' objects.", + "License": "MIT + file LICENSE", + "LazyData": "TRUE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.3.0)" + ], + "Suggests": [ + "testthat", + "ggplot2", + "ggthemes", + "leaflet", + "knitr", + "tidycensus", + "sp" + ], + "Imports": [ + "stringr", + "magrittr", + "utils", + "rappdirs", + "httr", + "uuid", + "sf", + "dplyr", + "methods" + ], + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Kyle Walker [aut, cre], Bob Rudis [ctb]", + "Maintainer": "Kyle Walker ", + "Repository": "CRAN" + }, + "timechange": { + "Package": "timechange", + "Version": "0.4.0", + "Source": "Repository", + "Title": "Efficient Manipulation of Date-Times", + "Authors@R": "c(person(\"Vitalie\", \"Spinu\", email = \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Google Inc.\", role = c(\"ctb\", \"cph\")))", + "Description": "Efficient routines for manipulation of date-time objects while accounting for time-zones and daylight saving times. The package includes utilities for updating of date-time components (year, month, day etc.), modification of time-zones, rounding of date-times, period addition and subtraction etc. Parts of the 'CCTZ' source code, released under the Apache 2.0 License, are included in this package. See for more details.", + "Depends": [ + "R (>= 3.3)" + ], + "License": "GPL (>= 3)", + "Encoding": "UTF-8", + "LinkingTo": [ + "cpp11 (>= 0.2.7)" + ], + "Suggests": [ + "testthat (>= 0.7.1.99)", + "knitr" + ], + "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "BugReports": "https://github.com/vspinu/timechange/issues", + "URL": "https://github.com/vspinu/timechange/", + "RoxygenNote": "7.2.1", + "NeedsCompilation": "yes", + "Author": "Vitalie Spinu [aut, cre], Google Inc. [ctb, cph]", + "Maintainer": "Vitalie Spinu ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "tinytex": { + "Package": "tinytex", + "Version": "0.60", + "Source": "Repository", + "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" + ], + "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", + "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)" + ], + "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", + "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" + ], + "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" + }, + "urbnindicators": { + "Package": "urbnindicators", + "Version": "0.1.0", + "Source": "GitHub", + "Type": "Package", + "Title": "Analysis-Ready Social Science Indicators from the American Community Survey (ACS)", + "Authors@R": "person(\"Will\", \"Curran-Groome\", email = \"wcurrangroome@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "Provides analysis-ready social science measures from the American Community Survey (ACS) with a single function call. Wraps the Census Bureau API (via 'tidycensus') to return semantically-named variables, pre-computed percentages with correctly pooled margins of error per Census Bureau guidance, and an attached codebook documenting how every variable is calculated. Includes tools to aggregate or interpolate estimates to custom geographies with propagated margins of error, to define custom derived variables, and to explore results in a local 'shiny' viewer.", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli", + "dplyr", + "httr", + "janitor", + "jsonlite", + "lifecycle", + "magrittr", + "purrr", + "stats", + "stringr", + "tidycensus", + "tidyr", + "tigris", + "rlang", + "tibble", + "sf", + "tools" + ], + "Suggests": [ + "arrow", + "bslib", + "crosswalk", + "distributional", + "ggdist", + "ggplot2", + "gridExtra", + "knitr", + "mapgl", + "reactable", + "remotes", + "rmarkdown", + "sfarrow", + "shiny", + "testthat (>= 3.0.0)", + "scales", + "urbnthemes (>= 0.0.2)", + "withr" + ], + "URL": "https://ui-research.github.io/urbnindicators/, https://github.com/UI-Research/urbnindicators", + "BugReports": "https://github.com/UI-Research/urbnindicators/issues", + "VignetteBuilder": "knitr, rmarkdown", + "Config/testthat/edition": "3", + "Roxygen": "list(markdown = TRUE)", + "License": "GPL (>= 3)", + "Config/roxygen2/version": "8.0.0", + "Author": "Will Curran-Groome [aut, cre]", + "Maintainer": "Will Curran-Groome ", + "RemoteType": "github", + "RemoteUsername": "UI-Research", + "RemoteRepo": "urbnindicators", + "RemoteRef": "main", + "RemoteSha": "e47d4b2a749b504e27f80997526bdbe3e0c7aef9", + "RemoteHost": "api.github.com", + "Remotes": "UI-Research/crosswalk, UrbanInstitute/urbnthemes" + }, + "urbnthemes": { + "Package": "urbnthemes", + "Version": "0.0.3", + "Source": "GitHub", + "Type": "Package", + "Title": "Additional theme and utilities for \"ggplot2\" in the Urban Institute style", + "Authors@R": "c( person(given = \"Aaron\", family = \"Williams\", middle = \"R.\", email = \"awilliams@urban.org\", role = c(\"aut\", \"cre\")), person(given = \"Kyle\", family = \"Ueyama\", email = \"kueyama@urban.org\", role = \"aut\"), person(given = \"Ajjit\", family = \"Narayanan\", email = \"anarayanan@urban.org\", role = \"aut\"), person(given = \"Ben\", family = \"Chartoff\", email = \"bchartoff@urban.org\", role = \"aut\") )", + "Description": "Align \"ggplot2\" output more closely with the Urban Institute Data Visualization style guide .", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "extrafont", + "ggplot2 (>= 3.3.0)", + "ggrepel", + "grid", + "gridExtra", + "lifecycle", + "scales", + "conflicted", + "tibble", + "purrr", + "stringr", + "systemfonts" + ], + "License": "GPL-3", + "URL": "https://github.com/UrbanInstitute/urbnthemes", + "BugReports": "https://github.com/UrbanInstitute/urbnthemes/issues", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.2", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "Roxygen": "list(markdown = TRUE)", + "Author": "Aaron R. Williams [aut, cre], Kyle Ueyama [aut], Ajjit Narayanan [aut], Ben Chartoff [aut]", + "Maintainer": "Aaron R. Williams ", + "RemoteType": "github", + "RemoteUsername": "UrbanInstitute", + "RemoteRepo": "urbnthemes", + "RemoteRef": "master", + "RemoteSha": "c7c37dd1ce8d1fee7eb7e1aed7f4eb7dcaf4d5b4", + "RemoteHost": "api.github.com", + "Remotes": "extrafont=github::wch/extrafont" + }, + "utf8": { + "Package": "utf8", + "Version": "1.2.6", + "Source": "Repository", + "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" + ], + "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", + "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)" + ], + "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": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, + "vctrs": { + "Package": "vctrs", + "Version": "0.7.3", + "Source": "Repository", + "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 (>= 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" + ], + "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", + "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" + ], + "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", + "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 (>= 3.2.0)", + "crayon", + "glue", + "hms", + "lifecycle (>= 1.0.3)", + "methods", + "rlang (>= 1.1.0)", + "stats", + "tibble (>= 2.0.0)", + "tidyselect", + "tzdb (>= 0.1.1)", + "vctrs (>= 0.2.0)", + "withr" + ], + "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" + }, + "waldo": { + "Package": "waldo", + "Version": "0.6.2", + "Source": "Repository", + "Title": "Find Differences Between R Objects", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Compare complex R objects and reveal the key differences. Designed particularly for use in testing packages where being able to quickly isolate key differences makes understanding test failures much easier.", + "License": "MIT + file LICENSE", + "URL": "https://waldo.r-lib.org, https://github.com/r-lib/waldo", + "BugReports": "https://github.com/r-lib/waldo/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "cli", + "diffobj (>= 0.3.4)", + "glue", + "methods", + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "bit64", + "R6", + "S7", + "testthat (>= 3.0.0)", + "withr", + "xml2" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "whisker": { + "Package": "whisker", + "Version": "0.4.1", + "Source": "Repository", + "Maintainer": "Edwin de Jonge ", + "License": "GPL-3", + "Title": "{{mustache}} for R, Logicless Templating", + "Type": "Package", + "LazyLoad": "yes", + "Author": "Edwin de Jonge", + "Description": "Implements 'Mustache' logicless templating.", + "URL": "https://github.com/edwindj/whisker", + "Suggests": [ + "markdown" + ], + "RoxygenNote": "6.1.1", + "NeedsCompilation": "no", + "Repository": "https://packagemanager.posit.co/cran/latest", + "Encoding": "UTF-8" + }, + "withr": { + "Package": "withr", + "Version": "3.0.3", + "Source": "Repository", + "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" + ], + "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", + "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)" + ], + "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", + "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" + ], + "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", + "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 (>= 1.1.0)" + ], + "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" + }, + "yaml": { + "Package": "yaml", + "Version": "2.3.12", + "Source": "Repository", + "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": "https://packagemanager.posit.co/cran/latest" + }, + "zeallot": { + "Package": "zeallot", + "Version": "0.2.0", + "Source": "Repository", + "Type": "Package", + "Title": "Multiple, Unpacking, and Destructuring Assignment", + "Authors@R": "c( person(\"Nathan\", \"Teetor\", email = \"nate@haufin.ch\", role = c(\"aut\", \"cre\")), person(\"Paul\", \"Teetor\", role = \"ctb\"))", + "Description": "Provides a %<-% operator to perform multiple, unpacking, and destructuring assignment in R. The operator unpacks the right-hand side of an assignment into multiple values and assigns these values to variables on the left-hand side of the assignment.", + "URL": "https://github.com/r-lib/zeallot", + "BugReports": "https://github.com/r-lib/zeallot/issues", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 3.2)" + ], + "Suggests": [ + "codetools", + "testthat", + "knitr", + "rmarkdown", + "purrr" + ], + "NeedsCompilation": "no", + "Author": "Nathan Teetor [aut, cre], Paul Teetor [ctb]", + "Maintainer": "Nathan Teetor ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "zip": { + "Package": "zip", + "Version": "3.0.1", + "Source": "Repository", + "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" + ], + "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" + } + } +} diff --git a/renv/activate.R b/renv/activate.R index ef25ef8..cb8d5fe 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -1,1419 +1,1334 @@ - -local({ - - # the requested version of renv - version <- "1.1.7" - attr(version, "md5") <- "dd5d60f155dadff4c88c2fc6680504b4" - 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) - - # 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)) { - file.copy(pkgpath, library, recursive = TRUE) - 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) { - - # 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() - -}) + +local({ + + # the requested version of renv + version <- "1.2.3" + 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() + +}) diff --git a/tests/testthat/test-estimate_units_per_parcel.R b/tests/testthat/test-estimate_units_per_parcel.R deleted file mode 100644 index 9e86a79..0000000 --- a/tests/testthat/test-estimate_units_per_parcel.R +++ /dev/null @@ -1,22 +0,0 @@ -# Tests for estimate_units_per_parcel.R - -test_that("estimate_units_per_parcel function signature is correct", { - expect_true(is.function(estimate_units_per_parcel)) - - # Check parameter names - params <- names(formals(estimate_units_per_parcel)) - expect_true("structures" %in% params) - expect_true("parcels" %in% params) - expect_true("zoning" %in% params) - expect_true("acs" %in% params) - - # Check default for acs - f <- estimate_units_per_parcel - expect_null(formals(f)$acs) -}) - -test_that("estimate_units_per_parcel requires specific input datasets", { - # This is a complex function requiring specific data structures - # The function will error without properly structured inputs - expect_true(is.function(estimate_units_per_parcel)) -}) diff --git a/tests/testthat/test-get_business_patterns.R b/tests/testthat/test-get_business_patterns.R index c90b7f1..55d01f4 100644 --- a/tests/testthat/test-get_business_patterns.R +++ b/tests/testthat/test-get_business_patterns.R @@ -38,7 +38,7 @@ testthat::test_that("get_naics_codes exists and is a function", { }) testthat::test_that("get_naics_codes validates year parameter", { - testthat::expect_error(get_naics_codes(year = 1985), "1986 or later") + testthat::expect_error(get_naics_codes(year = 1985), "2008 or later") testthat::expect_error(get_naics_codes(year = 2030), "2023") }) diff --git a/tests/testthat/test-get_current_fire_perimeters.R b/tests/testthat/test-get_current_fire_perimeters.R index 889995e..82984a1 100644 --- a/tests/testthat/test-get_current_fire_perimeters.R +++ b/tests/testthat/test-get_current_fire_perimeters.R @@ -8,6 +8,14 @@ test_that("get_current_fire_perimeters validates geography parameter", { ) }) +test_that("get_current_fire_perimeters validates file_path parameter", { + # file_path must be NULL + expect_error( + get_current_fire_perimeters(file_path = "some/path.csv"), + "must be NULL" + ) +}) + test_that("get_current_fire_perimeters validates api parameter", { # api must be TRUE expect_error( @@ -16,6 +24,16 @@ test_that("get_current_fire_perimeters validates api parameter", { ) }) +test_that("get_current_fire_perimeters dates are in a sane year range", { + # regression test for an epoch-milliseconds-fed-to-a-seconds-parser bug, which produced + # dates ~1000x too far in the future + result <- tryCatch(get_current_fire_perimeters(), error = function(e) NULL) + skip_if(is.null(result) || nrow(result) == 0, "Live NIFC API data not available") + + expect_true(all(lubridate::year(result$identified_date) %in% 2000:2100, na.rm = TRUE)) + expect_true(all(lubridate::year(result$updated_date) %in% 2000:2100, na.rm = TRUE)) +}) + test_that("get_current_fire_perimeters validates bbox parameter", { # Invalid bbox should error (either with custom message or st_bbox error) expect_error( diff --git a/tests/testthat/test-get_emergency_management_performance.R b/tests/testthat/test-get_emergency_management_performance.R index 1d783ae..512dc69 100644 --- a/tests/testthat/test-get_emergency_management_performance.R +++ b/tests/testthat/test-get_emergency_management_performance.R @@ -10,7 +10,7 @@ test_that("get_emergency_management_performance function signature is correct", # Check defaults f <- get_emergency_management_performance - expect_true(formals(f)$api) + expect_false(formals(f)$api) }) test_that("get_emergency_management_performance validates file_path when api=FALSE", { diff --git a/tests/testthat/test-get_fema_disaster_declarations.R b/tests/testthat/test-get_fema_disaster_declarations.R index 7d748a0..9532632 100644 --- a/tests/testthat/test-get_fema_disaster_declarations.R +++ b/tests/testthat/test-get_fema_disaster_declarations.R @@ -16,7 +16,7 @@ test_that("get_fema_disaster_declarations function exists and has correct signat # Check default parameters f <- get_fema_disaster_declarations - expect_true(formals(f)$api) + expect_false(formals(f)$api) }) test_that("get_fema_disaster_declarations returns expected structure (mocked)", { diff --git a/tests/testthat/test-get_government_finances.R b/tests/testthat/test-get_government_finances.R index e02824e..d57a789 100644 --- a/tests/testthat/test-get_government_finances.R +++ b/tests/testthat/test-get_government_finances.R @@ -2,17 +2,4 @@ test_that("get_government_finances function signature is correct", { expect_true(is.function(get_government_finances)) - - # Check parameter names - params <- names(formals(get_government_finances)) - expect_true("year" %in% params) - - # Check default year - f <- get_government_finances - expect_equal(formals(f)$year, 2022) -}) - -test_that("get_government_finances validates year parameter type", { - # Year should be numeric (function uses str_sub on it) - expect_true(is.function(get_government_finances)) }) diff --git a/tests/testthat/test-get_ihp_registrations.R b/tests/testthat/test-get_ihp_registrations.R index 579156d..057e834 100644 --- a/tests/testthat/test-get_ihp_registrations.R +++ b/tests/testthat/test-get_ihp_registrations.R @@ -23,7 +23,7 @@ local({ if (!is.null(box_path) && dir.exists(box_path)) { ihp_test_data <<- tryCatch( suppressWarnings(suppressMessages( - get_ihp_registrations(state_fips = "DC", api = FALSE) + get_ihp_registrations(state_abbreviation = "DC", api = FALSE) )), error = function(e) NULL ) @@ -49,14 +49,14 @@ test_that("get_ihp_registrations function signature is correct", { # Check parameter names params <- names(formals(get_ihp_registrations)) - expect_true("state_fips" %in% params) + expect_true("state_abbreviation" %in% params) expect_true("file_name" %in% params) expect_true("api" %in% params) expect_true("outpath" %in% params) # Check defaults f <- get_ihp_registrations - expect_null(formals(f)$state_fips) + expect_null(formals(f)$state_abbreviation) expect_false(formals(f)$api) expect_null(formals(f)$outpath) }) diff --git a/tests/testthat/test-get_lodes.R b/tests/testthat/test-get_lodes.R index 97666d5..cf9ef6a 100644 --- a/tests/testthat/test-get_lodes.R +++ b/tests/testthat/test-get_lodes.R @@ -6,8 +6,16 @@ testthat::test_that("states clearly errors when invalid state abbreviation is su }) testthat::test_that("warning generated when missing state and year combination is supplied", { - testthat::expect_warning({get_lodes(lodes_type = "od", year = 2022, states = c("AK", "MN"))}) - testthat::expect_warning({get_lodes(lodes_type = "wac", year = 2009, states = c("DC", "MN"))}) + testthat::expect_warning( + {get_lodes(lodes_type = "od", years = 2022, states = c("AK", "MN"))}, + "state-year combinations") + ## pre-2015 years also trigger the federal-jobs reporting warning; capture both + ## so neither escapes the expectation + testthat::expect_warning( + testthat::expect_warning( + {get_lodes(lodes_type = "wac", years = 2009, states = c("DC", "MN"))}, + "state-year combinations"), + "federal jobs") }) testthat::test_that("error generated when invalid lodes_type is supplied", { @@ -16,7 +24,9 @@ testthat::test_that("error generated when invalid lodes_type is supplied", { }) testthat::test_that("variables have no negative values", { - test <- get_lodes(lodes_type = "wac", year = 2022, states = "all") + ## states = "all" includes state-years missing from LODES (e.g., AK/MI in 2022), + ## which triggers an expected availability warning + test <- suppressWarnings(get_lodes(lodes_type = "wac", years = 2022, states = "all")) # Select numeric columns num_df <- dplyr::select(test, where(is.numeric)) @@ -32,7 +42,7 @@ testthat::test_that("variables have no negative values", { testthat::expect_true( length(neg_cols) == 0, info = if (length(neg_cols) > 0) - sprintf("Negative values found in: %s", paste(bad_cols, collapse = ", ")) + sprintf("Negative values found in: %s", paste(neg_cols, collapse = ", ")) else NULL ) diff --git a/tests/testthat/test-get_nfip_policies.R b/tests/testthat/test-get_nfip_policies.R index a84596f..98ff395 100644 --- a/tests/testthat/test-get_nfip_policies.R +++ b/tests/testthat/test-get_nfip_policies.R @@ -8,6 +8,7 @@ # Load data once for success tests (skip if Box path unavailable) # --------------------------------------------------------------------------- nfip_policies_test_data <- NULL +nfip_policies_load_error <- NULL skip_if_no_box <- function() { box_path <- tryCatch(get_box_path(), error = function(e) NULL) @@ -16,6 +17,12 @@ skip_if_no_box <- function() { } } +skip_if_data_not_loaded <- function() { + skip_if( + is.null(nfip_policies_test_data), + paste("NFIP policies test data not loaded:", nfip_policies_load_error)) +} + # Attempt to load data once for all success tests (small state: DC) local({ box_path <- tryCatch(get_box_path(), error = function(e) NULL) @@ -24,7 +31,11 @@ local({ suppressWarnings(suppressMessages( get_nfip_policies(state_abbreviation = "DC", api = FALSE) )), - error = function(e) NULL + ## surface the error in the skip message rather than swallowing it silently + error = function(e) { + nfip_policies_load_error <<- conditionMessage(e) + NULL + } ) } }) @@ -64,7 +75,7 @@ test_that("get_nfip_policies function signature is correct", { # --------------------------------------------------------------------------- test_that("get_nfip_policies returns expected columns", { skip_if_no_box() - skip_if(is.null(nfip_policies_test_data), "NFIP policies test data not loaded") + skip_if_data_not_loaded() expected_cols <- c( "state_fips", "state_abbreviation", "county_geoid", "county_name", @@ -80,14 +91,14 @@ test_that("get_nfip_policies returns expected columns", { test_that("get_nfip_policies returns a data frame", { skip_if_no_box() - skip_if(is.null(nfip_policies_test_data), "NFIP policies test data not loaded") + skip_if_data_not_loaded() expect_true(is.data.frame(nfip_policies_test_data)) }) test_that("get_nfip_policies county_geoid is 5 characters", { skip_if_no_box() - skip_if(is.null(nfip_policies_test_data), "NFIP policies test data not loaded") + skip_if_data_not_loaded() geoids <- nfip_policies_test_data$county_geoid[!is.na(nfip_policies_test_data$county_geoid)] if (length(geoids) > 0) { @@ -97,7 +108,7 @@ test_that("get_nfip_policies county_geoid is 5 characters", { test_that("get_nfip_policies building_occupancy_type has expected categories", { skip_if_no_box() - skip_if(is.null(nfip_policies_test_data), "NFIP policies test data not loaded") + skip_if_data_not_loaded() valid_types <- c("single family", "multi-family", "mobile/manufactured home", "non-residential", NA) occupancy <- nfip_policies_test_data$building_occupancy_type diff --git a/tests/testthat/test-get_wildfire_burn_zones.R b/tests/testthat/test-get_wildfire_burn_zones.R index c9daa44..179276a 100644 --- a/tests/testthat/test-get_wildfire_burn_zones.R +++ b/tests/testthat/test-get_wildfire_burn_zones.R @@ -57,6 +57,50 @@ test_that("get_wildfire_burn_zones has one county per row", { expect_false(any(stringr::str_detect(result$county_name, "\\|"), na.rm = TRUE)) }) +test_that("get_wildfire_burn_zones wildfire-level columns repeat identically across a multi-county wildfire's rows", { + skip_if_not( + file.exists(file.path( + get_box_path(), "hazards", "other-sources", "wildfire-burn-zones", + "wfbz_disasters_2000-2025.geojson")), + message = "Wildfire burn zones data file not available" + ) + + result <- suppressMessages(get_wildfire_burn_zones()) + + multi_county_ids <- result$wildfire_id[duplicated(result$wildfire_id)] |> unique() + # this test is only meaningful if the live data actually contains multi-county wildfires + expect_true(length(multi_county_ids) > 0) + + wildfire_level_columns <- c( + "area_sq_km", "fatalities_total", "injuries_total", "structures_destroyed", + "structures_threatened", "evacuation_total", "wui_type", + "density_people_sq_km_wildfire_buffer") + + n_distinct_by_wildfire <- result |> + sf::st_drop_geometry() |> + dplyr::filter(wildfire_id %in% multi_county_ids) |> + dplyr::summarize( + dplyr::across(dplyr::all_of(wildfire_level_columns), dplyr::n_distinct), + .by = wildfire_id) + + expect_true(all(dplyr::select(n_distinct_by_wildfire, -wildfire_id) == 1)) + + n_distinct_geometry_by_wildfire <- result |> + dplyr::filter(wildfire_id %in% multi_county_ids) |> + dplyr::mutate(geometry_wkt = sf::st_as_text(geometry)) |> + sf::st_drop_geometry() |> + dplyr::summarize(n_distinct_geometry = dplyr::n_distinct(geometry_wkt), .by = wildfire_id) + + expect_true(all(n_distinct_geometry_by_wildfire$n_distinct_geometry == 1)) + + # demonstrates the @returns-documented hazard directly: summing a wildfire-level column + # across the county-expanded rows over-counts multi-county wildfires; de-duplicating on + # wildfire_id first (as the docs instruct) avoids it + naive_sum <- sum(result$area_sq_km, na.rm = TRUE) + deduped_sum <- sum(result$area_sq_km[!duplicated(result$wildfire_id)], na.rm = TRUE) + expect_gt(naive_sum, deduped_sum) +}) + test_that("get_wildfire_burn_zones has valid FIPS codes", { skip_if_not( file.exists(file.path( @@ -75,7 +119,7 @@ test_that("get_wildfire_burn_zones has valid FIPS codes", { expect_true(all(result$state_fips == stringr::str_sub(result$county_fips, 1, 2), na.rm = TRUE)) }) -test_that("get_wildfire_burn_zones county names are title case", { +test_that("get_wildfire_burn_zones county names use Census's canonical casing", { skip_if_not( file.exists(file.path( get_box_path(), "hazards", "other-sources", "wildfire-burn-zones", @@ -86,7 +130,12 @@ test_that("get_wildfire_burn_zones county names are title case", { result <- suppressMessages(get_wildfire_burn_zones()) non_na_names <- result$county_name[!is.na(result$county_name)] - expect_equal(non_na_names, stringr::str_to_title(non_na_names)) + # county_name is joined from tidycensus::fips_codes (Census's own canonical casing) by + # county_fips, rather than title-cased from the raw source string -- a naive + # stringr::str_to_title() would mangle Mc-prefixed county names (e.g. "McKenzie" -> + # "Mckenzie"), so we check against the real reference list instead of str_to_title() + expect_true(all(non_na_names %in% tidycensus::fips_codes$county)) + expect_false(any(stringr::str_detect(non_na_names, "^Mc[a-z]"))) }) test_that("get_wildfire_burn_zones emits expected message", { diff --git a/tests/testthat/test-interpolate_demographics.R b/tests/testthat/test-interpolate_demographics.R deleted file mode 100644 index 1974881..0000000 --- a/tests/testthat/test-interpolate_demographics.R +++ /dev/null @@ -1,30 +0,0 @@ -# Tests for interpolate_demographics.R - -test_that("interpolate_demographics validates weights parameter", { - # Create a minimal sf object for testing - simple_poly <- sf::st_sfc( - sf::st_polygon(list(matrix(c(0, 0, 1, 0, 1, 1, 0, 1, 0, 0), ncol = 2, byrow = TRUE))), - crs = 5070 - ) - zones_sf <- sf::st_as_sf(data.frame(zone_id = "A"), geometry = simple_poly) - - # weights must be one of "population" or "housing" - # The function doesn't explicitly validate this but tidycensus will error - expect_true(is.function(interpolate_demographics)) -}) - -test_that("interpolate_demographics function signature is correct", { - expect_true(is.function(interpolate_demographics)) - - # Check parameter names - params <- names(formals(interpolate_demographics)) - expect_true("zones_sf" %in% params) - expect_true("sociodemographic_tracts_sf" %in% params) - expect_true("id_column" %in% params) - expect_true("weights" %in% params) - - # Check defaults - f <- interpolate_demographics - expect_null(formals(f)$sociodemographic_tracts_sf) - expect_equal(formals(f)$weights, "population") -}) diff --git a/tests/testthat/test-qualtrics_analysis.R b/tests/testthat/test-qualtrics_analysis.R deleted file mode 100644 index e20c872..0000000 --- a/tests/testthat/test-qualtrics_analysis.R +++ /dev/null @@ -1,182 +0,0 @@ -# Tests for qualtrics_analysis.R functions - -test_that("qualtrics_format_metadata validates input parameters", { - # Create mock metadata - mock_metadata <- data.frame( - qname = c("Q1", "Q2", "Q3"), - main = c("Question 1 text", "Question 2 text", "Question 3 text"), - sub = c("Sub 1", "Sub 2", "Sub 3"), - stringsAsFactors = FALSE - ) - - # Test that function runs without error with valid inputs - expect_no_error(qualtrics_format_metadata(mock_metadata)) - - # Test with sections parameter - sections <- c("Section A" = 2, "Section B" = 3) - expect_no_error(qualtrics_format_metadata(mock_metadata, sections = sections)) -}) - -test_that("qualtrics_format_metadata returns expected structure", { - mock_metadata <- data.frame( - qname = c("Q1", "Q2", "Q3", "Q4"), - main = c("Main 1", "Main 2", "Main 3", "Main 4"), - sub = c("Sub 1", "Sub 2", "Sub 3", "Sub 4"), - stringsAsFactors = FALSE - ) - - result <- qualtrics_format_metadata(mock_metadata) - - # Check that result is a data frame/tibble - expect_true(is.data.frame(result)) - - # Check expected columns exist - expect_true("question_number" %in% names(result)) - expect_true("question_name" %in% names(result)) - expect_true("text_main" %in% names(result)) - expect_true("text_sub" %in% names(result)) - - # Check row count matches input -expect_equal(nrow(result), 4) - - # Check question_number is sequential - expect_equal(result$question_number, 1:4) -}) - -test_that("qualtrics_format_metadata handles sections correctly", { - mock_metadata <- data.frame( - qname = c("Q1", "Q2", "Q3", "Q4"), - main = c("Main 1", "Main 2", "Main 3", "Main 4"), - sub = c("Sub 1", "Sub 2", "Sub 3", "Sub 4"), - stringsAsFactors = FALSE - ) - - sections <- c("Section A" = 2, "Section B" = 4) - result <- qualtrics_format_metadata(mock_metadata, sections = sections) - - # Check survey_section column exists - expect_true("survey_section" %in% names(result)) - - # Check sections are filled correctly (upward fill) - expect_equal(result$survey_section[1:2], c("Section A", "Section A")) - expect_equal(result$survey_section[3:4], c("Section B", "Section B")) -}) - -test_that("qualtrics_get_metadata validates input parameters", { - mock_metadata <- data.frame( - question_number = 1:3, - question_name = c("Q1", "Q2", "Q3"), - text_main = c("Main 1", "Main 2", "Main 3"), - text_sub = c("Sub 1", "Sub 2", "Sub 3"), - survey_section = c("A", "A", "B"), - stringsAsFactors = FALSE - ) - - # Test that function errors when neither question_name nor survey_section provided - expect_error( - qualtrics_get_metadata(mock_metadata), - "One of `survey_section` and `question_name` must be supplied" - ) - - # Test that function runs with question_name - expect_no_error(qualtrics_get_metadata(mock_metadata, question_name = "Q1")) - - # Test that function runs with survey_section - expect_no_error(qualtrics_get_metadata(mock_metadata, survey_section = "A")) -}) - -test_that("qualtrics_get_metadata returns correct values", { - mock_metadata <- data.frame( - question_number = 1:3, - question_name = c("Q1", "Q2", "Q3"), - text_main = c("Main 1", "Main 2", "Main 3"), - text_sub = c("Sub 1", "Sub 2", "Sub 3"), - survey_section = c("A", "A", "B"), - stringsAsFactors = FALSE - ) - - # Test filtering by question_name - result <- qualtrics_get_metadata(mock_metadata, question_name = "Q1") - expect_equal(result, "Sub 1") - - # Test filtering by survey_section - result <- qualtrics_get_metadata(mock_metadata, survey_section = "A") - expect_equal(length(result), 2) - - # Test custom return_values - result <- qualtrics_get_metadata(mock_metadata, question_name = "Q2", return_values = "text_main") - expect_equal(result, "Main 2") -}) - -test_that("qualtrics_define_missing validates input parameters", { - mock_df <- data.frame( - Q1_a = c("Yes", NA, "Yes"), - Q1_b = c(NA, "No", "Yes"), - Q2 = c("Yes", "No", NA), - stringsAsFactors = FALSE - ) - - # Test that default_values must be a list of length 3 - expect_error( - qualtrics_define_missing(mock_df, question_code_include = "Q1", default_values = list("No")), - "`default_values` must be a list of length 3" - ) - - expect_error( - qualtrics_define_missing(mock_df, question_code_include = "Q1", default_values = "No"), - "`default_values` must be a list of length 3" - ) - - # Test that function runs with valid inputs - expect_no_error( - qualtrics_define_missing(mock_df, question_code_include = "Q1") - ) -}) - -test_that("qualtrics_define_missing returns expected structure", { - mock_df <- data.frame( - Q1_a = c("Yes", NA, "Yes"), - Q1_b = c(NA, "No", "Yes"), - Q2 = c("Yes", "No", NA), - stringsAsFactors = FALSE - ) - - result <- qualtrics_define_missing(mock_df, question_code_include = "Q1") - - # Check that result is a data frame - expect_true(is.data.frame(result)) - - # Check that only Q1 columns are returned (not Q2) - expect_true("Q1_a" %in% names(result)) - expect_true("Q1_b" %in% names(result)) - expect_false("Q2" %in% names(result)) -}) - -test_that("qualtrics_define_missing handles predicate question validation", { - mock_df <- data.frame( - predicate = c("Yes", "No", NA), - Q1_a = c("A", NA, "C"), - Q1_b = c(NA, "B", "D"), - stringsAsFactors = FALSE - ) - - # Test that predicate_question must exist in df - expect_error( - qualtrics_define_missing( - mock_df, - question_code_include = "Q1", - predicate_question = "nonexistent" - ), - "Predicate question not found" - ) - - # Test that predicate_question_negative_value must be provided with predicate_question - expect_error( - qualtrics_define_missing( - mock_df, - question_code_include = "Q1", - predicate_question = "predicate" - ), - "negative value must also be provided" - ) -}) diff --git a/tests/testthat/test-spatial_analysis.R b/tests/testthat/test-spatial_analysis.R deleted file mode 100644 index 4d18ed8..0000000 --- a/tests/testthat/test-spatial_analysis.R +++ /dev/null @@ -1,142 +0,0 @@ -# Tests for spatial_analysis.R functions - -test_that("subdivide_linestring runs without error with valid inputs", { - # Create a linestring in projected CRS (5070 uses meters) - # Line from (0,0) to (1000,0) in meters - - coords <- matrix(c(0, 0, 1000, 0), ncol = 2, byrow = TRUE) - line <- sf::st_sfc(sf::st_linestring(coords), crs = 5070) - line_sf <- sf::st_as_sf(data.frame(id = 1), geometry = line) - - # Test that function runs without error with valid inputs - expect_no_error(subdivide_linestring(line_sf, max_length = 500)) -}) - -test_that("subdivide_linestring applies crs parameter correctly", { - # Create test data in projected CRS - coords <- matrix(c(0, 0, 1000, 0), ncol = 2, byrow = TRUE) - line <- sf::st_sfc(sf::st_linestring(coords), crs = 5070) - line_sf <- sf::st_as_sf(data.frame(id = 1), geometry = line) - - # Test with default crs (5070) - result <- subdivide_linestring(line_sf, max_length = 500) - expect_equal(sf::st_crs(result)$epsg, 5070) - - # Test with explicit different crs - result2 <- subdivide_linestring(line_sf, max_length = 500, crs = 3857) - expect_equal(sf::st_crs(result2)$epsg, 3857) -}) - -test_that("subdivide_linestring returns expected structure", { - # Create test data - line of 1000 meters - coords <- matrix(c(0, 0, 1000, 0), ncol = 2, byrow = TRUE) - line <- sf::st_sfc(sf::st_linestring(coords), crs = 5070) - line_sf <- sf::st_as_sf(data.frame(attr1 = "test", attr2 = 123), geometry = line) - - result <- subdivide_linestring(line_sf, max_length = 500, crs = 5070) - - # Check that result is an sf object - expect_s3_class(result, "sf") - - # Check that geometry type is LINESTRING - expect_true(all(sf::st_geometry_type(result) == "LINESTRING")) - - # Check that original attributes are preserved - expect_true("attr1" %in% names(result)) - expect_true("attr2" %in% names(result)) - - # Check that row_id column exists - expect_true("row_id" %in% names(result)) -}) - -test_that("subdivide_linestring subdivides long lines", { - # Create a line that's 1000 meters long - coords <- matrix(c(0, 0, 1000, 0), ncol = 2, byrow = TRUE) - line <- sf::st_sfc(sf::st_linestring(coords), crs = 5070) - line_sf <- sf::st_as_sf(data.frame(id = 1), geometry = line) - - # Subdivide into segments of max 400 meters - should create 3 segments - result <- subdivide_linestring(line_sf, max_length = 400, crs = 5070) - - # Should have more than 1 row (line was subdivided) - expect_gt(nrow(result), 1) -}) - -test_that("subdivide_linestring preserves short lines unchanged", { - # Create a line that's only 100 meters long - coords <- matrix(c(0, 0, 100, 0), ncol = 2, byrow = TRUE) - line <- sf::st_sfc(sf::st_linestring(coords), crs = 5070) - line_sf <- sf::st_as_sf(data.frame(id = 1), geometry = line) - - # With max_length = 500, line should not be subdivided - result <- subdivide_linestring(line_sf, max_length = 500, crs = 5070) - - # Should still have 1 row - expect_equal(nrow(result), 1) -}) - -test_that("polygons_to_linestring runs without error with valid inputs", { - - # Create a MULTIPOLYGON for testing (function uses L3 from st_coordinates which - # requires MULTIPOLYGON geometry) - coords <- matrix(c(0, 0, 1, 0, 1, 1, 0, 1, 0, 0), ncol = 2, byrow = TRUE) - poly <- sf::st_polygon(list(coords)) - mpoly <- sf::st_sfc(sf::st_multipolygon(list(list(coords))), crs = 5070) - poly_sf <- sf::st_as_sf(data.frame(id = 1), geometry = mpoly) - - # Test that function runs without error with valid inputs - expect_no_error(polygons_to_linestring(poly_sf)) -}) - -test_that("polygons_to_linestring returns expected structure", { - # Create MULTIPOLYGON test data - coords <- matrix(c(0, 0, 1, 0, 1, 1, 0, 1, 0, 0), ncol = 2, byrow = TRUE) - mpoly <- sf::st_sfc(sf::st_multipolygon(list(list(coords))), crs = 5070) - poly_sf <- sf::st_as_sf(data.frame(attr1 = "test"), geometry = mpoly) - - result <- polygons_to_linestring(poly_sf) - - # Check that result is an sf object - expect_s3_class(result, "sf") - - # Check that geometry type is LINESTRING - expect_true(all(sf::st_geometry_type(result) == "LINESTRING")) - - # Check that polygon_id column exists - expect_true("polygon_id" %in% names(result)) - - # Check that line_id column exists - expect_true("line_id" %in% names(result)) - - # Check that original attributes are preserved - expect_true("attr1" %in% names(result)) - - # A square polygon should produce 4 line segments (one per edge) - expect_equal(nrow(result), 4) -}) - -test_that("polygons_to_linestring preserves original attributes", { - # Create MULTIPOLYGON test data with multiple attributes - coords <- matrix(c(0, 0, 1, 0, 1, 1, 0, 1, 0, 0), ncol = 2, byrow = TRUE) - mpoly <- sf::st_sfc(sf::st_multipolygon(list(list(coords))), crs = 5070) - poly_sf <- sf::st_as_sf( - data.frame( - name = "test_polygon", - value = 42, - category = "A" - ), - geometry = mpoly - ) - - result <- polygons_to_linestring(poly_sf) - - # Check all original attributes are present - expect_true("name" %in% names(result)) - expect_true("value" %in% names(result)) - expect_true("category" %in% names(result)) - - # Check that attribute values are correct - expect_equal(unique(result$name), "test_polygon") - expect_equal(unique(result$value), 42) - expect_equal(unique(result$category), "A") -}) diff --git a/vignettes/preliminary_damage_assessments.Rmd b/vignettes/preliminary_damage_assessments.Rmd index 8792b93..1e36715 100644 --- a/vignettes/preliminary_damage_assessments.Rmd +++ b/vignettes/preliminary_damage_assessments.Rmd @@ -1,8 +1,8 @@ --- -title: "preliminary_damage_assessments" +title: "Preliminary Damage Assessments and Declaration Outcomes" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{preliminary_damage_assessments} + %\VignetteIndexEntry{Preliminary Damage Assessments and Declaration Outcomes} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -10,154 +10,406 @@ vignette: > ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, - comment = "#>") + comment = "#>", + warning = FALSE, + message = FALSE, + fig.width = 8, + fig.height = 6, + dpi = 300, + ## This committed .Rmd is a build-safe placeholder: code is shown but not run, + ## because the analysis needs the Box-hosted PDA cache plus live OpenFEMA calls. + ## Run `source("vignettes/precompile.R")` locally (where those are available) to + ## regenerate this file from preliminary_damage_assessments.Rmd.orig with outputs. + eval = FALSE, + echo = TRUE) + +options(scipen = 999) ``` +## Overview + +When a state, territory, or tribal government believes an event exceeds its +capacity to respond, it requests a major disaster declaration from the +president. Before that request is granted or denied, FEMA and its partners +conduct a *preliminary damage assessment* (PDA) that estimates the scale of +the damage and compares it against the statutory thresholds FEMA uses to gauge +whether federal assistance is warranted. + +`get_preliminary_damage_assessments()` extracts these estimates from the PDF +PDA reports FEMA publishes. On their own, the reports tell us what the damage +*looked like*; they do not tell us, in a structured way, whether the request +was ultimately approved or denied. This vignette closes that gap by joining the +PDAs to two authoritative FEMA datasets — the record of granted major disaster +declarations and the record of turned-down requests — so that each PDA carries +its official outcome. We then ask a simple question: **do the requests FEMA +approves actually clear the Public Assistance per-capita threshold, and do the +ones it denies fall short?** + +## Data sources + +| Role | Dataset | Access | +|---|---|---| +| Damage estimates | PDA reports | `climateapi::get_preliminary_damage_assessments()` | +| Approved requests | `DisasterDeclarationsSummaries` | OpenFEMA, via `rfema::open_fema()` | +| Denied requests | `DeclarationDenials` | OpenFEMA, via `rfema::open_fema()` | + +The two FEMA datasets are *authoritative*: they are FEMA's own structured +records of what was declared and what was turned down. The PDAs, by contrast, +are text-extracted from unstructured PDFs and carry the caveats described in +`?get_preliminary_damage_assessments`. Treating the OpenFEMA records as the +source of truth for the outcome, and the PDAs as the source of the damage +estimates, plays to the strengths of each. + ```{r setup} library(climateapi) -library(dplyr) -library(tidyr) library(tidyverse) library(urbnthemes) + +set_urbn_defaults(style = "print") +``` + +```{r parameters} +## PDAs and approved declarations are restricted to requests filed after this +## year (i.e. 2025 onward). Denials use a one-year-wider window so that a request +## filed late in the prior year but denied inside the analysis window can still +## be matched to its PDA. + +## NOTE: PDAs included in this corpus only date back to 2008 (there are a few from +## 2007, but this is not comprehensive for that year) +pda_min_year = 2008 +denial_min_year = 1997 ``` -```{r} -## we use this to extract state names from PDAs -states_match = str_c(tigris::fips_codes %>% select(state_name) %>% distinct() %>% pull(), collapse = "|") +## Loading and preparing the PDAs + +The PDA text names the affected state, so we recover it with a regex built from +every state and territory name. Names are ordered longest-first so that, for +example, "West Virginia" is preferred over the substring "Virginia" when both +could match at the same position. +```{r states-match} +states_match = tigris::fips_codes %>% + distinct(state_name) %>% + arrange(desc(str_length(state_name))) %>% + pull(state_name) %>% + str_c(collapse = "|") +``` + +```{r load-pdas, eval = FALSE} pdas = get_preliminary_damage_assessments(use_cache = TRUE) +``` -disaster_declarations1 = rfema::open_fema( - data_set = "DisasterDeclarationsSummaries", - # Major Disaster Declarations Only - filters = list(declarationType = "=DR"), - ask_before_call = FALSE) |> - janitor::clean_names() - -disaster_rejections1 = - rfema::open_fema( - data_set = "DeclarationDenials", - ask_before_call = FALSE) |> - janitor::clean_names() %>% - filter( - current_request_status == "Turndown", - year(declaration_request_date) > 2023, - declaration_request_type == "Major Disaster") %>% - select( - disaster_number = declaration_request_number, - state, - declaration_date = declaration_request_date, - declaration_title = incident_name) +```{r load-pdas-hidden, echo = FALSE} +pdas = get_preliminary_damage_assessments(use_cache = TRUE) +``` + +From each PDA we keep the fields needed for the join and the analysis: the +disaster number (the key for approved requests), the affected state, the +approve/deny decision parsed from the report, the determination date, the +per-capita impact figures, and the cost estimates. -pdas_2025 = pdas %>% - filter(year(event_date_determined) > 2024) %>% +```{r prepare-pdas} +pdas_recent = pdas %>% + filter( + year(event_date_determined) < 2026, + year(event_date_determined) > pda_min_year) %>% mutate( - cost_estimate_ia_pa_total = rowSums(select(., pa_cost_estimate_total, ia_cost_estimate_total), na.rm = TRUE), + ## the OpenFEMA disaster number is numeric; the PDA value is character and + ## may be NA -- coerce both sides to character so the join keys are comparable + disaster_number = as.character(disaster_number), state = str_extract(text, states_match), - declaration_title = str_remove_all(event_title, str_c("Preliminary Damage Assessment Report (", states_match, ") – | Preliminary Damage Assessment Report") %>% str_trim()), - disaster_number = case_when( - disaster_number == 4653 ~ "4853", - disaster_number == 4657 ~ "4857", - TRUE ~ disaster_number), - decision = case_when( - str_detect(event_type, "denial") ~ "Denied", - str_detect(event_type, "approv") ~ "Approved")) %>% - select(disaster_number, decision, declaration_title, state, matches("per_capita|date|cost_estimate")) %>% - select(-matches("county")) - -declarations_2025 = disaster_declarations1 %>% + pda_title = event_title %>% + str_remove("Preliminary Damage Assessment Report") %>% + ## group the alternation so this matches a literal "(State name)", not a + ## bare state name (| binds looser than the surrounding parens otherwise) + str_remove(str_c("\\((", states_match, ")\\)")) %>% + str_remove("^\\s*[–-]\\s*") %>% + str_squish(), + decision = case_when( + str_detect(event_type, "denial") ~ "Denied", + str_detect(event_type, "approv") ~ "Approved"), + ## a total damage estimate; 0 when neither program reported a cost + cost_estimate_ia_pa_total = rowSums( + cbind(pa_cost_estimate_total, ia_cost_estimate_total), na.rm = TRUE)) %>% + select( + disaster_number, decision, state, event_date_determined, pda_title, + pa_per_capita_impact_statewide, pa_per_capita_impact_indicator_statewide, + pa_cost_estimate_total, ia_cost_estimate_total, cost_estimate_ia_pa_total) +``` + +## Loading the authoritative FEMA outcomes + +### Approved requests + +`DisasterDeclarationsSummaries` returns one row per designated area (usually a +county), so a single declaration appears many times. We collapse to one row per +declaration string and translate the state abbreviation to a full name to match +the PDA state field. + +```{r load-declarations} +declarations_raw = rfema::open_fema( + data_set = "DisasterDeclarationsSummaries", + ## major disaster declarations only + filters = list(declarationType = "=DR"), + ask_before_call = FALSE) %>% + janitor::clean_names() + +declarations = declarations_raw %>% filter( - year(declaration_date) > 2024) %>% + year(declaration_date) < 2026, + year(declaration_date) > pda_min_year) %>% distinct(fema_declaration_string, .keep_all = TRUE) %>% - select(disaster_number, state, declaration_type, declaration_date, declaration_title) %>% - left_join(tigris::fips_codes %>% distinct(state_name, state)) %>% + transmute( + disaster_number = as.character(disaster_number), + state, + declaration_type, + declaration_date = lubridate::as_date(declaration_date), + declaration_title, + decision = "Approved") %>% + ## translate the state abbreviation to the full name used by the PDAs + left_join( + tigris::fips_codes %>% distinct(state_name, state), + by = "state", + relationship = "many-to-one") %>% select(-state) %>% rename(state = state_name) +``` -fema_data_combined = bind_rows( - declarations_2025 %>% mutate(decision = "Approved"), - disaster_rejections1 %>% - mutate( - disaster_number = NA, - decision = "Denied", - across(where(is.character), str_trim))) - -pdas_join = pdas_2025 %>% - filter(!is.na(state)) - -joined_denied %>% filter(decision == "Denied") %>% - select(matches("cost_estimate")) - -fema_data_combined_join = fema_data_combined %>% - mutate(join_flag = 1) %>% - filter(!is.na(state)) - -# Approved: disaster_number is available on both sides -joined_approved = tidylog::left_join( - pdas_join %>% filter(decision == "Approved"), - fema_data_combined_join %>% filter(decision == "Approved"), - by = c( - "disaster_number", - "decision", - "state"), - relationship = "one-to-one") - -anti_join( - fema_data_combined_join %>% filter(decision == "Approved"), - pdas_join %>% filter(decision == "Approved"), - by = c( - "disaster_number", - "decision", - "state")) - -left_join( - fema, - pda, - by = join_by( - state, - closest(pda_date >= fema_date)), - relationship = "one-to-one") - -# Denied: disaster_number is NA on the FEMA side, so drop it from join keys -joined_denied = tidylog::left_join( - fema_data_combined_join %>% filter(decision == "Denied"), - pdas_join %>% filter(decision == "Denied"), - by = join_by( - decision, +### Denied requests + +`DeclarationDenials` records requests FEMA turned down. Crucially, a denied +request never receives an official disaster number, so it cannot be joined on +that key — a fact that shapes the join strategy below. The state name is already +spelled out, and the request date stands in for the declaration date. + +We also retain two fields that exist purely to validate the join afterwards: +`request_status_date`, FEMA's official turndown date, and +`requested_incident_types`, the hazard type of the request. + +```{r load-denials} +denials_raw = rfema::open_fema( + data_set = "DeclarationDenials", + ask_before_call = FALSE) %>% + janitor::clean_names() + +denials = denials_raw %>% + filter( + ## every current record is a Turndown, but FEMA could add other statuses + ## (e.g., declared-after-appeal); only true turndowns belong in this join + current_request_status == "Turndown", + declaration_request_type == "Major Disaster", + year(declaration_request_date) < 2026, + year(declaration_request_date) > denial_min_year) %>% + transmute( state, - closest(event_date_determined >= declaration_date)), - relationship = "one-to-one") %>% - ## this was requested in 2023, does not relate to a natural hazard - ## and further it appears no PDA was conducted (though, obviously, there's a PDA report) - filter(!str_detect(declaration_title.x, "Train")) - -joined_denied %>% - select(matches("date"), matches("title"), state, everything()) %>% - select(-matches("join|per_capita|number|type")) %>% - arrange(state, declaration_date) %>% - print(n = 50) - -bind_rows( - joined_approved, - joined_denied) %>% -select(disaster_number, matches("date"), declaration_type, decision, matches("per_capita")) %>% - ggplot() + - geom_boxplot(aes(y = pa_per_capita_impact_statewide / pa_per_capita_impact_indicator_statewide, color = decision, x = decision)) + - theme_urbn_print() + - geom_hline(yintercept = 1) - -bind_rows( - joined_approved, - joined_denied) %>% - filter(decision == "Denied") %>% - select(matches("cost_estimate")) - filter(cost_estimate_ia_pa_total != 0) %>% - ggplot() + - geom_point(aes( - x = pa_per_capita_impact_statewide / pa_per_capita_impact_indicator_statewide, - y = cost_estimate_ia_pa_total, - color = decision)) + - theme_urbn_print() + declaration_date = lubridate::as_date(declaration_request_date), + declaration_title = incident_name, + decision = "Denied", + ## retained for post-join QC only + request_status_date = lubridate::as_date(request_status_date), + requested_incident_types) %>% + mutate(across(where(is.character), str_trim)) %>% + ## there is one + distinct() +``` +## Joining PDAs to their outcomes + +The two outcomes require two different joins, because approvals and denials +carry different keys. + +**Approved requests** share a disaster number with the declarations record, so +we join on `disaster_number` directly. + +```{r join-approved} +joined_approved = pdas_recent %>% + filter(decision == "Approved") %>% + select(-c(decision, state)) %>% + tidylog::left_join( + declarations %>% filter(year(declaration_date) < 2026), + by = c("disaster_number"), + relationship = "one-to-one") %>% + mutate(matched = !is.na(declaration_date)) + +unjoined = + tidylog::anti_join( + declarations, + pdas_recent %>% filter(decision == "Approved"), + by = c("disaster_number")) + +## limited, seemingly random non-joins +unjoined %>% count(year(declaration_date), sort = TRUE) +``` + +**Denied requests** have no disaster number to join on. Instead we match each +denied PDA to the turndown in the same state whose request date falls closest to +(and at or before) the PDA's determination date, using a rolling `join_by()`. +The PDA table is on the left so that the inequality reads in the natural +direction (`event_date_determined >= declaration_date`). + +```{r join-denied} +joined_denied = pdas_recent %>% + filter( + decision == "Denied", + ## we filter out already-matched disasters to avoid double-counting rejected -> appealed-and-approved disasters + !disaster_number %in% joined_approved$disaster_number) %>% + tidylog::left_join( + denials, + by = join_by( + state, + decision, + closest(event_date_determined >= declaration_date)), + ## each PDA should claim exactly one turndown; two same-state turndowns + ## sharing a request date would tie in closest() and error here rather than + ## silently duplicating rows + relationship = "many-to-many") %>% + mutate(matched = !is.na(declaration_date)) %>% + filter(!str_detect(pda_title, "Derailment")) %>% + ## this is a cheap shortcut to deal with a duplicated WV decision + ## it appears that there are two, almost-identical requests -- need to + ## figure out whether they're actually duplicates or not + distinct() +``` + +### Validating the denied matches + +The closest-date heuristic can silently pick the wrong turndown when a state has +two requests pending at once, or when the true turndown has not yet appeared in +`DeclarationDenials` (decisions are published on a lag). Two checks catch both +failure modes: + +1. **Turndown-date agreement.** For a denial PDA, `event_date_determined` is the + turndown date printed in the report ("Denied on ..."), so it must equal the + matched turndown's official `request_status_date` exactly. A disagreement + means the heuristic matched the wrong request. +2. **No shared turndowns.** Two PDAs matched to the same turndown means at least + one of them belongs to a different (likely not-yet-published) turndown, so + both are flagged for review. + +A match that fails either check is worse than no match, so failing rows are +downgraded to unmatched and surfaced with a warning. The `requested_incident_types` +and title columns printed above provide a final manual check that the matched +hazards agree (e.g., a "Flooding" PDA should not match a "Fire" turndown). + +```{r qc-denied} +joined_denied = joined_denied %>% + add_count(state, declaration_date, declaration_title, name = "pdas_per_turndown") %>% + mutate( + qc_suspect = matched & + (replace_na(request_status_date != event_date_determined, TRUE) | + pdas_per_turndown > 1)) + +qc_suspect_denied = joined_denied %>% + filter(qc_suspect) %>% + select( + state, pda_title, declaration_title, requested_incident_types, + event_date_determined, declaration_date, request_status_date, + pdas_per_turndown) + +if (nrow(qc_suspect_denied) > 0) { + warning( + nrow(qc_suspect_denied), + " denied PDA(s) matched a turndown that fails QC; treating as unmatched.") + print(qc_suspect_denied) +} + +joined_denied = joined_denied %>% + mutate(matched = matched & !qc_suspect) ``` +### Did the join succeed? + +Before analyzing the joined data, we confirm that the PDAs actually matched an +authoritative FEMA record. A low match rate would mean our outcome labels are +unreliable. + +```{r match-rate} +pda_outcomes = bind_rows(joined_approved, joined_denied) + +pda_outcomes %>% + count(decision, matched) %>% + pivot_wider(names_from = matched, values_from = n, names_prefix = "matched_", values_fill = 0) +``` + +## Analysis: does the per-capita threshold predict the outcome? + +FEMA's Public Assistance program compares a jurisdiction's estimated per-capita +damage against a statutory per-capita *indicator* (a dollar threshold that is +updated annually). We express each PDA as the ratio of the two: a value above +1.0 means the estimated damage exceeded the threshold. + +```{r threshold-ratio} +pda_outcomes = pda_outcomes %>% + mutate( + pa_threshold_ratio = + pa_per_capita_impact_statewide / pa_per_capita_impact_indicator_statewide) +``` + +If the threshold drove the decision, approved requests would sit above the line +and denials below it. + +```{r ratio-boxplot} +pda_outcomes %>% + filter(!is.na(pa_threshold_ratio)) %>% + ggplot(aes(x = decision, y = pa_threshold_ratio, color = decision)) + + geom_hline(yintercept = 1, linetype = "dashed", color = "grey40") + + geom_boxplot(outlier.shape = NA) + + geom_jitter(width = 0.15, alpha = 0.5) + + labs( + title = "Do approved requests clear the Public Assistance per-capita threshold?", + subtitle = "Ratio of estimated statewide per-capita impact to FEMA's statutory indicator", + x = NULL, + y = "Per-capita impact ÷ threshold") + + theme(legend.position = "none") +``` + +The relationship is imperfect, which is the point: the per-capita indicator is +one input among several (insurance coverage, localized impacts, prior-year +disaster burden), so some sub-threshold requests are approved and some +above-threshold requests are denied. Plotting the ratio against the total cost +estimate shows how the two dimensions interact. + +```{r ratio-cost-scatter} +pda_outcomes %>% + filter(!is.na(pa_threshold_ratio), cost_estimate_ia_pa_total > 0) %>% + ggplot(aes( + x = pa_threshold_ratio, + y = cost_estimate_ia_pa_total, + color = decision)) + + geom_vline(xintercept = 1, linetype = "dashed", color = "grey40") + + geom_point(alpha = 0.7, size = 2) + + scale_y_continuous( + labels = scales::label_dollar(scale_cut = scales::cut_short_scale())) + + labs( + title = "Threshold ratio versus total estimated damage", + subtitle = "Combined Individual and Public Assistance cost estimate", + x = "Per-capita impact ÷ threshold", + y = "Total estimated cost", + color = "Decision") +``` + +## Caveats + +- **State recovery is best-effort.** The affected state is extracted from free + text and is set to the first state name that appears; a report that mentions a + neighboring state first could be mislabeled. PDAs with no recoverable state are + dropped before the join. +- **Denied requests are matched by date, not by key.** Because turndowns lack a + disaster number, the denied join relies on a closest-date heuristic within a + state. Every match is validated against FEMA's official turndown date + (`request_status_date`), and matches that fail validation — or that share a + turndown with another PDA — are downgraded to unmatched, but the hazard-type + comparison remains a manual check. +- **`disaster_number` reliability.** For FEMA's newest filename convention + (`FY25…`, `FY26…`), the disaster number is recovered from the PDF body rather + than the filename; see `?get_preliminary_damage_assessments` for details. +- **Per-capita fields are text-extracted.** The `pa_per_capita_impact_*` + fields come from parsing PDFs and can be missing or malformed for individual + reports; rows with missing values are excluded from the plots. + +## See also + +- `get_preliminary_damage_assessments()`: the PDA extraction itself +- `get_fema_disaster_declarations()`: FEMA disaster declarations +- `get_public_assistance()`: obligated Public Assistance funding +- `get_ihp_registrations()`: Individual and Households Program registrations diff --git a/vignettes/preliminary_damage_assessments.Rmd.orig b/vignettes/preliminary_damage_assessments.Rmd.orig new file mode 100644 index 0000000..a48382e --- /dev/null +++ b/vignettes/preliminary_damage_assessments.Rmd.orig @@ -0,0 +1,338 @@ +--- +title: "Preliminary Damage Assessments and Declaration Outcomes" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Preliminary Damage Assessments and Declaration Outcomes} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + warning = FALSE, + message = FALSE, + fig.width = 8, + fig.height = 6, + dpi = 300, + eval = TRUE, + echo = TRUE) + +options(scipen = 999) +``` + +## Overview + +When a state, territory, or tribal government believes an event exceeds its +capacity to respond, it requests a major disaster declaration from the +president. Before that request is granted or denied, FEMA and its partners +conduct a *preliminary damage assessment* (PDA) that estimates the scale of +the damage and compares it against the statutory thresholds FEMA uses to gauge +whether federal assistance is warranted. + +`get_preliminary_damage_assessments()` extracts these estimates from the PDF +PDA reports FEMA publishes. On their own, the reports tell us what the damage +*looked like*; they do not tell us, in a structured way, whether the request +was ultimately approved or denied. This vignette closes that gap by joining the +PDAs to two authoritative FEMA datasets — the record of granted major disaster +declarations and the record of turned-down requests — so that each PDA carries +its official outcome. We then ask a simple question: **do the requests FEMA +approves actually clear the Public Assistance per-capita threshold, and do the +ones it denies fall short?** + +## Data sources + +| Role | Dataset | Access | +|---|---|---| +| Damage estimates | PDA reports | `climateapi::get_preliminary_damage_assessments()` | +| Approved requests | `DisasterDeclarationsSummaries` | OpenFEMA, via `rfema::open_fema()` | +| Denied requests | `DeclarationDenials` | OpenFEMA, via `rfema::open_fema()` | + +The two FEMA datasets are *authoritative*: they are FEMA's own structured +records of what was declared and what was turned down. The PDAs, by contrast, +are text-extracted from unstructured PDFs and carry the caveats described in +`?get_preliminary_damage_assessments`. Treating the OpenFEMA records as the +source of truth for the outcome, and the PDAs as the source of the damage +estimates, plays to the strengths of each. + +```{r setup} +library(climateapi) +library(tidyverse) +library(urbnthemes) + +set_urbn_defaults(style = "print") +``` + +```{r parameters} +## PDAs and approved declarations are restricted to requests filed after this +## year (i.e. 2025 onward). Denials use a one-year-wider window so that a request +## filed late in the prior year but denied inside the analysis window can still +## be matched to its PDA. +pda_min_year = 2024 +denial_min_year = 2023 +``` + +## Loading and preparing the PDAs + +The PDA text names the affected state, so we recover it with a regex built from +every state and territory name. Names are ordered longest-first so that, for +example, "West Virginia" is preferred over the substring "Virginia" when both +could match at the same position. + +```{r states-match} +states_match = tigris::fips_codes %>% + distinct(state_name) %>% + arrange(desc(str_length(state_name))) %>% + pull(state_name) %>% + str_c(collapse = "|") +``` + +```{r load-pdas, eval = FALSE} +pdas = get_preliminary_damage_assessments(use_cache = TRUE) +``` + +```{r load-pdas-hidden, echo = FALSE} +pdas = get_preliminary_damage_assessments(use_cache = TRUE) +``` + +From each PDA we keep the fields needed for the join and the analysis: the +disaster number (the key for approved requests), the affected state, the +approve/deny decision parsed from the report, the determination date, the +per-capita impact figures, and the cost estimates. + +```{r prepare-pdas} +pdas_recent = pdas %>% + filter(year(event_date_determined) > pda_min_year) %>% + mutate( + ## the OpenFEMA disaster number is numeric; the PDA value is character and + ## may be NA -- coerce both sides to character so the join keys are comparable + disaster_number = as.character(disaster_number), + ## a handful of PDA URLs carry a typo'd disaster number. The getter now + ## re-derives most of these from the PDF text; these two remaining cases are + ## corrected here as a belt-and-suspenders measure. + disaster_number = case_when( + disaster_number == "4653" ~ "4853", + disaster_number == "4657" ~ "4857", + TRUE ~ disaster_number), + state = str_extract(text, states_match), + pda_title = event_title %>% + str_remove("Preliminary Damage Assessment Report") %>% + ## group the alternation so this matches a literal "(State name)", not a + ## bare state name (| binds looser than the surrounding parens otherwise) + str_remove(str_c("\\((", states_match, ")\\)")) %>% + str_remove("^\\s*[–-]\\s*") %>% + str_squish(), + decision = case_when( + str_detect(event_type, "denial") ~ "Denied", + str_detect(event_type, "approv") ~ "Approved"), + ## a total damage estimate; 0 when neither program reported a cost + cost_estimate_ia_pa_total = rowSums( + cbind(pa_cost_estimate_total, ia_cost_estimate_total), na.rm = TRUE)) %>% + ## drop PDAs whose state could not be recovered from the text -- they cannot be + ## joined to the FEMA records by state + filter(!is.na(state), !is.na(decision)) %>% + select( + disaster_number, decision, state, event_date_determined, pda_title, + pa_per_capita_impact_statewide, pa_per_capita_impact_indicator_statewide, + pa_cost_estimate_total, ia_cost_estimate_total, cost_estimate_ia_pa_total) +``` + +## Loading the authoritative FEMA outcomes + +### Approved requests + +`DisasterDeclarationsSummaries` returns one row per designated area (usually a +county), so a single declaration appears many times. We collapse to one row per +declaration string and translate the state abbreviation to a full name to match +the PDA state field. + +```{r load-declarations} +declarations_raw = rfema::open_fema( + data_set = "DisasterDeclarationsSummaries", + ## major disaster declarations only + filters = list(declarationType = "=DR"), + ask_before_call = FALSE) %>% + janitor::clean_names() + +declarations = declarations_raw %>% + filter(year(declaration_date) > pda_min_year) %>% + distinct(fema_declaration_string, .keep_all = TRUE) %>% + transmute( + disaster_number = as.character(disaster_number), + state, + declaration_type, + declaration_date = lubridate::as_date(declaration_date), + declaration_title, + decision = "Approved") %>% + ## translate the state abbreviation to the full name used by the PDAs + left_join( + tigris::fips_codes %>% distinct(state_name, state), + by = "state", + relationship = "many-to-one") %>% + select(-state) %>% + rename(state = state_name) +``` + +### Denied requests + +`DeclarationDenials` records requests FEMA turned down. Crucially, a denied +request never receives an official disaster number, so it cannot be joined on +that key — a fact that shapes the join strategy below. The state name is already +spelled out, and the request date stands in for the declaration date. + +```{r load-denials} +denials_raw = rfema::open_fema( + data_set = "DeclarationDenials", + ask_before_call = FALSE) %>% + janitor::clean_names() + +denials = denials_raw %>% + filter( + current_request_status == "Turndown", + declaration_request_type == "Major Disaster", + year(declaration_request_date) > denial_min_year) %>% + transmute( + state, + declaration_date = lubridate::as_date(declaration_request_date), + declaration_title = incident_name, + decision = "Denied") %>% + mutate(across(where(is.character), str_trim)) +``` + +## Joining PDAs to their outcomes + +The two outcomes require two different joins, because approvals and denials +carry different keys. + +**Approved requests** share a disaster number with the declarations record, so +we join on `disaster_number`, `state`, and `decision` directly. The join is +many-to-one: a disaster may have more than one PDA (an original plus an +appeal), but only one authoritative declaration. + +```{r join-approved} +joined_approved = pdas_recent %>% + filter(decision == "Approved") %>% + left_join( + declarations, + by = c("disaster_number", "state", "decision"), + relationship = "many-to-one") %>% + mutate(matched = !is.na(declaration_date)) +``` + +**Denied requests** have no disaster number to join on. Instead we match each +denied PDA to the turndown in the same state whose request date falls closest to +(and at or before) the PDA's determination date, using a rolling `join_by()`. +The PDA table is on the left so that the inequality reads in the natural +direction (`event_date_determined >= declaration_date`). + +```{r join-denied} +joined_denied = pdas_recent %>% + filter(decision == "Denied") %>% + left_join( + denials, + by = join_by( + state, + decision, + closest(event_date_determined >= declaration_date)), + relationship = "many-to-one") %>% + mutate(matched = !is.na(declaration_date)) %>% + ## one turndown in this window is a train-derailment request: not a natural + ## hazard and not a substantive PDA, so we exclude it from the comparison + filter(is.na(declaration_title) | !str_detect(declaration_title, regex("train", ignore_case = TRUE))) +``` + +### Did the join succeed? + +Before analyzing the joined data, we confirm that the PDAs actually matched an +authoritative FEMA record. A low match rate would mean our outcome labels are +unreliable. + +```{r match-rate} +pda_outcomes = bind_rows(joined_approved, joined_denied) + +pda_outcomes %>% + count(decision, matched) %>% + pivot_wider(names_from = matched, values_from = n, names_prefix = "matched_", values_fill = 0) +``` + +## Analysis: does the per-capita threshold predict the outcome? + +FEMA's Public Assistance program compares a jurisdiction's estimated per-capita +damage against a statutory per-capita *indicator* (a dollar threshold that is +updated annually). We express each PDA as the ratio of the two: a value above +1.0 means the estimated damage exceeded the threshold. + +```{r threshold-ratio} +pda_outcomes = pda_outcomes %>% + mutate( + pa_threshold_ratio = + pa_per_capita_impact_statewide / pa_per_capita_impact_indicator_statewide) +``` + +If the threshold drove the decision, approved requests would sit above the line +and denials below it. + +```{r ratio-boxplot} +pda_outcomes %>% + filter(!is.na(pa_threshold_ratio)) %>% + ggplot(aes(x = decision, y = pa_threshold_ratio, color = decision)) + + geom_hline(yintercept = 1, linetype = "dashed", color = "grey40") + + geom_boxplot(outlier.shape = NA) + + geom_jitter(width = 0.15, alpha = 0.5) + + labs( + title = "Do approved requests clear the Public Assistance per-capita threshold?", + subtitle = "Ratio of estimated statewide per-capita impact to FEMA's statutory indicator", + x = NULL, + y = "Per-capita impact ÷ threshold") + + theme(legend.position = "none") +``` + +The relationship is imperfect, which is the point: the per-capita indicator is +one input among several (insurance coverage, localized impacts, prior-year +disaster burden), so some sub-threshold requests are approved and some +above-threshold requests are denied. Plotting the ratio against the total cost +estimate shows how the two dimensions interact. + +```{r ratio-cost-scatter} +pda_outcomes %>% + filter(!is.na(pa_threshold_ratio), cost_estimate_ia_pa_total > 0) %>% + ggplot(aes( + x = pa_threshold_ratio, + y = cost_estimate_ia_pa_total, + color = decision)) + + geom_vline(xintercept = 1, linetype = "dashed", color = "grey40") + + geom_point(alpha = 0.7, size = 2) + + scale_y_continuous( + labels = scales::label_dollar(scale_cut = scales::cut_short_scale())) + + labs( + title = "Threshold ratio versus total estimated damage", + subtitle = "Combined Individual and Public Assistance cost estimate", + x = "Per-capita impact ÷ threshold", + y = "Total estimated cost", + color = "Decision") +``` + +## Caveats + +- **State recovery is best-effort.** The affected state is extracted from free + text and is set to the first state name that appears; a report that mentions a + neighboring state first could be mislabeled. PDAs with no recoverable state are + dropped before the join. +- **Denied requests are matched by date, not by key.** Because turndowns lack a + disaster number, the denied join relies on a closest-date heuristic within a + state. Two denials close together in time in the same state could be matched + imperfectly. +- **`disaster_number` reliability.** For FEMA's newest filename convention + (`FY25…`, `FY26…`), the disaster number is recovered from the PDF body rather + than the filename; see `?get_preliminary_damage_assessments` for details. +- **Per-capita fields are text-extracted.** The `pa_per_capita_impact_*` + fields come from parsing PDFs and can be missing or malformed for individual + reports; rows with missing values are excluded from the plots. + +## See also + +- `get_preliminary_damage_assessments()`: the PDA extraction itself +- `get_fema_disaster_declarations()`: FEMA disaster declarations +- `get_public_assistance()`: obligated Public Assistance funding +- `get_ihp_registrations()`: Individual and Households Program registrations