From 569c5eb59d59aa5f191549753e7cf89c30287644 Mon Sep 17 00:00:00 2001 From: Jens von Bergmann Date: Mon, 23 Jan 2023 08:30:59 -0800 Subject: [PATCH 1/8] dontrun for list_census_regions example --- R/census_regions.R | 2 ++ man/list_census_regions.Rd | 2 ++ 2 files changed, 4 insertions(+) diff --git a/R/census_regions.R b/R/census_regions.R index a764b5fa..705b75c2 100644 --- a/R/census_regions.R +++ b/R/census_regions.R @@ -34,7 +34,9 @@ #' @export #' #' @examples +#' \dontrun{ #' list_census_regions('CA16') +#' } list_census_regions <- function(dataset, use_cache = TRUE, quiet = FALSE) { dataset <- translate_dataset(dataset) cache_file <- file.path(tempdir(),paste0(dataset, "_regions.rda")) diff --git a/man/list_census_regions.Rd b/man/list_census_regions.Rd index 2e224e92..facb9a19 100644 --- a/man/list_census_regions.Rd +++ b/man/list_census_regions.Rd @@ -43,5 +43,7 @@ Returns a data frame with the following columns: Query the CensusMapper API for available regions in a given dataset. } \examples{ +\dontrun{ list_census_regions('CA16') } +} From f98a5c25d3b966458d67f992cb7eac6eea178cb5 Mon Sep 17 00:00:00 2001 From: Jens von Bergmann Date: Mon, 23 Jan 2023 08:32:00 -0800 Subject: [PATCH 2/8] bump version for new dev version stub --- DESCRIPTION | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index dae0b64b..f2d6c992 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: cancensus Type: Package Title: Access, Retrieve, and Work with Canadian Census Data and Geography -Version: 0.5.5 +Version: 0.5.6 Authors@R: c( person("Jens", "von Bergmann", email = "jens@mountainmath.ca", role = c("aut"), comment = "API creator and maintainer"), person("Dmitry", "Shkolnik", email = "shkolnikd@gmail.com", role = c("aut", "cre"), comment = "Package maintainer, responsible for correspondence"), diff --git a/README.md b/README.md index 0187dd36..949b2cf8 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ There are several other jurisdiction where census data is available via R packag If you wish to cite cancensus: von Bergmann, J., Aaron Jacobs, Dmitry Shkolnik (2022). cancensus: R package to - access, retrieve, and work with Canadian Census data and geography. v0.5.5. + access, retrieve, and work with Canadian Census data and geography. v0.5.6. A BibTeX entry for LaTeX users is @@ -148,7 +148,7 @@ A BibTeX entry for LaTeX users is author = {Jens {von Bergmann} and Dmitry Shkolnik and Aaron Jacobs}, title = {cancensus: R package to access, retrieve, and work with Canadian Census data and geography}, year = {2022}, - note = {R package version 0.5.5}, + note = {R package version 0.5.6}, url = {https://mountainmath.github.io/cancensus/} } ``` From 4bab4cdf0611801d98b621230426a30d9f2619fb Mon Sep 17 00:00:00 2001 From: Jens von Bergmann Date: Tue, 11 Apr 2023 12:10:06 -0700 Subject: [PATCH 3/8] fix issue with named vectors in case data for geography is unavailable --- NEWS.md | 4 ++++ R/cancensus.R | 5 ++++- cran-comments.md | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 4db26f3b..5ad9220b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +# cancensus 0.5.6 + +- fix issue when using named vectors to query data for non-existent geographies, return NULL in this case instead of throwing error + # cancensus 0.5.5 - add functionality for direct access to StatCan census WDS for 2021 diff --git a/R/cancensus.R b/R/cancensus.R index cbae05bb..fe4f5465 100644 --- a/R/cancensus.R +++ b/R/cancensus.R @@ -268,7 +268,10 @@ get_census <- function (dataset, regions, level=NA, vectors=c(), geo_format = NA to_rename <- setNames(names(result),gsub(":.*","",names(result))) to_rename <- to_rename[names(to_rename)!=as.character(to_rename)] if (length(to_rename)>0) result <- result %>% dplyr::rename(!!!to_rename) - if (!is.null(names(vectors))) result <- result %>% dplyr::rename(!!! vectors) + if (!is.null(names(vectors))) { + to_rename <- vectors[as.character(vectors) %in% names(result)] + if (length(to_rename)>0) result <- result %>% dplyr::rename(!!! to_rename) + } } } diff --git a/cran-comments.md b/cran-comments.md index 003bf85a..66901ba3 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,3 +1,6 @@ +# cancensus 0.5.6 +- fix issue when using named vectors to query data for non-existent geographies, return NULL in this case instead of throwing error + # Update 0.5.5 - add functionality for direct access to StatCan census WDS for 2021 - add functionality to download original StatCan geographies for 2021 From 13cc052b74a57dc7f6c9b184e739fe7c8e26505d Mon Sep 17 00:00:00 2001 From: Jens von Bergmann Date: Tue, 18 Apr 2023 14:34:26 -0700 Subject: [PATCH 4/8] population centres and FSA geographies and adata --- DESCRIPTION | 2 +- NEWS.md | 2 + R/geographies.R | 16 +- R/wds.R | 4 +- cran-comments.md | 2 + docs/404.html | 4 +- docs/LICENSE-text.html | 4 +- ...ngs_by_document_type_cross_tabulation.html | 14 +- docs/articles/Making_maps_with_cancensus.html | 16 +- .../figure-html/unnamed-chunk-4-1.png | Bin 104215 -> 104132 bytes .../htmlwidgets-1.6.1/htmlwidgets.js | 901 ++++++++++++++++++ docs/articles/Taxfiler_Data.html | 20 +- docs/articles/cancensus.html | 44 +- docs/articles/data_discovery.html | 32 +- docs/articles/index.html | 4 +- docs/articles/intersecting_geometries.html | 20 +- docs/articles/statcan_attribute_files.html | 6 +- docs/articles/statcan_wds.html | 14 +- docs/authors.html | 4 +- docs/index.html | 31 +- docs/news/index.html | 27 +- docs/pkgdown.yml | 4 +- docs/reference/CODES_TABLE.html | 4 +- docs/reference/COV_SKYTRAIN_STATIONS.html | 4 +- .../add_unique_names_to_region_list.html | 4 +- docs/reference/as_census_region_list.html | 4 +- docs/reference/census_vectors.html | 4 +- docs/reference/child_census_vectors.html | 4 +- docs/reference/dataset_attribution.html | 4 +- docs/reference/explore_census_regions.html | 4 +- docs/reference/explore_census_vectors.html | 4 +- docs/reference/find_census_vectors.html | 4 +- docs/reference/get_census.html | 4 +- docs/reference/get_census_geometry.html | 4 +- .../get_intersecting_geometries.html | 4 +- docs/reference/get_recalled_database.html | 4 +- docs/reference/get_statcan_geo_suite.html | 4 +- .../get_statcan_geographic_attributes.html | 4 +- docs/reference/get_statcan_geographies.html | 6 +- .../get_statcan_geography_relationships.html | 4 +- docs/reference/get_statcan_wds_data.html | 4 +- docs/reference/get_statcan_wds_metadata.html | 6 +- docs/reference/index.html | 8 +- docs/reference/label_vectors.html | 4 +- docs/reference/list_cancensus_cache.html | 28 +- docs/reference/list_census_datasets.html | 4 +- docs/reference/list_census_regions.html | 23 +- docs/reference/list_census_vectors.html | 4 +- docs/reference/list_recalled_cached_data.html | 4 +- docs/reference/parent_census_vectors.html | 4 +- .../remove_from_cancensus_cache.html | 4 +- .../remove_recalled_cached_data.html | 4 +- docs/reference/search_census_regions.html | 4 +- docs/reference/search_census_vectors.html | 4 +- docs/reference/set_cancensus_api_key.html | 4 +- docs/reference/set_cancensus_cache_path.html | 4 +- docs/reference/show_cancensus_api_key.html | 4 +- docs/reference/show_cancensus_cache_path.html | 4 +- man/get_statcan_geographies.Rd | 2 +- man/get_statcan_wds_metadata.Rd | 2 +- 60 files changed, 1134 insertions(+), 236 deletions(-) create mode 100644 docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.6.1/htmlwidgets.js diff --git a/DESCRIPTION b/DESCRIPTION index f2d6c992..d2af7e92 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -24,7 +24,7 @@ Imports: digest (>= 0.1), httr (>= 1.0.0), jsonlite (>= 1.0), rlang -RoxygenNote: 7.2.1 +RoxygenNote: 7.2.3 Suggests: knitr, ggplot2, leaflet, diff --git a/NEWS.md b/NEWS.md index 5ad9220b..71cbe0ea 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,8 @@ # cancensus 0.5.6 - fix issue when using named vectors to query data for non-existent geographies, return NULL in this case instead of throwing error +- fix problem with population centre geographic data download +- support newly released Forward Sortation Area geography for statcan geography and WDS functionality # cancensus 0.5.5 diff --git a/R/geographies.R b/R/geographies.R index fe5ce12f..71ec90d7 100644 --- a/R/geographies.R +++ b/R/geographies.R @@ -5,7 +5,7 @@ #' #' @param census_year census year to get the data for, right now only 2021 is supported #' @param level geographic level to return the data for, valid choices are -#' "PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR" +#' "PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR", "FSA" #' @param type type of geographic data, valid choices area "cartographic" or "digital" #' @param cache_path optional path to cache the data. If the cancensus cache path is set the geographic data gets #' cached in the "geographies" subdirectory of the cancensus cache path. @@ -24,7 +24,7 @@ get_statcan_geographies <- function(census_year,level,type="cartographic", cache_path = NULL,timeout=1000, refresh=FALSE,quiet=FALSE) { valid_census_years <- c("2021") - valid_levels <- c("PR","CD","CMACA","CMA","CA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR") + valid_levels <- c("PR","CD","CMACA","CMA","CA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR","POPCTR","FSA") valid_types <- c("cartographic","digital") if (!(census_year %in% valid_census_years)) { stop(paste0("Census year must be one of ",paste0(valid_census_years,collapse = ", "),".")) @@ -35,9 +35,9 @@ get_statcan_geographies <- function(census_year,level,type="cartographic", if (!(level %in% valid_levels)) { stop(paste0("Level must be one of ",paste0(valid_levels,collapse = ", "),".")) } - level_map <- c("CMACA"="CMA","CA"="CMA","POPCNTR","PC") + level_map <- c("CMACA"="CMA","CA"="CMA","POPCNTR"="PC","POPCTR"="PC") if (level %in% names(level_map)) level <-level_map[[level]] - geo_base_path <- cache_path("geographies") + geo_base_path <- cancensus:::cache_path("geographies") if (!dir.exists(geo_base_path)) dir.create(geo_base_path) geo_base_path <- file.path(geo_base_path,type) if (!dir.exists(geo_base_path)) dir.create(geo_base_path) @@ -56,6 +56,14 @@ get_statcan_geographies <- function(census_year,level,type="cartographic", utils::download.file(url,tmp,mode="wb",quiet=quiet) options(timeout = old_timeout) utils::unzip(tmp,exdir = exdir) + fs <- dir(exdir,full.names = TRUE) + if (length(fs)==1 && dir.exists(fs)) { + tmp_dir <- file.path(geo_base_path,"XXXX") + file.rename(exdir,tmp_dir) + fs <- dir(tmp_dir,full.names = TRUE) + file.rename(fs,exdir) + unlink(tmp_dir) + } } else { if (!quiet) message("Reading geographic data from local cache.") } diff --git a/R/wds.R b/R/wds.R index 7e595504..04f75895 100644 --- a/R/wds.R +++ b/R/wds.R @@ -6,7 +6,7 @@ #' #' @param census_year census year to get the data for, right now only 2021 is supported #' @param level geographic level to return the data for, valid choices are -#' "PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR" +#' "PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR", "FSA" #' @param refresh default is `FALSE` will refresh the temporary cache if `TRUE` #' @return tibble with the metadata #' @@ -18,7 +18,7 @@ #' @export get_statcan_wds_metadata <- function(census_year,level,refresh=FALSE){ valid_census_years <- c("2021") - valid_levels <- c("PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR") + valid_levels <- c("PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR","FSA") if (!(census_year %in% valid_census_years)) { stop(paste0("Census year must be one of ",paste0(valid_census_years,collapse = ", "),".")) } diff --git a/cran-comments.md b/cran-comments.md index 66901ba3..3fbce461 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,5 +1,7 @@ # cancensus 0.5.6 - fix issue when using named vectors to query data for non-existent geographies, return NULL in this case instead of throwing error +- fix problem with population centre geographic data download +- support newly released Forward Sortation Area geography for statcan geography and WDS functionality # Update 0.5.5 - add functionality for direct access to StatCan census WDS for 2021 diff --git a/docs/404.html b/docs/404.html index af0f1d6f..d7d1da8e 100644 --- a/docs/404.html +++ b/docs/404.html @@ -50,7 +50,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -139,7 +139,7 @@

Page not found (404)

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index edbf629d..a1be5b1e 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -103,7 +103,7 @@

License

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/articles/Dwellings_by_document_type_cross_tabulation.html b/docs/articles/Dwellings_by_document_type_cross_tabulation.html index 21ac4288..09d9b034 100644 --- a/docs/articles/Dwellings_by_document_type_cross_tabulation.html +++ b/docs/articles/Dwellings_by_document_type_cross_tabulation.html @@ -51,7 +51,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -180,10 +180,10 @@

E started with cancensus vignette.

 # Attribution for the dataset to be used in graphs
-attribution <- dataset_attribution("CA16xSD")
+attribution <- dataset_attribution("CA16xSD")
 
 # Select all variables base variables, this gives us total counts by structural type of dwelling
-vars <- list_census_vectors("CA16xSD") %>% 
+vars <- list_census_vectors("CA16xSD") %>% 
   filter(is.na(parent_vector))
 variables <- setNames(vars$vector,vars$label)
 
@@ -213,7 +213,7 @@ 

E dwelling_types <- setdiff(names(variables),"Total dwellings") # Grab the census data and compute shares for each dwelling type -census_data <- get_census("CA16xSD",regions=list(CSD="3520005"), vectors = variables, quiet = TRUE) %>% +census_data <- get_census("CA16xSD",regions=list(CSD="3520005"), vectors = variables, quiet = TRUE) %>% pivot_longer(cols = all_of(dwelling_types)) %>% mutate(share=value/`Total dwellings`)

To visualize what this looks like on a bar chart:

@@ -228,7 +228,7 @@

E

As with regular Census data, all data can be retrieved as spatial data. Sometimes it’s easier to use the CensusMapper API interface to search for and select the variables we are interested in. The -explore_census_vectors() function opens a browser with the +explore_census_vectors() function opens a browser with the variable selection tool, we determine that “v_CA16xSD_1” and “v_CA16xSD_28” are the variables enumerating all dwellings and all unoccupied dwellings, respectively.

@@ -237,7 +237,7 @@

E vars <- c(Total="v_CA16xSD_1", Unoccupied="v_CA16xSD_28") # Retrieve data with attached geography -census_data <- get_census("CA16xSD",regions=list(CSD="3520005"), level="CT", quiet = TRUE, geo_format = "sf", +census_data <- get_census("CA16xSD",regions=list(CSD="3520005"), level="CT", quiet = TRUE, geo_format = "sf", vectors = vars,use_cache = FALSE) %>% mutate(share=Unoccupied/Total) @@ -270,7 +270,7 @@

E

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/articles/Making_maps_with_cancensus.html b/docs/articles/Making_maps_with_cancensus.html index 50aa4c6e..ce39babf 100644 --- a/docs/articles/Making_maps_with_cancensus.html +++ b/docs/articles/Making_maps_with_cancensus.html @@ -51,7 +51,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -114,7 +114,7 @@ - +
@@ -156,7 +156,7 @@

Spatial data in cancensuslibrary(cancensus) library(sf) # retrieve sf dataframe -toronto <- get_census(dataset='CA21', regions=list(CMA="35535"), +toronto <- get_census(dataset='CA21', regions=list(CMA="35535"), vectors=c("median_hh_income"="v_CA21_906"), level='CSD', quiet = TRUE, geo_format = 'sf', labels = 'short')

@@ -228,8 +228,8 @@

Interactive maps with leafletleaflet(toronto) %>% addProviderTiles(providers$CartoDB.Positron) %>% addPolygons() -
-

Adding colour ramps and additional interactivity takes a little bit +

+

Adding colour ramps and additional interactivity takes a little bit more work but is still pretty easy to implement. Following this example we can specify the colour ramp to match our needs.

@@ -242,8 +242,8 @@ 

Interactive maps with leaflet= 1, opacity = 1, fillOpacity = 0.65)

-
- +
+ @@ -264,7 +264,7 @@

Interactive maps with leaflet

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/articles/Making_maps_with_cancensus_files/figure-html/unnamed-chunk-4-1.png b/docs/articles/Making_maps_with_cancensus_files/figure-html/unnamed-chunk-4-1.png index c9afb25aa53c4a8757592afb21b4c412a6856903..0667972ccfe47ba13cf33f373b057c3e251b273d 100644 GIT binary patch literal 104132 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

;TF&Q;h2sDSeYym0JA(QyRWY<(U$A4`&KuiNg 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

sLs2f=S3BZA($qIQTYCN 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 XnRmWL7tmQCnIx2o<~73AJJ0?X9bdKt literal 104215 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�oD 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 UgV(sTInp$RyDE3Gr60cfU*g8f5dZ)H diff --git a/docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.6.1/htmlwidgets.js b/docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.6.1/htmlwidgets.js new file mode 100644 index 00000000..1067d029 --- /dev/null +++ b/docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.6.1/htmlwidgets.js @@ -0,0 +1,901 @@ +(function() { + // If window.HTMLWidgets is already defined, then use it; otherwise create a + // new object. This allows preceding code to set options that affect the + // initialization process (though none currently exist). + window.HTMLWidgets = window.HTMLWidgets || {}; + + // See if we're running in a viewer pane. If not, we're in a web browser. + var viewerMode = window.HTMLWidgets.viewerMode = + /\bviewer_pane=1\b/.test(window.location); + + // See if we're running in Shiny mode. If not, it's a static document. + // Note that static widgets can appear in both Shiny and static modes, but + // obviously, Shiny widgets can only appear in Shiny apps/documents. + var shinyMode = window.HTMLWidgets.shinyMode = + typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings; + + // We can't count on jQuery being available, so we implement our own + // version if necessary. + function querySelectorAll(scope, selector) { + if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) { + return scope.find(selector); + } + if (scope.querySelectorAll) { + return scope.querySelectorAll(selector); + } + } + + function asArray(value) { + if (value === null) + return []; + if ($.isArray(value)) + return value; + return [value]; + } + + // Implement jQuery's extend + function extend(target /*, ... */) { + if (arguments.length == 1) { + return target; + } + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + target[prop] = source[prop]; + } + } + } + return target; + } + + // IE8 doesn't support Array.forEach. + function forEach(values, callback, thisArg) { + if (values.forEach) { + values.forEach(callback, thisArg); + } else { + for (var i = 0; i < values.length; i++) { + callback.call(thisArg, values[i], i, values); + } + } + } + + // Replaces the specified method with the return value of funcSource. + // + // Note that funcSource should not BE the new method, it should be a function + // that RETURNS the new method. funcSource receives a single argument that is + // the overridden method, it can be called from the new method. The overridden + // method can be called like a regular function, it has the target permanently + // bound to it so "this" will work correctly. + function overrideMethod(target, methodName, funcSource) { + var superFunc = target[methodName] || function() {}; + var superFuncBound = function() { + return superFunc.apply(target, arguments); + }; + target[methodName] = funcSource(superFuncBound); + } + + // Add a method to delegator that, when invoked, calls + // delegatee.methodName. If there is no such method on + // the delegatee, but there was one on delegator before + // delegateMethod was called, then the original version + // is invoked instead. + // For example: + // + // var a = { + // method1: function() { console.log('a1'); } + // method2: function() { console.log('a2'); } + // }; + // var b = { + // method1: function() { console.log('b1'); } + // }; + // delegateMethod(a, b, "method1"); + // delegateMethod(a, b, "method2"); + // a.method1(); + // a.method2(); + // + // The output would be "b1", "a2". + function delegateMethod(delegator, delegatee, methodName) { + var inherited = delegator[methodName]; + delegator[methodName] = function() { + var target = delegatee; + var method = delegatee[methodName]; + + // The method doesn't exist on the delegatee. Instead, + // call the method on the delegator, if it exists. + if (!method) { + target = delegator; + method = inherited; + } + + if (method) { + return method.apply(target, arguments); + } + }; + } + + // Implement a vague facsimilie of jQuery's data method + function elementData(el, name, value) { + if (arguments.length == 2) { + return el["htmlwidget_data_" + name]; + } else if (arguments.length == 3) { + el["htmlwidget_data_" + name] = value; + return el; + } else { + throw new Error("Wrong number of arguments for elementData: " + + arguments.length); + } + } + + // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + function escapeRegExp(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + + function hasClass(el, className) { + var re = new RegExp("\\b" + escapeRegExp(className) + "\\b"); + return re.test(el.className); + } + + // elements - array (or array-like object) of HTML elements + // className - class name to test for + // include - if true, only return elements with given className; + // if false, only return elements *without* given className + function filterByClass(elements, className, include) { + var results = []; + for (var i = 0; i < elements.length; i++) { + if (hasClass(elements[i], className) == include) + results.push(elements[i]); + } + return results; + } + + function on(obj, eventName, func) { + if (obj.addEventListener) { + obj.addEventListener(eventName, func, false); + } else if (obj.attachEvent) { + obj.attachEvent(eventName, func); + } + } + + function off(obj, eventName, func) { + if (obj.removeEventListener) + obj.removeEventListener(eventName, func, false); + else if (obj.detachEvent) { + obj.detachEvent(eventName, func); + } + } + + // Translate array of values to top/right/bottom/left, as usual with + // the "padding" CSS property + // https://developer.mozilla.org/en-US/docs/Web/CSS/padding + function unpackPadding(value) { + if (typeof(value) === "number") + value = [value]; + if (value.length === 1) { + return {top: value[0], right: value[0], bottom: value[0], left: value[0]}; + } + if (value.length === 2) { + return {top: value[0], right: value[1], bottom: value[0], left: value[1]}; + } + if (value.length === 3) { + return {top: value[0], right: value[1], bottom: value[2], left: value[1]}; + } + if (value.length === 4) { + return {top: value[0], right: value[1], bottom: value[2], left: value[3]}; + } + } + + // Convert an unpacked padding object to a CSS value + function paddingToCss(paddingObj) { + return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px"; + } + + // Makes a number suitable for CSS + function px(x) { + if (typeof(x) === "number") + return x + "px"; + else + return x; + } + + // Retrieves runtime widget sizing information for an element. + // The return value is either null, or an object with fill, padding, + // defaultWidth, defaultHeight fields. + function sizingPolicy(el) { + var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']"); + if (!sizingEl) + return null; + var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}"); + if (viewerMode) { + return sp.viewer; + } else { + return sp.browser; + } + } + + // @param tasks Array of strings (or falsy value, in which case no-op). + // Each element must be a valid JavaScript expression that yields a + // function. Or, can be an array of objects with "code" and "data" + // properties; in this case, the "code" property should be a string + // of JS that's an expr that yields a function, and "data" should be + // an object that will be added as an additional argument when that + // function is called. + // @param target The object that will be "this" for each function + // execution. + // @param args Array of arguments to be passed to the functions. (The + // same arguments will be passed to all functions.) + function evalAndRun(tasks, target, args) { + if (tasks) { + forEach(tasks, function(task) { + var theseArgs = args; + if (typeof(task) === "object") { + theseArgs = theseArgs.concat([task.data]); + task = task.code; + } + var taskFunc = tryEval(task); + if (typeof(taskFunc) !== "function") { + throw new Error("Task must be a function! Source:\n" + task); + } + taskFunc.apply(target, theseArgs); + }); + } + } + + // Attempt eval() both with and without enclosing in parentheses. + // Note that enclosing coerces a function declaration into + // an expression that eval() can parse + // (otherwise, a SyntaxError is thrown) + function tryEval(code) { + var result = null; + try { + result = eval("(" + code + ")"); + } catch(error) { + if (!(error instanceof SyntaxError)) { + throw error; + } + try { + result = eval(code); + } catch(e) { + if (e instanceof SyntaxError) { + throw error; + } else { + throw e; + } + } + } + return result; + } + + function initSizing(el) { + var sizing = sizingPolicy(el); + if (!sizing) + return; + + var cel = document.getElementById("htmlwidget_container"); + if (!cel) + return; + + if (typeof(sizing.padding) !== "undefined") { + document.body.style.margin = "0"; + document.body.style.padding = paddingToCss(unpackPadding(sizing.padding)); + } + + if (sizing.fill) { + document.body.style.overflow = "hidden"; + document.body.style.width = "100%"; + document.body.style.height = "100%"; + document.documentElement.style.width = "100%"; + document.documentElement.style.height = "100%"; + cel.style.position = "absolute"; + var pad = unpackPadding(sizing.padding); + cel.style.top = pad.top + "px"; + cel.style.right = pad.right + "px"; + cel.style.bottom = pad.bottom + "px"; + cel.style.left = pad.left + "px"; + el.style.width = "100%"; + el.style.height = "100%"; + + return { + getWidth: function() { return cel.getBoundingClientRect().width; }, + getHeight: function() { return cel.getBoundingClientRect().height; } + }; + + } else { + el.style.width = px(sizing.width); + el.style.height = px(sizing.height); + + return { + getWidth: function() { return cel.getBoundingClientRect().width; }, + getHeight: function() { return cel.getBoundingClientRect().height; } + }; + } + } + + // Default implementations for methods + var defaults = { + find: function(scope) { + return querySelectorAll(scope, "." + this.name); + }, + renderError: function(el, err) { + var $el = $(el); + + this.clearError(el); + + // Add all these error classes, as Shiny does + var errClass = "shiny-output-error"; + if (err.type !== null) { + // use the classes of the error condition as CSS class names + errClass = errClass + " " + $.map(asArray(err.type), function(type) { + return errClass + "-" + type; + }).join(" "); + } + errClass = errClass + " htmlwidgets-error"; + + // Is el inline or block? If inline or inline-block, just display:none it + // and add an inline error. + var display = $el.css("display"); + $el.data("restore-display-mode", display); + + if (display === "inline" || display === "inline-block") { + $el.hide(); + if (err.message !== "") { + var errorSpan = $("").addClass(errClass); + errorSpan.text(err.message); + $el.after(errorSpan); + } + } else if (display === "block") { + // If block, add an error just after the el, set visibility:none on the + // el, and position the error to be on top of the el. + // Mark it with a unique ID and CSS class so we can remove it later. + $el.css("visibility", "hidden"); + if (err.message !== "") { + var errorDiv = $("

").addClass(errClass).css("position", "absolute") + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + // setting width can push out the page size, forcing otherwise + // unnecessary scrollbars to appear and making it impossible for + // the element to shrink; so use max-width instead + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + errorDiv.text(err.message); + $el.after(errorDiv); + + // Really dumb way to keep the size/position of the error in sync with + // the parent element as the window is resized or whatever. + var intId = setInterval(function() { + if (!errorDiv[0].parentElement) { + clearInterval(intId); + return; + } + errorDiv + .css("top", el.offsetTop) + .css("left", el.offsetLeft) + .css("maxWidth", el.offsetWidth) + .css("height", el.offsetHeight); + }, 500); + } + } + }, + clearError: function(el) { + var $el = $(el); + var display = $el.data("restore-display-mode"); + $el.data("restore-display-mode", null); + + if (display === "inline" || display === "inline-block") { + if (display) + $el.css("display", display); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } else if (display === "block"){ + $el.css("visibility", "inherit"); + $(el.nextSibling).filter(".htmlwidgets-error").remove(); + } + }, + sizing: {} + }; + + // Called by widget bindings to register a new type of widget. The definition + // object can contain the following properties: + // - name (required) - A string indicating the binding name, which will be + // used by default as the CSS classname to look for. + // - initialize (optional) - A function(el) that will be called once per + // widget element; if a value is returned, it will be passed as the third + // value to renderValue. + // - renderValue (required) - A function(el, data, initValue) that will be + // called with data. Static contexts will cause this to be called once per + // element; Shiny apps will cause this to be called multiple times per + // element, as the data changes. + window.HTMLWidgets.widget = function(definition) { + if (!definition.name) { + throw new Error("Widget must have a name"); + } + if (!definition.type) { + throw new Error("Widget must have a type"); + } + // Currently we only support output widgets + if (definition.type !== "output") { + throw new Error("Unrecognized widget type '" + definition.type + "'"); + } + // TODO: Verify that .name is a valid CSS classname + + // Support new-style instance-bound definitions. Old-style class-bound + // definitions have one widget "object" per widget per type/class of + // widget; the renderValue and resize methods on such widget objects + // take el and instance arguments, because the widget object can't + // store them. New-style instance-bound definitions have one widget + // object per widget instance; the definition that's passed in doesn't + // provide renderValue or resize methods at all, just the single method + // factory(el, width, height) + // which returns an object that has renderValue(x) and resize(w, h). + // This enables a far more natural programming style for the widget + // author, who can store per-instance state using either OO-style + // instance fields or functional-style closure variables (I guess this + // is in contrast to what can only be called C-style pseudo-OO which is + // what we required before). + if (definition.factory) { + definition = createLegacyDefinitionAdapter(definition); + } + + if (!definition.renderValue) { + throw new Error("Widget must have a renderValue function"); + } + + // For static rendering (non-Shiny), use a simple widget registration + // scheme. We also use this scheme for Shiny apps/documents that also + // contain static widgets. + window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || []; + // Merge defaults into the definition; don't mutate the original definition. + var staticBinding = extend({}, defaults, definition); + overrideMethod(staticBinding, "find", function(superfunc) { + return function(scope) { + var results = superfunc(scope); + // Filter out Shiny outputs, we only want the static kind + return filterByClass(results, "html-widget-output", false); + }; + }); + window.HTMLWidgets.widgets.push(staticBinding); + + if (shinyMode) { + // Shiny is running. Register the definition with an output binding. + // The definition itself will not be the output binding, instead + // we will make an output binding object that delegates to the + // definition. This is because we foolishly used the same method + // name (renderValue) for htmlwidgets definition and Shiny bindings + // but they actually have quite different semantics (the Shiny + // bindings receive data that includes lots of metadata that it + // strips off before calling htmlwidgets renderValue). We can't + // just ignore the difference because in some widgets it's helpful + // to call this.renderValue() from inside of resize(), and if + // we're not delegating, then that call will go to the Shiny + // version instead of the htmlwidgets version. + + // Merge defaults with definition, without mutating either. + var bindingDef = extend({}, defaults, definition); + + // This object will be our actual Shiny binding. + var shinyBinding = new Shiny.OutputBinding(); + + // With a few exceptions, we'll want to simply use the bindingDef's + // version of methods if they are available, otherwise fall back to + // Shiny's defaults. NOTE: If Shiny's output bindings gain additional + // methods in the future, and we want them to be overrideable by + // HTMLWidget binding definitions, then we'll need to add them to this + // list. + delegateMethod(shinyBinding, bindingDef, "getId"); + delegateMethod(shinyBinding, bindingDef, "onValueChange"); + delegateMethod(shinyBinding, bindingDef, "onValueError"); + delegateMethod(shinyBinding, bindingDef, "renderError"); + delegateMethod(shinyBinding, bindingDef, "clearError"); + delegateMethod(shinyBinding, bindingDef, "showProgress"); + + // The find, renderValue, and resize are handled differently, because we + // want to actually decorate the behavior of the bindingDef methods. + + shinyBinding.find = function(scope) { + var results = bindingDef.find(scope); + + // Only return elements that are Shiny outputs, not static ones + var dynamicResults = results.filter(".html-widget-output"); + + // It's possible that whatever caused Shiny to think there might be + // new dynamic outputs, also caused there to be new static outputs. + // Since there might be lots of different htmlwidgets bindings, we + // schedule execution for later--no need to staticRender multiple + // times. + if (results.length !== dynamicResults.length) + scheduleStaticRender(); + + return dynamicResults; + }; + + // Wrap renderValue to handle initialization, which unfortunately isn't + // supported natively by Shiny at the time of this writing. + + shinyBinding.renderValue = function(el, data) { + Shiny.renderDependencies(data.deps); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var i = 0; data.evals && i < data.evals.length; i++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]); + } + if (!bindingDef.renderOnNullValue) { + if (data.x === null) { + el.style.visibility = "hidden"; + return; + } else { + el.style.visibility = "inherit"; + } + } + if (!elementData(el, "initialized")) { + initSizing(el); + + elementData(el, "initialized", true); + if (bindingDef.initialize) { + var rect = el.getBoundingClientRect(); + var result = bindingDef.initialize(el, rect.width, rect.height); + elementData(el, "init_result", result); + } + } + bindingDef.renderValue(el, data.x, elementData(el, "init_result")); + evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]); + }; + + // Only override resize if bindingDef implements it + if (bindingDef.resize) { + shinyBinding.resize = function(el, width, height) { + // Shiny can call resize before initialize/renderValue have been + // called, which doesn't make sense for widgets. + if (elementData(el, "initialized")) { + bindingDef.resize(el, width, height, elementData(el, "init_result")); + } + }; + } + + Shiny.outputBindings.register(shinyBinding, bindingDef.name); + } + }; + + var scheduleStaticRenderTimerId = null; + function scheduleStaticRender() { + if (!scheduleStaticRenderTimerId) { + scheduleStaticRenderTimerId = setTimeout(function() { + scheduleStaticRenderTimerId = null; + window.HTMLWidgets.staticRender(); + }, 1); + } + } + + // Render static widgets after the document finishes loading + // Statically render all elements that are of this widget's class + window.HTMLWidgets.staticRender = function() { + var bindings = window.HTMLWidgets.widgets || []; + forEach(bindings, function(binding) { + var matches = binding.find(document.documentElement); + forEach(matches, function(el) { + var sizeObj = initSizing(el, binding); + + var getSize = function(el) { + if (sizeObj) { + return {w: sizeObj.getWidth(), h: sizeObj.getHeight()} + } else { + var rect = el.getBoundingClientRect(); + return {w: rect.width, h: rect.height} + } + }; + + if (hasClass(el, "html-widget-static-bound")) + return; + el.className = el.className + " html-widget-static-bound"; + + var initResult; + if (binding.initialize) { + var size = getSize(el); + initResult = binding.initialize(el, size.w, size.h); + elementData(el, "init_result", initResult); + } + + if (binding.resize) { + var lastSize = getSize(el); + var resizeHandler = function(e) { + var size = getSize(el); + if (size.w === 0 && size.h === 0) + return; + if (size.w === lastSize.w && size.h === lastSize.h) + return; + lastSize = size; + binding.resize(el, size.w, size.h, initResult); + }; + + on(window, "resize", resizeHandler); + + // This is needed for cases where we're running in a Shiny + // app, but the widget itself is not a Shiny output, but + // rather a simple static widget. One example of this is + // an rmarkdown document that has runtime:shiny and widget + // that isn't in a render function. Shiny only knows to + // call resize handlers for Shiny outputs, not for static + // widgets, so we do it ourselves. + if (window.jQuery) { + window.jQuery(document).on( + "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets", + resizeHandler + ); + window.jQuery(document).on( + "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets", + resizeHandler + ); + } + + // This is needed for the specific case of ioslides, which + // flips slides between display:none and display:block. + // Ideally we would not have to have ioslide-specific code + // here, but rather have ioslides raise a generic event, + // but the rmarkdown package just went to CRAN so the + // window to getting that fixed may be long. + if (window.addEventListener) { + // It's OK to limit this to window.addEventListener + // browsers because ioslides itself only supports + // such browsers. + on(document, "slideenter", resizeHandler); + on(document, "slideleave", resizeHandler); + } + } + + var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']"); + if (scriptData) { + var data = JSON.parse(scriptData.textContent || scriptData.text); + // Resolve strings marked as javascript literals to objects + if (!(data.evals instanceof Array)) data.evals = [data.evals]; + for (var k = 0; data.evals && k < data.evals.length; k++) { + window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]); + } + binding.renderValue(el, data.x, initResult); + evalAndRun(data.jsHooks.render, initResult, [el, data.x]); + } + }); + }); + + invokePostRenderHandlers(); + } + + + function has_jQuery3() { + if (!window.jQuery) { + return false; + } + var $version = window.jQuery.fn.jquery; + var $major_version = parseInt($version.split(".")[0]); + return $major_version >= 3; + } + + /* + / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's + / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now + / really means $(setTimeout(fn)). + / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous + / + / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny + / one tick later than it did before, which means staticRender() is + / called renderValue() earlier than (advanced) widget authors might be expecting. + / https://github.com/rstudio/shiny/issues/2630 + / + / For a concrete example, leaflet has some methods (e.g., updateBounds) + / which reference Shiny methods registered in initShiny (e.g., setInputValue). + / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to + / delay execution of those methods (until Shiny methods are ready) + / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268 + / + / Ideally widget authors wouldn't need to use this setTimeout() hack that + / leaflet uses to call Shiny methods on a staticRender(). In the long run, + / the logic initShiny should be broken up so that method registration happens + / right away, but binding happens later. + */ + function maybeStaticRenderLater() { + if (shinyMode && has_jQuery3()) { + window.jQuery(window.HTMLWidgets.staticRender); + } else { + window.HTMLWidgets.staticRender(); + } + } + + if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", function() { + document.removeEventListener("DOMContentLoaded", arguments.callee, false); + maybeStaticRenderLater(); + }, false); + } else if (document.attachEvent) { + document.attachEvent("onreadystatechange", function() { + if (document.readyState === "complete") { + document.detachEvent("onreadystatechange", arguments.callee); + maybeStaticRenderLater(); + } + }); + } + + + window.HTMLWidgets.getAttachmentUrl = function(depname, key) { + // If no key, default to the first item + if (typeof(key) === "undefined") + key = 1; + + var link = document.getElementById(depname + "-" + key + "-attachment"); + if (!link) { + throw new Error("Attachment " + depname + "/" + key + " not found in document"); + } + return link.getAttribute("href"); + }; + + window.HTMLWidgets.dataframeToD3 = function(df) { + var names = []; + var length; + for (var name in df) { + if (df.hasOwnProperty(name)) + names.push(name); + if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof(length) !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; + }; + + window.HTMLWidgets.transposeArray2D = function(array) { + if (array.length === 0) return array; + var newArray = array[0].map(function(col, i) { + return array.map(function(row) { + return row[i] + }) + }); + return newArray; + }; + // Split value at splitChar, but allow splitChar to be escaped + // using escapeChar. Any other characters escaped by escapeChar + // will be included as usual (including escapeChar itself). + function splitWithEscape(value, splitChar, escapeChar) { + var results = []; + var escapeMode = false; + var currentResult = ""; + for (var pos = 0; pos < value.length; pos++) { + if (!escapeMode) { + if (value[pos] === splitChar) { + results.push(currentResult); + currentResult = ""; + } else if (value[pos] === escapeChar) { + escapeMode = true; + } else { + currentResult += value[pos]; + } + } else { + currentResult += value[pos]; + escapeMode = false; + } + } + if (currentResult !== "") { + results.push(currentResult); + } + return results; + } + // Function authored by Yihui/JJ Allaire + window.HTMLWidgets.evaluateStringMember = function(o, member) { + var parts = splitWithEscape(member, '.', '\\'); + for (var i = 0, l = parts.length; i < l; i++) { + var part = parts[i]; + // part may be a character or 'numeric' member name + if (o !== null && typeof o === "object" && part in o) { + if (i == (l - 1)) { // if we are at the end of the line then evalulate + if (typeof o[part] === "string") + o[part] = tryEval(o[part]); + } else { // otherwise continue to next embedded object + o = o[part]; + } + } + } + }; + + // Retrieve the HTMLWidget instance (i.e. the return value of an + // HTMLWidget binding's initialize() or factory() function) + // associated with an element, or null if none. + window.HTMLWidgets.getInstance = function(el) { + return elementData(el, "init_result"); + }; + + // Finds the first element in the scope that matches the selector, + // and returns the HTMLWidget instance (i.e. the return value of + // an HTMLWidget binding's initialize() or factory() function) + // associated with that element, if any. If no element matches the + // selector, or the first matching element has no HTMLWidget + // instance associated with it, then null is returned. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.find = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var el = scope.querySelector(selector); + if (el === null) { + return null; + } else { + return window.HTMLWidgets.getInstance(el); + } + }; + + // Finds all elements in the scope that match the selector, and + // returns the HTMLWidget instances (i.e. the return values of + // an HTMLWidget binding's initialize() or factory() function) + // associated with the elements, in an array. If elements that + // match the selector don't have an associated HTMLWidget + // instance, the returned array will contain nulls. + // + // The scope argument is optional, and defaults to window.document. + window.HTMLWidgets.findAll = function(scope, selector) { + if (arguments.length == 1) { + selector = scope; + scope = document; + } + + var nodes = scope.querySelectorAll(selector); + var results = []; + for (var i = 0; i < nodes.length; i++) { + results.push(window.HTMLWidgets.getInstance(nodes[i])); + } + return results; + }; + + var postRenderHandlers = []; + function invokePostRenderHandlers() { + while (postRenderHandlers.length) { + var handler = postRenderHandlers.shift(); + if (handler) { + handler(); + } + } + } + + // Register the given callback function to be invoked after the + // next time static widgets are rendered. + window.HTMLWidgets.addPostRenderHandler = function(callback) { + postRenderHandlers.push(callback); + }; + + // Takes a new-style instance-bound definition, and returns an + // old-style class-bound definition. This saves us from having + // to rewrite all the logic in this file to accomodate both + // types of definitions. + function createLegacyDefinitionAdapter(defn) { + var result = { + name: defn.name, + type: defn.type, + initialize: function(el, width, height) { + return defn.factory(el, width, height); + }, + renderValue: function(el, x, instance) { + return instance.renderValue(x); + }, + resize: function(el, width, height, instance) { + return instance.resize(width, height); + } + }; + + if (defn.find) + result.find = defn.find; + if (defn.renderError) + result.renderError = defn.renderError; + if (defn.clearError) + result.clearError = defn.clearError; + + return result; + } +})(); diff --git a/docs/articles/Taxfiler_Data.html b/docs/articles/Taxfiler_Data.html index 5bf003a6..624dc928 100644 --- a/docs/articles/Taxfiler_Data.html +++ b/docs/articles/Taxfiler_Data.html @@ -51,7 +51,7 @@ cancensus - 0.5.5 + 0.5.6
@@ -174,9 +174,9 @@

library(ggplot2) library(sf)

To see all available T1FF datasets and their reference codes we can -use list_census_datasets().

+use list_census_datasets().

-list_census_datasets() %>% 
+list_census_datasets() %>% 
   filter(grepl("taxfiler",description))
 #> # A tibble: 19 × 6
 #>    dataset description             geo_dataset attribution       refer…¹ refer…²
@@ -204,7 +204,7 @@ 

-list_census_vectors('TX2017')
+list_census_vectors('TX2017')
 #> # A tibble: 818 × 7
 #>    vector      type  label           units              parent…¹ aggre…² details
 #>    <chr>       <fct> <chr>           <fct>              <chr>    <chr>   <chr>  
@@ -225,7 +225,7 @@ 

Here we also re-organized the data by year. All that’s left is to plot the data, one year at a time.

@@ -285,7 +285,7 @@

scale_fill_gradient2(labels=scales::percent) + #scale_fill_viridis_c(labels=scales::percent,option = "inferno") + coord_sf(datum=NA,xlim=c(-123.4, -122.5), ylim=c(49.01, 49.4)) + - labs(title="Change in share of census families in low income 2006-2011",fill="Percentage\npoint change",caption=dataset_attribution(paste0("TX",c(2006,2011)))) + labs(title="Change in share of census families in low income 2006-2011",fill="Percentage\npoint change",caption=dataset_attribution(paste0("TX",c(2006,2011))))

Analyzing change over longer timelines that span changes in Census geometries involves more work, the tongfen @@ -311,7 +311,7 @@

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/articles/cancensus.html b/docs/articles/cancensus.html index fd647ce0..6b2c0e7c 100644 --- a/docs/articles/cancensus.html +++ b/docs/articles/cancensus.html @@ -51,7 +51,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -215,17 +215,17 @@

Accessing Census Data
 # Returns a data frame with data only
-census_data <- get_census(dataset='CA21', regions=list(CMA="59933"),
+census_data <- get_census(dataset='CA21', regions=list(CMA="59933"),
                           vectors=c("v_CA21_434","v_CA21_435","v_CA21_440"),
                           level='CSD', use_cache = FALSE, geo_format = NA, quiet = TRUE)
 
 # Returns data and geography as an sf-class data frame
-census_data <- get_census(dataset='CA21', regions=list(CMA="59933"),
+census_data <- get_census(dataset='CA21', regions=list(CMA="59933"),
                           vectors=c("v_CA21_434","v_CA21_435","v_CA21_440"),
                           level='CSD', use_cache = FALSE, geo_format = 'sf', quiet = TRUE)
 
 # Returns a SpatialPolygonsDataFrame object with data and geography
-census_data <- get_census(dataset='CA21', regions=list(CMA="59933"),
+census_data <- get_census(dataset='CA21', regions=list(CMA="59933"),
                           vectors=c("v_CA21_434","v_CA21_435","v_CA21_440"),
                           level='CSD', use_cache = FALSE, geo_format = 'sp', quiet = TRUE)

cancensus utilizes caching to increase speed, @@ -236,7 +236,7 @@

Accessing Census Datause_cache = FALSE as a parameter for get_census.

Additional parameters for advanced options can be viewed by running -?get_census.

+?get_census.

Census Datasets

@@ -257,10 +257,10 @@

Census Datasets -

The function list_census_datasets() will show all +

The function list_census_datasets() will show all available datasets alongside their metadata.

-list_census_datasets()
+list_census_datasets()
 #> # A tibble: 29 × 6
 #>    dataset description                           geo_d…¹ attri…² refer…³ refer…⁴
 #>    <chr>   <chr>                                 <chr>   <chr>   <chr>   <chr>  
@@ -278,7 +278,7 @@ 

Census Datasets#> # ²​attribution, ³​reference, ⁴​reference_url

As other Census datasets become available via the CensusMapper API, they will be listed as output when calling -list_census_datasets().

+list_census_datasets().

Census Regions @@ -293,7 +293,7 @@

Census Regionslist_census_regions(dataset), to display all named census regions and their corresponding id for a given census dataset.

-list_census_regions("CA21")
+list_census_regions("CA21")
 #> # A tibble: 5,518 × 8
 #>    region name                      level      pop munic…¹ CMA_UID CD_UID PR_UID
 #>    <chr>  <chr>                     <chr>    <int> <chr>   <chr>   <chr>  <chr> 
@@ -314,7 +314,7 @@ 

Census Regions
 # Retrieves Vancouver and Toronto
-list_census_regions('CA21') %>% 
+list_census_regions('CA21') %>% 
   filter(level == "CMA", name %in% c("Vancouver","Toronto"))
 #> # A tibble: 2 × 8
 #>   region name      level     pop municipal_status CMA_UID CD_UID PR_UID
@@ -322,7 +322,7 @@ 

Census Regions#> 1 35535 Toronto CMA 6202225 B NA NA 35 #> 2 59933 Vancouver CMA 2642825 B NA NA 59 -census_data <- get_census(dataset='CA21', regions=list(CMA=c("59933","35535")), +census_data <- get_census(dataset='CA21', regions=list(CMA=c("59933","35535")), vectors=c("v_CA21_434","v_CA21_435","v_CA21_440"), level='CSD', use_cache = FALSE, quiet = TRUE)

@@ -423,7 +423,7 @@

Displaying available Census varia

Run list_census_vectors(dataset) to view all available Census variables for a given dataset.

-list_census_vectors("CA21")
+list_census_vectors("CA21")
 #> # A tibble: 7,709 × 7
 #>    vector    type   label                          units paren…¹ aggre…² details
 #>    <chr>     <fct>  <chr>                          <fct> <chr>   <chr>   <chr>  
@@ -468,7 +468,7 @@ 
@@ -148,7 +148,7 @@

Census datasets +list_census_datasets()

## # A tibble: 29 × 6
 ##    dataset description                           geo_d…¹ attri…² refer…³ refer…⁴
 ##    <chr>   <chr>                                 <chr>   <chr>   <chr>   <chr>  
@@ -164,7 +164,7 @@ 

Census datasets## 10 CA16xSD 2016 Canada Census xtab - Structural… CA16 StatCa… 98-301… https:… ## # … with 19 more rows, and abbreviated variable names ¹​geo_dataset, ## # ²​attribution, ³​reference, ⁴​reference_url

-

The list_census_datasets() function also provides +

The list_census_datasets() function also provides additional background like series reference code, catalogue reference, and attribution details.

@@ -183,7 +183,7 @@

Variable vectorsView available Census variable vectors

+list_census_vectors('CA21')
## # A tibble: 7,709 × 7
 ##    vector    type   label                          units paren…¹ aggre…² details
 ##    <chr>     <fct>  <chr>                          <fct> <chr>   <chr>   <chr>  
@@ -223,7 +223,7 @@ 

Searching for Census variable vec matches; and, semantic search which works better with search phrases and has tolerance for inexact searches. Switching between search modes is done using the query_type argument when calling -find_census_vectors() function.

+find_census_vectors() function.

Note that variable search is optimized for the Census variables in the main Census datasets. While searches generally work for variables in additional datasets such as cross-tabs and taxfiler data, they have not @@ -235,7 +235,7 @@

## # A tibble: 4 × 4
 ##   vector      type  label    details                                            
 ##   <chr>       <fct> <chr>    <chr>                                              
@@ -245,12 +245,12 @@ 

This, on the other hand, will return a warning.

-find_census_vectors("Ojib-cree", dataset = "CA16", type = "total", query_type = "exact")
+find_census_vectors("Ojib-cree", dataset = "CA16", type = "total", query_type = "exact")
## Warning: No exact matches found. Please check spelling and try again or consider using semantic or keyword search.
 ## See ?find_census_vectors() for more details.
 ## 
 ## Alternatively, you can launch the Censusmapper web API in a browser by calling explore_census_vectors(dataset)
-

Unless otherwise specified, find_census_vectors() will +

Unless otherwise specified, find_census_vectors() will use exact search as the default option.

@@ -262,7 +262,7 @@
## # A tibble: 7 × 4
 ##   vector      type   label                                               details
 ##   <chr>       <fct>  <chr>                                               <chr>  
@@ -278,7 +278,7 @@ 
## # A tibble: 56 × 4
 ##    vector      type  label                                               details
 ##    <chr>       <fct> <chr>                                               <chr>  
@@ -310,14 +310,14 @@ 
## Warning: No exact matches found. Please check spelling and try again or consider using semantic or keyword search.
 ## See ?find_census_vectors() for more details.
 ## 
 ## Alternatively, you can launch the Censusmapper web API in a browser by calling explore_census_vectors(dataset)

This will find the correct Census vector.

-find_census_vectors('ojib cree', dataset = 'CA16', type = 'total', query_type = 'semantic')
+find_census_vectors('ojib cree', dataset = 'CA16', type = 'total', query_type = 'semantic')
## Multiple possible matches. Results ordered by closeness.
## # A tibble: 4 × 4
 ##   vector      type  label    details                                            
@@ -446,7 +446,7 @@ 

Viewing available Census regions +list_census_regions('CA21')

## # A tibble: 5,518 × 8
 ##    region name                      level      pop munic…¹ CMA_UID CD_UID PR_UID
 ##    <chr>  <chr>                     <chr>    <int> <chr>   <chr>   <chr>  <chr> 
@@ -479,7 +479,7 @@ 

Searching through named Census r any geographies that have a name that matches or partially matches the search query.

-search_census_regions("Vancouver","CA21")
+search_census_regions("Vancouver","CA21")

## # A tibble: 7 × 8
 ##   region  name              level     pop municipal_status CMA_UID CD_UID PR_UID
 ##   <chr>   <chr>             <chr>   <int> <chr>            <chr>   <chr>  <chr> 
@@ -531,7 +531,7 @@ 

Exploring C

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/articles/index.html b/docs/articles/index.html index 7a2d8daf..1ead90c1 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -136,7 +136,7 @@

Additional datasets

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/articles/intersecting_geometries.html b/docs/articles/intersecting_geometries.html index c3d779fa..dff03aeb 100644 --- a/docs/articles/intersecting_geometries.html +++ b/docs/articles/intersecting_geometries.html @@ -51,7 +51,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -136,7 +136,7 @@

Bring custom data and geographies or other geospatial data of interest and want to be able to quickly and easily identify the collection of census features that correspond to that region.

-

The get_intersecting_geometries() function is projection +

The get_intersecting_geometries() function is projection agnostic and accepts any valid sf or sfc class object as input. These objects are then reprojected into lat/lon coordinates on the backend to facilitate the intersecting join on the @@ -165,9 +165,9 @@

A simple example
-station_city_ids <- get_intersecting_geometries("CA16", level = "CSD", geometry = cov_station_buffers,
+station_city_ids <- get_intersecting_geometries("CA16", level = "CSD", geometry = cov_station_buffers,
                                                 quiet=TRUE)
-station_ct_ids <- get_intersecting_geometries("CA16", level = "CT", geometry = cov_station_buffers,
+station_ct_ids <- get_intersecting_geometries("CA16", level = "CT", geometry = cov_station_buffers,
                                               quiet=TRUE)

These return a list of census geographic identifiers suitable for use in the ‘region’ argument in get_census. We may be @@ -175,10 +175,10 @@

A simple example
 variables <- c(mode_base="v_CA16_5792",transit="v_CA16_5801",walk="v_CA16_5804")
-station_city <-  get_census("CA16", regions = station_city_ids, vectors = variables, 
+station_city <-  get_census("CA16", regions = station_city_ids, vectors = variables, 
                             geo_format = 'sf', quiet=TRUE) %>% 
   filter(name == "Vancouver (CY)")
-station_cts <-   get_census("CA16", regions = station_ct_ids, vectors = variables, 
+station_cts <-   get_census("CA16", regions = station_ct_ids, vectors = variables, 
                             geo_format = 'sf', quiet=TRUE)

To understand how these relate we plot the data.

@@ -195,9 +195,9 @@ 

A simple exampleTo get a closer match we can cut out the dissemination areas intersecting the station catchment areas.

-station_das <-   get_intersecting_geometries("CA16", level = "DA", geometry = cov_station_buffers,
+station_das <-   get_intersecting_geometries("CA16", level = "DA", geometry = cov_station_buffers,
                                              quiet=TRUE) %>% 
-  get_census("CA16", regions = ., vectors=variables, geo_format = 'sf', quiet=TRUE)
+  get_census("CA16", regions = ., vectors=variables, geo_format = 'sf', quiet=TRUE)
 
 ggplot(station_city) +
   geom_sf(fill=NA) +
@@ -215,7 +215,7 @@ 

A simple exampleget_intersecting_geometries call and then filter down to those intersecting the station buffers.

-station_das2 <- get_census("CA16", regions = station_ct_ids, vectors=variables, 
+station_das2 <- get_census("CA16", regions = station_ct_ids, vectors=variables, 
                            geo_format = 'sf', level="DA", quiet=TRUE) %>%
   sf::st_filter(cov_station_buffers)
 
@@ -268,7 +268,7 @@ 

Addendum

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/articles/statcan_attribute_files.html b/docs/articles/statcan_attribute_files.html index 83a31f3d..9e0e90e0 100644 --- a/docs/articles/statcan_attribute_files.html +++ b/docs/articles/statcan_attribute_files.html @@ -51,7 +51,7 @@ cancensus - 0.5.5 + 0.5.6

@@ -151,7 +151,7 @@

Match between Censu basic building block of census geographies, and tags other levels of geography the Census Block lies in.

-attributes <- get_statcan_geographic_attributes("2021")
+attributes <- get_statcan_geographic_attributes("2021")
 
 attributes %>% colnames()
 #>  [1] "PRUID_PRIDU"                   "PRDGUID_PRIDUGD"              
@@ -230,7 +230,7 @@ 

Match between Censu

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/articles/statcan_wds.html b/docs/articles/statcan_wds.html index 12d642d5..9c29b172 100644 --- a/docs/articles/statcan_wds.html +++ b/docs/articles/statcan_wds.html @@ -51,7 +51,7 @@ cancensus - 0.5.5 + 0.5.6

@@ -133,7 +133,7 @@

StatCan WDS

library(tidyr) library(ggplot2)

Some census datasets have not been imported into CensusMapper, and -thus aren’t available via the get_census() function. But +thus aren’t available via the get_census() function. But the data can be queried directly from the Statistics Canada Web Data Service for the 2021 census, as well as geographic boundary files.

@@ -156,7 +156,7 @@

Ukrainians by Federal Elector base characteristic for ethnic origin and the entry referencing “Ukrainian” that’s a descendant of the base characteristic.

-metadata <- get_statcan_wds_metadata("2021","FED")
+metadata <- get_statcan_wds_metadata("2021","FED")
 
 characteristics <- metadata |> 
   filter(`Codelist en`=="Characteristic") |>
@@ -167,7 +167,7 @@ 

Ukrainians by Federal Elector ukranian <- characteristics |> filter(grepl("Ukrainian",en), `Parent ID`==ethnic_base$ID) -selected_characteristics <- bind_rows(ethnic_base,ukranian) +selected_characteristics <- bind_rows(ethnic_base,ukranian) selected_characteristics |> select(ID,en) #> # A tibble: 2 × 2 @@ -182,7 +182,7 @@

Ukrainians by Federal Elector filter(`Codelist ID`=="CL_GEO_FED") |> pull(ID)

-data <- get_statcan_wds_data(dguids,members=selected_characteristics$ID,gender="Total")
+data <- get_statcan_wds_data(dguids,members=selected_characteristics$ID,gender="Total")

The data comes enriched with metadata to make working with it easier, in particular the CHARACTERISTIC_NAME column contains plain language names. Now we can transform the data to compute @@ -206,7 +206,7 @@

Ukrainians by Federal Elector

To map the data we have to get the geographies.

-fed_geos <- get_statcan_geographies("2021","FED")
+fed_geos <- get_statcan_geographies("2021","FED")

With these we can join on our census data and map it.

 fed_geos |>
@@ -239,7 +239,7 @@ 

Ukrainians by Federal Elector

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/authors.html b/docs/authors.html index 02fd1809..e3bc0f3c 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6

@@ -126,7 +126,7 @@

Citation

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/index.html b/docs/index.html index f4868f71..354efa51 100644 --- a/docs/index.html +++ b/docs/index.html @@ -58,7 +58,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -126,7 +126,7 @@
- +

R build status CRAN_Status_Badge CRAN_Downloads_Badge

cancensus logo

Access, retrieve, and work with Canadian Census data and geography.

    @@ -163,7 +163,7 @@

    API keyLocal Cache

    For performance reasons, and to avoid unnecessarily drawing down API quotas, cancensus caches data queries under the hood. By default, cancensus caches in R’s temporary directory, but this cache is not persistent across sessions. In order to speed up performance, reduce quota usage, and reduce the need for unnecessary network calls, we recommend assigning a persistent local cache using set_cancensus_cache_path(<local cache path>, install = TRUE), this enables more efficient loading and reuse of downloaded data. Users will be prompted with a suggestion to change their default cache location when making API calls if one has not been set yet.

    -

    Starting with version 0.5.2 cancensus will automatically check if for data that has been recalled by Statistics Canada and is stored in the local cache via the new data recall API implemented in CensusMapper. Statistics Canada occasionally detects and corrects errors in their census data releases, and cancensus will download a list of recalled data at the first invocation of get_census() in each session and emit a warning if it detected locally cached data that has been recalled. Removal of the cached recalled data has to be done explicitly by the user via the remove_recalled_chached_data() function. If data was cached with cancensus versions prior to version 0.5.0 there is insufficient metadata to determine all instances of recalled cached data, but the package will check every time cached data is loaded and can identify recalled data at this point at the latest and issues a warning if recalled data is loaded.

    +

    Starting with version 0.5.2 cancensus will automatically check if for data that has been recalled by Statistics Canada and is stored in the local cache via the new data recall API implemented in CensusMapper. Statistics Canada occasionally detects and corrects errors in their census data releases, and cancensus will download a list of recalled data at the first invocation of get_census() in each session and emit a warning if it detected locally cached data that has been recalled. Removal of the cached recalled data has to be done explicitly by the user via the remove_recalled_chached_data() function. If data was cached with cancensus versions prior to version 0.5.0 there is insufficient metadata to determine all instances of recalled cached data, but the package will check every time cached data is loaded and can identify recalled data at this point at the latest and issues a warning if recalled data is loaded.

Currently available datasets @@ -176,13 +176,13 @@

Picking regions and variables# To view available Census datasets -list_census_datasets() +list_census_datasets() # To view available named regions at different levels of Census hierarchy for the 2016 Census (for example) -list_census_regions("CA16") +list_census_regions("CA16") # To view available Census variables for the 2016 Census -list_census_vectors("CA16") +list_census_vectors("CA16")

There is also an interactive tool that is available at the CensusMapper API to visually select regions and variables and generate code for the API call. Calling explore_census_vectors(dataset = "CA16") or explore_census_regions(dataset = "CA16") will open a new browser window to this interactive tool, preconfigured for whichever Census dataset is set as an argument.

@@ -190,11 +190,11 @@

Getting the data

cancensus can return census data with or without associated Census geographical information that can be used for mapping and GIS. By default, cancensus returns tidy tabular data only, but has options to return spatial data objects in either sf or sp formats.

# Return data only
-census_data <- get_census(dataset='CA16', regions=list(CMA="59933"), 
+census_data <- get_census(dataset='CA16', regions=list(CMA="59933"), 
                           vectors=c("v_CA16_408","v_CA16_409","v_CA16_410"), level='CSD')
 
 # Return an sf-class data frame
-census_data <- get_census(dataset='CA16', regions=list(CMA="59933"), 
+census_data <- get_census(dataset='CA16', regions=list(CMA="59933"), 
                           vectors=c("v_CA16_408","v_CA16_409","v_CA16_410"), level='CSD', geo_format = "sf")

cancensus attempts to minimize bandwidth usage and download time by caching downloads. When attempting to download data that has previously been downloaded, cancensus will instead access the locally cached equivalent.

@@ -274,13 +274,13 @@

Cite cancensus

If you wish to cite cancensus:

-

von Bergmann, J., Aaron Jacobs, Dmitry Shkolnik (2022). cancensus: R package to access, retrieve, and work with Canadian Census data and geography. v0.5.5.

+

von Bergmann, J., Aaron Jacobs, Dmitry Shkolnik (2022). cancensus: R package to access, retrieve, and work with Canadian Census data and geography. v0.5.6.

A BibTeX entry for LaTeX users is

  @Manual{cancensus,
     author = {Jens {von Bergmann} and Dmitry Shkolnik and Aaron Jacobs},
     title = {cancensus: R package to access, retrieve, and work with Canadian Census data and geography},
     year = {2022},
-    note = {R package version 0.5.5},
+    note = {R package version 0.5.6},
     url = {https://mountainmath.github.io/cancensus/}
   }
@@ -348,14 +348,7 @@

Developers

-
-

Dev status

-
    -
  • R build status
  • -
  • CRAN_Status_Badge
  • -
  • CRAN_Downloads_Badge
  • -
-
+ @@ -368,7 +361,7 @@

Dev status

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/news/index.html b/docs/news/index.html index 05a00d6c..b7c23883 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -85,7 +85,12 @@

Changelog

- + +
  • fix issue when using named vectors to query data for non-existent geographies, return NULL in this case instead of throwing error
  • +
  • support newly released Forward Sortation Area geography for statcan geography and WDS functionality
  • +
+
+
  • add functionality for direct access to StatCan census WDS for 2021
  • add functionality to download original StatCan geographies for 2021
  • update CODES_TABLE for 2021 census
  • @@ -93,7 +98,7 @@
@@ -188,17 +193,17 @@

Minor changescancensus 0.3.0

Major changes

-

Minor changes

@@ -301,7 +306,7 @@

Major changes

Minor changes

-
@@ -339,7 +344,7 @@

Major changes
-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 7508534c..5d267424 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,5 +1,5 @@ pandoc: 2.19.2 -pkgdown: 2.0.6 +pkgdown: 2.0.7 pkgdown_sha: ~ articles: Dwellings_by_document_type_cross_tabulation: Dwellings_by_document_type_cross_tabulation.html @@ -10,7 +10,7 @@ articles: intersecting_geometries: intersecting_geometries.html statcan_attribute_files: statcan_attribute_files.html statcan_wds: statcan_wds.html -last_built: 2023-01-21T22:13Z +last_built: 2023-04-17T22:50Z urls: reference: https://mountainmath.github.io/cancensus/reference article: https://mountainmath.github.io/cancensus/articles diff --git a/docs/reference/CODES_TABLE.html b/docs/reference/CODES_TABLE.html index 9603ac10..ecd2fce0 100644 --- a/docs/reference/CODES_TABLE.html +++ b/docs/reference/CODES_TABLE.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -111,7 +111,7 @@

Author

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/COV_SKYTRAIN_STATIONS.html b/docs/reference/COV_SKYTRAIN_STATIONS.html index b45c32e9..93c5b031 100644 --- a/docs/reference/COV_SKYTRAIN_STATIONS.html +++ b/docs/reference/COV_SKYTRAIN_STATIONS.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -111,7 +111,7 @@

Author

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/add_unique_names_to_region_list.html b/docs/reference/add_unique_names_to_region_list.html index 467a52a3..ba86e5ee 100644 --- a/docs/reference/add_unique_names_to_region_list.html +++ b/docs/reference/add_unique_names_to_region_list.html @@ -26,7 +26,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -135,7 +135,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/as_census_region_list.html b/docs/reference/as_census_region_list.html index cd2b5d66..4e82fb3e 100644 --- a/docs/reference/as_census_region_list.html +++ b/docs/reference/as_census_region_list.html @@ -29,7 +29,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -141,7 +141,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/census_vectors.html b/docs/reference/census_vectors.html index 917e9077..9b70b4e1 100644 --- a/docs/reference/census_vectors.html +++ b/docs/reference/census_vectors.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -133,7 +133,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/child_census_vectors.html b/docs/reference/child_census_vectors.html index 6982bc5c..e5da23ae 100644 --- a/docs/reference/child_census_vectors.html +++ b/docs/reference/child_census_vectors.html @@ -29,7 +29,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -178,7 +178,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/dataset_attribution.html b/docs/reference/dataset_attribution.html index e03bbac3..7057e539 100644 --- a/docs/reference/dataset_attribution.html +++ b/docs/reference/dataset_attribution.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -126,7 +126,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/explore_census_regions.html b/docs/reference/explore_census_regions.html index 26cb9418..bf9080c4 100644 --- a/docs/reference/explore_census_regions.html +++ b/docs/reference/explore_census_regions.html @@ -27,7 +27,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -133,7 +133,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/explore_census_vectors.html b/docs/reference/explore_census_vectors.html index 1633436d..709d1c52 100644 --- a/docs/reference/explore_census_vectors.html +++ b/docs/reference/explore_census_vectors.html @@ -27,7 +27,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -133,7 +133,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/find_census_vectors.html b/docs/reference/find_census_vectors.html index 3673a80d..f6033e6c 100644 --- a/docs/reference/find_census_vectors.html +++ b/docs/reference/find_census_vectors.html @@ -36,7 +36,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -212,7 +212,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_census.html b/docs/reference/get_census.html index 9a284105..70cbd3f5 100644 --- a/docs/reference/get_census.html +++ b/docs/reference/get_census.html @@ -24,7 +24,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -200,7 +200,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_census_geometry.html b/docs/reference/get_census_geometry.html index f9c3829b..2fb3aeaf 100644 --- a/docs/reference/get_census_geometry.html +++ b/docs/reference/get_census_geometry.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -146,7 +146,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_intersecting_geometries.html b/docs/reference/get_intersecting_geometries.html index 76437046..8484029d 100644 --- a/docs/reference/get_intersecting_geometries.html +++ b/docs/reference/get_intersecting_geometries.html @@ -28,7 +28,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -181,7 +181,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_recalled_database.html b/docs/reference/get_recalled_database.html index 228ac756..754eee91 100644 --- a/docs/reference/get_recalled_database.html +++ b/docs/reference/get_recalled_database.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -129,7 +129,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_statcan_geo_suite.html b/docs/reference/get_statcan_geo_suite.html index f1897127..4f519094 100644 --- a/docs/reference/get_statcan_geo_suite.html +++ b/docs/reference/get_statcan_geo_suite.html @@ -25,7 +25,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -139,7 +139,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_statcan_geographic_attributes.html b/docs/reference/get_statcan_geographic_attributes.html index 3b076588..24114f34 100644 --- a/docs/reference/get_statcan_geographic_attributes.html +++ b/docs/reference/get_statcan_geographic_attributes.html @@ -27,7 +27,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -138,7 +138,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_statcan_geographies.html b/docs/reference/get_statcan_geographies.html index eb10cd0a..e46ed422 100644 --- a/docs/reference/get_statcan_geographies.html +++ b/docs/reference/get_statcan_geographies.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -109,7 +109,7 @@

Arguments

level

geographic level to return the data for, valid choices are -"PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR"

+"PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR", "FSA"

type
@@ -160,7 +160,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_statcan_geography_relationships.html b/docs/reference/get_statcan_geography_relationships.html index 2fc6e8ab..9a306eae 100644 --- a/docs/reference/get_statcan_geography_relationships.html +++ b/docs/reference/get_statcan_geography_relationships.html @@ -26,7 +26,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -137,7 +137,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_statcan_wds_data.html b/docs/reference/get_statcan_wds_data.html index 5e837196..f91b8ac4 100644 --- a/docs/reference/get_statcan_wds_data.html +++ b/docs/reference/get_statcan_wds_data.html @@ -25,7 +25,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -155,7 +155,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/get_statcan_wds_metadata.html b/docs/reference/get_statcan_wds_metadata.html index e649e5cd..b42d6605 100644 --- a/docs/reference/get_statcan_wds_metadata.html +++ b/docs/reference/get_statcan_wds_metadata.html @@ -24,7 +24,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -103,7 +103,7 @@

Arguments

level

geographic level to return the data for, valid choices are -"PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR"

+"PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR", "FSA"

refresh
@@ -137,7 +137,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/index.html b/docs/reference/index.html index 6a49299f..0beb8715 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -107,8 +107,8 @@

Data discovery as_census_region_list()

Convert a (suitably filtered) data frame from -list_census_regions to a list suitable for passing to -get_census.

+list_census_regions to a list suitable for passing to +get_census.

list_census_vectors()

@@ -262,7 +262,7 @@

Data

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/label_vectors.html b/docs/reference/label_vectors.html index 77845aff..94de4893 100644 --- a/docs/reference/label_vectors.html +++ b/docs/reference/label_vectors.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -133,7 +133,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/list_cancensus_cache.html b/docs/reference/list_cancensus_cache.html index 1fd9286b..3034cabc 100644 --- a/docs/reference/list_cancensus_cache.html +++ b/docs/reference/list_cancensus_cache.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -104,20 +104,20 @@

Value

Examples

# list add the cached census data
 list_cancensus_cache()
-#> # A tibble: 1,453 × 11
+#> # A tibble: 1,579 × 11
 #>    path         dataset regions level vectors created_at          version   size
 #>    <chr>        <chr>   <chr>   <chr> <chr>   <dttm>              <chr>    <dbl>
-#>  1 CM_data_009… CA06    "[\"{\… DA    "[]"    2022-05-21 15:28:16 d.1       1663
-#>  2 CM_data_00a… CA16    "[\"{\… DA    "[\"Po… 2022-05-14 16:24:07 d.1      16663
-#>  3 CM_data_014… CA06    "{\"CS… CT    "[\"v_… 2022-11-03 04:34:33 d.3      13801
-#>  4 CM_data_016… CA01    "{\"CS… DB    "[\"Po… 2022-12-12 12:54:14 d.3     179740
-#>  5 CM_data_016… CA16    "[\"{\… DA    "[]"    2022-05-21 15:28:24 d.1       1658
-#>  6 CM_data_01c… CA16    "[\"{\… CT    "[\"v_… 2022-07-13 15:23:08 d.1       5258
-#>  7 CM_data_01f… CA1996  "{\"CS… CSD   "[\"v_… 2022-08-18 19:13:18 d.2       8898
-#>  8 CM_data_024… CA16    "[\"{\… Regi… "[\"v_… 2022-04-27 23:26:47 d.1       3603
-#>  9 CM_data_02b… CA21    "{\"CD… CT    "[\"v_… 2022-12-31 09:37:21 d.4        361
-#> 10 CM_data_02b… CA16    "{\"C\… CT    "[\"v_… 2022-10-06 10:39:55 d.2     143505
-#> # … with 1,443 more rows, and 3 more variables: last_accessed <dttm>,
+#>  1 CM_data_007… CA21    "{\"CM… Regi… "[]"    2023-01-26 07:18:01 d.4       1882
+#>  2 CM_data_009… CA06    "[\"{\… DA    "[]"    2022-05-21 15:28:16 d.1       1663
+#>  3 CM_data_00a… CA16    "[\"{\… DA    "[\"Po… 2022-05-14 16:24:07 d.1      16663
+#>  4 CM_data_014… CA06    "{\"CS… CT    "[\"v_… 2022-11-03 04:34:33 d.3      13801
+#>  5 CM_data_016… CA01    "{\"CS… DB    "[\"Po… 2022-12-12 12:54:14 d.3     179740
+#>  6 CM_data_016… CA16    "[\"{\… DA    "[]"    2022-05-21 15:28:24 d.1       1658
+#>  7 CM_data_01c… CA16    "[\"{\… CT    "[\"v_… 2022-07-13 15:23:08 d.1       5258
+#>  8 CM_data_01f… CA1996  "{\"CS… CSD   "[\"v_… 2022-08-18 19:13:18 d.2       8898
+#>  9 CM_data_024… CA16    "[\"{\… Regi… "[\"v_… 2022-04-27 23:26:47 d.1       3603
+#> 10 CM_data_02b… CA21    "{\"CD… CT    "[\"v_… 2022-12-31 09:37:21 d.4        361
+#> # … with 1,569 more rows, and 3 more variables: last_accessed <dttm>,
 #> #   access_count <dbl>, resolution <chr>
 
 
@@ -134,7 +134,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/list_census_datasets.html b/docs/reference/list_census_datasets.html index 7075ed41..7e4c1745 100644 --- a/docs/reference/list_census_datasets.html +++ b/docs/reference/list_census_datasets.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -152,7 +152,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/list_census_regions.html b/docs/reference/list_census_regions.html index d2fda857..8eec1337 100644 --- a/docs/reference/list_census_regions.html +++ b/docs/reference/list_census_regions.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -155,22 +155,9 @@

Value

Examples

-
list_census_regions('CA16')
-#> Reading regions list from local cache.
-#> # A tibble: 5,518 × 8
-#>    region name                      level      pop munic…¹ CMA_UID CD_UID PR_UID
-#>    <chr>  <chr>                     <chr>    <int> <chr>   <chr>   <chr>  <chr> 
-#>  1 01     Canada                    C     35151728 NA      NA      NA     NA    
-#>  2 35     Ontario                   PR    13448494 NA      NA      NA     NA    
-#>  3 24     Quebec                    PR     8164361 NA      NA      NA     NA    
-#>  4 59     British Columbia          PR     4648055 NA      NA      NA     NA    
-#>  5 48     Alberta                   PR     4067175 NA      NA      NA     NA    
-#>  6 46     Manitoba                  PR     1278365 NA      NA      NA     NA    
-#>  7 47     Saskatchewan              PR     1098352 NA      NA      NA     NA    
-#>  8 12     Nova Scotia               PR      923598 NA      NA      NA     NA    
-#>  9 13     New Brunswick             PR      747101 NA      NA      NA     NA    
-#> 10 10     Newfoundland and Labrador PR      519716 NA      NA      NA     NA    
-#> # … with 5,508 more rows, and abbreviated variable name ¹​municipal_status
+    
if (FALSE) {
+list_census_regions('CA16')
+}
 
@@ -185,7 +172,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/list_census_vectors.html b/docs/reference/list_census_vectors.html index d057b115..6afd20c9 100644 --- a/docs/reference/list_census_vectors.html +++ b/docs/reference/list_census_vectors.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -148,7 +148,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/list_recalled_cached_data.html b/docs/reference/list_recalled_cached_data.html index b7e5e8a5..e3d9b790 100644 --- a/docs/reference/list_recalled_cached_data.html +++ b/docs/reference/list_recalled_cached_data.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -133,7 +133,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/parent_census_vectors.html b/docs/reference/parent_census_vectors.html index 002f2132..2c840ed0 100644 --- a/docs/reference/parent_census_vectors.html +++ b/docs/reference/parent_census_vectors.html @@ -29,7 +29,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -149,7 +149,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/remove_from_cancensus_cache.html b/docs/reference/remove_from_cancensus_cache.html index a2c0b78f..129a4224 100644 --- a/docs/reference/remove_from_cancensus_cache.html +++ b/docs/reference/remove_from_cancensus_cache.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -128,7 +128,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/remove_recalled_cached_data.html b/docs/reference/remove_recalled_cached_data.html index 937014c7..3b500fad 100644 --- a/docs/reference/remove_recalled_cached_data.html +++ b/docs/reference/remove_recalled_cached_data.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -119,7 +119,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/search_census_regions.html b/docs/reference/search_census_regions.html index 4bc26268..712574c2 100644 --- a/docs/reference/search_census_regions.html +++ b/docs/reference/search_census_regions.html @@ -27,7 +27,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -153,7 +153,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/search_census_vectors.html b/docs/reference/search_census_vectors.html index fa843220..feec8ee1 100644 --- a/docs/reference/search_census_vectors.html +++ b/docs/reference/search_census_vectors.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -153,7 +153,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/set_cancensus_api_key.html b/docs/reference/set_cancensus_api_key.html index 7716eafc..4b5c8966 100644 --- a/docs/reference/set_cancensus_api_key.html +++ b/docs/reference/set_cancensus_api_key.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -130,7 +130,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/set_cancensus_cache_path.html b/docs/reference/set_cancensus_cache_path.html index b9d1c092..cb0b31c7 100644 --- a/docs/reference/set_cancensus_cache_path.html +++ b/docs/reference/set_cancensus_cache_path.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -130,7 +130,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/show_cancensus_api_key.html b/docs/reference/show_cancensus_api_key.html index ffe240d2..995d5a80 100644 --- a/docs/reference/show_cancensus_api_key.html +++ b/docs/reference/show_cancensus_api_key.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -112,7 +112,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/reference/show_cancensus_cache_path.html b/docs/reference/show_cancensus_cache_path.html index ef36f064..2125a52e 100644 --- a/docs/reference/show_cancensus_cache_path.html +++ b/docs/reference/show_cancensus_cache_path.html @@ -23,7 +23,7 @@ cancensus - 0.5.5 + 0.5.6 @@ -112,7 +112,7 @@

Examples

-

Site built with pkgdown 2.0.6.

+

Site built with pkgdown 2.0.7.

diff --git a/man/get_statcan_geographies.Rd b/man/get_statcan_geographies.Rd index 1a17d3bf..4ac50e88 100644 --- a/man/get_statcan_geographies.Rd +++ b/man/get_statcan_geographies.Rd @@ -18,7 +18,7 @@ get_statcan_geographies( \item{census_year}{census year to get the data for, right now only 2021 is supported} \item{level}{geographic level to return the data for, valid choices are -"PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR"} +"PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR", "FSA"} \item{type}{type of geographic data, valid choices area "cartographic" or "digital"} diff --git a/man/get_statcan_wds_metadata.Rd b/man/get_statcan_wds_metadata.Rd index 9fec9992..ba0c8e15 100644 --- a/man/get_statcan_wds_metadata.Rd +++ b/man/get_statcan_wds_metadata.Rd @@ -10,7 +10,7 @@ get_statcan_wds_metadata(census_year, level, refresh = FALSE) \item{census_year}{census year to get the data for, right now only 2021 is supported} \item{level}{geographic level to return the data for, valid choices are -"PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR"} +"PR","CD","CMACA","CSD","CT","ADA","DA","ER","FED","DPL","POPCNTR", "FSA"} \item{refresh}{default is `FALSE` will refresh the temporary cache if `TRUE`} } From e23749281dcc429a32ce809180cd16d7639693b1 Mon Sep 17 00:00:00 2001 From: Jens von Bergmann Date: Thu, 27 Apr 2023 11:45:52 -0700 Subject: [PATCH 5/8] replace new native R pipe with dplyr pipe to avoid implicit dependency on R version 4.1+ --- NEWS.md | 1 + R/census_regions.R | 8 +- R/geographies.R | 2 +- R/wds.R | 42 +- cran-comments.md | 1 + docs/articles/Making_maps_with_cancensus.html | 8 +- .../htmlwidgets-1.5.4/htmlwidgets.js | 903 ------------------ docs/news/index.html | 2 + docs/pkgdown.yml | 2 +- docs/reference/list_cancensus_cache.html | 6 +- 10 files changed, 38 insertions(+), 937 deletions(-) delete mode 100644 docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.5.4/htmlwidgets.js diff --git a/NEWS.md b/NEWS.md index 71cbe0ea..bd049493 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,7 @@ - fix issue when using named vectors to query data for non-existent geographies, return NULL in this case instead of throwing error - fix problem with population centre geographic data download - support newly released Forward Sortation Area geography for statcan geography and WDS functionality +- remove instances of new native R pipe |> with dplyr pipe %>% to preserve compatibility with older R versions # cancensus 0.5.5 diff --git a/R/census_regions.R b/R/census_regions.R index 705b75c2..1c394be7 100644 --- a/R/census_regions.R +++ b/R/census_regions.R @@ -202,16 +202,16 @@ add_unique_names_to_region_list <- function(region_list) { dplyr::group_by(.data$name) %>% dplyr::mutate(count=dplyr::n()) %>% dplyr::mutate(Name=dplyr::case_when(.data$count==1 ~ name, - TRUE ~ paste0(.data$name," (",.data$municipal_status,")"))) |> + TRUE ~ paste0(.data$name," (",.data$municipal_status,")"))) %>% dplyr::group_by(.data$Name) %>% dplyr::mutate(count=dplyr::n()) %>% dplyr::mutate(Name=dplyr::case_when(.data$count==1 ~ Name, - TRUE ~ paste0(.data$Name," (",.data$region,")"))) |> - dplyr::select(-.data$count) |> + TRUE ~ paste0(.data$Name," (",.data$region,")"))) %>% + dplyr::select(-.data$count) %>% dplyr::ungroup() if (length(gs)>1) { - r <- r |> + r <- r %>% dplyr::group_by(dplyr::across(dplyr::all_of(gs))) } r diff --git a/R/geographies.R b/R/geographies.R index 71ec90d7..0ab321bf 100644 --- a/R/geographies.R +++ b/R/geographies.R @@ -37,7 +37,7 @@ get_statcan_geographies <- function(census_year,level,type="cartographic", } level_map <- c("CMACA"="CMA","CA"="CMA","POPCNTR"="PC","POPCTR"="PC") if (level %in% names(level_map)) level <-level_map[[level]] - geo_base_path <- cancensus:::cache_path("geographies") + geo_base_path <- cache_path("geographies") if (!dir.exists(geo_base_path)) dir.create(geo_base_path) geo_base_path <- file.path(geo_base_path,type) if (!dir.exists(geo_base_path)) dir.create(geo_base_path) diff --git a/R/wds.R b/R/wds.R index 04f75895..71ef6510 100644 --- a/R/wds.R +++ b/R/wds.R @@ -34,24 +34,24 @@ get_statcan_wds_metadata <- function(census_year,level,refresh=FALSE){ code_lists <- xml2::xml_find_all(d,"//structure:Codelist") meta_data <- lapply(code_lists, \(cl){ - codelist_id <- cl |> xml2::xml_attr("id") - agencyID <- cl |> xml2::xml_attr("agencyID") - codelist_en <- cl |> xml2::xml_find_all("common:Name[@xml:lang='en']") |> xml2::xml_text() - codelist_fr <- cl |> xml2::xml_find_all("common:Name[@xml:lang='fr']") |> xml2::xml_text() - description_en <- cl |> xml2::xml_find_all("common:Name[@xml:lang='en']") |> xml2::xml_text() - description_fr <- cl |> xml2::xml_find_all("common:Name[@xml:lang='fr']") |> xml2::xml_text() - codes <- cl |> xml2::xml_find_all("structure:Code") + codelist_id <- cl %>% xml2::xml_attr("id") + agencyID <- cl %>% xml2::xml_attr("agencyID") + codelist_en <- cl %>% xml2::xml_find_all("common:Name[@xml:lang='en']") %>% xml2::xml_text() + codelist_fr <- cl %>% xml2::xml_find_all("common:Name[@xml:lang='fr']") %>% xml2::xml_text() + description_en <- cl %>% xml2::xml_find_all("common:Name[@xml:lang='en']") %>% xml2::xml_text() + description_fr <- cl %>% xml2::xml_find_all("common:Name[@xml:lang='fr']") %>% xml2::xml_text() + codes <- cl %>% xml2::xml_find_all("structure:Code") dplyr::tibble(`Agency ID`=agencyID, `Codelist ID`=codelist_id, `Codelist en`=codelist_en, `Codelist fr`=codelist_fr, - ID=codes |> xml2::xml_attr("id"), - en=codes |> xml2::xml_find_all("common:Name[@xml:lang='en']") |> xml2::xml_text(), - fr=codes |> xml2::xml_find_all("common:Name[@xml:lang='fr']") |> xml2::xml_text(), - `Parent ID`=codes |> xml2::xml_find_all("structure:Parent/Ref",flatten=FALSE) |> - lapply(\(d)ifelse(is.null(d),NA,xml2::xml_attr(d,"id"))) |> unlist() + ID=codes %>% xml2::xml_attr("id"), + en=codes %>% xml2::xml_find_all("common:Name[@xml:lang='en']") %>% xml2::xml_text(), + fr=codes %>% xml2::xml_find_all("common:Name[@xml:lang='fr']") %>% xml2::xml_text(), + `Parent ID`=codes %>% xml2::xml_find_all("structure:Parent/Ref",flatten=FALSE) %>% + lapply(\(d)ifelse(is.null(d),NA,xml2::xml_attr(d,"id"))) %>% unlist() ) - }) |> + }) %>% dplyr::bind_rows() meta_data } @@ -116,22 +116,22 @@ get_statcan_wds_data <- function(DGUIDs, census_year <- "2021" meta_data <- get_statcan_wds_metadata(census_year,level,refresh = refresh) - levels <- meta_data |> + levels <- meta_data %>% dplyr::filter(.data$`Codelist ID`=="CL_GEO_LEVEL") - meta_geos <- meta_data |> + meta_geos <- meta_data %>% dplyr::filter(.data$`Codelist ID`==paste0("CL_GEO_",level)) - meta_characteristics <- meta_data |> + meta_characteristics <- meta_data %>% dplyr::filter(.data$`Codelist ID`=="CL_CHARACTERISTIC") name_field <- language #paste0(language,"_description") - data <- readr::read_csv(wds_data_tempfile,col_types = readr::cols(.default="c")) |> - dplyr::mutate(dplyr::across(dplyr::matches("OBS_VALUE|TNR_CI_"),as.numeric)) |> - dplyr::left_join(meta_geos |> + data <- readr::read_csv(wds_data_tempfile,col_types = readr::cols(.default="c")) %>% + dplyr::mutate(dplyr::across(dplyr::matches("OBS_VALUE|TNR_CI_"),as.numeric)) %>% + dplyr::left_join(meta_geos %>% dplyr::select(GEO_DESC=.data$ID,GEO_NAME=!!as.name(name_field)), - by="GEO_DESC") |> - dplyr::left_join(meta_characteristics |> + by="GEO_DESC") %>% + dplyr::left_join(meta_characteristics %>% dplyr::select(CHARACTERISTIC=.data$ID,CHARACTERISTIC_NAME=!!as.name(name_field)), by="CHARACTERISTIC") diff --git a/cran-comments.md b/cran-comments.md index 3fbce461..7e5da72b 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -2,6 +2,7 @@ - fix issue when using named vectors to query data for non-existent geographies, return NULL in this case instead of throwing error - fix problem with population centre geographic data download - support newly released Forward Sortation Area geography for statcan geography and WDS functionality +- remove instances of new native R pipe |> with dplyr pipe %>% to preserve compatibility with older R versions # Update 0.5.5 - add functionality for direct access to StatCan census WDS for 2021 diff --git a/docs/articles/Making_maps_with_cancensus.html b/docs/articles/Making_maps_with_cancensus.html index ce39babf..030a006c 100644 --- a/docs/articles/Making_maps_with_cancensus.html +++ b/docs/articles/Making_maps_with_cancensus.html @@ -228,8 +228,8 @@

Interactive maps with leafletleaflet(toronto) %>% addProviderTiles(providers$CartoDB.Positron) %>% addPolygons() -
-

Adding colour ramps and additional interactivity takes a little bit +

+

Adding colour ramps and additional interactivity takes a little bit more work but is still pretty easy to implement. Following this example we can specify the colour ramp to match our needs.

@@ -242,8 +242,8 @@ 

Interactive maps with leaflet= 1, opacity = 1, fillOpacity = 0.65)

-
- +
+ diff --git a/docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.5.4/htmlwidgets.js b/docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.5.4/htmlwidgets.js deleted file mode 100644 index da8b2367..00000000 --- a/docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.5.4/htmlwidgets.js +++ /dev/null @@ -1,903 +0,0 @@ -(function() { - // If window.HTMLWidgets is already defined, then use it; otherwise create a - // new object. This allows preceding code to set options that affect the - // initialization process (though none currently exist). - window.HTMLWidgets = window.HTMLWidgets || {}; - - // See if we're running in a viewer pane. If not, we're in a web browser. - var viewerMode = window.HTMLWidgets.viewerMode = - /\bviewer_pane=1\b/.test(window.location); - - // See if we're running in Shiny mode. If not, it's a static document. - // Note that static widgets can appear in both Shiny and static modes, but - // obviously, Shiny widgets can only appear in Shiny apps/documents. - var shinyMode = window.HTMLWidgets.shinyMode = - typeof(window.Shiny) !== "undefined" && !!window.Shiny.outputBindings; - - // We can't count on jQuery being available, so we implement our own - // version if necessary. - function querySelectorAll(scope, selector) { - if (typeof(jQuery) !== "undefined" && scope instanceof jQuery) { - return scope.find(selector); - } - if (scope.querySelectorAll) { - return scope.querySelectorAll(selector); - } - } - - function asArray(value) { - if (value === null) - return []; - if ($.isArray(value)) - return value; - return [value]; - } - - // Implement jQuery's extend - function extend(target /*, ... */) { - if (arguments.length == 1) { - return target; - } - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var prop in source) { - if (source.hasOwnProperty(prop)) { - target[prop] = source[prop]; - } - } - } - return target; - } - - // IE8 doesn't support Array.forEach. - function forEach(values, callback, thisArg) { - if (values.forEach) { - values.forEach(callback, thisArg); - } else { - for (var i = 0; i < values.length; i++) { - callback.call(thisArg, values[i], i, values); - } - } - } - - // Replaces the specified method with the return value of funcSource. - // - // Note that funcSource should not BE the new method, it should be a function - // that RETURNS the new method. funcSource receives a single argument that is - // the overridden method, it can be called from the new method. The overridden - // method can be called like a regular function, it has the target permanently - // bound to it so "this" will work correctly. - function overrideMethod(target, methodName, funcSource) { - var superFunc = target[methodName] || function() {}; - var superFuncBound = function() { - return superFunc.apply(target, arguments); - }; - target[methodName] = funcSource(superFuncBound); - } - - // Add a method to delegator that, when invoked, calls - // delegatee.methodName. If there is no such method on - // the delegatee, but there was one on delegator before - // delegateMethod was called, then the original version - // is invoked instead. - // For example: - // - // var a = { - // method1: function() { console.log('a1'); } - // method2: function() { console.log('a2'); } - // }; - // var b = { - // method1: function() { console.log('b1'); } - // }; - // delegateMethod(a, b, "method1"); - // delegateMethod(a, b, "method2"); - // a.method1(); - // a.method2(); - // - // The output would be "b1", "a2". - function delegateMethod(delegator, delegatee, methodName) { - var inherited = delegator[methodName]; - delegator[methodName] = function() { - var target = delegatee; - var method = delegatee[methodName]; - - // The method doesn't exist on the delegatee. Instead, - // call the method on the delegator, if it exists. - if (!method) { - target = delegator; - method = inherited; - } - - if (method) { - return method.apply(target, arguments); - } - }; - } - - // Implement a vague facsimilie of jQuery's data method - function elementData(el, name, value) { - if (arguments.length == 2) { - return el["htmlwidget_data_" + name]; - } else if (arguments.length == 3) { - el["htmlwidget_data_" + name] = value; - return el; - } else { - throw new Error("Wrong number of arguments for elementData: " + - arguments.length); - } - } - - // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex - function escapeRegExp(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - } - - function hasClass(el, className) { - var re = new RegExp("\\b" + escapeRegExp(className) + "\\b"); - return re.test(el.className); - } - - // elements - array (or array-like object) of HTML elements - // className - class name to test for - // include - if true, only return elements with given className; - // if false, only return elements *without* given className - function filterByClass(elements, className, include) { - var results = []; - for (var i = 0; i < elements.length; i++) { - if (hasClass(elements[i], className) == include) - results.push(elements[i]); - } - return results; - } - - function on(obj, eventName, func) { - if (obj.addEventListener) { - obj.addEventListener(eventName, func, false); - } else if (obj.attachEvent) { - obj.attachEvent(eventName, func); - } - } - - function off(obj, eventName, func) { - if (obj.removeEventListener) - obj.removeEventListener(eventName, func, false); - else if (obj.detachEvent) { - obj.detachEvent(eventName, func); - } - } - - // Translate array of values to top/right/bottom/left, as usual with - // the "padding" CSS property - // https://developer.mozilla.org/en-US/docs/Web/CSS/padding - function unpackPadding(value) { - if (typeof(value) === "number") - value = [value]; - if (value.length === 1) { - return {top: value[0], right: value[0], bottom: value[0], left: value[0]}; - } - if (value.length === 2) { - return {top: value[0], right: value[1], bottom: value[0], left: value[1]}; - } - if (value.length === 3) { - return {top: value[0], right: value[1], bottom: value[2], left: value[1]}; - } - if (value.length === 4) { - return {top: value[0], right: value[1], bottom: value[2], left: value[3]}; - } - } - - // Convert an unpacked padding object to a CSS value - function paddingToCss(paddingObj) { - return paddingObj.top + "px " + paddingObj.right + "px " + paddingObj.bottom + "px " + paddingObj.left + "px"; - } - - // Makes a number suitable for CSS - function px(x) { - if (typeof(x) === "number") - return x + "px"; - else - return x; - } - - // Retrieves runtime widget sizing information for an element. - // The return value is either null, or an object with fill, padding, - // defaultWidth, defaultHeight fields. - function sizingPolicy(el) { - var sizingEl = document.querySelector("script[data-for='" + el.id + "'][type='application/htmlwidget-sizing']"); - if (!sizingEl) - return null; - var sp = JSON.parse(sizingEl.textContent || sizingEl.text || "{}"); - if (viewerMode) { - return sp.viewer; - } else { - return sp.browser; - } - } - - // @param tasks Array of strings (or falsy value, in which case no-op). - // Each element must be a valid JavaScript expression that yields a - // function. Or, can be an array of objects with "code" and "data" - // properties; in this case, the "code" property should be a string - // of JS that's an expr that yields a function, and "data" should be - // an object that will be added as an additional argument when that - // function is called. - // @param target The object that will be "this" for each function - // execution. - // @param args Array of arguments to be passed to the functions. (The - // same arguments will be passed to all functions.) - function evalAndRun(tasks, target, args) { - if (tasks) { - forEach(tasks, function(task) { - var theseArgs = args; - if (typeof(task) === "object") { - theseArgs = theseArgs.concat([task.data]); - task = task.code; - } - var taskFunc = tryEval(task); - if (typeof(taskFunc) !== "function") { - throw new Error("Task must be a function! Source:\n" + task); - } - taskFunc.apply(target, theseArgs); - }); - } - } - - // Attempt eval() both with and without enclosing in parentheses. - // Note that enclosing coerces a function declaration into - // an expression that eval() can parse - // (otherwise, a SyntaxError is thrown) - function tryEval(code) { - var result = null; - try { - result = eval("(" + code + ")"); - } catch(error) { - if (!(error instanceof SyntaxError)) { - throw error; - } - try { - result = eval(code); - } catch(e) { - if (e instanceof SyntaxError) { - throw error; - } else { - throw e; - } - } - } - return result; - } - - function initSizing(el) { - var sizing = sizingPolicy(el); - if (!sizing) - return; - - var cel = document.getElementById("htmlwidget_container"); - if (!cel) - return; - - if (typeof(sizing.padding) !== "undefined") { - document.body.style.margin = "0"; - document.body.style.padding = paddingToCss(unpackPadding(sizing.padding)); - } - - if (sizing.fill) { - document.body.style.overflow = "hidden"; - document.body.style.width = "100%"; - document.body.style.height = "100%"; - document.documentElement.style.width = "100%"; - document.documentElement.style.height = "100%"; - if (cel) { - cel.style.position = "absolute"; - var pad = unpackPadding(sizing.padding); - cel.style.top = pad.top + "px"; - cel.style.right = pad.right + "px"; - cel.style.bottom = pad.bottom + "px"; - cel.style.left = pad.left + "px"; - el.style.width = "100%"; - el.style.height = "100%"; - } - - return { - getWidth: function() { return cel.offsetWidth; }, - getHeight: function() { return cel.offsetHeight; } - }; - - } else { - el.style.width = px(sizing.width); - el.style.height = px(sizing.height); - - return { - getWidth: function() { return el.offsetWidth; }, - getHeight: function() { return el.offsetHeight; } - }; - } - } - - // Default implementations for methods - var defaults = { - find: function(scope) { - return querySelectorAll(scope, "." + this.name); - }, - renderError: function(el, err) { - var $el = $(el); - - this.clearError(el); - - // Add all these error classes, as Shiny does - var errClass = "shiny-output-error"; - if (err.type !== null) { - // use the classes of the error condition as CSS class names - errClass = errClass + " " + $.map(asArray(err.type), function(type) { - return errClass + "-" + type; - }).join(" "); - } - errClass = errClass + " htmlwidgets-error"; - - // Is el inline or block? If inline or inline-block, just display:none it - // and add an inline error. - var display = $el.css("display"); - $el.data("restore-display-mode", display); - - if (display === "inline" || display === "inline-block") { - $el.hide(); - if (err.message !== "") { - var errorSpan = $("").addClass(errClass); - errorSpan.text(err.message); - $el.after(errorSpan); - } - } else if (display === "block") { - // If block, add an error just after the el, set visibility:none on the - // el, and position the error to be on top of the el. - // Mark it with a unique ID and CSS class so we can remove it later. - $el.css("visibility", "hidden"); - if (err.message !== "") { - var errorDiv = $("
").addClass(errClass).css("position", "absolute") - .css("top", el.offsetTop) - .css("left", el.offsetLeft) - // setting width can push out the page size, forcing otherwise - // unnecessary scrollbars to appear and making it impossible for - // the element to shrink; so use max-width instead - .css("maxWidth", el.offsetWidth) - .css("height", el.offsetHeight); - errorDiv.text(err.message); - $el.after(errorDiv); - - // Really dumb way to keep the size/position of the error in sync with - // the parent element as the window is resized or whatever. - var intId = setInterval(function() { - if (!errorDiv[0].parentElement) { - clearInterval(intId); - return; - } - errorDiv - .css("top", el.offsetTop) - .css("left", el.offsetLeft) - .css("maxWidth", el.offsetWidth) - .css("height", el.offsetHeight); - }, 500); - } - } - }, - clearError: function(el) { - var $el = $(el); - var display = $el.data("restore-display-mode"); - $el.data("restore-display-mode", null); - - if (display === "inline" || display === "inline-block") { - if (display) - $el.css("display", display); - $(el.nextSibling).filter(".htmlwidgets-error").remove(); - } else if (display === "block"){ - $el.css("visibility", "inherit"); - $(el.nextSibling).filter(".htmlwidgets-error").remove(); - } - }, - sizing: {} - }; - - // Called by widget bindings to register a new type of widget. The definition - // object can contain the following properties: - // - name (required) - A string indicating the binding name, which will be - // used by default as the CSS classname to look for. - // - initialize (optional) - A function(el) that will be called once per - // widget element; if a value is returned, it will be passed as the third - // value to renderValue. - // - renderValue (required) - A function(el, data, initValue) that will be - // called with data. Static contexts will cause this to be called once per - // element; Shiny apps will cause this to be called multiple times per - // element, as the data changes. - window.HTMLWidgets.widget = function(definition) { - if (!definition.name) { - throw new Error("Widget must have a name"); - } - if (!definition.type) { - throw new Error("Widget must have a type"); - } - // Currently we only support output widgets - if (definition.type !== "output") { - throw new Error("Unrecognized widget type '" + definition.type + "'"); - } - // TODO: Verify that .name is a valid CSS classname - - // Support new-style instance-bound definitions. Old-style class-bound - // definitions have one widget "object" per widget per type/class of - // widget; the renderValue and resize methods on such widget objects - // take el and instance arguments, because the widget object can't - // store them. New-style instance-bound definitions have one widget - // object per widget instance; the definition that's passed in doesn't - // provide renderValue or resize methods at all, just the single method - // factory(el, width, height) - // which returns an object that has renderValue(x) and resize(w, h). - // This enables a far more natural programming style for the widget - // author, who can store per-instance state using either OO-style - // instance fields or functional-style closure variables (I guess this - // is in contrast to what can only be called C-style pseudo-OO which is - // what we required before). - if (definition.factory) { - definition = createLegacyDefinitionAdapter(definition); - } - - if (!definition.renderValue) { - throw new Error("Widget must have a renderValue function"); - } - - // For static rendering (non-Shiny), use a simple widget registration - // scheme. We also use this scheme for Shiny apps/documents that also - // contain static widgets. - window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || []; - // Merge defaults into the definition; don't mutate the original definition. - var staticBinding = extend({}, defaults, definition); - overrideMethod(staticBinding, "find", function(superfunc) { - return function(scope) { - var results = superfunc(scope); - // Filter out Shiny outputs, we only want the static kind - return filterByClass(results, "html-widget-output", false); - }; - }); - window.HTMLWidgets.widgets.push(staticBinding); - - if (shinyMode) { - // Shiny is running. Register the definition with an output binding. - // The definition itself will not be the output binding, instead - // we will make an output binding object that delegates to the - // definition. This is because we foolishly used the same method - // name (renderValue) for htmlwidgets definition and Shiny bindings - // but they actually have quite different semantics (the Shiny - // bindings receive data that includes lots of metadata that it - // strips off before calling htmlwidgets renderValue). We can't - // just ignore the difference because in some widgets it's helpful - // to call this.renderValue() from inside of resize(), and if - // we're not delegating, then that call will go to the Shiny - // version instead of the htmlwidgets version. - - // Merge defaults with definition, without mutating either. - var bindingDef = extend({}, defaults, definition); - - // This object will be our actual Shiny binding. - var shinyBinding = new Shiny.OutputBinding(); - - // With a few exceptions, we'll want to simply use the bindingDef's - // version of methods if they are available, otherwise fall back to - // Shiny's defaults. NOTE: If Shiny's output bindings gain additional - // methods in the future, and we want them to be overrideable by - // HTMLWidget binding definitions, then we'll need to add them to this - // list. - delegateMethod(shinyBinding, bindingDef, "getId"); - delegateMethod(shinyBinding, bindingDef, "onValueChange"); - delegateMethod(shinyBinding, bindingDef, "onValueError"); - delegateMethod(shinyBinding, bindingDef, "renderError"); - delegateMethod(shinyBinding, bindingDef, "clearError"); - delegateMethod(shinyBinding, bindingDef, "showProgress"); - - // The find, renderValue, and resize are handled differently, because we - // want to actually decorate the behavior of the bindingDef methods. - - shinyBinding.find = function(scope) { - var results = bindingDef.find(scope); - - // Only return elements that are Shiny outputs, not static ones - var dynamicResults = results.filter(".html-widget-output"); - - // It's possible that whatever caused Shiny to think there might be - // new dynamic outputs, also caused there to be new static outputs. - // Since there might be lots of different htmlwidgets bindings, we - // schedule execution for later--no need to staticRender multiple - // times. - if (results.length !== dynamicResults.length) - scheduleStaticRender(); - - return dynamicResults; - }; - - // Wrap renderValue to handle initialization, which unfortunately isn't - // supported natively by Shiny at the time of this writing. - - shinyBinding.renderValue = function(el, data) { - Shiny.renderDependencies(data.deps); - // Resolve strings marked as javascript literals to objects - if (!(data.evals instanceof Array)) data.evals = [data.evals]; - for (var i = 0; data.evals && i < data.evals.length; i++) { - window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]); - } - if (!bindingDef.renderOnNullValue) { - if (data.x === null) { - el.style.visibility = "hidden"; - return; - } else { - el.style.visibility = "inherit"; - } - } - if (!elementData(el, "initialized")) { - initSizing(el); - - elementData(el, "initialized", true); - if (bindingDef.initialize) { - var result = bindingDef.initialize(el, el.offsetWidth, - el.offsetHeight); - elementData(el, "init_result", result); - } - } - bindingDef.renderValue(el, data.x, elementData(el, "init_result")); - evalAndRun(data.jsHooks.render, elementData(el, "init_result"), [el, data.x]); - }; - - // Only override resize if bindingDef implements it - if (bindingDef.resize) { - shinyBinding.resize = function(el, width, height) { - // Shiny can call resize before initialize/renderValue have been - // called, which doesn't make sense for widgets. - if (elementData(el, "initialized")) { - bindingDef.resize(el, width, height, elementData(el, "init_result")); - } - }; - } - - Shiny.outputBindings.register(shinyBinding, bindingDef.name); - } - }; - - var scheduleStaticRenderTimerId = null; - function scheduleStaticRender() { - if (!scheduleStaticRenderTimerId) { - scheduleStaticRenderTimerId = setTimeout(function() { - scheduleStaticRenderTimerId = null; - window.HTMLWidgets.staticRender(); - }, 1); - } - } - - // Render static widgets after the document finishes loading - // Statically render all elements that are of this widget's class - window.HTMLWidgets.staticRender = function() { - var bindings = window.HTMLWidgets.widgets || []; - forEach(bindings, function(binding) { - var matches = binding.find(document.documentElement); - forEach(matches, function(el) { - var sizeObj = initSizing(el, binding); - - if (hasClass(el, "html-widget-static-bound")) - return; - el.className = el.className + " html-widget-static-bound"; - - var initResult; - if (binding.initialize) { - initResult = binding.initialize(el, - sizeObj ? sizeObj.getWidth() : el.offsetWidth, - sizeObj ? sizeObj.getHeight() : el.offsetHeight - ); - elementData(el, "init_result", initResult); - } - - if (binding.resize) { - var lastSize = { - w: sizeObj ? sizeObj.getWidth() : el.offsetWidth, - h: sizeObj ? sizeObj.getHeight() : el.offsetHeight - }; - var resizeHandler = function(e) { - var size = { - w: sizeObj ? sizeObj.getWidth() : el.offsetWidth, - h: sizeObj ? sizeObj.getHeight() : el.offsetHeight - }; - if (size.w === 0 && size.h === 0) - return; - if (size.w === lastSize.w && size.h === lastSize.h) - return; - lastSize = size; - binding.resize(el, size.w, size.h, initResult); - }; - - on(window, "resize", resizeHandler); - - // This is needed for cases where we're running in a Shiny - // app, but the widget itself is not a Shiny output, but - // rather a simple static widget. One example of this is - // an rmarkdown document that has runtime:shiny and widget - // that isn't in a render function. Shiny only knows to - // call resize handlers for Shiny outputs, not for static - // widgets, so we do it ourselves. - if (window.jQuery) { - window.jQuery(document).on( - "shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets", - resizeHandler - ); - window.jQuery(document).on( - "hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets", - resizeHandler - ); - } - - // This is needed for the specific case of ioslides, which - // flips slides between display:none and display:block. - // Ideally we would not have to have ioslide-specific code - // here, but rather have ioslides raise a generic event, - // but the rmarkdown package just went to CRAN so the - // window to getting that fixed may be long. - if (window.addEventListener) { - // It's OK to limit this to window.addEventListener - // browsers because ioslides itself only supports - // such browsers. - on(document, "slideenter", resizeHandler); - on(document, "slideleave", resizeHandler); - } - } - - var scriptData = document.querySelector("script[data-for='" + el.id + "'][type='application/json']"); - if (scriptData) { - var data = JSON.parse(scriptData.textContent || scriptData.text); - // Resolve strings marked as javascript literals to objects - if (!(data.evals instanceof Array)) data.evals = [data.evals]; - for (var k = 0; data.evals && k < data.evals.length; k++) { - window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]); - } - binding.renderValue(el, data.x, initResult); - evalAndRun(data.jsHooks.render, initResult, [el, data.x]); - } - }); - }); - - invokePostRenderHandlers(); - } - - - function has_jQuery3() { - if (!window.jQuery) { - return false; - } - var $version = window.jQuery.fn.jquery; - var $major_version = parseInt($version.split(".")[0]); - return $major_version >= 3; - } - - /* - / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's - / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now - / really means $(setTimeout(fn)). - / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous - / - / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny - / one tick later than it did before, which means staticRender() is - / called renderValue() earlier than (advanced) widget authors might be expecting. - / https://github.com/rstudio/shiny/issues/2630 - / - / For a concrete example, leaflet has some methods (e.g., updateBounds) - / which reference Shiny methods registered in initShiny (e.g., setInputValue). - / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to - / delay execution of those methods (until Shiny methods are ready) - / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268 - / - / Ideally widget authors wouldn't need to use this setTimeout() hack that - / leaflet uses to call Shiny methods on a staticRender(). In the long run, - / the logic initShiny should be broken up so that method registration happens - / right away, but binding happens later. - */ - function maybeStaticRenderLater() { - if (shinyMode && has_jQuery3()) { - window.jQuery(window.HTMLWidgets.staticRender); - } else { - window.HTMLWidgets.staticRender(); - } - } - - if (document.addEventListener) { - document.addEventListener("DOMContentLoaded", function() { - document.removeEventListener("DOMContentLoaded", arguments.callee, false); - maybeStaticRenderLater(); - }, false); - } else if (document.attachEvent) { - document.attachEvent("onreadystatechange", function() { - if (document.readyState === "complete") { - document.detachEvent("onreadystatechange", arguments.callee); - maybeStaticRenderLater(); - } - }); - } - - - window.HTMLWidgets.getAttachmentUrl = function(depname, key) { - // If no key, default to the first item - if (typeof(key) === "undefined") - key = 1; - - var link = document.getElementById(depname + "-" + key + "-attachment"); - if (!link) { - throw new Error("Attachment " + depname + "/" + key + " not found in document"); - } - return link.getAttribute("href"); - }; - - window.HTMLWidgets.dataframeToD3 = function(df) { - var names = []; - var length; - for (var name in df) { - if (df.hasOwnProperty(name)) - names.push(name); - if (typeof(df[name]) !== "object" || typeof(df[name].length) === "undefined") { - throw new Error("All fields must be arrays"); - } else if (typeof(length) !== "undefined" && length !== df[name].length) { - throw new Error("All fields must be arrays of the same length"); - } - length = df[name].length; - } - var results = []; - var item; - for (var row = 0; row < length; row++) { - item = {}; - for (var col = 0; col < names.length; col++) { - item[names[col]] = df[names[col]][row]; - } - results.push(item); - } - return results; - }; - - window.HTMLWidgets.transposeArray2D = function(array) { - if (array.length === 0) return array; - var newArray = array[0].map(function(col, i) { - return array.map(function(row) { - return row[i] - }) - }); - return newArray; - }; - // Split value at splitChar, but allow splitChar to be escaped - // using escapeChar. Any other characters escaped by escapeChar - // will be included as usual (including escapeChar itself). - function splitWithEscape(value, splitChar, escapeChar) { - var results = []; - var escapeMode = false; - var currentResult = ""; - for (var pos = 0; pos < value.length; pos++) { - if (!escapeMode) { - if (value[pos] === splitChar) { - results.push(currentResult); - currentResult = ""; - } else if (value[pos] === escapeChar) { - escapeMode = true; - } else { - currentResult += value[pos]; - } - } else { - currentResult += value[pos]; - escapeMode = false; - } - } - if (currentResult !== "") { - results.push(currentResult); - } - return results; - } - // Function authored by Yihui/JJ Allaire - window.HTMLWidgets.evaluateStringMember = function(o, member) { - var parts = splitWithEscape(member, '.', '\\'); - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i]; - // part may be a character or 'numeric' member name - if (o !== null && typeof o === "object" && part in o) { - if (i == (l - 1)) { // if we are at the end of the line then evalulate - if (typeof o[part] === "string") - o[part] = tryEval(o[part]); - } else { // otherwise continue to next embedded object - o = o[part]; - } - } - } - }; - - // Retrieve the HTMLWidget instance (i.e. the return value of an - // HTMLWidget binding's initialize() or factory() function) - // associated with an element, or null if none. - window.HTMLWidgets.getInstance = function(el) { - return elementData(el, "init_result"); - }; - - // Finds the first element in the scope that matches the selector, - // and returns the HTMLWidget instance (i.e. the return value of - // an HTMLWidget binding's initialize() or factory() function) - // associated with that element, if any. If no element matches the - // selector, or the first matching element has no HTMLWidget - // instance associated with it, then null is returned. - // - // The scope argument is optional, and defaults to window.document. - window.HTMLWidgets.find = function(scope, selector) { - if (arguments.length == 1) { - selector = scope; - scope = document; - } - - var el = scope.querySelector(selector); - if (el === null) { - return null; - } else { - return window.HTMLWidgets.getInstance(el); - } - }; - - // Finds all elements in the scope that match the selector, and - // returns the HTMLWidget instances (i.e. the return values of - // an HTMLWidget binding's initialize() or factory() function) - // associated with the elements, in an array. If elements that - // match the selector don't have an associated HTMLWidget - // instance, the returned array will contain nulls. - // - // The scope argument is optional, and defaults to window.document. - window.HTMLWidgets.findAll = function(scope, selector) { - if (arguments.length == 1) { - selector = scope; - scope = document; - } - - var nodes = scope.querySelectorAll(selector); - var results = []; - for (var i = 0; i < nodes.length; i++) { - results.push(window.HTMLWidgets.getInstance(nodes[i])); - } - return results; - }; - - var postRenderHandlers = []; - function invokePostRenderHandlers() { - while (postRenderHandlers.length) { - var handler = postRenderHandlers.shift(); - if (handler) { - handler(); - } - } - } - - // Register the given callback function to be invoked after the - // next time static widgets are rendered. - window.HTMLWidgets.addPostRenderHandler = function(callback) { - postRenderHandlers.push(callback); - }; - - // Takes a new-style instance-bound definition, and returns an - // old-style class-bound definition. This saves us from having - // to rewrite all the logic in this file to accomodate both - // types of definitions. - function createLegacyDefinitionAdapter(defn) { - var result = { - name: defn.name, - type: defn.type, - initialize: function(el, width, height) { - return defn.factory(el, width, height); - }, - renderValue: function(el, x, instance) { - return instance.renderValue(x); - }, - resize: function(el, width, height, instance) { - return instance.resize(width, height); - } - }; - - if (defn.find) - result.find = defn.find; - if (defn.renderError) - result.renderError = defn.renderError; - if (defn.clearError) - result.clearError = defn.clearError; - - return result; - } -})(); - diff --git a/docs/news/index.html b/docs/news/index.html index b7c23883..3411a1b4 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -87,7 +87,9 @@

Changelog

  • fix issue when using named vectors to query data for non-existent geographies, return NULL in this case instead of throwing error
  • +
  • fix problem with population centre geographic data download
  • support newly released Forward Sortation Area geography for statcan geography and WDS functionality
  • +
  • remove instances of new native R pipe |> with dplyr pipe %>% to preserve compatibility with older R versions
diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 5d267424..75e09004 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -10,7 +10,7 @@ articles: intersecting_geometries: intersecting_geometries.html statcan_attribute_files: statcan_attribute_files.html statcan_wds: statcan_wds.html -last_built: 2023-04-17T22:50Z +last_built: 2023-04-27T18:36Z urls: reference: https://mountainmath.github.io/cancensus/reference article: https://mountainmath.github.io/cancensus/articles diff --git a/docs/reference/list_cancensus_cache.html b/docs/reference/list_cancensus_cache.html index 3034cabc..8ede6af1 100644 --- a/docs/reference/list_cancensus_cache.html +++ b/docs/reference/list_cancensus_cache.html @@ -104,7 +104,7 @@

Value

Examples

# list add the cached census data
 list_cancensus_cache()
-#> # A tibble: 1,579 × 11
+#> # A tibble: 1,628 × 11
 #>    path         dataset regions level vectors created_at          version   size
 #>    <chr>        <chr>   <chr>   <chr> <chr>   <dttm>              <chr>    <dbl>
 #>  1 CM_data_007… CA21    "{\"CM… Regi… "[]"    2023-01-26 07:18:01 d.4       1882
@@ -116,8 +116,8 @@ 

Examples

#> 7 CM_data_01c… CA16 "[\"{\… CT "[\"v_… 2022-07-13 15:23:08 d.1 5258 #> 8 CM_data_01f… CA1996 "{\"CS… CSD "[\"v_… 2022-08-18 19:13:18 d.2 8898 #> 9 CM_data_024… CA16 "[\"{\… Regi… "[\"v_… 2022-04-27 23:26:47 d.1 3603 -#> 10 CM_data_02b… CA21 "{\"CD… CT "[\"v_… 2022-12-31 09:37:21 d.4 361 -#> # … with 1,569 more rows, and 3 more variables: last_accessed <dttm>, +#> 10 CM_data_027… CA21 "{\"CS… CT "[\"v_… 2023-04-18 10:26:05 d.4 2099 +#> # … with 1,618 more rows, and 3 more variables: last_accessed <dttm>, #> # access_count <dbl>, resolution <chr>
From 4d70f837724703c8215054200f36b8c34d1d1679 Mon Sep 17 00:00:00 2001 From: Jens von Bergmann Date: Tue, 6 Jun 2023 18:01:24 -0700 Subject: [PATCH 6/8] remove gdal and rgeos dependencies --- DESCRIPTION | 2 - docs/articles/Making_maps_with_cancensus.html | 12 +- .../htmlwidgets.js | 0 .../leaflet.js | 0 .../leaflet-providers-plugin.js | 0 docs/articles/Taxfiler_Data.html | 70 ++++++------ docs/articles/cancensus.html | 108 +++++++++--------- docs/articles/data_discovery.html | 82 +++++++------ docs/pkgdown.yml | 2 +- docs/reference/find_census_vectors.html | 2 +- docs/reference/list_cancensus_cache.html | 31 ++--- docs/reference/list_census_datasets.html | 27 +++-- docs/reference/parent_census_vectors.html | 7 +- docs/reference/search_census_vectors.html | 27 +++-- 14 files changed, 179 insertions(+), 191 deletions(-) rename docs/articles/Making_maps_with_cancensus_files/{htmlwidgets-1.6.1 => htmlwidgets-1.6.2}/htmlwidgets.js (100%) rename docs/articles/Making_maps_with_cancensus_files/{leaflet-binding-2.1.1 => leaflet-binding-2.1.2}/leaflet.js (100%) rename docs/articles/Making_maps_with_cancensus_files/{leaflet-providers-plugin-2.1.1 => leaflet-providers-plugin-2.1.2}/leaflet-providers-plugin.js (100%) diff --git a/DESCRIPTION b/DESCRIPTION index d2af7e92..ae507efb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -31,8 +31,6 @@ Suggests: knitr, mapdeck, rmarkdown, readr, - rgdal, - rgeos, scales, sp, sf, diff --git a/docs/articles/Making_maps_with_cancensus.html b/docs/articles/Making_maps_with_cancensus.html index 030a006c..4d87e7b3 100644 --- a/docs/articles/Making_maps_with_cancensus.html +++ b/docs/articles/Making_maps_with_cancensus.html @@ -114,10 +114,10 @@ - + -
+
-
-

Adding colour ramps and additional interactivity takes a little bit +

+

Adding colour ramps and additional interactivity takes a little bit more work but is still pretty easy to implement. Following this example we can specify the colour ramp to match our needs.

@@ -242,8 +242,8 @@ 

Interactive maps with leaflet= 1, opacity = 1, fillOpacity = 0.65)

-
- +
+
diff --git a/docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.6.1/htmlwidgets.js b/docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.6.2/htmlwidgets.js similarity index 100% rename from docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.6.1/htmlwidgets.js rename to docs/articles/Making_maps_with_cancensus_files/htmlwidgets-1.6.2/htmlwidgets.js diff --git a/docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.1.1/leaflet.js b/docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.1.2/leaflet.js similarity index 100% rename from docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.1.1/leaflet.js rename to docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.1.2/leaflet.js diff --git a/docs/articles/Making_maps_with_cancensus_files/leaflet-providers-plugin-2.1.1/leaflet-providers-plugin.js b/docs/articles/Making_maps_with_cancensus_files/leaflet-providers-plugin-2.1.2/leaflet-providers-plugin.js similarity index 100% rename from docs/articles/Making_maps_with_cancensus_files/leaflet-providers-plugin-2.1.1/leaflet-providers-plugin.js rename to docs/articles/Making_maps_with_cancensus_files/leaflet-providers-plugin-2.1.2/leaflet-providers-plugin.js diff --git a/docs/articles/Taxfiler_Data.html b/docs/articles/Taxfiler_Data.html index 624dc928..b2c6f5b4 100644 --- a/docs/articles/Taxfiler_Data.html +++ b/docs/articles/Taxfiler_Data.html @@ -179,47 +179,45 @@

list_census_datasets() %>% filter(grepl("taxfiler",description)) #> # A tibble: 19 × 6 -#> dataset description geo_dataset attribution refer…¹ refer…² -#> <chr> <chr> <chr> <chr> <chr> <chr> -#> 1 TX2000 2000 T1FF taxfiler data CA1996 StatCan 2000 T1F… 72-212… https:… -#> 2 TX2001 2001 T1FF taxfiler data CA01 StatCan 2001 T1F… 72-212… https:… -#> 3 TX2002 2002 T1FF taxfiler data CA01 StatCan 2002 T1F… 72-212… https:… -#> 4 TX2003 2003 T1FF taxfiler data CA01 StatCan 2003 T1F… 72-212… https:… -#> 5 TX2004 2004 T1FF taxfiler data CA01 StatCan 2004 T1F… 72-212… https:… -#> 6 TX2005 2005 T1FF taxfiler data CA01 StatCan 2005 T1F… 72-212… https:… -#> 7 TX2006 2006 T1FF taxfiler data CA06 StatCan 2006 T1F… 72-212… https:… -#> 8 TX2007 2007 T1FF taxfiler data CA06 StatCan 2007 T1F… 72-212… https:… -#> 9 TX2008 2008 T1FF taxfiler data CA06 StatCan 2008 T1F… 72-212… https:… -#> 10 TX2009 2009 T1FF taxfiler data CA06 StatCan 2009 T1F… 72-212… https:… -#> 11 TX2010 2010 T1FF taxfiler data CA06 StatCan 2010 T1F… 72-212… https:… -#> 12 TX2011 2011 T1FF taxfiler data CA06 StatCan 2011 T1F… 72-212… https:… -#> 13 TX2012 2012 T1FF taxfiler data CA11 StatCan 2012 T1F… 72-212… https:… -#> 14 TX2013 2013 T1FF taxfiler data CA11 StatCan 2013 T1F… 72-212… https:… -#> 15 TX2014 2014 T1FF taxfiler data CA11 StatCan 2014 T1F… 72-212… https:… -#> 16 TX2015 2015 T1FF taxfiler data CA11 StatCan 2015 T1F… 72-212… https:… -#> 17 TX2016 2016 T1FF taxfiler data CA16 StatCan 2016 T1F… 72-212… https:… -#> 18 TX2017 2017 T1FF taxfiler data CA16 StatCan 2017 T1F… 72-212… https:… -#> 19 TX2018 2018 T1FF taxfiler data CA16 StatCan 2018 T1F… 72-212… https:… -#> # … with abbreviated variable names ¹​reference, ²​reference_url

+#> dataset description geo_dataset attribution reference reference_url +#> <chr> <chr> <chr> <chr> <chr> <chr> +#> 1 TX2000 2000 T1FF taxfiler d… CA1996 StatCan 20… 72-212-X https://www1… +#> 2 TX2001 2001 T1FF taxfiler d… CA01 StatCan 20… 72-212-X https://www1… +#> 3 TX2002 2002 T1FF taxfiler d… CA01 StatCan 20… 72-212-X https://www1… +#> 4 TX2003 2003 T1FF taxfiler d… CA01 StatCan 20… 72-212-X https://www1… +#> 5 TX2004 2004 T1FF taxfiler d… CA01 StatCan 20… 72-212-X https://www1… +#> 6 TX2005 2005 T1FF taxfiler d… CA01 StatCan 20… 72-212-X https://www1… +#> 7 TX2006 2006 T1FF taxfiler d… CA06 StatCan 20… 72-212-X https://www1… +#> 8 TX2007 2007 T1FF taxfiler d… CA06 StatCan 20… 72-212-X https://www1… +#> 9 TX2008 2008 T1FF taxfiler d… CA06 StatCan 20… 72-212-X https://www1… +#> 10 TX2009 2009 T1FF taxfiler d… CA06 StatCan 20… 72-212-X https://www1… +#> 11 TX2010 2010 T1FF taxfiler d… CA06 StatCan 20… 72-212-X https://www1… +#> 12 TX2011 2011 T1FF taxfiler d… CA06 StatCan 20… 72-212-X https://www1… +#> 13 TX2012 2012 T1FF taxfiler d… CA11 StatCan 20… 72-212-X https://www1… +#> 14 TX2013 2013 T1FF taxfiler d… CA11 StatCan 20… 72-212-X https://www1… +#> 15 TX2014 2014 T1FF taxfiler d… CA11 StatCan 20… 72-212-X https://www1… +#> 16 TX2015 2015 T1FF taxfiler d… CA11 StatCan 20… 72-212-X https://www1… +#> 17 TX2016 2016 T1FF taxfiler d… CA16 StatCan 20… 72-212-X https://www1… +#> 18 TX2017 2017 T1FF taxfiler d… CA16 StatCan 20… 72-212-X https://www1… +#> 19 TX2018 2018 T1FF taxfiler d… CA16 StatCan 20… 72-212-X https://www1…

And, as an example, available data vectors for one such T1FF dataset.

 list_census_vectors('TX2017')
 #> # A tibble: 818 × 7
-#>    vector      type  label           units              parent…¹ aggre…² details
-#>    <chr>       <fct> <chr>           <fct>              <chr>    <chr>   <chr>  
-#>  1 v_TX2017_1  Total Taxfilers - #   Number             NA       Additi… Tax da…
-#>  2 v_TX2017_3  Total % 0-24          Percentage (0-100) v_TX201… Averag… Tax da…
-#>  3 v_TX2017_4  Total % 25-44         Percentage (0-100) v_TX201… Averag… Tax da…
-#>  4 v_TX2017_5  Total % 45-64         Percentage (0-100) v_TX201… Averag… Tax da…
-#>  5 v_TX2017_6  Total % 65+           Percentage (0-100) v_TX201… Averag… Tax da…
-#>  6 v_TX2017_7  Total Average - Age   Ratio              v_TX201… Averag… Tax da…
-#>  7 v_TX2017_8  Total % female        Percentage (0-100) v_TX201… Averag… Tax da…
-#>  8 v_TX2017_9  Total % married       Percentage (0-100) v_TX201… Averag… Tax da…
-#>  9 v_TX2017_10 Total % in appt       Percentage (0-100) v_TX201… Averag… Tax da…
-#> 10 v_TX2017_11 Total All persons - # Number             NA       Additi… Tax da…
-#> # … with 808 more rows, and abbreviated variable names ¹​parent_vector,
-#> #   ²​aggregation
+#> vector type label units parent_vector aggregation details +#> <chr> <fct> <chr> <fct> <chr> <chr> <chr> +#> 1 v_TX2017_1 Total Taxfilers - # Number NA Additive Tax da… +#> 2 v_TX2017_3 Total % 0-24 Percenta… v_TX2017_1 Average of… Tax da… +#> 3 v_TX2017_4 Total % 25-44 Percenta… v_TX2017_1 Average of… Tax da… +#> 4 v_TX2017_5 Total % 45-64 Percenta… v_TX2017_1 Average of… Tax da… +#> 5 v_TX2017_6 Total % 65+ Percenta… v_TX2017_1 Average of… Tax da… +#> 6 v_TX2017_7 Total Average - Age Ratio v_TX2017_1 Average of… Tax da… +#> 7 v_TX2017_8 Total % female Percenta… v_TX2017_1 Average of… Tax da… +#> 8 v_TX2017_9 Total % married Percenta… v_TX2017_1 Average of… Tax da… +#> 9 v_TX2017_10 Total % in appt Percenta… v_TX2017_1 Average of… Tax da… +#> 10 v_TX2017_11 Total All persons - # Number NA Additive Tax da… +#> # ℹ 808 more rows

This particular dataset has over 800 individual vectors. The vector codes follow a regular pattern across different years, and we can use this to quickly identify all the relevant variables of interest across diff --git a/docs/articles/cancensus.html b/docs/articles/cancensus.html index 6b2c0e7c..64d143d5 100644 --- a/docs/articles/cancensus.html +++ b/docs/articles/cancensus.html @@ -262,20 +262,19 @@

Census Datasets
 list_census_datasets()
 #> # A tibble: 29 × 6
-#>    dataset description                           geo_d…¹ attri…² refer…³ refer…⁴
-#>    <chr>   <chr>                                 <chr>   <chr>   <chr>   <chr>  
-#>  1 CA1996  1996 Canada Census                    CA1996  StatCa… 92-351… https:…
-#>  2 CA01    2001 Canada Census                    CA01    StatCa… 92-378… https:…
-#>  3 CA06    2006 Canada Census                    CA06    StatCa… 92-566… https:…
-#>  4 CA11    2011 Canada Census and NHS            CA11    StatCa… 98-301… https:…
-#>  5 CA16    2016 Canada Census                    CA16    StatCa… 98-301… https:…
-#>  6 CA21    2021 Canada Census                    CA21    StatCa… 98-301… https:…
-#>  7 CA01xSD 2001 Canada Census xtab - Structural… CA01    StatCa… 92-378… https:…
-#>  8 CA06xSD 2006 Canada Census xtab - Structural… CA06    StatCa… 92-566… https:…
-#>  9 CA11xSD 2011 Canada Census xtab - Structural… CA11    StatCa… 98-301… https:…
-#> 10 CA16xSD 2016 Canada Census xtab - Structural… CA16    StatCa… 98-301… https:…
-#> # … with 19 more rows, and abbreviated variable names ¹​geo_dataset,
-#> #   ²​attribution, ³​reference, ⁴​reference_url
+#> dataset description geo_dataset attribution reference reference_url +#> <chr> <chr> <chr> <chr> <chr> <chr> +#> 1 CA1996 1996 Canada Census CA1996 StatCan 19… 92-351-U https://www1… +#> 2 CA01 2001 Canada Census CA01 StatCan 20… 92-378-X https://www1… +#> 3 CA06 2006 Canada Census CA06 StatCan 20… 92-566-X https://www1… +#> 4 CA11 2011 Canada Census a… CA11 StatCan 20… 98-301-X… https://www1… +#> 5 CA16 2016 Canada Census CA16 StatCan 20… 98-301-X https://www1… +#> 6 CA21 2021 Canada Census CA21 StatCan 20… 98-301-X https://www1… +#> 7 CA01xSD 2001 Canada Census x… CA01 StatCan 20… 92-378-X https://www1… +#> 8 CA06xSD 2006 Canada Census x… CA06 StatCan 20… 92-566-X https://www1… +#> 9 CA11xSD 2011 Canada Census x… CA11 StatCan 20… 98-301-X https://www1… +#> 10 CA16xSD 2016 Canada Census x… CA16 StatCan 20… 98-301-X https://www1… +#> # ℹ 19 more rows

As other Census datasets become available via the CensusMapper API, they will be listed as output when calling list_census_datasets().

@@ -295,19 +294,19 @@

Census Regions
 list_census_regions("CA21")
 #> # A tibble: 5,518 × 8
-#>    region name                      level      pop munic…¹ CMA_UID CD_UID PR_UID
-#>    <chr>  <chr>                     <chr>    <int> <chr>   <chr>   <chr>  <chr> 
-#>  1 01     Canada                    C     36991981 NA      NA      NA     NA    
-#>  2 35     Ontario                   PR    14223942 Ont.    NA      NA     NA    
-#>  3 24     Quebec                    PR     8501833 Que.    NA      NA     NA    
-#>  4 59     British Columbia          PR     5000879 B.C.    NA      NA     NA    
-#>  5 48     Alberta                   PR     4262635 Alta.   NA      NA     NA    
-#>  6 46     Manitoba                  PR     1342153 Man.    NA      NA     NA    
-#>  7 47     Saskatchewan              PR     1132505 Sask.   NA      NA     NA    
-#>  8 12     Nova Scotia               PR      969383 N.S.    NA      NA     NA    
-#>  9 13     New Brunswick             PR      775610 N.B.    NA      NA     NA    
-#> 10 10     Newfoundland and Labrador PR      510550 N.L.    NA      NA     NA    
-#> # … with 5,508 more rows, and abbreviated variable name ¹​municipal_status
+#> region name level pop municipal_status CMA_UID CD_UID PR_UID +#> <chr> <chr> <chr> <int> <chr> <chr> <chr> <chr> +#> 1 01 Canada C 3.70e7 NA NA NA NA +#> 2 35 Ontario PR 1.42e7 Ont. NA NA NA +#> 3 24 Quebec PR 8.50e6 Que. NA NA NA +#> 4 59 British Columbia PR 5.00e6 B.C. NA NA NA +#> 5 48 Alberta PR 4.26e6 Alta. NA NA NA +#> 6 46 Manitoba PR 1.34e6 Man. NA NA NA +#> 7 47 Saskatchewan PR 1.13e6 Sask. NA NA NA +#> 8 12 Nova Scotia PR 9.69e5 N.S. NA NA NA +#> 9 13 New Brunswick PR 7.76e5 N.B. NA NA NA +#> 10 10 Newfoundland and … PR 5.11e5 N.L. NA NA NA +#> # ℹ 5,508 more rows

The regions parameter in get_census requires as input a list of region id strings that correspond to that regions geoid. You can combine different regions together into region @@ -425,20 +424,19 @@

Displaying available Census varia
 list_census_vectors("CA21")
 #> # A tibble: 7,709 × 7
-#>    vector    type   label                          units paren…¹ aggre…² details
-#>    <chr>     <fct>  <chr>                          <fct> <chr>   <chr>   <chr>  
-#>  1 v_CA21_1  Total  Population, 2021               Numb… NA      Additi… CA 202…
-#>  2 v_CA21_2  Total  Population, 2016               Numb… NA      Additi… CA 202…
-#>  3 v_CA21_3  Total  Population percentage change,… Numb… NA      Averag… CA 202…
-#>  4 v_CA21_4  Total  Total private dwellings        Numb… NA      Additi… CA 202…
-#>  5 v_CA21_5  Total  Private dwellings occupied by… Numb… v_CA21… Additi… CA 202…
-#>  6 v_CA21_6  Total  Population density per square… Ratio NA      Averag… CA 202…
-#>  7 v_CA21_7  Total  Land area in square kilometres Numb… NA      Additi… CA 202…
-#>  8 v_CA21_8  Total  Total - Age                    Numb… NA      Additi… CA 202…
-#>  9 v_CA21_9  Male   Total - Age                    Numb… NA      Additi… CA 202…
-#> 10 v_CA21_10 Female Total - Age                    Numb… NA      Additi… CA 202…
-#> # … with 7,699 more rows, and abbreviated variable names ¹​parent_vector,
-#> #   ²​aggregation
+#> vector type label units parent_vector aggregation details +#> <chr> <fct> <chr> <fct> <chr> <chr> <chr> +#> 1 v_CA21_1 Total Population, 2021 Numb… NA Additive CA 202… +#> 2 v_CA21_2 Total Population, 2016 Numb… NA Additive CA 202… +#> 3 v_CA21_3 Total Population percenta… Numb… NA Average of… CA 202… +#> 4 v_CA21_4 Total Total private dwell… Numb… NA Additive CA 202… +#> 5 v_CA21_5 Total Private dwellings o… Numb… v_CA21_4 Additive CA 202… +#> 6 v_CA21_6 Total Population density … Ratio NA Average of… CA 202… +#> 7 v_CA21_7 Total Land area in square… Numb… NA Additive CA 202… +#> 8 v_CA21_8 Total Total - Age Numb… NA Additive CA 202… +#> 9 v_CA21_9 Male Total - Age Numb… NA Additive CA 202… +#> 10 v_CA21_10 Female Total - Age Numb… NA Additive CA 202… +#> # ℹ 7,699 more rows

Variable characteristics @@ -511,12 +509,11 @@

Managing variable hierarchyfilter(vector == "v_CA16_4092") %>% parent_census_vectors() #> # A tibble: 3 × 7 -#> vector type label units paren…¹ aggre…² details -#> <chr> <fct> <chr> <fct> <chr> <chr> <chr> -#> 1 v_CA16_4089 Total Western European origins (exc… Numb… v_CA16… Additi… CA 201… -#> 2 v_CA16_4044 Total European origins Numb… v_CA16… Additi… CA 201… -#> 3 v_CA16_3999 Total Total - Ethnic origin for the… Numb… NA Additi… CA 201… -#> # … with abbreviated variable names ¹​parent_vector, ²​aggregation

+#> vector type label units parent_vector aggregation details +#> <chr> <fct> <chr> <fct> <chr> <chr> <chr> +#> 1 v_CA16_4089 Total Western European or… Numb… v_CA16_4044 Additive CA 201… +#> 2 v_CA16_4044 Total European origins Numb… v_CA16_3999 Additive CA 201… +#> 3 v_CA16_3999 Total Total - Ethnic orig… Numb… NA Additive CA 201…

Sometimes we want to traverse the hierarchy in the opposite direction. This is frequently required when looking to compare different variable stems that share the same aggregate variable. As an example, if @@ -545,15 +542,14 @@

Managing variable hierarchylist_census_vectors("CA16") %>% filter(vector == "v_CA16_4122") %>% child_census_vectors(leaves = TRUE) #> # A tibble: 6 × 7 -#> vector type label units paren…¹ aggre…² details -#> <chr> <fct> <chr> <fct> <chr> <chr> <chr> -#> 1 v_CA16_4125 Total Danish Numb… v_CA16… Additi… CA 201… -#> 2 v_CA16_4128 Total Finnish Numb… v_CA16… Additi… CA 201… -#> 3 v_CA16_4131 Total Icelandic Numb… v_CA16… Additi… CA 201… -#> 4 v_CA16_4134 Total Norwegian Numb… v_CA16… Additi… CA 201… -#> 5 v_CA16_4137 Total Swedish Numb… v_CA16… Additi… CA 201… -#> 6 v_CA16_4140 Total Northern European origins, n.… Numb… v_CA16… Additi… CA 201… -#> # … with abbreviated variable names ¹​parent_vector, ²​aggregation +#> vector type label units parent_vector aggregation details +#> <chr> <fct> <chr> <fct> <chr> <chr> <chr> +#> 1 v_CA16_4125 Total Danish Numb… v_CA16_4122 Additive CA 201… +#> 2 v_CA16_4128 Total Finnish Numb… v_CA16_4122 Additive CA 201… +#> 3 v_CA16_4131 Total Icelandic Numb… v_CA16_4122 Additive CA 201… +#> 4 v_CA16_4134 Total Norwegian Numb… v_CA16_4122 Additive CA 201… +#> 5 v_CA16_4137 Total Swedish Numb… v_CA16_4122 Additive CA 201… +#> 6 v_CA16_4140 Total Northern European o… Numb… v_CA16_4122 Additive CA 201…

The leaves = TRUE parameter specifies whether intermediate aggregates are included or not. If TRUE then only the lowest level variables are returns - the “leaves” of the diff --git a/docs/articles/data_discovery.html b/docs/articles/data_discovery.html index bb59a1cb..13a41903 100644 --- a/docs/articles/data_discovery.html +++ b/docs/articles/data_discovery.html @@ -150,20 +150,19 @@

Census datasets
 list_census_datasets()
## # A tibble: 29 × 6
-##    dataset description                           geo_d…¹ attri…² refer…³ refer…⁴
-##    <chr>   <chr>                                 <chr>   <chr>   <chr>   <chr>  
-##  1 CA1996  1996 Canada Census                    CA1996  StatCa… 92-351… https:…
-##  2 CA01    2001 Canada Census                    CA01    StatCa… 92-378… https:…
-##  3 CA06    2006 Canada Census                    CA06    StatCa… 92-566… https:…
-##  4 CA11    2011 Canada Census and NHS            CA11    StatCa… 98-301… https:…
-##  5 CA16    2016 Canada Census                    CA16    StatCa… 98-301… https:…
-##  6 CA21    2021 Canada Census                    CA21    StatCa… 98-301… https:…
-##  7 CA01xSD 2001 Canada Census xtab - Structural… CA01    StatCa… 92-378… https:…
-##  8 CA06xSD 2006 Canada Census xtab - Structural… CA06    StatCa… 92-566… https:…
-##  9 CA11xSD 2011 Canada Census xtab - Structural… CA11    StatCa… 98-301… https:…
-## 10 CA16xSD 2016 Canada Census xtab - Structural… CA16    StatCa… 98-301… https:…
-## # … with 19 more rows, and abbreviated variable names ¹​geo_dataset,
-## #   ²​attribution, ³​reference, ⁴​reference_url
+## dataset description geo_dataset attribution reference reference_url +## <chr> <chr> <chr> <chr> <chr> <chr> +## 1 CA1996 1996 Canada Census CA1996 StatCan 19… 92-351-U https://www1… +## 2 CA01 2001 Canada Census CA01 StatCan 20… 92-378-X https://www1… +## 3 CA06 2006 Canada Census CA06 StatCan 20… 92-566-X https://www1… +## 4 CA11 2011 Canada Census a… CA11 StatCan 20… 98-301-X… https://www1… +## 5 CA16 2016 Canada Census CA16 StatCan 20… 98-301-X https://www1… +## 6 CA21 2021 Canada Census CA21 StatCan 20… 98-301-X https://www1… +## 7 CA01xSD 2001 Canada Census x… CA01 StatCan 20… 92-378-X https://www1… +## 8 CA06xSD 2006 Canada Census x… CA06 StatCan 20… 92-566-X https://www1… +## 9 CA11xSD 2011 Canada Census x… CA11 StatCan 20… 98-301-X https://www1… +## 10 CA16xSD 2016 Canada Census x… CA16 StatCan 20… 98-301-X https://www1… +## # ℹ 19 more rows

The list_census_datasets() function also provides additional background like series reference code, catalogue reference, and attribution details.

@@ -185,20 +184,19 @@

View available Census variable v
## # A tibble: 7,709 × 7
-##    vector    type   label                          units paren…¹ aggre…² details
-##    <chr>     <fct>  <chr>                          <fct> <chr>   <chr>   <chr>  
-##  1 v_CA21_1  Total  Population, 2021               Numb… NA      Additi… CA 202…
-##  2 v_CA21_2  Total  Population, 2016               Numb… NA      Additi… CA 202…
-##  3 v_CA21_3  Total  Population percentage change,… Numb… NA      Averag… CA 202…
-##  4 v_CA21_4  Total  Total private dwellings        Numb… NA      Additi… CA 202…
-##  5 v_CA21_5  Total  Private dwellings occupied by… Numb… v_CA21… Additi… CA 202…
-##  6 v_CA21_6  Total  Population density per square… Ratio NA      Averag… CA 202…
-##  7 v_CA21_7  Total  Land area in square kilometres Numb… NA      Additi… CA 202…
-##  8 v_CA21_8  Total  Total - Age                    Numb… NA      Additi… CA 202…
-##  9 v_CA21_9  Male   Total - Age                    Numb… NA      Additi… CA 202…
-## 10 v_CA21_10 Female Total - Age                    Numb… NA      Additi… CA 202…
-## # … with 7,699 more rows, and abbreviated variable names ¹​parent_vector,
-## #   ²​aggregation
+## vector type label units parent_vector aggregation details +## <chr> <fct> <chr> <fct> <chr> <chr> <chr> +## 1 v_CA21_1 Total Population, 2021 Numb… NA Additive CA 202… +## 2 v_CA21_2 Total Population, 2016 Numb… NA Additive CA 202… +## 3 v_CA21_3 Total Population percenta… Numb… NA Average of… CA 202… +## 4 v_CA21_4 Total Total private dwell… Numb… NA Additive CA 202… +## 5 v_CA21_5 Total Private dwellings o… Numb… v_CA21_4 Additive CA 202… +## 6 v_CA21_6 Total Population density … Ratio NA Average of… CA 202… +## 7 v_CA21_7 Total Land area in square… Numb… NA Additive CA 202… +## 8 v_CA21_8 Total Total - Age Numb… NA Additive CA 202… +## 9 v_CA21_9 Male Total - Age Numb… NA Additive CA 202… +## 10 v_CA21_10 Female Total - Age Numb… NA Additive CA 202… +## # ℹ 7,699 more rows

list_census_vectors(dataset) retrieves an index of all available vectors for a given dataset from the CensusMapper API or local cache if recently called. Each Census variable has a vector code @@ -305,7 +303,7 @@

Value

Examples

# list add the cached census data
 list_cancensus_cache()
-#> # A tibble: 1,628 × 11
-#>    path         dataset regions level vectors created_at          version   size
-#>    <chr>        <chr>   <chr>   <chr> <chr>   <dttm>              <chr>    <dbl>
-#>  1 CM_data_007… CA21    "{\"CM… Regi… "[]"    2023-01-26 07:18:01 d.4       1882
-#>  2 CM_data_009… CA06    "[\"{\… DA    "[]"    2022-05-21 15:28:16 d.1       1663
-#>  3 CM_data_00a… CA16    "[\"{\… DA    "[\"Po… 2022-05-14 16:24:07 d.1      16663
-#>  4 CM_data_014… CA06    "{\"CS… CT    "[\"v_… 2022-11-03 04:34:33 d.3      13801
-#>  5 CM_data_016… CA01    "{\"CS… DB    "[\"Po… 2022-12-12 12:54:14 d.3     179740
-#>  6 CM_data_016… CA16    "[\"{\… DA    "[]"    2022-05-21 15:28:24 d.1       1658
-#>  7 CM_data_01c… CA16    "[\"{\… CT    "[\"v_… 2022-07-13 15:23:08 d.1       5258
-#>  8 CM_data_01f… CA1996  "{\"CS… CSD   "[\"v_… 2022-08-18 19:13:18 d.2       8898
-#>  9 CM_data_024… CA16    "[\"{\… Regi… "[\"v_… 2022-04-27 23:26:47 d.1       3603
-#> 10 CM_data_027… CA21    "{\"CS… CT    "[\"v_… 2023-04-18 10:26:05 d.4       2099
-#> # … with 1,618 more rows, and 3 more variables: last_accessed <dttm>,
-#> #   access_count <dbl>, resolution <chr>
+#> # A tibble: 2,664 × 11
+#>    path          dataset regions level vectors created_at          version  size
+#>    <chr>         <chr>   <chr>   <chr> <chr>   <dttm>              <chr>   <dbl>
+#>  1 CM_data_0017… CA16    "{\"CS… Regi… "[\"v_… 2023-05-24 18:34:54 d.4       516
+#>  2 CM_data_0023… CA11    "{\"CS… Regi… "[\"v_… 2023-05-16 21:46:25 d.4       485
+#>  3 CM_data_0039… CA21    "{\"CS… Regi… "[\"v_… 2023-05-24 19:32:51 d.4       533
+#>  4 CM_data_0056… CA16    "{\"CS… Regi… "[\"v_… 2023-05-24 18:32:15 d.4       525
+#>  5 CM_data_006c… CA21    "{\"CS… Regi… "[\"v_… 2023-05-24 18:29:31 d.4       529
+#>  6 CM_data_007f… CA21    "{\"CM… Regi… "[]"    2023-01-26 07:18:01 d.4      1882
+#>  7 CM_data_008d… CA11    "{\"CS… Regi… "[\"v_… 2023-05-24 18:36:59 d.4       478
+#>  8 CM_data_0090… CA06    "[\"{\… DA    "[]"    2022-05-21 15:28:16 d.1      1663
+#>  9 CM_data_00af… CA16    "[\"{\… DA    "[\"Po… 2022-05-14 16:24:07 d.1     16663
+#> 10 CM_data_0103… CA01    "{\"CS… Regi… "[\"v_… 2023-05-24 18:36:45 d.4       501
+#> # ℹ 2,654 more rows
+#> # ℹ 3 more variables: last_accessed <dttm>, access_count <dbl>,
+#> #   resolution <chr>
 
 
diff --git a/docs/reference/list_census_datasets.html b/docs/reference/list_census_datasets.html index 7e4c1745..ebe50c71 100644 --- a/docs/reference/list_census_datasets.html +++ b/docs/reference/list_census_datasets.html @@ -124,20 +124,19 @@

Examples

list_census_datasets() #> Reading dataset list from temporary cache. #> # A tibble: 29 × 6 -#> dataset description geo_d…¹ attri…² refer…³ refer…⁴ -#> <chr> <chr> <chr> <chr> <chr> <chr> -#> 1 CA1996 1996 Canada Census CA1996 StatCa… 92-351… https:… -#> 2 CA01 2001 Canada Census CA01 StatCa… 92-378… https:… -#> 3 CA06 2006 Canada Census CA06 StatCa… 92-566… https:… -#> 4 CA11 2011 Canada Census and NHS CA11 StatCa… 98-301… https:… -#> 5 CA16 2016 Canada Census CA16 StatCa… 98-301… https:… -#> 6 CA21 2021 Canada Census CA21 StatCa… 98-301… https:… -#> 7 CA01xSD 2001 Canada Census xtab - Structural… CA01 StatCa… 92-378… https:… -#> 8 CA06xSD 2006 Canada Census xtab - Structural… CA06 StatCa… 92-566… https:… -#> 9 CA11xSD 2011 Canada Census xtab - Structural… CA11 StatCa… 98-301… https:… -#> 10 CA16xSD 2016 Canada Census xtab - Structural… CA16 StatCa… 98-301… https:… -#> # … with 19 more rows, and abbreviated variable names ¹​geo_dataset, -#> # ²​attribution, ³​reference, ⁴​reference_url +#> dataset description geo_dataset attribution reference reference_url +#> <chr> <chr> <chr> <chr> <chr> <chr> +#> 1 CA1996 1996 Canada Census CA1996 StatCan 19… 92-351-U https://www1… +#> 2 CA01 2001 Canada Census CA01 StatCan 20… 92-378-X https://www1… +#> 3 CA06 2006 Canada Census CA06 StatCan 20… 92-566-X https://www1… +#> 4 CA11 2011 Canada Census a… CA11 StatCan 20… 98-301-X… https://www1… +#> 5 CA16 2016 Canada Census CA16 StatCan 20… 98-301-X https://www1… +#> 6 CA21 2021 Canada Census CA21 StatCan 20… 98-301-X https://www1… +#> 7 CA01xSD 2001 Canada Census x… CA01 StatCan 20… 92-378-X https://www1… +#> 8 CA06xSD 2006 Canada Census x… CA06 StatCan 20… 92-566-X https://www1… +#> 9 CA11xSD 2011 Canada Census x… CA11 StatCan 20… 98-301-X https://www1… +#> 10 CA16xSD 2016 Canada Census x… CA16 StatCan 20… 98-301-X https://www1… +#> # ℹ 19 more rows
diff --git a/docs/reference/parent_census_vectors.html b/docs/reference/parent_census_vectors.html index 2c840ed0..0d7f9a32 100644 --- a/docs/reference/parent_census_vectors.html +++ b/docs/reference/parent_census_vectors.html @@ -116,10 +116,9 @@

Examples

# Query parent vectors directly using vector identifier
 parent_census_vectors("v_CA16_2519")
 #> # A tibble: 1 × 7
-#>   vector      type  label                          units paren…¹ aggre…² details
-#>   <chr>       <fct> <chr>                          <fct> <chr>   <chr>   <chr>  
-#> 1 v_CA16_2510 Total Total - Low-income status in … Numb… NA      Additi… CA 201…
-#> # … with abbreviated variable names ¹​parent_vector, ²​aggregation
+#>   vector      type  label                units parent_vector aggregation details
+#>   <chr>       <fct> <chr>                <fct> <chr>         <chr>       <chr>  
+#> 1 v_CA16_2510 Total Total - Low-income … Numb… NA            Additive    CA 201…
 if (FALSE) {
 # Example using multiple vectors coerced into a list
 parent_census_vectors(c("v_CA16_2519","v_CA16_2520","v_CA16_2521"))
diff --git a/docs/reference/search_census_vectors.html b/docs/reference/search_census_vectors.html
index feec8ee1..cc07ef55 100644
--- a/docs/reference/search_census_vectors.html
+++ b/docs/reference/search_census_vectors.html
@@ -121,20 +121,19 @@ 

Examples

search_census_vectors('Ojibway', 'CA16')
 #> Warning: search_census_vectors(). See ?find_census_vectors() for more robust search functions.
 #> # A tibble: 24 × 7
-#>    vector      type   label                        units paren…¹ aggre…² details
-#>    <chr>       <fct>  <chr>                        <fct> <chr>   <chr>   <chr>  
-#>  1 v_CA16_617  Total  Ojibway-Potawatomi languages Numb… v_CA16… Additi… CA 201…
-#>  2 v_CA16_618  Male   Ojibway-Potawatomi languages Numb… v_CA16… Additi… CA 201…
-#>  3 v_CA16_619  Female Ojibway-Potawatomi languages Numb… v_CA16… Additi… CA 201…
-#>  4 v_CA16_623  Total  Ojibway                      Numb… v_CA16… Additi… CA 201…
-#>  5 v_CA16_624  Male   Ojibway                      Numb… v_CA16… Additi… CA 201…
-#>  6 v_CA16_625  Female Ojibway                      Numb… v_CA16… Additi… CA 201…
-#>  7 v_CA16_1424 Total  Ojibway-Potawatomi languages Numb… v_CA16… Additi… CA 201…
-#>  8 v_CA16_1425 Male   Ojibway-Potawatomi languages Numb… v_CA16… Additi… CA 201…
-#>  9 v_CA16_1426 Female Ojibway-Potawatomi languages Numb… v_CA16… Additi… CA 201…
-#> 10 v_CA16_1430 Total  Ojibway                      Numb… v_CA16… Additi… CA 201…
-#> # … with 14 more rows, and abbreviated variable names ¹​parent_vector,
-#> #   ²​aggregation
+#>    vector      type   label              units parent_vector aggregation details
+#>    <chr>       <fct>  <chr>              <fct> <chr>         <chr>       <chr>  
+#>  1 v_CA16_617  Total  Ojibway-Potawatom… Numb… v_CA16_569    Additive    CA 201…
+#>  2 v_CA16_618  Male   Ojibway-Potawatom… Numb… v_CA16_570    Additive    CA 201…
+#>  3 v_CA16_619  Female Ojibway-Potawatom… Numb… v_CA16_571    Additive    CA 201…
+#>  4 v_CA16_623  Total  Ojibway            Numb… v_CA16_617    Additive    CA 201…
+#>  5 v_CA16_624  Male   Ojibway            Numb… v_CA16_618    Additive    CA 201…
+#>  6 v_CA16_625  Female Ojibway            Numb… v_CA16_619    Additive    CA 201…
+#>  7 v_CA16_1424 Total  Ojibway-Potawatom… Numb… v_CA16_1376   Additive    CA 201…
+#>  8 v_CA16_1425 Male   Ojibway-Potawatom… Numb… v_CA16_1377   Additive    CA 201…
+#>  9 v_CA16_1426 Female Ojibway-Potawatom… Numb… v_CA16_1378   Additive    CA 201…
+#> 10 v_CA16_1430 Total  Ojibway            Numb… v_CA16_1424   Additive    CA 201…
+#> # ℹ 14 more rows
 if (FALSE) {
 # This will return a warning that no match was found, but will suggest similar terms.
 search_census_vectors('Ojibwe', 'CA16', 'Total')

From ab20046e961a35b61b76471fda2606f9af4d14a1 Mon Sep 17 00:00:00 2001
From: Jens von Bergmann 
Date: Tue, 13 Jun 2023 10:55:38 -0700
Subject: [PATCH 7/8] emit a message every time data is loaded without a
 permanent cache path set, fix inconsistencies in instructions how to set the
 cache path and API keys.

---
 R/helpers.R                                   | 5 ++++-
 R/user_settings.R                             | 9 +++++----
 docs/articles/Making_maps_with_cancensus.html | 8 ++++----
 docs/articles/cancensus.html                  | 6 +++---
 docs/pkgdown.yml                              | 4 ++--
 docs/reference/list_cancensus_cache.html      | 4 ++--
 vignettes/cancensus.Rmd                       | 9 +++++----
 7 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/R/helpers.R b/R/helpers.R
index a46ddd0f..35385b89 100644
--- a/R/helpers.R
+++ b/R/helpers.R
@@ -22,7 +22,10 @@ cache_path <- function(...) {
   if (nchar(cache_dir)==0) {
     if (!is.null(getOption("cancensus.cache_path"))) {
       cache_dir <- getOption("cancensus.cache_path")
-    } else cache_dir <- tempdir()
+    } else {
+      cache_dir <- tempdir()
+      message(cm_no_cache_path_message)
+    }
   }
   if (!is.character(cache_dir)) {
     stop("Corrupt 'CM_CACHE_PATH' environment variable or 'cancensus.cache_path' option. Must be a path.",
diff --git a/R/user_settings.R b/R/user_settings.R
index 3febf2ff..ed2d7c80 100644
--- a/R/user_settings.R
+++ b/R/user_settings.R
@@ -138,9 +138,10 @@ show_cancensus_cache_path <- function() {
 cm_no_cache_path_message <- paste(
   "Census data is currently stored temporarily.\n\n",
   "In order to speed up performance, reduce API quota usage, and reduce",
-  "unnecessary network calls, please set up a persistent cache directory by",
-  "setting the environment variable CM_CACHE_PATH= '' or ",
+  "unnecessary network calls, please set up a persistent cache directory via",
+  "`set_cancensus_cache_path(, install = TRUE)`.\n\n",
+  "to set the environment variable CM_CACHE_PATH= '' or ",
   "setting options(cancensus.cache_path = '')\n\n",
-  "You may add this environment varianble to your .Renviron",
-  "or add this option, together with your API key, to your .Rprofile.\n\n"
+  "This will add your cache directory as environment varianble to your .Renviron to be",
+  "used across sessions and projects.\n\n"
 )
diff --git a/docs/articles/Making_maps_with_cancensus.html b/docs/articles/Making_maps_with_cancensus.html
index 4d87e7b3..e2f242b0 100644
--- a/docs/articles/Making_maps_with_cancensus.html
+++ b/docs/articles/Making_maps_with_cancensus.html
@@ -228,8 +228,8 @@ 

Interactive maps with leafletleaflet(toronto) %>% addProviderTiles(providers$CartoDB.Positron) %>% addPolygons()

-
-

Adding colour ramps and additional interactivity takes a little bit +

+

Adding colour ramps and additional interactivity takes a little bit more work but is still pretty easy to implement. Following this example we can specify the colour ramp to match our needs.

@@ -242,8 +242,8 @@ 

Interactive maps with leaflet= 1, opacity = 1, fillOpacity = 0.65)

-
- +
+
diff --git a/docs/articles/cancensus.html b/docs/articles/cancensus.html index 64d143d5..d093856e 100644 --- a/docs/articles/cancensus.html +++ b/docs/articles/cancensus.html @@ -144,7 +144,7 @@

Cancensus and CensusMappercancensus, to provide interactive geographic visualizations of Canadian Census data. CensusMapper databases store all publicly available data from Statistics Canada for the 2006, 2011, and -2016 Censuses. Censusmapper data can be accessed via an API and +2016 Censuses. CensusMapper data can be accessed via an API and cancensus is built to interface directly with it.

Installing cancensus @@ -192,7 +192,7 @@

Installing cancensus
# list add the cached census data
 list_cancensus_cache()
-#> # A tibble: 2,664 × 11
+#> # A tibble: 2,678 × 11
 #>    path          dataset regions level vectors created_at          version  size
 #>    <chr>         <chr>   <chr>   <chr> <chr>   <dttm>              <chr>   <dbl>
 #>  1 CM_data_0017… CA16    "{\"CS… Regi… "[\"v_… 2023-05-24 18:34:54 d.4       516
@@ -117,7 +117,7 @@ 

Examples

#> 8 CM_data_0090… CA06 "[\"{\… DA "[]" 2022-05-21 15:28:16 d.1 1663 #> 9 CM_data_00af… CA16 "[\"{\… DA "[\"Po… 2022-05-14 16:24:07 d.1 16663 #> 10 CM_data_0103… CA01 "{\"CS… Regi… "[\"v_… 2023-05-24 18:36:45 d.4 501 -#> # ℹ 2,654 more rows +#> # ℹ 2,668 more rows #> # ℹ 3 more variables: last_accessed <dttm>, access_count <dbl>, #> # resolution <chr> diff --git a/vignettes/cancensus.Rmd b/vignettes/cancensus.Rmd index 73119704..e65436d4 100644 --- a/vignettes/cancensus.Rmd +++ b/vignettes/cancensus.Rmd @@ -19,19 +19,20 @@ knitr::opts_chunk$set( ) library(cancensus) library(dplyr) -# set_api_key(, install = TRUE) +# set_cancensus_api_key(', install = TRUE) +# set_cancensus_cache_path(, install = TRUE) ``` # Cancensus and CensusMapper The **cancensus** package was developed to provide users with a way to access Canadian Census in a programmatic way following good [tidy data](http://vita.had.co.nz/papers/tidy-data.pdf) practices. While the structure and data in **cancensus** is unique to Canadian Census data, this package is inspired in part by [tidycensus](https://github.com/walkerke/tidycensus), a package to interface with the US Census Bureau data APIs. -As Statistics Canada does not provide direct API access to Census data, **cancensus** retrieves Census data indirectly through the [CensusMapper](https://censusmapper.ca) API. CensusMapper is a project by [Jens von Bergmann](https://github.com/mountainMath), one of the authors of **cancensus**, to provide interactive geographic visualizations of Canadian Census data. CensusMapper databases store all publicly available data from Statistics Canada for the 2006, 2011, and 2016 Censuses. Censusmapper data can be accessed via an API and **cancensus** is built to interface directly with it. +As Statistics Canada does not provide direct API access to Census data, **cancensus** retrieves Census data indirectly through the [CensusMapper](https://censusmapper.ca) API. CensusMapper is a project by [Jens von Bergmann](https://github.com/mountainMath), one of the authors of **cancensus**, to provide interactive geographic visualizations of Canadian Census data. CensusMapper databases store all publicly available data from Statistics Canada for the 2006, 2011, and 2016 Censuses. CensusMapper data can be accessed via an API and **cancensus** is built to interface directly with it. ## API Key **cancensus** requires a valid CensusMapper API key to use. You can obtain a free API key by [signing up](https://censusmapper.ca/users/sign_up) for a CensusMapper account. CensusMapper API keys are free and public API quotas are generous; however, due to incremental costs of serving large quantities of data, there limits to API usage in place. For most use cases, these API limits should not be an issue. Production uses with large extracts of fine grained geographies may run into API quota limits. For larger quotas, please get in touch with Jens [directly](mailto:jens@censusmapper.ca). -To check your API key, just go to "Edit Profile" (in the top-right of the CensusMapper menu bar). Once you have your key, you can store it in your system environment so it is automatically used in API calls. To do so just enter `set_api_key(, install = TRUE)` +To check your API key, just go to "Edit Profile" (in the top-right of the CensusMapper menu bar). Once you have your key, you can store it in your system environment so it is automatically used in API calls. To do so just enter `set_cancensus_api_key(', install = TRUE)` ## Installing cancensus @@ -56,7 +57,7 @@ options(cancensus.api_key = "your_api_key") options(cancensus.cache_path = "custom cache path") ``` -For performance reasons, and to avoid unnecessarily drawing down API quotas, **cancensus** caches data queries under the hood. By default, **cancensus** caches in R's temporary directory, but this cache is not persistent across sessions. In order to speed up performance, reduce quota usage, and reduce the need for unnecessary network calls, we recommend assigning a persistent local cache using `set_cache_path(, install = TRUE)`, this enables more efficient loading and reuse of downloaded data.. Users will be prompted with a suggestion to change their default cache location when making API calls if one has not been set yet. +For performance reasons, and to avoid unnecessarily drawing down API quotas, **cancensus** caches data queries under the hood. By default, **cancensus** caches in R's temporary directory, but this cache is not persistent across sessions. In order to speed up performance, reduce quota usage, and reduce the need for unnecessary network calls, we recommend assigning a persistent local cache using `set_cancensus_cache_path(, install = TRUE)`, this enables more efficient loading and reuse of downloaded data.. Users will be prompted with a suggestion to change their default cache location when making API calls if one has not been set yet. # Accessing Census Data From 9b486cc5bba9cc05645150793f297dcf928c8591 Mon Sep 17 00:00:00 2001 From: Jens von Bergmann Date: Wed, 4 Oct 2023 08:58:05 -0700 Subject: [PATCH 8/8] getting ready for submission --- R/user_settings.R | 12 +- README.md | 8 +- docs/articles/Making_maps_with_cancensus.html | 10 +- .../leaflet.js | 24 +- .../leaflet-providers_1.13.0.js} | 447 ++++++++++++++---- .../leaflet-providers-plugin.js | 0 .../leafletfix-1.0.0/leafletfix.css | 10 +- docs/articles/cancensus.html | 52 +- docs/index.html | 8 +- docs/pkgdown.yml | 2 +- docs/reference/list_cancensus_cache.html | 24 +- vignettes/cancensus.Rmd | 19 +- 12 files changed, 434 insertions(+), 182 deletions(-) rename docs/articles/Making_maps_with_cancensus_files/{leaflet-binding-2.1.2 => leaflet-binding-2.2.0}/leaflet.js (99%) rename docs/articles/Making_maps_with_cancensus_files/{leaflet-providers-1.9.0/leaflet-providers_1.9.0.js => leaflet-providers-1.13.0/leaflet-providers_1.13.0.js} (64%) rename docs/articles/Making_maps_with_cancensus_files/{leaflet-providers-plugin-2.1.2 => leaflet-providers-plugin-2.2.0}/leaflet-providers-plugin.js (100%) diff --git a/R/user_settings.R b/R/user_settings.R index ed2d7c80..3278a78c 100644 --- a/R/user_settings.R +++ b/R/user_settings.R @@ -43,7 +43,8 @@ set_cancensus_api_key <- function(key, overwrite = FALSE, install = FALSE){ keyconcat <- paste0("CM_API_KEY='", key, "'") # Append API key to .Renviron file write(keyconcat, renv, sep = "\n", append = TRUE) - message('Your API key has been stored in your .Renviron and can be accessed by Sys.getenv("CM_API_KEY"). \nTo use now, restart R or run `readRenviron("~/.Renviron")`') + Sys.setenv(CM_API_KEY = key) + message('Your API key has been stored in your .Renviron and can be accessed by Sys.getenv("CM_API_KEY").') } else { message("API key set for duration of session. To install your API key for use across sessions, run this function with `install = TRUE`.") Sys.setenv(CM_API_KEY = key) @@ -65,7 +66,7 @@ set_cancensus_api_key <- function(key, overwrite = FALSE, install = FALSE){ #'\dontrun{ #' set_cancensus_cache_path("~/cancensus_cache") #' -#' # This will set the cache path permanently until ovewritten again +#' # This will set the cache path permanently until overwritten again #' set_cancensus_cache_path("~/cancensus_cache", install = TRUE) #' } set_cancensus_cache_path <- function(cache_path, overwrite = FALSE, install = FALSE){ @@ -93,7 +94,8 @@ set_cancensus_cache_path <- function(cache_path, overwrite = FALSE, install = FA keyconcat <- paste0("CM_CACHE_PATH='", cache_path, "'") # Append cache path .Renviron file write(keyconcat, renv, sep = "\n", append = TRUE) - message('Your cache path has been stored in your .Renviron and can be accessed by Sys.getenv("CM_CACHE_PATH"). \nTo use now, restart R or run readRenviron("~/.Renviron").') + message('Your cache path has been stored in your .Renviron and can be accessed by Sys.getenv("CM_CACHE_PATH").') + Sys.setenv('CM_CACHE_PATH' = cache_path) } else { message("Cache set for duration of session. To permanently add your cache path for use across sessions, run this function with install = TRUE.") Sys.setenv('CM_CACHE_PATH' = cache_path) @@ -139,9 +141,7 @@ cm_no_cache_path_message <- paste( "Census data is currently stored temporarily.\n\n", "In order to speed up performance, reduce API quota usage, and reduce", "unnecessary network calls, please set up a persistent cache directory via", - "`set_cancensus_cache_path(, install = TRUE)`.\n\n", - "to set the environment variable CM_CACHE_PATH= '' or ", - "setting options(cancensus.cache_path = '')\n\n", + "`set_cancensus_cache_path('', install = TRUE)`.\n", "This will add your cache directory as environment varianble to your .Renviron to be", "used across sessions and projects.\n\n" ) diff --git a/README.md b/README.md index 949b2cf8..ff6b9965 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,13 @@ library(cancensus) Alternatively, the latest development version can be installed from Github. ``` -devtools::install_github("mountainmath/cancensus") +remotes::install_github("mountainmath/cancensus") library(cancensus) ``` ### API key -**cancensus** requires a valid CensusMapper API key to use. You can obtain a free API key by [signing up](https://censusmapper.ca/users/sign_up) for a CensusMapper account. To check your API key, just go to "Edit Profile" (in the top-right of the CensusMapper menu bar). Once you have your key, you can store it in your system environment so it is automatically used in API calls. To do so just enter `set_cancensus_api_key(', install = TRUE)`. +**cancensus** requires a valid CensusMapper API key to use. You can obtain a free API key by [signing up](https://censusmapper.ca/users/sign_up) for a CensusMapper account. To check your API key, just go to "Edit Profile" (in the top-right of the CensusMapper menu bar). Once you have your key, you can store it in your system environment so it is automatically used in API calls. To do so just enter `set_cancensus_api_key('', install = TRUE)`. CensusMapper API keys are free and public API quotas are generous; however, due to incremental costs of serving large quantities of data, there are some limits to API usage in place. For most use cases, these API limits should not be an issue. Production uses with large extracts of detailed geographies may run into API quota limits. @@ -45,13 +45,13 @@ For larger quotas, please get in touch with Jens [directly](mailto:jens@censusma ### Local Cache -For performance reasons, and to avoid unnecessarily drawing down API quotas, **cancensus** caches data queries under the hood. By default, **cancensus** caches in R's temporary directory, but this cache is not persistent across sessions. In order to speed up performance, reduce quota usage, and reduce the need for unnecessary network calls, we recommend assigning a persistent local cache using `set_cancensus_cache_path(, install = TRUE)`, this enables more efficient loading and reuse of downloaded data. Users will be prompted with a suggestion to change their default cache location when making API calls if one has not been set yet. +For performance reasons, and to avoid unnecessarily drawing down API quotas, **cancensus** caches data queries under the hood. By default, **cancensus** caches in R's temporary directory, but this cache is not persistent across sessions. In order to speed up performance, reduce quota usage, and reduce the need for unnecessary network calls, we recommend assigning a persistent local cache using `set_cancensus_cache_path('', install = TRUE)`, this enables more efficient loading and reuse of downloaded data. Users will be prompted with a suggestion to change their default cache location when making API calls if one has not been set yet. Starting with version 0.5.2 **cancensus** will automatically check if for data that has been recalled by Statistics Canada and is stored in the local cache via the new data recall API implemented in [CensusMapper](https://censusmapper.ca). Statistics Canada occasionally detects and corrects errors in their census data releases, and **cancensus** will download a list of recalled data at the first invocation of `get_census()` in each session and emit a warning if it detected locally cached data that has been recalled. Removal of the cached recalled data has to be done explicitly by the user via the `remove_recalled_chached_data()` function. If data was cached with **cancensus** versions prior to version 0.5.0 there is insufficient metadata to determine all instances of recalled cached data, but the package will check every time cached data is loaded and can identify recalled data at this point at the latest and issues a warning if recalled data is loaded. ### Currently available datasets -**cancensus** can access Statistics Canada Census data for Census years 1996, 2001, 2006, 2011, 2016, and 2021. You can run `list_census_datasets` to check what datasets are currently available for access through the CensusMapper API. Additional data for the 2021 Census will be included in Censusmapper within a day or two after public release by Statistics Canada. Statistics Canada maintains a release schedule for the Census 2021 Program which can be viewed on their [website](https://www12.statcan.gc.ca/census-recensement/2021/ref/prodserv/release-diffusion-eng.cfm). +**cancensus** can access Statistics Canada Census data for Census years 1996, 2001, 2006, 2011, 2016, and 2021. You can run `list_census_datasets` to check what datasets are currently available for access through the CensusMapper API. Additional data for the 2021 Census will be included in CensusMapper within a day or two after public release by Statistics Canada. Statistics Canada maintains a release schedule for the Census 2021 Program which can be viewed on their [website](https://www12.statcan.gc.ca/census-recensement/2021/ref/prodserv/release-diffusion-eng.cfm). Thanks to contributions by the Canada Mortgage and Housing Corporation (CMHC), **cancensus** now includes additional Census-linked datasets as open-data releases. These include annual taxfiler data at the census tract level for tax years 2000 through 2018, which includes data on incomes and demographics, as well as specialized crosstabs for Structural type of dwelling by Document type, which details occupancy status for residences. These crosstabs are available for the 2001, 2006, 2011, 2016, and 2021 Census years at all levels starting with census tract. diff --git a/docs/articles/Making_maps_with_cancensus.html b/docs/articles/Making_maps_with_cancensus.html index e2f242b0..06117f31 100644 --- a/docs/articles/Making_maps_with_cancensus.html +++ b/docs/articles/Making_maps_with_cancensus.html @@ -117,7 +117,7 @@ -

-
-

Adding colour ramps and additional interactivity takes a little bit +

+

Adding colour ramps and additional interactivity takes a little bit more work but is still pretty easy to implement. Following this example we can specify the colour ramp to match our needs.

@@ -242,8 +242,8 @@ 

Interactive maps with leaflet= 1, opacity = 1, fillOpacity = 0.65)

-
- +
+ diff --git a/docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.1.2/leaflet.js b/docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.2.0/leaflet.js similarity index 99% rename from docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.1.2/leaflet.js rename to docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.2.0/leaflet.js index 1eafcbe0..c8e7e5e0 100644 --- a/docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.1.2/leaflet.js +++ b/docs/articles/Making_maps_with_cancensus_files/leaflet-binding-2.2.0/leaflet.js @@ -593,8 +593,20 @@ function preventUnintendedZoomOnScroll(map) { }); (0, _jquery2["default"])(document).on("mousemove", "*", function (e) { // Did the mouse really move? - if (lastScreen.x !== null && e.screenX !== lastScreen.x || e.screenY !== lastScreen.y) { - // It really moved. Enable zooming. + if (map.options.scrollWheelZoom) { + if (lastScreen.x !== null && e.screenX !== lastScreen.x || e.screenY !== lastScreen.y) { + // It really moved. Enable zooming. + map.scrollWheelZoom.enable(); + lastScreen = { + x: null, + y: null + }; + } + } + }); + (0, _jquery2["default"])(document).on("mousedown", ".leaflet", function (e) { + // Clicking always enables zooming. + if (map.options.scrollWheelZoom) { map.scrollWheelZoom.enable(); lastScreen = { x: null, @@ -602,14 +614,6 @@ function preventUnintendedZoomOnScroll(map) { }; } }); - (0, _jquery2["default"])(document).on("mousedown", ".leaflet", function (e) { - // Clicking always enables zooming. - map.scrollWheelZoom.enable(); - lastScreen = { - x: null, - y: null - }; - }); } _htmlwidgets2["default"].widget({ diff --git a/docs/articles/Making_maps_with_cancensus_files/leaflet-providers-1.9.0/leaflet-providers_1.9.0.js b/docs/articles/Making_maps_with_cancensus_files/leaflet-providers-1.13.0/leaflet-providers_1.13.0.js similarity index 64% rename from docs/articles/Making_maps_with_cancensus_files/leaflet-providers-1.9.0/leaflet-providers_1.9.0.js rename to docs/articles/Making_maps_with_cancensus_files/leaflet-providers-1.13.0/leaflet-providers_1.13.0.js index e842c82d..e9986a97 100644 --- a/docs/articles/Making_maps_with_cancensus_files/leaflet-providers-1.9.0/leaflet-providers_1.9.0.js +++ b/docs/articles/Making_maps_with_cancensus_files/leaflet-providers-1.13.0/leaflet-providers_1.13.0.js @@ -77,7 +77,7 @@ L.TileLayer.Provider.providers = { OpenStreetMap: { - url: '//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', options: { maxZoom: 19, attribution: @@ -86,27 +86,27 @@ variants: { Mapnik: {}, DE: { - url: '//{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png', + url: 'https://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png', options: { maxZoom: 18 } }, CH: { - url: '//tile.osm.ch/switzerland/{z}/{x}/{y}.png', + url: 'https://tile.osm.ch/switzerland/{z}/{x}/{y}.png', options: { maxZoom: 18, bounds: [[45, 5], [48, 11]] } }, France: { - url: '//{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', + url: 'https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', options: { maxZoom: 20, - attribution: '© Openstreetmap France | {attribution.OpenStreetMap}' + attribution: '© OpenStreetMap France | {attribution.OpenStreetMap}' } }, HOT: { - url: '//{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', + url: 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', options: { attribution: '{attribution.OpenStreetMap}, ' + @@ -115,7 +115,7 @@ } }, BZH: { - url: '//tile.openstreetmap.bzh/br/{z}/{x}/{y}.png', + url: 'https://tile.openstreetmap.bzh/br/{z}/{x}/{y}.png', options: { attribution: '{attribution.OpenStreetMap}, Tiles courtesy of
Breton OpenStreetMap Team', bounds: [[46.2, -5.5], [50, 0.7]] @@ -124,16 +124,16 @@ } }, OpenSeaMap: { - url: '//tiles.openseamap.org/seamark/{z}/{x}/{y}.png', + url: 'https://tiles.openseamap.org/seamark/{z}/{x}/{y}.png', options: { attribution: 'Map data: © OpenSeaMap contributors' } }, - OpenPtMap: { - url: 'http://openptmap.org/tiles/{z}/{x}/{y}.png', + OPNVKarte: { + url: 'https://tileserver.memomaps.de/tilegen/{z}/{x}/{y}.png', options: { - maxZoom: 17, - attribution: 'Map data: © OpenPtMap contributors' + maxZoom: 18, + attribution: 'Map memomaps.de CC-BY-SA, map data {attribution.OpenStreetMap}' } }, OpenTopoMap: { @@ -158,12 +158,33 @@ } }, SafeCast: { - url: '//s3.amazonaws.com/te512.safecast.org/{z}/{x}/{y}.png', + url: 'https://s3.amazonaws.com/te512.safecast.org/{z}/{x}/{y}.png', options: { maxZoom: 16, attribution: 'Map data: {attribution.OpenStreetMap} | Map style: © SafeCast (CC-BY-SA)' } }, + Stadia: { + url: 'https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png', + options: { + maxZoom: 20, + attribution: '© Stadia Maps, © OpenMapTiles © OpenStreetMap contributors' + }, + variants: { + AlidadeSmooth: { + url: 'https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png' + }, + AlidadeSmoothDark: { + url: 'https://tiles.stadiamaps.com/tiles/alidade_smooth_dark/{z}/{x}/{y}{r}.png' + }, + OSMBright: { + url: 'https://tiles.stadiamaps.com/tiles/osm_bright/{z}/{x}/{y}{r}.png' + }, + Outdoors: { + url: 'https://tiles.stadiamaps.com/tiles/outdoors/{z}/{x}/{y}{r}.png' + } + } + }, Thunderforest: { url: 'https://{s}.tile.thunderforest.com/{variant}/{z}/{x}/{y}.png?apikey={apikey}', options: { @@ -197,60 +218,17 @@ Neighbourhood: 'neighbourhood' } }, - OpenMapSurfer: { - url: 'https://maps.heigit.org/openmapsurfer/tiles/{variant}/webmercator/{z}/{x}/{y}.png', + CyclOSM: { + url: 'https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png', options: { - maxZoom: 19, - variant: 'roads', - attribution: 'Imagery from GIScience Research Group @ University of Heidelberg | Map data ' - }, - variants: { - Roads: { - options: { - variant: 'roads', - attribution: '{attribution.OpenMapSurfer}{attribution.OpenStreetMap}' - } - }, - Hybrid: { - options: { - variant: 'hybrid', - attribution: '{attribution.OpenMapSurfer}{attribution.OpenStreetMap}' - } - }, - AdminBounds: { - options: { - variant: 'adminb', - maxZoom: 18, - attribution: '{attribution.OpenMapSurfer}{attribution.OpenStreetMap}' - } - }, - ContourLines: { - options: { - variant: 'asterc', - maxZoom: 18, - minZoom: 13, - attribution: '{attribution.OpenMapSurfer} ASTER GDEM' - } - }, - Hillshade: { - options: { - variant: 'asterh', - maxZoom: 18, - attribution: '{attribution.OpenMapSurfer} ASTER GDEM, SRTM' - } - }, - ElementsAtRisk: { - options: { - variant: 'elements_at_risk', - attribution: '{attribution.OpenMapSurfer}{attribution.OpenStreetMap}' - } - } + maxZoom: 20, + attribution: 'CyclOSM | Map data: {attribution.OpenStreetMap}' } }, Hydda: { - url: '//{s}.tile.openstreetmap.se/hydda/{variant}/{z}/{x}/{y}.png', + url: 'https://{s}.tile.openstreetmap.se/hydda/{variant}/{z}/{x}/{y}.png', options: { - maxZoom: 18, + maxZoom: 20, variant: 'full', attribution: 'Tiles courtesy of OpenStreetMap Sweden — Map data {attribution.OpenStreetMap}' }, @@ -260,20 +238,75 @@ RoadsAndLabels: 'roads_and_labels' } }, + Jawg: { + url: 'https://{s}.tile.jawg.io/{variant}/{z}/{x}/{y}{r}.png?access-token={accessToken}', + options: { + attribution: + '© JawgMaps ' + + '{attribution.OpenStreetMap}', + minZoom: 0, + maxZoom: 22, + subdomains: 'abcd', + variant: 'jawg-terrain', + // Get your own Jawg access token here : https://www.jawg.io/lab/ + // NB : this is a demonstration key that comes with no guarantee + accessToken: '', + }, + variants: { + Streets: 'jawg-streets', + Terrain: 'jawg-terrain', + Sunny: 'jawg-sunny', + Dark: 'jawg-dark', + Light: 'jawg-light', + Matrix: 'jawg-matrix' + } + }, MapBox: { - url: 'https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}{r}.png?access_token={accessToken}', + url: 'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}{r}?access_token={accessToken}', options: { attribution: - '© Mapbox ' + + '© Mapbox ' + '{attribution.OpenStreetMap} ' + 'Improve this map', - subdomains: 'abcd', - id: 'mapbox.streets', + tileSize: 512, + maxZoom: 18, + zoomOffset: -1, + id: 'mapbox/streets-v11', accessToken: '', } }, + MapTiler: { + url: 'https://api.maptiler.com/maps/{variant}/{z}/{x}/{y}{r}.{ext}?key={key}', + options: { + attribution: + '© MapTiler © OpenStreetMap contributors', + variant: 'streets', + ext: 'png', + key: '', + tileSize: 512, + zoomOffset: -1, + minZoom: 0, + maxZoom: 21 + }, + variants: { + Streets: 'streets', + Basic: 'basic', + Bright: 'bright', + Pastel: 'pastel', + Positron: 'positron', + Hybrid: { + options: { + variant: 'hybrid', + ext: 'jpg' + } + }, + Toner: 'toner', + Topo: 'topo', + Voyager: 'voyager' + } + }, Stamen: { - url: '//stamen-tiles-{s}.a.ssl.fastly.net/{variant}/{z}/{x}/{y}{r}.{ext}', + url: 'https://stamen-tiles-{s}.a.ssl.fastly.net/{variant}/{z}/{x}/{y}{r}.{ext}', options: { attribution: 'Map tiles by Stamen Design, ' + @@ -293,7 +326,7 @@ TonerLabels: 'toner-labels', TonerLite: 'toner-lite', Watercolor: { - url: '//stamen-tiles-{s}.a.ssl.fastly.net/{variant}/{z}/{x}/{y}.{ext}', + url: 'https://stamen-tiles-{s}.a.ssl.fastly.net/{variant}/{z}/{x}/{y}.{ext}', options: { variant: 'watercolor', ext: 'jpg', @@ -323,7 +356,7 @@ } }, TopOSMRelief: { - url: '//stamen-tiles-{s}.a.ssl.fastly.net/{variant}/{z}/{x}/{y}.{ext}', + url: 'https://stamen-tiles-{s}.a.ssl.fastly.net/{variant}/{z}/{x}/{y}.{ext}', options: { variant: 'toposm-color-relief', ext: 'jpg', @@ -358,7 +391,7 @@ } }, Esri: { - url: '//server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}', + url: 'https://server.arcgisonline.com/ArcGIS/rest/services/{variant}/MapServer/tile/{z}/{y}/{x}', options: { variant: 'World_Street_Map', attribution: 'Tiles © Esri' @@ -446,7 +479,7 @@ options: { maxZoom: 19, attribution: 'Map data © OpenWeatherMap', - apiKey:'', + apiKey: '', opacity: 0.5 }, variants: { @@ -466,7 +499,7 @@ HERE: { /* * HERE maps, formerly Nokia maps. - * These basemaps are free, but you need an API key. Please sign up at + * These basemaps are free, but you need an api id and app key. Please sign up at * https://developer.here.com/plans */ url: @@ -582,12 +615,120 @@ } } }, + HEREv3: { + /* + * HERE maps API Version 3. + * These basemaps are free, but you need an API key. Please sign up at + * https://developer.here.com/plans + * Version 3 deprecates the app_id and app_code access in favor of apiKey + * + * Supported access methods as of 2019/12/21: + * @see https://developer.here.com/faqs#access-control-1--how-do-you-control-access-to-here-location-services + */ + url: + 'https://{s}.{base}.maps.ls.hereapi.com/maptile/2.1/' + + '{type}/{mapID}/{variant}/{z}/{x}/{y}/{size}/{format}?' + + 'apiKey={apiKey}&lg={language}', + options: { + attribution: + 'Map © 1987-' + new Date().getFullYear() + ' HERE', + subdomains: '1234', + mapID: 'newest', + apiKey: '', + base: 'base', + variant: 'normal.day', + maxZoom: 20, + type: 'maptile', + language: 'eng', + format: 'png8', + size: '256' + }, + variants: { + normalDay: 'normal.day', + normalDayCustom: 'normal.day.custom', + normalDayGrey: 'normal.day.grey', + normalDayMobile: 'normal.day.mobile', + normalDayGreyMobile: 'normal.day.grey.mobile', + normalDayTransit: 'normal.day.transit', + normalDayTransitMobile: 'normal.day.transit.mobile', + normalNight: 'normal.night', + normalNightMobile: 'normal.night.mobile', + normalNightGrey: 'normal.night.grey', + normalNightGreyMobile: 'normal.night.grey.mobile', + normalNightTransit: 'normal.night.transit', + normalNightTransitMobile: 'normal.night.transit.mobile', + reducedDay: 'reduced.day', + reducedNight: 'reduced.night', + basicMap: { + options: { + type: 'basetile' + } + }, + mapLabels: { + options: { + type: 'labeltile', + format: 'png' + } + }, + trafficFlow: { + options: { + base: 'traffic', + type: 'flowtile' + } + }, + carnavDayGrey: 'carnav.day.grey', + hybridDay: { + options: { + base: 'aerial', + variant: 'hybrid.day' + } + }, + hybridDayMobile: { + options: { + base: 'aerial', + variant: 'hybrid.day.mobile' + } + }, + hybridDayTransit: { + options: { + base: 'aerial', + variant: 'hybrid.day.transit' + } + }, + hybridDayGrey: { + options: { + base: 'aerial', + variant: 'hybrid.grey.day' + } + }, + pedestrianDay: 'pedestrian.day', + pedestrianNight: 'pedestrian.night', + satelliteDay: { + options: { + base: 'aerial', + variant: 'satellite.day' + } + }, + terrainDay: { + options: { + base: 'aerial', + variant: 'terrain.day' + } + }, + terrainDayMobile: { + options: { + base: 'aerial', + variant: 'terrain.day.mobile' + } + } + } + }, FreeMapSK: { - url: 'http://t{s}.freemap.sk/T/{z}/{x}/{y}.jpeg', + url: 'https://{s}.freemap.sk/T/{z}/{x}/{y}.jpeg', options: { minZoom: 8, maxZoom: 16, - subdomains: '1234', + subdomains: 'abcd', bounds: [[47.204642, 15.996093], [49.830896, 22.576904]], attribution: '{attribution.OpenStreetMap}, vizualization CC-By-SA 2.0 Freemap.sk' @@ -605,7 +746,7 @@ options: { attribution: '{attribution.OpenStreetMap} © CARTO', subdomains: 'abcd', - maxZoom: 19, + maxZoom: 20, variant: 'light_all' }, variants: { @@ -639,11 +780,12 @@ } }, BasemapAT: { - url: '//maps{s}.wien.gv.at/basemap/{variant}/normal/google3857/{z}/{y}/{x}.{format}', + url: 'https://maps{s}.wien.gv.at/basemap/{variant}/{type}/google3857/{z}/{y}/{x}.{format}', options: { maxZoom: 19, attribution: 'Datenquelle: basemap.at', subdomains: ['', '1', '2', '3', '4'], + type: 'normal', format: 'png', bounds: [[46.358770, 8.782379], [49.037872, 17.189532]], variant: 'geolandbasemap' @@ -657,6 +799,20 @@ }, grau: 'bmapgrau', overlay: 'bmapoverlay', + terrain: { + options: { + variant: 'bmapgelaende', + type: 'grau', + format: 'jpeg' + } + }, + surface: { + options: { + variant: 'bmapoberflaeche', + type: 'grau', + format: 'jpeg' + } + }, highdpi: { options: { variant: 'bmaphidpi', @@ -673,19 +829,19 @@ } }, nlmaps: { - url: '//geodata.nationaalgeoregister.nl/tiles/service/wmts/{variant}/EPSG:3857/{z}/{x}/{y}.png', + url: 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts/{variant}/EPSG:3857/{z}/{x}/{y}.png', options: { minZoom: 6, maxZoom: 19, bounds: [[50.5, 3.25], [54, 7.6]], - attribution: 'Kaartgegevens © Kadaster' + attribution: 'Kaartgegevens © Kadaster' }, variants: { 'standaard': 'brtachtergrondkaart', 'pastel': 'brtachtergrondkaartpastel', 'grijs': 'brtachtergrondkaartgrijs', 'luchtfoto': { - 'url': '//geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts/1.0.0/2016_ortho25/EPSG:3857/{z}/{x}/{y}.png', + 'url': 'https://service.pdok.nl/hwh/luchtfotorgb/wmts/v1_0/Actueel_ortho25/EPSG:3857/{z}/{x}/{y}.jpeg', } } }, @@ -721,7 +877,7 @@ }, ModisTerraSnowCover: { options: { - variant: 'MODIS_Terra_Snow_Cover', + variant: 'MODIS_Terra_NDSI_Snow_Cover', format: 'png', maxZoom: 8, opacity: 0.75 @@ -754,7 +910,7 @@ // z0-9 - 1:1m // z10-11 - quarter inch (1:253440) // z12-18 - one inch (1:63360) - url: '//nls-{s}.tileserver.com/nls/{z}/{x}/{y}.jpg', + url: 'https://nls-{s}.tileserver.com/nls/{z}/{x}/{y}.jpg', options: { attribution: 'National Library of Scotland Historic Maps', bounds: [[49.6, -12], [61.7, 3]], @@ -767,7 +923,7 @@ // Justice Map (http://www.justicemap.org/) // Visualize race and income data for your community, county and country. // Includes tools for data journalists, bloggers and community activists. - url: 'http://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png', + url: 'https://www.justicemap.org/tile/{size}/{variant}/{z}/{x}/{y}.png', options: { attribution: 'Justice Map', // one of 'county', 'tract', 'block' @@ -787,14 +943,6 @@ plurality: 'plural' } }, - Wikimedia: { - url: 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}{r}.png', - options: { - attribution: 'Wikimedia', - minZoom: 1, - maxZoom: 19 - } - }, GeoportailFrance: { url: 'https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER={variant}&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', options: { @@ -805,31 +953,30 @@ // Get your own geoportail apikey here : http://professionnels.ign.fr/ign/contrats/ // NB : 'choisirgeoportail' is a demonstration key that comes with no guarantee apikey: 'choisirgeoportail', - format: 'image/jpeg', - style : 'normal', - variant: 'GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN-EXPRESS.STANDARD' + format: 'image/png', + style: 'normal', + variant: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2' }, variants: { + plan: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2', parcels: { - options : { - variant: 'CADASTRALPARCELS.PARCELS', - maxZoom: 20, - style : 'bdparcellaire', - format: 'image/png' + options: { + variant: 'CADASTRALPARCELS.PARCELLAIRE_EXPRESS', + style: 'PCI vecteur', + maxZoom: 20 } }, - ignMaps: 'GEOGRAPHICALGRIDSYSTEMS.MAPS', - maps: 'GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN-EXPRESS.STANDARD', orthos: { options: { maxZoom: 19, + format: 'image/jpeg', variant: 'ORTHOIMAGERY.ORTHOPHOTOS' } } } }, OneMapSG: { - url: '//maps-{s}.onemap.sg/v3/{variant}/{z}/{x}/{y}.png', + url: 'https://maps-{s}.onemap.sg/v3/{variant}/{z}/{x}/{y}.png', options: { variant: 'Default', minZoom: 11, @@ -844,6 +991,104 @@ Grey: 'Grey', LandLot: 'LandLot' } + }, + USGS: { + url: 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}', + options: { + maxZoom: 20, + attribution: 'Tiles courtesy of the U.S. Geological Survey' + }, + variants: { + USTopo: {}, + USImagery: { + url: 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/{z}/{y}/{x}' + }, + USImageryTopo: { + url: 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryTopo/MapServer/tile/{z}/{y}/{x}' + } + } + }, + WaymarkedTrails: { + url: 'https://tile.waymarkedtrails.org/{variant}/{z}/{x}/{y}.png', + options: { + maxZoom: 18, + attribution: 'Map data: {attribution.OpenStreetMap} | Map style: © waymarkedtrails.org (CC-BY-SA)' + }, + variants: { + hiking: 'hiking', + cycling: 'cycling', + mtb: 'mtb', + slopes: 'slopes', + riding: 'riding', + skating: 'skating' + } + }, + OpenAIP: { + url: 'https://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.{ext}', + options: { + attribution: 'openAIP Data (CC-BY-NC-SA)', + ext: 'png', + minZoom: 4, + maxZoom: 14, + tms: true, + detectRetina: true, + subdomains: '12' + } + }, + OpenSnowMap: { + url: 'https://tiles.opensnowmap.org/{variant}/{z}/{x}/{y}.png', + options: { + minZoom: 9, + maxZoom: 18, + attribution: 'Map data: {attribution.OpenStreetMap} & ODbL, © www.opensnowmap.org CC-BY-SA' + }, + variants: { + pistes: 'pistes', + } + }, + AzureMaps: { + url: + 'https://atlas.microsoft.com/map/tile?api-version={apiVersion}'+ + '&tilesetId={variant}&x={x}&y={y}&zoom={z}&language={language}'+ + '&subscription-key={subscriptionKey}', + options: { + attribution: 'See https://docs.microsoft.com/en-US/rest/api/maps/renderv2/getmaptilepreview for details.', + apiVersion: '2.0', + variant: 'microsoft.imagery', + subscriptionKey: '', + language: 'en-US', + }, + variants: { + MicrosoftImagery: 'microsoft.imagery', + MicrosoftBaseDarkGrey: 'microsoft.base.darkgrey', + MicrosoftBaseRoad: 'microsoft.base.road', + MicrosoftBaseHybridRoad: 'microsoft.base.hybrid.road', + MicrosoftTerraMain: 'microsoft.terra.main', + MicrosoftWeatherInfraredMain: { + url: + 'https://atlas.microsoft.com/map/tile?api-version={apiVersion}'+ + '&tilesetId={variant}&x={x}&y={y}&zoom={z}'+ + '&timeStamp={timeStamp}&language={language}' + + '&subscription-key={subscriptionKey}', + options: { + timeStamp: '2021-05-08T09:03:00Z', + attribution: 'See https://docs.microsoft.com/en-US/rest/api/maps/renderv2/getmaptilepreview#uri-parameters for details.', + variant: 'microsoft.weather.infrared.main', + }, + }, + MicrosoftWeatherRadarMain: { + url: + 'https://atlas.microsoft.com/map/tile?api-version={apiVersion}'+ + '&tilesetId={variant}&x={x}&y={y}&zoom={z}'+ + '&timeStamp={timeStamp}&language={language}' + + '&subscription-key={subscriptionKey}', + options: { + timeStamp: '2021-05-08T09:03:00Z', + attribution: 'See https://docs.microsoft.com/en-US/rest/api/maps/renderv2/getmaptilepreview#uri-parameters for details.', + variant: 'microsoft.weather.radar.main', + }, + } + }, } }; diff --git a/docs/articles/Making_maps_with_cancensus_files/leaflet-providers-plugin-2.1.2/leaflet-providers-plugin.js b/docs/articles/Making_maps_with_cancensus_files/leaflet-providers-plugin-2.2.0/leaflet-providers-plugin.js similarity index 100% rename from docs/articles/Making_maps_with_cancensus_files/leaflet-providers-plugin-2.1.2/leaflet-providers-plugin.js rename to docs/articles/Making_maps_with_cancensus_files/leaflet-providers-plugin-2.2.0/leaflet-providers-plugin.js diff --git a/docs/articles/Making_maps_with_cancensus_files/leafletfix-1.0.0/leafletfix.css b/docs/articles/Making_maps_with_cancensus_files/leafletfix-1.0.0/leafletfix.css index 3ae60ffa..466d8681 100644 --- a/docs/articles/Making_maps_with_cancensus_files/leafletfix-1.0.0/leafletfix.css +++ b/docs/articles/Making_maps_with_cancensus_files/leafletfix-1.0.0/leafletfix.css @@ -5,7 +5,7 @@ img.leaflet-tile { border-radius: 0; border: none; } -.info { +.leaflet .info { padding: 6px 8px; font: 14px/16px Arial, Helvetica, sans-serif; background: white; @@ -13,17 +13,17 @@ img.leaflet-tile { box-shadow: 0 0 15px rgba(0,0,0,0.2); border-radius: 5px; } -.legend { +.leaflet .legend { line-height: 18px; color: #555; } -.legend svg text { +.leaflet .legend svg text { fill: #555; } -.legend svg line { +.leaflet .legend svg line { stroke: #555; } -.legend i { +.leaflet .legend i { width: 18px; height: 18px; margin-right: 4px; diff --git a/docs/articles/cancensus.html b/docs/articles/cancensus.html index d093856e..4e890ab0 100644 --- a/docs/articles/cancensus.html +++ b/docs/articles/cancensus.html @@ -171,31 +171,29 @@

Installing cancensus
 install.packages("cancensus")
 
-library(cancensus)
-
-options(cancensus.api_key = "your_api_key")
-options(cancensus.cache_path = "custom cache path")
+library(cancensus)

Alternatively, the latest development version can be installed from -Github using devtools.

+Github using `remotes``.

 # install.packages("devtools")
-devtools::install_github("mountainmath/cancensus")
+remotes::install_github("mountainmath/cancensus")
 
 library(cancensus)
 
 options(cancensus.api_key = "your_api_key")
 options(cancensus.cache_path = "custom cache path")
-

For performance reasons, and to avoid unnecessarily drawing down API -quotas, cancensus caches data queries under the hood. -By default, cancensus caches in R’s temporary -directory, but this cache is not persistent across sessions. In order to -speed up performance, reduce quota usage, and reduce the need for -unnecessary network calls, we recommend assigning a persistent local -cache using -set_cancensus_cache_path(<local cache path>, install = TRUE), -this enables more efficient loading and reuse of downloaded data.. Users -will be prompted with a suggestion to change their default cache -location when making API calls if one has not been set yet.

+

If you have not already done so, you can install the API keys and the +data cache path. You can get your free API key when you sign up for a CensusMapper account and check your +profile. Additionally we recommend you set a permanent data cache path +so that census data you query is stored persistently across +sessions.

+
+# Only need to install api key can cache path once
+set_cancensus_api_key('<your_api_key>', install = TRUE)
+set_cancensus_cache_path('<local cache path>', install = TRUE)
+

Data in the persistent cache can be managed via the functions +list_cancensus_cache and +remove_from_cancensus_cache if needed.

@@ -213,7 +211,7 @@

Accessing Census DataNA to return data only, sf to return an sf-class data frame, or sp to return a SpatialPolygonsDataFrame object.

-
+
 # Returns a data frame with data only
 census_data <- get_census(dataset='CA21', regions=list(CMA="59933"),
                           vectors=c("v_CA21_434","v_CA21_435","v_CA21_440"),
@@ -244,7 +242,7 @@ 

Census Datasetslist_census_datasets to check what datasets are currently available for access through the CensusMapper API. Additional data for -the 2016 Census will be included in Censusmapper within a day or two +the 2016 Census will be included in CensusMapper within a day or two after public release by Statistics Canada. Statistics Canada maintains a release schedule for the Census 2016 Program which can be viewed on their website.

@@ -259,7 +257,7 @@

Census Datasets

The function list_census_datasets() will show all available datasets alongside their metadata.

-
+
 list_census_datasets()
 #> # A tibble: 29 × 6
 #>    dataset description           geo_dataset attribution reference reference_url
@@ -291,7 +289,7 @@ 

Census Regionscancensus provides a function, list_census_regions(dataset), to display all named census regions and their corresponding id for a given census dataset.

-
+
 list_census_regions("CA21")
 #> # A tibble: 5,518 × 8
 #>    region name               level    pop municipal_status CMA_UID CD_UID PR_UID
@@ -311,7 +309,7 @@ 

Census Regions -
+
 # Retrieves Vancouver and Toronto
 list_census_regions('CA21') %>% 
   filter(level == "CMA", name %in% c("Vancouver","Toronto"))
@@ -421,7 +419,7 @@ 

Displaying available Census varia

Run list_census_vectors(dataset) to view all available Census variables for a given dataset.

-
+
 list_census_vectors("CA21")
 #> # A tibble: 7,709 × 7
 #>    vector    type   label                units parent_vector aggregation details
@@ -476,7 +474,7 @@