diff --git a/.Rbuildignore b/.Rbuildignore index 13aba1a8..5b261fd3 100755 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -27,7 +27,6 @@ docs ^\.Rproj\.user$ ^packrat/ ^\.Rprofile$ -^NEWS.md$ ^cran-comments\.md$ ^data-raw$ ^revdep$ diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..3de2551d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" + diff --git a/.github/workflows/rogtemplate-gh-pages.yaml b/.github/workflows/rogtemplate-gh-pages.yaml index 3fa62d6b..eb360976 100755 --- a/.github/workflows/rogtemplate-gh-pages.yaml +++ b/.github/workflows/rogtemplate-gh-pages.yaml @@ -19,7 +19,7 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: r-lib/actions/setup-pandoc@v2 @@ -34,11 +34,7 @@ jobs: local::. any::pkgdown ropengov/rogtemplate - any::magick - any::tmap - any::Cairo any::rcmdcheck - any::XML - name: Build logo if not present and prepare template run: | @@ -57,6 +53,6 @@ jobs: - name: Deploy package run: | - git config --local user.name "$GITHUB_ACTOR" - git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" Rscript -e 'pkgdown::deploy_to_branch(new_process = FALSE)' diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index b1a3a761..4492baf2 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -16,7 +16,7 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: r-lib/actions/setup-r@v2 with: diff --git a/.github/workflows/tidy_code.yaml b/.github/workflows/tidy_code.yaml index 2fbe65b4..e044b82c 100644 --- a/.github/workflows/tidy_code.yaml +++ b/.github/workflows/tidy_code.yaml @@ -16,23 +16,24 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: r-lib/actions/setup-pandoc@master + - uses: r-lib/actions/setup-pandoc@v2 - - uses: r-lib/actions/setup-r@master + - uses: r-lib/actions/setup-r@v2 with: use-public-rspm: true - - uses: r-lib/actions/setup-r-dependencies@master + - uses: r-lib/actions/setup-r-dependencies@v2 with: extra-packages: | - usethis - styler - urlchecker - devtools - roxygen2 - + local::. + any::usethis + any::styler + any::urlchecker + any::devtools + any::roxygen2 + ropengov/rogtemplate needs: website - name: Tidy code run: | @@ -48,17 +49,15 @@ jobs: - name: Commit results run: | - git config --local user.name "$GITHUB_ACTOR" - git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" git add -A git commit -m 'Tidy code' || echo "No changes to commit" git push origin || echo "No changes to commit" - name: Trigger pkgdown workflow if: success() - uses: peter-evans/repository-dispatch@v1 - with: - token: ${{ secrets.REPO_GHA_PAT }} - repository: ${{ github.repository }} - event-type: trigger-pkgdown-workflow - client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}' \ No newline at end of file + run: | + git config --local user.name "github-actions[bot]" + git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" + Rscript -e 'pkgdown::deploy_to_branch(new_process = FALSE)' \ No newline at end of file diff --git a/DESCRIPTION b/DESCRIPTION index dd4d34eb..ea2c8b76 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Type: Package Package: eurostat Title: Tools for Eurostat Open Data -Version: 3.8.3 -Date: 2023-03-07 +Version: 4.0.0 +Date: 2023-12-19 Authors@R: c( person("Leo", "Lahti", , "leo.lahti@iki.fi", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-5537-637X")), @@ -31,36 +31,38 @@ URL: https://ropengov.github.io/eurostat/, https://github.com/rOpenGov/eurostat BugReports: https://github.com/rOpenGov/eurostat/issues Depends: - methods, - R (>= 3.5.0) + R (>= 3.6.0) Imports: - broom, classInt, countrycode, curl, + digest, dplyr, - httr, + httr2 (>= 0.2.3), + ISOweek, jsonlite, lubridate, rappdirs, readr, RefManageR, regions, + rlang, stringi, stringr, tibble, tidyr (>= 1.0.0), - ISOweek + xml2, + data.table (>= 1.14.8) Suggests: - RColorBrewer, + giscoR, knitr, rmarkdown, sf, - sp, - testthat (>= 3.0.0), - remotes + testthat (>= 3.0.0) VignetteBuilder: knitr +Config/Needs/website: ggplot2, tmap, styler, sessioninfo, + ropengov/rogtemplate, ragg Config/testthat/edition: 3 Config/testthat/parallel: false Encoding: UTF-8 diff --git a/NAMESPACE b/NAMESPACE index f42115f6..2ecf819b 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,22 +6,22 @@ export(clean_eurostat_cache) export(cut_to_classes) export(dic_order) export(eurotime2date) -export(eurotime2date2) export(eurotime2num) -export(eurotime2num2) export(get_bibentry) export(get_eurostat) export(get_eurostat_dic) +export(get_eurostat_folder) export(get_eurostat_geospatial) +export(get_eurostat_interactive) export(get_eurostat_json) export(get_eurostat_toc) export(grepEurostatTOC) export(harmonize_country_code) export(harmonize_geo_code) export(label_eurostat) -export(label_eurostat2) export(label_eurostat_tables) export(label_eurostat_vars) +export(list_eurostat_cache_items) export(recode_nuts) export(recode_to_nuts_2013) export(recode_to_nuts_2016) @@ -32,42 +32,65 @@ export(validate_nuts_regions) importFrom(ISOweek,ISOweek2date) importFrom(RefManageR,BibEntry) importFrom(RefManageR,toBiblatex) -importFrom(broom,tidy) importFrom(classInt,classIntervals) importFrom(countrycode,countrycode) importFrom(curl,curl_download) +importFrom(data.table,":=") +importFrom(data.table,.SD) +importFrom(data.table,fread) +importFrom(data.table,melt) +importFrom(data.table,setDT) +importFrom(digest,digest) +importFrom(dplyr,"%>%") importFrom(dplyr,case_when) importFrom(dplyr,coalesce) importFrom(dplyr,filter) -importFrom(dplyr,left_join) +importFrom(dplyr,inner_join) importFrom(dplyr,mutate) -importFrom(httr,RETRY) -importFrom(httr,build_url) -importFrom(httr,content) -importFrom(httr,http_error) -importFrom(httr,parse_url) -importFrom(httr,status_code) +importFrom(httr2,"%>%") +importFrom(httr2,req_error) +importFrom(httr2,req_perform) +importFrom(httr2,req_proxy) +importFrom(httr2,req_retry) +importFrom(httr2,req_user_agent) +importFrom(httr2,request) +importFrom(httr2,resp_body_json) +importFrom(httr2,resp_content_type) +importFrom(httr2,resp_is_error) +importFrom(httr2,url_build) +importFrom(httr2,url_parse) importFrom(jsonlite,fromJSON) +importFrom(jsonlite,toJSON) importFrom(lubridate,day) importFrom(lubridate,dmy) importFrom(lubridate,month) importFrom(lubridate,year) importFrom(lubridate,ymd) -importFrom(methods,as) importFrom(readr,col_character) importFrom(readr,cols) importFrom(readr,read_tsv) importFrom(regions,recode_nuts) importFrom(regions,validate_geo_code) importFrom(regions,validate_nuts_regions) +importFrom(rlang,"!!") +importFrom(rlang,sym) +importFrom(stats,na.omit) importFrom(stringi,stri_extract_first_regex) +importFrom(stringi,stri_replace_all_fixed) +importFrom(stringi,stri_replace_all_regex) +importFrom(stringr,str_extract) +importFrom(stringr,str_glue) importFrom(stringr,str_replace_all) importFrom(tibble,as_tibble) importFrom(tibble,is_tibble) -importFrom(tidyr,gather) importFrom(tidyr,pivot_longer) importFrom(tidyr,separate) -importFrom(utils,data) +importFrom(utils,capture.output) importFrom(utils,download.file) importFrom(utils,hasName) +importFrom(utils,menu) +importFrom(utils,person) importFrom(utils,toBibtex) +importFrom(xml2,read_xml) +importFrom(xml2,xml_find_all) +importFrom(xml2,xml_text) diff --git a/NEWS.md b/NEWS.md index 76c3852c..22c8436a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,59 @@ +# eurostat 4.0.0 + +## Major updates + +* Add data.table to package Imports and make using data.table functions optional with `get_eurostat()` `use.data.table` argument. This is especially useful with big datasets that would otherwise take a long time to go through the different data cleaning functions or crash R with their large memory footprint. (issue #277, PR #278) +* switch from `httr` package to `httr2` (issue #273, PR #276) +* Rewritten caching functionalities, making it possible to cache filtered queries and rely on local caches if the user attempt to filter a complete dataset that has already been cached. A list of queries and cached item hashes is stored in a cache_list.json file in cache folder. This can be viewed with a new function: `list_eurostat_cache_items()`. (Affects issues mentioned in #144, #257, #258, fixed in PR #267) +* Column names in `.eurostatTOC` object (returned by `get_eurostat_toc()`) now use dots instead of spaces in the style of `base::make.names()`, e.g. turning `last update of data` to `last.update.of.data` (PR #271) +* `.eurostatTOC` object includes a new hierarchy column that represents the position of each folder, dataset and table in the folder structure. +* `search_eurostat()` includes the option to search Table of Content items by dataset codes in addition to titles. This makes it possible to make further queries from similar datasets (e.g. "nama_10_gdp", "nama_10r_2gdp", "nama_10r_3popgdp") that might have different titles. +* `label_eurostat_tables()` has been rewritten to use the new SDMX API instead of `table_dic.dic` file in Eurostat Bulk Download Listing (PR #271) +* Remove legacy code related to downloading data from old bulk download facilities and temporary functions added in package version 3.7.14. +* `get_eurostat_geospatial()` now leverages on `giscoR::gisco_get_nuts()` for +downloading geospatial data (PR #264, thanks to @dieghernan): + * `"spdf"` output class soft-deprecated, it would return a `sf` object with a message. + * `make_valid` parameter soft-deprecated. + * Added `...` to the function so additional parametes can be passed to `giscoR::gisco_get_nuts()`. + * Dataset `eurostat_geodata_60_2016` updated. +* `get_eurostat_geospatial()` now requires sf package to work at all (PR #280, thanks to @dieghernan) + +## Minor updates + +* Added suppressWarnings() to some of the tests that use TOC's directly or indirectly as the tests are not directly related to TOC files. +* Use more parameter inheritance in package function documentation to reduce discrepancies between different functions (DRY-principle) (PR #270) +* Documentation more explicitly explains how to use filter parameters in `get_eurostat()` and `get_eurostat_json()` functions. The documentation now warns users about potential problems caused by `time` / `TIME_PERIOD` parameters when used to query datasets that contain quarterly data (issue #260) +* As continuation of the update done in 3.7.14, started to use the new URL also for dictionary files in `get_eurostat_dic()` and `label_eurostat()` functions. +* `get_bibentry()` now outputs "Accessed YYYY-MM-DD" and "dataset last updated YYYY-MM-DD" in note field as otherwise it would be sporadically printed or not at all printed from `urldate` field. +* Print more informative API error messages. (issue #261, PR #262, thanks to @ake123) +* Removed `sp`, `methods` and `broom` packages from dependencies. +* Added `giscoR` to Suggests. (PR #264) + +## New features + +* Added new function: `get_eurostat_interactive()` for interactively searching and downloading data from Eurostat SDMX API. The function aims to make good data citation practices more prominently visible and also make it easier to explore what different arguments in `get_eurostat()` function do. +* There is also a new internal function `eurostat:::fixity_checksum()` to easily calculate a fixity checksum for datasets downloaded from Eurostat. The fixity checksum can, for example, be saved in research notes and reported in as part of data appendices. Printing the fixity checksum is encouraged by including an option to print it in every `get_eurostat_interactive()` query. +* Added a new internal function `clean_eurostat_toc()` for easy removal of TOC objects from .EurostatEnv environment. (PR #278) +* New internal function `check_lang()` (PR #270) +* `get_eurostat()` function now explicity accepts a 'lang' argument, for passing onwards to `get_eurostat_json()` and `label_eurostat()` (PR #270) +* New user facing function: `get_eurostat_folder()` for downloading all datasets in a folder. The function is limited to downloading folders that contain at maximum 20 datasets. This function relies on new internal helper functions: `toc_count_whitespace()`, `toc_determine_hierarchy()`, `toc_count_children()` and `toc_list_children()`. (PR #270) +* EXPERIMENTAL: `get_eurostat_toc()` and `set_eurostat_toc()` now have experimental features that support downloading TOCs in French and German as well. This support, in turn, is leveraged in `get_bibentry()` which now has a language parameter: `lang` (PR #270) +* Related to updates to `get_eurostat_toc()`, `search_eurostat()` now supports searching from French and German TOC-files as well (PR #270) + +## Deprecated and defunct + +* `grepEurostatTOC()` is completely marked as defunct and is enroute to being removed from the package as `search_eurostat()` is now the only way to fetch Eurostat TOC items and search (grep) them (PR #270) +* During the development of the 4.0.0 version there was a temporary function called `label_eurostat_vars2` that has been removed in the final version, as promised earlier: "The old function will be completely removed after October 2023 when Eurostat Bulk Download Listing website is retired and `label_eurostat_vars2` will be renamed to `label_eurostat_vars()`". The new `label_eurostat_vars()` function uses the new SDMX API to retrieve names for dataset columns. Function evolution is subject to ongoing Eurostat API developments. (PR #270) + +## Bug fixes + +* Added a more informatic warning message in situations where TOC datasets downloaded from Eurostat might not have proper titles. For some reason this was isolated to German and French language versions of TOC while English language TOC had proper titles for all items. (PR #278) +* `get_bibentry()` returns correct codes for titles and warns the user if some / all of the requested codes were not found in the TOC (PR #270) +* `get_bibentry()` uses the date field with the internal BibEntry format that can be easily translated to other formats: bibtex, bibentry (PR #270) +* `get_bibentry()` now outputs dataset codes in titles correctly so that `bibtex` and `biblatex` entries can be copypasted into bibliographies without adding escape characters manually (PR #270) +* Fix issue related to downloading quarterly data (issue #260, PR #271) +* Reduce RAM usage in `eurotime2date()` when handling big datasets containing weekly data and tens of millions of rows (dataset used for testing mentioned in issue #200). + # eurostat 3.8.3 (2023-03-07) ## Bug fixes @@ -220,4 +276,4 @@ # eurostat 0.9.1 (2014-04-24) -* Package collected from statfi and smarterpoland \ No newline at end of file +* Package collected from statfi and smarterpoland diff --git a/R/clean_eurostat_cache.R b/R/clean_eurostat_cache.R index 2400d534..66ecb3cc 100755 --- a/R/clean_eurostat_cache.R +++ b/R/clean_eurostat_cache.R @@ -1,23 +1,27 @@ -#' @title Clean Eurostat Cache -#' @description Delete all .rds files from the eurostat cache directory. -#' See [get_eurostat()] for more on cache. -#' @param cache_dir A path to cache directory. If `NULL` (default) -#' tries to clean default temporary cache directory. -#' @param config Logical `TRUE/FALSE`. Should the cached path be -#' deleted? -#' @export +#' @title +#' Clean Eurostat Cache +#' @description +#' Delete all .rds files from the eurostat cache directory. +#' See [get_eurostat()] for more on cache. +#' @param cache_dir +#' A path to cache directory. If `NULL` (default) +#' tries to clean default temporary cache directory. +#' @param config +#' Logical `TRUE/FALSE`. Should the cached path be deleted? #' @family cache utilities -#' @author Przemyslaw Biecek, Leo Lahti, Janne Huovari, Markus Kainu and -#' Diego Hernangómez +#' @author +#' Przemyslaw Biecek, Leo Lahti, Janne Huovari, Markus Kainu and +#' Diego Hernangómez #' @examples #' \dontrun{ #' clean_eurostat_cache() #' } +#' @export clean_eurostat_cache <- function(cache_dir = NULL, config = FALSE) { # Config # nocov start - if (isTRUE(config)) { + if (config) { config_dir <- rappdirs::user_config_dir("eurostat", "R") if (dir.exists(config_dir)) { @@ -32,18 +36,24 @@ clean_eurostat_cache <- function(cache_dir = NULL, config = FALSE) { cache_dir <- eur_helper_cachedir(cache_dir) if (!file.exists(cache_dir)) { + # nocov start stop( "The cache folder ", cache_dir, " does not exist" ) + # nocov end } - files <- list.files(cache_dir, pattern = "rds|RData", full.names = TRUE) + files <- list.files( + cache_dir, + pattern = "rds|RData|cache_list.json", + full.names = TRUE + ) if (length(files) == 0) { message("The cache folder ", cache_dir, " is empty.") } else { unlink(files) - message("Deleted .rds/.RData files from ", cache_dir) + message("Deleted .rds/.RData files and cache_list.json from ", cache_dir) } invisible(TRUE) } diff --git a/R/cut_to_classes.R b/R/cut_to_classes.R index 5f0f25d2..50c38ca1 100755 --- a/R/cut_to_classes.R +++ b/R/cut_to_classes.R @@ -26,26 +26,32 @@ cut_to_classes <- function(x, n = 5, style = "equal", manual = FALSE, manual_breaks = NULL, decimals = 0, nodata_label = "No data") { - manual_breaks_orig <- manual_breaks - if (!is.null(manual_breaks) && (length(unique(manual_breaks)) == - length(manual_breaks))) { - warning("manual_breaks in cut_to_classes are not unique. Using unique breaks only.") + # manual_breaks_orig <- manual_breaks + if (!is.null(manual_breaks) && + (length(unique(manual_breaks)) == length(manual_breaks))) { + warning(paste("manual_breaks in cut_to_classes are not unique.", + "Using unique breaks only.")) manual_breaks <- unique(manual_breaks) } if (manual) { - levs <- as.data.frame(levels(cut(x, - breaks = manual_breaks, - include.lowest = T, - dig.lab = 5 - ))) + levs <- as.data.frame( + levels( + cut( + x, + breaks = manual_breaks, + include.lowest = TRUE, + dig.lab = 5 + ) + ) + ) } else { brs <- data.frame(classInt::classIntervals(x, n = n, style = style)[2])[, 1] # Ensure that the breaks are unique brs <- unique(brs) - cutting <- cut(x, breaks = brs, include.lowest = T, dig.lab = 5) + cutting <- cut(x, breaks = brs, include.lowest = TRUE, dig.lab = 5) levs <- levels(cutting) @@ -74,7 +80,7 @@ cut_to_classes <- function(x, n = 5, style = "equal", manual = FALSE, if (manual) { y <- cut(x, breaks = manual_breaks, - include.lowest = T, + include.lowest = TRUE, dig.lab = 5, labels = labs ) rm(manual_breaks) @@ -86,7 +92,7 @@ cut_to_classes <- function(x, n = 5, style = "equal", manual = FALSE, y <- cut(x, breaks = brs2, - include.lowest = T, + include.lowest = TRUE, dig.lab = 5, labels = labs ) } diff --git a/R/data_countries.R b/R/data_countries.R index 9130691c..7d09d677 100755 --- a/R/data_countries.R +++ b/R/data_countries.R @@ -6,6 +6,7 @@ #' * **name**: Country name in English. #' * **label**: Country name in the Eurostat database. #' +#' @family datasets #' @source , #' "eu_countries" diff --git a/R/data_spatial.R b/R/data_spatial.R index 48fd0efc..a1aacf8a 100755 --- a/R/data_spatial.R +++ b/R/data_spatial.R @@ -1,134 +1,128 @@ -#' @title Geospatial data of Europe from GISCO in 1:60 million scale from +#' Geospatial data of Europe from GISCO in 1:60 million scale from #' year 2016 +#' #' @description Geospatial data of Europe from GISCO in 1:60 million scale #' from year 2016 -#' @details +#' +#' @family datasets +#' @family geospatial +#' @format sf object +#' @docType data +#' @name eurostat_geodata_60_2016 +#' +#' @details #' The dataset contains 2016 observations (rows) and 12 variables (columns). -#' +#' #' The object contains the following columns: -#' * **id**: JSON id code, the same as NUTS_ID. See NUTS_ID below for further clarification. -#' * **LEVL_CODE**: NUTS level code: 0 (national level), 1 (major socio-economic regions), 2 (basic regions for the application of regional policies) or 3 (small regions). -#' * **NUTS_ID**: NUTS ID code, consisting of country code and numbers (1 for NUTS 1, 2 for NUTS 2 and 3 for NUTS 3) -#' * **CNTR_CODE**: Country code: two-letter ISO code (ISO 3166 alpha-2), except in the case of Greece (EL). +#' * **id**: JSON id code, the same as **NUTS_ID**. See **NUTS_ID** below for +#' further clarification. +#' * **LEVL_CODE**: NUTS level code: 0 (national level), 1 (major +#' socio-economic regions), 2 (basic regions for the application of regional +#' policies) or 3 (small regions). +#' * **NUTS_ID**: NUTS ID code, consisting of country code and numbers (1 for +#' NUTS 1, 2 for NUTS 2 and 3 for NUTS 3) +#' * **CNTR_CODE**: Country code: two-letter ISO code (ISO 3166 alpha-2), except +#' in the case of Greece (EL). #' * **NAME_LATN**: NUTS name in local language, transliterated to Latin script #' * **NUTS_NAME**: NUTS name in local language, in local script. #' * **MOUNT_TYPE**: Mountain typology for NUTS 3 regions. -#' \itemize{ -#' \item{1: "where more than 50 % of the surface is covered by topographic mountain areas"} -#' \item{2: "in which more than 50 % of the regional population lives in topographic mountain areas"} -#' \item{3: "where more than 50 % of the surface is covered by topographic mountain areas and where more than 50 % of the regional population lives in these mountain areas"} -#' \item{4: non-mountain region / other region} -#' \item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 and non-EU countries)} -#' } +#' * 1: "where more than 50 % of the surface is covered by topographic +#' mountain areas" +#' * 2: "in which more than 50 % of the regional population lives in +#' topographic mountain areas" +#' * 3: "where more than 50 % of the surface is covered by topographic +#' mountain areas and where more than 50 % of the regional population lives +#' in these mountain areas" +#' * 4: non-mountain region / other region +#' * 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 and +#' non-EU countries) #' * **URBN_TYPE**: Urban-rural typology for NUTS 3 regions. -#' \itemize{ -#' \item{1: predominantly urban region} -#' \item{2: intermediate region} -#' \item{3: predominantly rural region} -#' \item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 regions)} -#' } -#' * **COAST_TYPE**: Coastal typology for NUTS 3 regions. -#' \itemize{ -#' \item{1: coastal (on coast)} -#' \item{2: coastal (>= 50% of population living within 50km of the coastline)} -#' \item{3: non-coastal region} -#' \item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 regions)} -#' } +#' * 1: predominantly urban region +#' * 2: intermediate region +#' * 3: predominantly rural region +#' * 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 +#' regions) +#' * **COAST_TYPE**: Coastal typology for NUTS 3 regions. +#' * 1: coastal (on coast) +#' * 2: coastal (>= 50% of population living within 50km of the coastline) +#' * 3: non-coastal region +#' * 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 +#' regions) #' * **FID**: Same as NUTS_ID. +#' * **geo**: Same as NUTS_ID, added for for easier joins with dplyr. However, +#' it is recommended to use other identical fields for this purpose. #' * **geometry**: geospatial information. -#' * **geo**: Same as NUTS_ID, added for for easier joins with dplyr. However, it is recommended to use other identical fields for this purpose. -#' -#' Dataset updated: 2022-06-28. For a more recent version, please use [get_eurostat_geospatial()] function. -#' @family datasets -#' @family geospatial -#' @format sf object -#' @source -#' Data source: Eurostat -#' +#' +#' Dataset updated: 2023-06-29. For a more recent version, please use +#' [giscoR::gisco_get_nuts()] function. +#' +#' @source +#' Data source: Eurostat via [giscoR::gisco_get_nuts()]. +#' #' © EuroGeographics for the administrative boundaries -#' -#' Data downloaded from: \url{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units} -#' @references -#' The following copyright notice is provided for end user convenience. +#' +#' Data downloaded from: +#' +#' +#' @references +#' The following copyright notice is provided for end user convenience. #' Please check up-to-date copyright information from the eurostat website: #' [GISCO: Geographical information and maps - Administrative units/statistical units](https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units) -#' -#' "In addition to the [general copyright and licence policy](https://ec.europa.eu/eurostat/web/main/about/policies/copyright) applicable to the whole Eurostat website, the following specific provisions apply to the datasets you are downloading. The download and usage of these data is subject to the acceptance of the following clauses: -#' -#' 1. The Commission agrees to grant the non-exclusive and not transferable right to use and process the Eurostat/GISCO geographical data downloaded from this page (the "data"). -#' +#' +#' "In addition to the +#' [general copyright and licence policy](https://ec.europa.eu/eurostat/web/main/about/policies/copyright) +#' applicable to the whole Eurostat website, the following +#' specific provisions apply to the datasets you are downloading. The download +#' and usage of these data is subject to the acceptance of the following +#' clauses: +#' +#' 1. The Commission agrees to grant the non-exclusive and not transferable +#' right to use and process the Eurostat/GISCO geographical data downloaded +#' from this page (the "data"). +#' #' 1. The permission to use the data is granted on condition that: -#' \enumerate{ -#' \item{the data will not be used for commercial purposes;} -#' \item{the source will be acknowledged. A copyright notice, as specified below, will have to be visible on any printed or electronic publication using the data downloaded from this page.} -#' } +#' 1. the data will not be used for commercial purposes; +#' 2. the source will be acknowledged. A copyright notice, as specified +#' below, will have to be visible on any printed or electronic publication +#' using the data downloaded from this page. +#' #' ## Copyright notice -#' -#' When data downloaded from this page is used in any printed or electronic publication, in addition to any other provisions applicable to the whole Eurostat website, data source will have to be acknowledged in the legend of the map and in the introductory page of the publication with the following copyright notice: -#' +#' +#' When data downloaded from this page is used in any printed or electronic +#' publication, in addition to any other provisions applicable to the whole +#' Eurostat website, data source will have to be acknowledged in the legend of +#' the map and in the introductory page of the publication with the following +#' copyright notice: +#' #' EN: © EuroGeographics for the administrative boundaries -#' +#' #' FR: © EuroGeographics pour les limites administratives -#' +#' #' DE: © EuroGeographics bezüglich der Verwaltungsgrenzen -#' -#' For publications in languages other than English, French or German, the translation of the copyright notice in the language of the publication shall be used. -#' -#' If you intend to use the data commercially, please contact EuroGeographics for information regarding their licence agreements." -#' -#' @seealso +#' +#' For publications in languages other than English, French or German, the +#' translation of the copyright notice in the language of the publication shall +#' be used. +#' +#' If you intend to use the data commercially, please contact EuroGeographics +#' for information regarding their licence agreements." +#' +#' @seealso [giscoR::gisco_get_nuts()] and #' [Eurostat. (2019). Methodological manual on territorial typologies -- 2018 edition. Manuals and guidelines.](https://ec.europa.eu/eurostat/web/products-manuals-and-guidelines/-/ks-gq-18-008) -"eurostat_geodata_60_2016" - -## -- 2016 -# library(sf) -# library(httr) -# -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/nuts/geojson/NUTS_RG_03M_2016_4326_LEVL_0.geojson") -# n0 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/nuts/geojson/NUTS_RG_03M_2016_4326_LEVL_1.geojson") -# n1 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/nuts/geojson/NUTS_RG_03M_2016_4326_LEVL_2.geojson") -# n2 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/nuts/geojson/NUTS_RG_03M_2016_4326_LEVL_3.geojson") -# n3 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# eurostat_geodata_60_2016 <- rbind(n0,n1,n2,n3) -# eurostat_geodata_60_2016$geo <- eurostat_geodata_60_2016$NUTS_ID -# save(eurostat_geodata_60_2016, file = "./data/eurostat_geodata_60_2016.rda", compress = "xz") - - -## -- 2013 -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2013_4258_LEVL_0.geojson") -# n0 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2013_4258_LEVL_1.geojson") -# n1 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2013_4258_LEVL_2.geojson") -# n2 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2013_4258_LEVL_3.geojson") -# n3 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# eurostat_geodata_60_2013 <- rbind(n0,n1,n2,n3) -# save(eurostat_geodata_60_2013, file = "./data/eurostat_geodata_60_2013.rda") - -## --2010 -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2010_4258_LEVL_0.geojson") -# n0 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2010_4258_LEVL_1.geojson") -# n1 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2010_4258_LEVL_2.geojson") -# n2 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2010_4258_LEVL_3.geojson") -# n3 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# eurostat_geodata_60_2010 <- rbind(n0,n1,n2,n3) -# save(eurostat_geodata_60_2010, file = "./data/eurostat_geodata_60_2010.rda") - -## --2006 -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2006_4258_LEVL_0.geojson") -# n0 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2006_4258_LEVL_1.geojson") -# n1 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2006_4258_LEVL_2.geojson") -# n2 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# resp <- GET("http://ec.europa.eu/eurostat/cache/GISCO/distribution/v1/geojson/NUTS_RG_60M_2006_4258_LEVL_3.geojson") -# n3 <- st_read(content(resp, as="text"), stringsAsFactors = FALSE, quiet = TRUE) -# eurostat_geodata_60_2006 <- rbind(n0,n1,n2,n3) -# save(eurostat_geodata_60_2006, file = "./data/eurostat_geodata_60_2006.rda") +#' +#' +#' @examples +#' +#' eurostat_geodata_60_2016 <- eurostat::eurostat_geodata_60_2016 +#' +#' # Manipulate and plot +#' if (require(sf)) { +#' library(sf) +#' # Filter NUTS3 from select countries like in a regular data frame +#' example_nuts <- subset(eurostat_geodata_60_2016, LEVL_CODE == 3 & +#' CNTR_CODE %in% c("DK", "DE", "PL")) +#' +#' plot(example_nuts["CNTR_CODE"]) +#' } +#' +NULL diff --git a/R/eurostat-defunct.R b/R/eurostat-defunct.R new file mode 100644 index 00000000..9837831c --- /dev/null +++ b/R/eurostat-defunct.R @@ -0,0 +1,26 @@ +#' @title Defunct functions in eurostat +#' +#' @description +#' This list of defunct functions is maintained to document changes to eurostat functions in a +#' transparent manner. +#' +#' @param ... Generic representation of old arguments +#' +#' @name eurostat-defunct +#' @aliases eurostat-defunct +#' +#' @details +#' The following functions are defunct: +#' +#' \itemize{ +#' \item \code{\link{grepEurostatTOC}}: Use \code{search_eurostat} instead +#' } +#' +#' +NULL + +#' @rdname eurostat-defunct +#' @export +grepEurostatTOC <- function(...) { + .Defunct(new = "search_eurostat") +} \ No newline at end of file diff --git a/R/eurostat-package.R b/R/eurostat-package.R index 24dda7c9..7f231408 100755 --- a/R/eurostat-package.R +++ b/R/eurostat-package.R @@ -1,29 +1,338 @@ -#' Brief summary of the eurostat package +#' @title R Tools for Eurostat open data +#' +#' @description +#' Tools to download data from the Eurostat database +#' together with search and manipulation +#' utilities. +#' +#' @details #' #' | | | #' | :--- | :-- | #' | **Package** | eurostat | #' | **Type** | Package | #' | **Version** | `r packageVersion("eurostat")` | -#' | **Date** | 2014-2022 | +#' | **Date** | 2014-2023 | #' | **License** | `r as.character(utils::packageDescription("eurostat")["License"])`| #' | **LazyLoad** | yes | #' -#' -#' R Tools for Eurostat Open Data -#' #' @name eurostat-package #' @aliases eurostat #' @docType package -#' @title R Tools for Eurostat open data #' #' @author Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek #' @references #' See `citation("eurostat")`: #' -#' ```{r, echo=FALSE, comment="#" } +#' ```{r, echo=FALSE, comment="" } #' citation("eurostat") #' ``` +#' +#' When citing data downloaded from Eurostat, see section "Citing Eurostat data" +#' in [get_eurostat()] documentation. +#' +#' @details +#' # Eurostat +#' Eurostat website: \url{https://ec.europa.eu/eurostat} +#' Eurostat database: \url{https://ec.europa.eu/eurostat/web/main/data/database} +#' +#' Information about the data update schedule from Eurostat: +#' "Eurostat datasets are updated twice a day at 11:00 and 23:00 CET, if newer +#' data is available or for structural changes, for example for the +#' dimensions in the dataset. +#' +#' The Eurostat database always contains the latest version of the datasets, +#' meaning that there is no versioning or documentation of past versions of +#' the data." +#' +#' # Data source: Eurostat SDMX 2.1 Dissemination API +#' +#' Data is downloaded from Eurostat SDMX 2.1 API endpoint +#' as compressed TSV files that are transformed into tabular format. +#' See Eurostat documentation for more information: +#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+query} +#' +#' The new dissemination API replaces the old bulk download facility that was +#' used by Eurostat before October 2023 and by the eurostat R package versions +#' before 4.0.0. +#' See Eurostat documentation about the transition from Bulk Download to API +#' for more information about the differences between the old bulk download +#' facility and the data provided by the new API connection: +#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/Transition+-+from+Eurostat+Bulk+Download+to+API} +#' +#' See especially the document Migrating_to_API_TSV.pdf that describes the +#' changes in TSV file format in new applications. +#' +#' For more information about SDMX 2.1, see SDMX standards: Section 7: +#' Guidelines for the use of web services, Version 2.1: +#' \url{https://sdmx.org/wp-content/uploads/SDMX_2-1_SECTION_7_WebServicesGuidelines.pdf} +#' +#' # Disclaimer: Availability of filtering functionalities +#' +#' Currently it only possible to download filtered data through API Statistics +#' (JSON API) when using `eurostat` package, although technically filtering +#' datasets downloaded through the SDMX Dissemination API is also supported by +#' Eurostat. We may support this feature in the future. In the meantime, if you +#' are interested in filtering Dissemination API data queries manually, please +#' consult the following Eurostat documentation: +#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+filtering} +#' +#' # Data source: Eurostat API Statistics (JSON API) +#' +#' Data is downloaded from Eurostat API Statistics. See Eurostat documentation +#' for more information about data queries in API Statistics +#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query} +#' +#' This replaces the old JSON Web Services that was used by Eurostat before +#' February 2023 and by the eurostat R package versions before 3.7.13. +#' See Eurostat documentation about the migration from JSON web service to API +#' Statistics for more information about the differences between the old and +#' the new service: +#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+migrating+from+JSON+web+service+to+API+Statistics} +#' +#' For easily viewing which filtering options are available - in addition to +#' the default ones, time and language - Eurostat Web services Query builder +#' tool may be useful: +#' \url{https://ec.europa.eu/eurostat/web/query-builder} +#' +#' # Filtering datasets +#' +#' When using Eurostat API Statistics (JSON API), datasets can be filtered +#' before they are downloaded and saved in local memory. The general format +#' for filter parameters is `=`. +#' +#' Filter parameters are optional but the used dimension codes must be present +#' in the data product that is being queried. Dimension codes can +#' vary between different data products so it may be useful to examine new +#' datasets in Eurostat data browser beforehand. However, most if not all +#' Eurostat datasets concern European countries and contain information that +#' was gathered at some point in time, so `geo` and `time` dimension codes +#' can usually be used. +#' +#' `` and `` are case-insensitive and they can be written +#' in lowercase or uppercase in the query. +#' +#' Parameters are passed onto the `eurostat` package functions [get_eurostat()] +#' and [get_eurostat_json()] as a list item. If an individual item contains +#' multiple items, as it often can be in the case of `geo` parameters and +#' other optional items, they must be in the form of a vector: `c("FI", "SE")`. +#' For examples on how to use these parameters, see function examples below. +#' +#' ## Time parameters +#' +#' `time` and `time_period` address the same `TIME_PERIOD` dimension in the +#' dataset and can be used interchangeably. In the Eurostat documentation +#' it is stated that "Using more than one Time parameter in the same query +#' is not accepted", but practice has shown that actually Eurostat API allows +#' multiple `time` parameters in the same query. This makes it possible to +#' use R colon operator when writing queries, so `time = c(2015:2018)` +#' translates to `&time=2015&time=2016&time=2017&time=2018`. +#' +#' The only exception +#' to this is when the queried dataset contains e.g. quarterly data and +#' `TIME_PERIOD` is saved as `2015-Q1`, `2015-Q2` etc. Then it is possible +#' to use `time=2015-Q1&time=2015-Q2` style in the query URL, but this makes it +#' unfeasible to use the colon operator and requires a lot of manual typing. +#' +#' Because of this, it is useful to know about other time parameters as well: +#' * `untilTimePeriod`: return dataset items from the oldest record up until the +#' set time, for example "all data until 2000": `untilTimePeriod = 2000` +#' * `sinceTimePeriod`: return dataset items starting from set time, for example +#' "all datastarting from 2008": `sinceTimePeriod = 2008` +#' * `lastTimePeriod`: starting from the most recent time period, how many +#' preceding time periods should be returned? For example 10 most +#' recent observations: `lastTimePeriod = 10` +#' +#' Using both `untilTimePeriod` and `sinceTimePeriod` parameters in the same +#' query is allowed, making the usage of the R colon operator unnecessary. +#' In the case of quarterly data, using `untilTimePeriod` and `sinceTimePeriod` +#' parameters also works, as opposed to the colon operator, so it is generally +#' safer to use them as well. +#' +#' ## Other dimensions +#' +#' In [get_eurostat_json()] examples `nama_10_gdp` dataset is filtered with +#' two additional filter parameters: +#' * `na_item = "B1GQ"` +#' * `unit = "CLV_I10"` +#' +#' Filters like these are most likely unique to the `nama_10_gdp` dataset +#' (or other datasets within the same domain) and should +#' not be used with others dataset without user discretion. +#' By using [label_eurostat()] we know that `"B1GQ"` stands for +#' "Gross domestic product at market prices" and +#' `"CLV_I10"` means "Chain linked volumes, index 2010=100". +#' +#' Different dimension codes can be translated to a natural language by using +#' the [get_eurostat_dic()] function, which returns labels for individual +#' dimension items such as `na_item` and `unit`, as opposed to +#' [label_eurostat()] which does it for whole datasets. For example, the +#' parameter `na_item` stands for "National accounts indicator (ESA 2010)" and +#' `unit` stands for "Unit of measure". +#' +#' ## Language +#' +#' All datasets have metadata available in English, French and German. If no +#' parameter is given, the labels are returned in English. +#' +#' Example: +#' * `lang = "fr"` +#' +#' ## More information +#' +#' For more information about data filtering see Eurostat documentation +#' on API Statistics: +#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query#APIStatisticsdataquery-TheparametersdefinedintheRESTrequest} +#' +#' # Data source: Eurostat Table of Contents +#' +#' The Eurostat Table of Contents (TOC) is downloaded from +#' \url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=en} +#' (default) or from French or German language variants: +#' \url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=fr} +#' \url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=de} +#' +#' See Eurostat documentation on TOC items: +#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+-+Detailed+guidelines+-+Catalogue+API+-+TOC} +#' +#' # Data source: GISCO - General Copyright +#' +#' "Eurostat's general copyright notice and licence policy is applicable and +#' can be consulted here: +#' +#' +#' Please also be aware of the European Commission's general conditions: +#' +#' +#' Moreover, there are specific provisions applicable to some of the following +#' datasets available for downloading. The download and usage of these data +#' is subject to their acceptance: +#' +#' * Administrative Units / Statistical Units +#' * Population distribution / Demography +#' * Transport Networks +#' * Land Cover +#' * Elevation (DEM)" +#' +#' Of the abovementioned datasets, Administrative Units / Statistical Units +#' is applicable if the user wants to draw maps with borders provided by +#' GISCO / EuroGeographics. +#' +#' # Data source: GISCO - Administrative Units / Statistical Units +#' +#' The following copyright notice is provided for end user convenience. +#' Please check up-to-date copyright information from the GISCO website: +#' [GISCO: Geographical information and maps - Administrative units/statistical units](https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units) +#' +#' "In addition to the [general copyright and licence policy](https://ec.europa.eu/eurostat/web/main/about/policies/copyright) applicable to the whole Eurostat website, the following +#' specific provisions apply to the datasets you are downloading. The download +#' and usage of these data is subject to the acceptance of the following +#' clauses: +#' +#' 1. The Commission agrees to grant the non-exclusive and not transferable +#' right to use and process the Eurostat/GISCO geographical data downloaded +#' from this page (the "data"). +#' +#' 1. The permission to use the data is granted on condition that: +#' 1. the data will not be used for commercial purposes; +#' 2. the source will be acknowledged. A copyright notice, as specified +#' below, will have to be visible on any printed or electronic publication +#' using the data downloaded from this page." +#' +#' ## Copyright notice +#' +#' When data downloaded from this page is used in any printed or electronic +#' publication, in addition to any other provisions applicable to the whole +#' Eurostat website, data source will have to be acknowledged in the legend of +#' the map and in the introductory page of the publication with the following +#' copyright notice: +#' +#' EN: © EuroGeographics for the administrative boundaries +#' +#' FR: © EuroGeographics pour les limites administratives +#' +#' DE: © EuroGeographics bezüglich der Verwaltungsgrenzen +#' +#' For publications in languages other than English, French or German, the +#' translation of the copyright notice in the language of the publication shall +#' be used. +#' +#' If you intend to use the data commercially, please contact EuroGeographics +#' for information regarding their licence agreements." +#' +#' # Eurostat: Copyright notice and free re-use of data +#' +#' The following copyright notice is provided for end user convenience. +#' Please check up-to-date copyright information from the eurostat website: +#' +#' +#' "(c) European Union, 1995 - today +#' +#' Eurostat has a policy of encouraging free re-use of its data, both for +#' non-commercial and commercial purposes. All statistical data, metadata, +#' content of web pages or other dissemination tools, official publications +#' and other documents published on its website, with the exceptions listed +#' below, can be reused without any payment or written licence provided that: +#' +#' * the source is indicated as Eurostat; +#' * when re-use involves modifications to the data or text, this must be +#' stated clearly to the end user of the information." +#' +#' For exceptions to the abovementioned principles see +#' [Eurostat website](https://ec.europa.eu/eurostat/about-us/policies/copyright) +#' +#' # Citing Eurostat data +#' +#' For citing datasets, use [get_bibentry()] to build a bibliography that +#' is suitable for your reference manager of choice. +#' +#' When using Eurostat data in other contexts than academic publications that +#' in-text citations or footnotes/endnotes, the following guidelines may be +#' helpful: +#' +#' * The origin of the data should always be mentioned as "Source: Eurostat". +#' +#' * The online dataset codes(s) should also be provided in order to ensure +#' transparency and facilitate access to the Eurostat data and related +#' methodological information. For example: +#' "Source: Eurostat (online data code: namq_10_gdp)" +#' +#' * Online publications (e.g. web pages, PDF) should include a clickable +#' link to the dataset using the bookmark functionality available in the +#' Eurostat data browser. +#' +#' It should be avoided to associate different entities (e.g. Eurostat, +#' National Statistical Offices, other data providers) to the same dataset or +#' indicator without specifying the role of each of them in the treatment of +#' data. +#' +#' See also section "Eurostat: Copyright notice and free re-use of data" +#' in [get_eurostat()] documentation. +#' +#' # Strategies for handling large datasets more efficiently +#' +#' Most Eurostat datasets are relatively manageable, at least on a machine +#' with 16 GB of RAM. The largest dataset in Eurostat database, at the time +#' of writing this, had 148362539 (148 million) values, which results in an +#' object with 148 million rows in tidy data (long) format. The test machine +#' with 16 GB of RAM was able to handle the second largest dataset in the +#' database with 91 million values (rows). +#' +#' There are still some methods to make data fetching +#' functions perform faster: +#' +#' * turn caching off: `get_eurostat(cache = FALSE)` +#' * turn cache compression off (may result in rather large cache files!): +#' `get_eurostat(compress_file = FALSE)` +#' * if you want faster caching with manageable file sizes, use stringsAsFactors: +#' `get_eurostat(cache = TRUE, compress_file = TRUE, stringsAsFactors = TRUE)` +#' * Use faster data.table functions: `get_eurostat(use.data.table = TRUE)` +#' * Keep column processing to a minimum: +#' `get_eurostat(time_format = "raw", type = "code")` etc. +#' * Read `get_eurostat()` function documentation carefully so you understand +#' what different arguments do +#' * Filter the dataset so that you fetch only the parts you need! +#' #' @examples library(eurostat) #' @section regions functions: #' For working with sub-national statistics the basic functions of the diff --git a/R/eurotime2date.R b/R/eurotime2date.R index 89032f66..a59a030e 100755 --- a/R/eurotime2date.R +++ b/R/eurotime2date.R @@ -1,98 +1,9 @@ -#' @title Date Conversion from Eurostat Time Format -#' @description Date conversion from Eurostat time format. A function to -#' convert Eurostat time values to objects of class [Date()] -#' representing calendar dates. -#' @param x a charter string with time information in Eurostat time format. -#' @param last a logical. If `FALSE` (default) the date is -#' the first date of the period (month, quarter or year). If `TRUE` -#' the date is the last date of the period. -#' @references -#' See `citation("eurostat")`: -#' -#' ```{r, echo=FALSE, comment="#" } -#' citation("eurostat") -#' ``` -#' -#' @return an object of class [Date()]. -#' @author Janne Huovari -#' @family helpers -#' @seealso [lubridate::ymd()] -#' @examplesIf check_access_to_data() -#' \donttest{ -#' na_q <- get_eurostat("namq_10_pc", time_format = "raw") -#' na_q$time <- eurotime2date(x = na_q$time) -#' unique(na_q$time) -#' } -#' -#' @importFrom lubridate ymd -#' -#' @export -eurotime2date <- function(x, last = FALSE) { - if (!is.factor(x)) x <- factor(x) - times <- levels(x) - year <- substr(times, 1, 4) - subyear <- substr(times, 5, 7) - tcode <- substr(subyear[1], 1, 1) # type of time data - if (tcode != "_" && nchar(times[1]) > 7) { - days <- substr(times, 8, 10) - tcode <- substr(days[1], 1, 1) # type of time data if daily - } - - if (tcode == "") tcode <- "Y" - - day <- "01" # default for day - - # for yearly data - if (tcode == "Y") { - period <- "01" - # for bi-annual - } else if (tcode == "S") { - lookup <- c(S1 = "01", S2 = "07") - period <- lookup[subyear] - # for quarterly - } else if (tcode == "Q") { - lookup <- c(Q1 = "01", Q2 = "04", Q3 = "07", Q4 = "10") - period <- lookup[subyear] - # for montly - } else if (tcode == "M") { - period <- gsub("M", "", subyear) - # for daily - } else if (tcode == "D") { - period <- gsub("M", "", subyear) - day <- gsub("D", "", days) - # for year intervals - } else if (tcode == "_") { - warning("Time format is a year interval. No date conversion was made.") - return(x) - # for unkown - } else { - warning( - "Unknown time code, ", tcode, ". No date conversion was made.\n - Please fill bug report at ", - "https://github.com/rOpenGov/eurostat/issues." - ) - return(x) - } - - levels(x) <- paste0(year, "-", period, "-", day) - - # The date as the last date of the period - if (last == TRUE) { - shift <- c("Y" = 367, "S" = 186, "Q" = 96, "M" = 32, "D" = 0)[tcode] - levels(x) <- lubridate::ymd( - cut(lubridate::ymd(levels(x)) + shift, "month") - ) - 1 - } - y <- lubridate::ymd(x) - y -} - #' @title Date Conversion from New Eurostat Time Format -#' @description +#' @description #' Date conversion from Eurostat time format. A function to #' convert Eurostat time values to objects of class [Date()] #' representing calendar dates. -#' @details +#' @details #' Available patterns are YYYY (year), YYYY-SN (semester), YYYY-QN (quarter), #' YYYY-MM (month), YYYY-WNN (week) and YYYY-MM-DD (day). #' @param x a charter string with time information in Eurostat time format. @@ -113,25 +24,25 @@ eurotime2date <- function(x, last = FALSE) { #' @examplesIf check_access_to_data() #' \donttest{ #' na_q <- get_eurostat("namq_10_pc", time_format = "raw") -#' na_q$time <- eurotime2date(x = na_q$time) -#' unique(na_q$time) +#' na_q$TIME_PERIOD <- eurotime2date(x = na_q$TIME_PERIOD) +#' unique(na_q$TIME_PERIOD) #' } -#' +#' #' \dontrun{ #' # Test for weekly data #' get_eurostat( -#' id = "lfsi_abs_w", -#' select_time = c("W"), -#' time_format = "date", -#' legacy_bulk_download = FALSE +#' id = "lfsi_abs_w", +#' select_time = c("W"), +#' time_format = "date" #' ) #' } #' #' @importFrom lubridate ymd #' @importFrom ISOweek ISOweek2date +#' @importFrom dplyr inner_join #' #' @export -eurotime2date2 <- function(x, last = FALSE) { +eurotime2date <- function(x, last = FALSE) { if (!is.factor(x)) x <- factor(x) unique_times <- levels(x) year <- substr(unique_times, 1, 4) @@ -144,55 +55,97 @@ eurotime2date2 <- function(x, last = FALSE) { days <- substr(unique_times, 8, 10) #extract -DD from YYYY-MM-DD tcode <- substr(days[1], 1, 1) # tcode for daily data is "-" } - + if (tcode == "") tcode <- "Y" - + day <- "01" # default for day - - # for yearly data + if (tcode == "Y") { + # for yearly data period <- "01" - # for bi-annual } else if (tcode == "S") { + # for bi-annual ("semester") data lookup <- c(S1 = "01", S2 = "07") period <- lookup[subyear] - # for quarterly } else if (tcode == "Q") { + # quarterly data lookup <- c(Q1 = "01", Q2 = "04", Q3 = "07", Q4 = "10") period <- lookup[subyear] - # for montly } else if (tcode == "0" || tcode == "1") { + # monthly data period <- gsub("M", "", subyear) - # for weekly } else if (tcode == "W") { + # weekly data # We need period to be of format "WNN", e.g. W01 for 1st week of the year period <- subyear - # for daily } else if (tcode == "-") { + # daily data period <- gsub("M", "", subyear) day <- gsub("D", "", days) } else { + # nocov start warning( "Unknown time code, ", tcode, ". No date conversion was made.\n Please fill bug report at ", "https://github.com/rOpenGov/eurostat/issues." ) return(x) + # nocov end } - - levels(x) <- paste0(year, "-", period, "-", day) - + # The date as the last date of the period if (tcode == "W") { - # we will be using range 1-7 here, not 01-07 + # in some datasets week number can be larger than 53, e.g. 99 + # ISOweek2date does not support such week numbers -> they are coerced + # to W01-1 or W01-7 + if (any(substr(period, 2, 3) > 53)) { + warning(paste("Some TIME_PERIOD fields have invalid week values (> 53).", + "Coercing invalid fields to format YYYY-W01", + "(the first week of the year). If you wish to handle", + "weeks with invalid values manually please use", + "parameter time_format = 'raw' in get_eurostat.")) + invalid_w_numbers <- which(substr(period, 2, 3) > 53) + period[invalid_w_numbers] <- "W01" + } + + # Range is 1-7 here, not 01-07. 1 = Monday, 2 = Tuesday etc. day <- ifelse(last == TRUE, 7, 1) levels(x) <- paste0(year, "-", period, "-", day) - x <- ISOweek::ISOweek2date(x) - return(x) + unique_dates <- unique(x) + column_names <- c("orig", "date") + d <- data.frame( + matrix( + nrow = length(unique_dates), + ncol = length(column_names) + ) + ) + colnames(d) <- column_names + d$orig <- unique_dates + d$date <- ISOweek::ISOweek2date(unique_dates) + + # NEW CODE: data.table + # d <- as.data.table(d) + # x <- as.data.table(x) + + x <- as.data.frame(x) + colnames(x) <- "orig" + + # NEW CODE: data.table + # y <- x[d, on = "orig"]$date + + y <- dplyr::inner_join(x, d, by = "orig") + y <- y$date + return(y) } + + levels(x) <- paste0(year, "-", period, "-", day) + # For times other than weeks if (last == TRUE && tcode != "W") { - shift <- c("Y" = 367, "S" = 186, "Q" = 96, "0" = 32, "1" = 32, "D" = 0)[tcode] + shift <- c( + "Y" = 367, "S" = 186, "Q" = 96, "0" = 32, "1" = 32, "D" = 0 + )[tcode] + levels(x) <- lubridate::ymd( cut(lubridate::ymd(levels(x)) + shift, "month") ) - 1 diff --git a/R/eurotime2num.R b/R/eurotime2num.R index 09585c63..2e5fcb8d 100755 --- a/R/eurotime2num.R +++ b/R/eurotime2num.R @@ -1,67 +1,8 @@ #' @title Conversion of Eurostat Time Format to Numeric #' @description A conversion of a Eurostat time format to numeric. -#' @details Bi-annual, quarterly and monthly data is presented as fraction of -#' the year in beginning of the period. Conversion of daily data is not -#' supported. -#' @param x a charter string with time information in Eurostat time format. -#' @return see [as.numeric()]. -#' @author Janne Huovari -#' @family helpers -#' @examplesIf check_access_to_data() -#' \donttest{ -#' na_q <- get_eurostat("namq_10_pc", time_format = "raw") -#' na_q$time <- eurotime2num(x = na_q$time) -#' -#' unique(na_q$time) -#' } -#' -#' @export -eurotime2num <- function(x) { - x <- as.factor(x) - times <- levels(x) - - if (nchar(times[1]) > 7) { - tcode <- substr(times[1], 8, 8) # daily - } else { - tcode <- substr(times[1], 5, 5) # type of time data - if (tcode == "") tcode <- "Y" - } - - - # check input type - if (!(tcode %in% c("Y", "S", "Q", "M", "_"))) { - - # for daily - if (tcode == "D") { - warning("Time format is daily data. No numeric conversion was made.") - # for year intervals - } else if (tcode == "_") { - warning("Time format is a year interval. No numeric conversion was made.") - # for unkown - } else { - warning("Unknown time code, ", tcode, ". No numeric conversion was made.\n - Please fill bug report at https://github.com/rOpenGov/eurostat/issues.") - } - - return(x) - } - - year <- substr(times, 1, 4) - subyear <- substr(times, 6, 7) - subyear[subyear == ""] <- 1 - - - levels(x) <- as.numeric(year) + - (as.numeric(subyear) - 1) * 1 / c(Y = 1, S = 2, Q = 4, M = 12)[tcode] - y <- as.numeric(as.character(x)) - y -} - -#' @title Conversion of Eurostat Time Format to Numeric -#' @description A conversion of a Eurostat time format to numeric. -#' @details -#' Bi-annual (semester), quarterly, monthly and weekly data can be presented as -#' a fraction of the year in beginning of the period. Conversion of daily data +#' @details +#' Bi-annual (semester), quarterly, monthly and weekly data can be presented as +#' a fraction of the year in beginning of the period. Conversion of daily data #' is not supported. #' @param x a charter string with time information in Eurostat time format. #' @return see [as.numeric()]. @@ -70,19 +11,19 @@ eurotime2num <- function(x) { #' @examplesIf check_access_to_data() #' \donttest{ #' na_q <- get_eurostat("namq_10_pc", time_format = "raw") -#' na_q$time <- eurotime2num(x = na_q$time) +#' na_q$TIME_PERIOD <- eurotime2num(x = na_q$TIME_PERIOD) #' -#' unique(na_q$time) +#' unique(na_q$TIME_PERIOD) #' } #' #' @export -eurotime2num2 <- function(x) { +eurotime2num <- function(x) { x <- as.factor(x) times <- levels(x) - + if (nchar(times[1]) > 8) { # Finds the only format that is longer than YYYY-WNN (weeks, 8 chars) - # Day/date notation: YYYY-MM-DD, 10 chars + # Day/date notation: YYYY-MM-DD, 10 chars # tcode <- substr(times[1], 8, 8) tcode <- "D" } else { @@ -96,19 +37,25 @@ eurotime2num2 <- function(x) { tcode <- "A" } } - - + # check input type - if (!(tcode %in% c("A", "S", "Q", "M", "W", "D"))) { - + if (!(tcode %in% c("A", "S", "Q", "M", "W"))) { + # for daily if (tcode == "D") { warning("Time format is daily data. No numeric conversion was made.") } else { - warning("Unknown time code, ", tcode, ". No numeric conversion was made.\n - Please fill bug report at https://github.com/rOpenGov/eurostat/issues.") + # nocov start + warning( + paste0( + "Unknown time code, ", tcode, ". No numeric conversion was made.\n", + "Please fill bug report at ", + "https://github.com/rOpenGov/eurostat/issues." + ) + ) + # nocov end } - + return(x) } @@ -120,7 +67,8 @@ eurotime2num2 <- function(x) { subyear[subyear == ""] <- 1 levels(x) <- as.numeric(year) + - (as.numeric(subyear) - 1) * 1 / c(A = 1, S = 2, Q = 4, M = 12, W = 53)[tcode] + (as.numeric(subyear) - 1) * + 1 / c(A = 1, S = 2, Q = 4, M = 12, W = 53)[tcode] y <- as.numeric(as.character(x)) y } diff --git a/R/get_bibentry.R b/R/get_bibentry.R index 578c9075..0a2fc95e 100755 --- a/R/get_bibentry.R +++ b/R/get_bibentry.R @@ -7,35 +7,42 @@ #' @param keywords A list of keywords to be added to the entries. Defaults #' to `NULL`. #' @param format Default is `'Biblatex'`, alternatives are `'bibentry'` -#' or `'Bibtex'` (not case sensitive.) +#' or `'Bibtex'` (not case sensitive) +#' @inheritParams get_eurostat #' @author Daniel Antal, Przemyslaw Biecek +#' @inheritSection eurostat-package Citing Eurostat data +#' #' @return a bibentry, Bibtex or Biblatex object. +#' +#' @seealso [utils::bibentry] [RefManageR::toBiblatex] +#' #' @examplesIf check_access_to_data() #' \dontrun{ #' my_bibliography <- get_bibentry( -#' code = c("tran_hv_frtra", "t2020_rk310", "tec00001"), +#' code = c("tran_hv_frtra", "tec00001"), #' keywords = list( -#' c("railways", "freight", "transport"), -#' c("railways", "passengers", "modal split") +#' c("transport", "freight", "multimodal data", "GDP"), +#' c("economy and finance", "annual", "national accounts", "GDP") #' ), #' format = "Biblatex" #' ) #' my_bibliography #' } +#' #' @importFrom lubridate dmy year month day -#' @importFrom utils toBibtex +#' @importFrom utils toBibtex person #' @importFrom RefManageR BibEntry toBiblatex +#' @importFrom stringr str_glue #' #' @export - - get_bibentry <- function(code, keywords = NULL, - format = "Biblatex") { + format = "Biblatex", + lang = "en") { if (!any(class(code) %in% c("character", "factor"))) { stop("The code(s) must be added as character vector") } - if (!is.null(keywords) & !inherits(keywords, "list")) { + if (!is.null(keywords) && !inherits(keywords, "list")) { stop("If keyword(s) are added, they must be added as a list.") } @@ -48,28 +55,60 @@ get_bibentry <- function(code, format <- "biblatex" } - toc <- get_eurostat_toc() + toc <- get_eurostat_toc(lang = lang) + # Remove hierarchy column to make duplicated() check more viable + toc <- toc[, !names(toc) %in% c("hierarchy")] toc <- toc[toc$code %in% code, ] toc <- toc[!duplicated(toc), ] urldate <- as.character(Sys.Date()) + + lang <- check_lang(lang) + + lang_long <- switch(lang, + en = "english", + fr = "french", + de = "german") if (nrow(toc) == 0) { - warning(paste0("Code ", code, "not found")) + warning(paste( + "None of the codes were found in the Eurostat table of contents.\n", + "Please check the 'code' argument in get_bibentry() for errors:\n", + paste(code, collapse = ", ") + ) + ) return() } + + not_found <- NULL + not_found <- !(code %in% toc$code) + not_found <- code[not_found] + if (is.character(not_found) && length(not_found) != 0) { + warning(paste( + "The following codes were not found in the Eurostat table of contents.\n", + "Bibliography object returned without the following items:\n", + paste(not_found, collapse = ", ") + )) + } - eurostat_id <- paste0( - toc$code, "_", - gsub("\\.", "-", toc$`last update of data`) - ) - - for (i in 1:nrow(toc)) { - last_update_date <- lubridate::dmy(toc[["last update of data"]][[i]]) + for (i in seq_len(nrow(toc))) { + last_update_date <- lubridate::dmy(toc[["last.update.of.data"]][[i]]) last_update_year <- lubridate::year(last_update_date) last_update_month <- lubridate::month(last_update_date) last_update_day <- lubridate::day(last_update_date) - + + dataset_key <- paste0( + toc$code[i], "-", last_update_year, "-", last_update_month, "-", + last_update_day + ) + # replace troublesome _ with - + dataset_key <- gsub("_", "-", dataset_key) + + dataset_id <- toc$code[i] + # replace troublesome _ with \_ for bibtex and biblatex references + if (format %in% c("bibtex", "biblatex")) { + dataset_id <- gsub("_", "\\\\_", dataset_id) + } if (!is.null(keywords)) { # if user entered keywords if (length(keywords) < i) { # last keyword not entered @@ -83,15 +122,23 @@ get_bibentry <- function(code, entry <- RefManageR::BibEntry( bibtype = "misc", - key = eurostat_id[i], - title = paste0(toc$title[i], " [", code[i], "]"), - url = paste0("https://ec.europa.eu/eurostat/web/products-datasets/-/", code[i]), - language = "en", - year = paste0(toc$`last update of data`[i]), - publisher = "Eurostat", - author = "Eurostat", + key = dataset_key, + title = paste0(toc$title[i], " (", dataset_id, ")"), + url = paste0("https://ec.europa.eu/eurostat/web/products-datasets/product?code=", + toc$code[i]), + language = lang_long, + # date = last_update_date, + year = last_update_year, + author = c( + utils::person(given = "Eurostat") + ), keywords = keyword_entry, - urldate = urldate + urldate = urldate, + type = "Dataset", + note = stringr::str_glue( + paste("Accessed {as.Date(urldate)},", + "dataset last updated {as.Date(last_update_date)}") + ) ) if (i > 1) { diff --git a/R/get_eurostat.R b/R/get_eurostat.R index 4b1a5824..013fea38 100755 --- a/R/get_eurostat.R +++ b/R/get_eurostat.R @@ -1,56 +1,61 @@ -#' @title Read Eurostat Data -#' -#' @description +#' @title Get Eurostat Data +#' +#' @description #' Download data sets from Eurostat \url{https://ec.europa.eu/eurostat} #' -#' @param id -#' A code name for the dataset of interest. -#' See [search_eurostat()] or details for how to get code. -#' @param filters a "none" (default) to get a whole dataset or a named list of -#' filters to get just part of the table. Names of list objects are -#' Eurostat variable codes and values are vectors of observation codes. -#' If `NULL` the whole -#' dataset is returned via API. More on details. See more on filters and -#' limitations per query via API from for -#' [get_eurostat_json()]. -#' @param time_format -#' a string giving a type of the conversion of the time -#' column from the eurostat format. A "date" (default) converts to -#' a [Date()] with a first date of the period. -#' A "date_last" converts to a [Date()] with -#' a last date of the period. A "num" converts to a numeric and "raw" -#' does not do conversion. See [eurotime2date()] and -#' [eurotime2num()]. -#' @param type -#' A type of variables, "code" (default) or "label". -#' @param select_time -#' a character symbol for a time frequency or NULL, +#' @param id +#' A unique identifier / code for the dataset of interest. If code is not +#' known [search_eurostat()] function can be used to search Eurostat table +#' of contents. +#' @param filters +#' A named list of filters. Names of list objects are Eurostat +#' variable codes and values are vectors of observation codes. If `NULL` +#' (default) the whole dataset is returned. See details for more information +#' on filters and limitations per query. +#' @param time_format +#' a string giving a type of the conversion of the time column from the +#' eurostat format. The default argument "`date`" converts to a [Date()] class +#' with the date being the first day of the period. A "`date_last`" argument +#' converts the dataset date to a [Date()] class object with the difference +#' that the exact date is the last date of the period. Period can be year, +#' semester (half year), quarter, month, or week (See [eurotime2date()] for +#' more information). +#' Argument "`num`" converts the date into a numeric (integer) meaning that +#' the first day of the year 2000 is close to 2000.01 and the last day of the +#' year is close to 2000.99 (see [eurotime2num()] for more information). +#' Using the argument "`raw`" preserves the dates as they were in the original +#' Eurostat data. +#' @param type +#' A type of variables, "`code`" (default), "`label`" or "`both`". +#' The parameter "`both`" will return a data_frame with named vectors, +#' labels as values and codes as names. +#' @param select_time +#' a character symbol for a time frequency or `NULL`, #' which is used by default as most datasets have just one time #' frequency. For datasets with multiple time #' frequencies, select one or more of the desired frequencies with: -#' "Y" (or "A") = annual, "S" = semi-annual / semester, "Q" = quarterly, -#' "M" = monthly, "W" = weekly. For all frequencies in same data +#' "Y" (or "A") = annual, "S" = semi-annual / semester, "Q" = quarterly, +#' "M" = monthly, "W" = weekly. For all frequencies in same data #' frame `time_format = "raw"` should be used. -#' @param cache -#' a logical whether to do caching. Default is `TRUE`. Affects -#' only queries from the bulk download facility. -#' @param update_cache +#' @param lang 2-letter language code, default is "`en`" (English), other +#' options are "`fr`" (French) and "`de`" (German). Used for labeling datasets. +#' @param cache +#' a logical whether to do caching. Default is `TRUE`. +#' @param update_cache #' a logical whether to update cache. Can be set also with -#' options(eurostat_update = TRUE) -#' @param cache_dir a -#' path to a cache directory. The directory must exist. -#' The `NULL` (default) uses and creates -#' 'eurostat' directory in the temporary directory from -#' [tempdir()]. The directory can also be set with -#' [set_eurostat_cache_dir()]. -#' @param compress_file -#' a logical whether to compress the -#' RDS-file in caching. Default is `TRUE`. -#' @param stringsAsFactors -#' if `FALSE` (the default) the variables are -#' returned as characters. If `TRUE` the variables are converted to -#' factors in original Eurostat order. -#' @param keepFlags +#' `options(eurostat_update = TRUE)` +#' @param cache_dir +#' a path to a cache directory. `NULL` (default) uses and creates +#' 'eurostat' directory in the temporary directory defined by base R +#' [tempdir()] function. The user can set the cache directory to an existing +#' directory by using this argument. The cache directory can also be set with +#' [set_eurostat_cache_dir()] function. +#' @param compress_file +#' a logical whether to compress the RDS-file in caching. Default is `TRUE`. +#' @param stringsAsFactors +#' if `TRUE` (the default) variables are converted to factors in the original +#' Eurostat order. If `FALSE` they are returned as strings. +#' @param keepFlags #' a logical whether the flags (e.g. "confidential", #' "provisional") should be kept in a separate column or if they #' can be removed. Default is `FALSE`. For flag values see: @@ -58,34 +63,28 @@ #' Also possible non-real zero "0n" is indicated in flags column. #' Flags are not available for eurostat API, so `keepFlags` #' can not be used with a `filters`. -#' @param legacy_bulk_download -#' a logical, whether to use the new dissemination API to -#' download TSV files instead of the old Bulk Download facilities. -#' Default is `TRUE`. This is a temporary parameter that will be deleted -#' after the old Bulk Download facilities will are decommissioned. Please -#' use caution if you intend to build any automated scripts that use this -#' parameter. +#' @param use.data.table Use faster data.table functions? Default is FALSE. +#' On Windows requires that RTools is installed. #' @inheritDotParams get_eurostat_json -#' @export -#' @references -#' See `citation("eurostat")`: -#' -#' ```{r, echo=FALSE, comment="#" } -#' citation("eurostat") -#' ``` #' -#' When citing data, please indicate that the data source is Eurostat. If the -#' re-use of data involves modification to the data or text, state this clearly. -#' For more detailed information and exceptions regarding commercial use, -#' see [Eurostat policy on copyright and free re-use of data](https://ec.europa.eu/eurostat/web/main/about/policies/copyright). +#' @inherit eurostat-package references #' -#' @author Przemyslaw Biecek, Leo Lahti, Janne Huovari and Markus Kainu -#' @details Data sets are downloaded from -#' [the Eurostat bulk download facility](https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing) or from The Eurostat Web Services -#' [JSON API](https://ec.europa.eu/eurostat/web/main/data/web-services). +#' @inheritSection eurostat-package Eurostat: Copyright notice and free re-use of data +#' @inheritSection eurostat-package Filtering datasets +#' @inheritSection eurostat-package Citing Eurostat data +#' @inheritSection eurostat-package Disclaimer: Availability of filtering functionalities +#' @inheritSection eurostat-package Strategies for handling large datasets more efficiently +#' +#' @author +#' Przemyslaw Biecek, Leo Lahti, Janne Huovari, Markus Kainu and Pyry Kantanen +#' +#' @details +#' Datasets are downloaded from +#' [the Eurostat SDMX 2.1 API](https://wikis.ec.europa.eu/display/EUROSTATHELP/Transition+-+from+Eurostat+Bulk+Download+to+API) +#' in TSV format or from The Eurostat +#' [API Statistics JSON API](https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query). #' If only the table `id` is given, the whole table is downloaded from the -#' bulk download facility. If also `filters` are defined the JSON API is -#' used. +#' SDMX API. If any `filters` are given JSON API is used instead. #' #' The bulk download facility is the fastest method to download whole datasets. #' It is also often the only way as the JSON API has limitation of maximum @@ -94,12 +93,11 @@ #' bulk download facility and the `select_time` is not available for #' JSON API method. #' -#' If your connection is thru a proxy, you probably have to set proxy parameters +#' If your connection is through a proxy, you may have to set proxy parameters #' to use JSON API, see [get_eurostat_json()]. #' -#' By default datasets from the bulk download facility are cached as they are -#' often rather large. Caching is not (currently) possible for datasets from -#' JSON API. +#' By default datasets are cached to reduce load on Eurostat services and +#' because some datasets can be quite large. #' Cache files are stored in a temporary directory by default or in #' a named directory (See [set_eurostat_cache_dir()]). #' The cache can be emptied with [clean_eurostat_cache()]. @@ -109,17 +107,21 @@ #' . The Eurostat #' database gives codes in the Data Navigation Tree after every dataset #' in parenthesis. -#' @return -#' a tibble. #' -#' One column for each dimension in the data, the time column for a time -#' dimension and the values column for numerical values. Eurostat data does -#' not include all missing values and a treatment of missing values depend -#' on source. In bulk download facility missing values are dropped if all -#' dimensions are missing on particular time. In JSON API missing values are +#' @return +#' a tibble. +#' +#' One column for each dimension in the data, the time column for a time +#' dimension and the values column for numerical values. Eurostat data does +#' not include all missing values and a treatment of missing values depend +#' on source. In bulk download facility missing values are dropped if all +#' dimensions are missing on particular time. In JSON API missing values are #' dropped only if all dimensions are missing on all times. The data from #' bulk download facility can be completed for example with [tidyr::complete()]. -#' @seealso [search_eurostat()], [label_eurostat()] +#' +#' @seealso +#' [search_eurostat()], [label_eurostat()] +#' #' @examplesIf check_access_to_data() #' \dontrun{ #' k <- get_eurostat("nama_10_lp_ulc") @@ -145,142 +147,640 @@ #' unit = "CLV_I10" #' ) #' ) -#' +#' #' # A dataset with multiple time series in one #' dd2 <- get_eurostat("AVIA_GOR_ME", #' select_time = c("A", "M", "Q"), -#' time_format = "date_last", -#' legacy_bulk_download = FALSE +#' time_format = "date_last" #' ) +#' +#' # An example of downloading whole dataset from JSON API +#' dd3 <- get_eurostat("AVIA_GOR_ME", +#' filters = list() +#' ) +#' +#' # Filtering a dataset from a local file +#' dd3_filter <- get_eurostat("AVIA_GOR_ME", +#' filters = list( +#' tra_meas = "FRM_BRD" +#' ) +#' ) +#' #' } #' -get_eurostat <- function(id, - time_format = "date", - filters = "none", +#' @importFrom digest digest +#' @importFrom jsonlite toJSON fromJSON +#' @importFrom dplyr filter +#' @importFrom rlang !! sym +#' @export +get_eurostat <- function(id, + time_format = "date", + filters = NULL, type = "code", select_time = NULL, - cache = TRUE, - update_cache = FALSE, + lang = "en", + cache = TRUE, + update_cache = FALSE, cache_dir = NULL, compress_file = TRUE, stringsAsFactors = FALSE, keepFlags = FALSE, - legacy_bulk_download = TRUE, + use.data.table = FALSE, ...) { - + # Check if you have access to ec.europe.eu. + # If dataset is cached, access to ec.europe.eu is not needed + # Therefore this is a warning, not a stop if (!check_access_to_data()) { - message("You have no access to ec.europe.eu. + # nocov start + warning("You have no access to ec.europe.eu. Please check your connection and/or review your proxy settings") - } else { - # Warning for flags with filter - if (keepFlags & !is.character(filters) && filters != "none") { - warning("The keepFlags argument of the get_eurostat function - can be used only without filters. No Flags returned.") + # nocov end + } + + # For better code clarity, use only NULL in code + if (is.character(filters) && identical(tolower(filters), "none")) { + filters <- NULL + } else if (is.character(filters) && !identical(tolower(filters), "null")) { + message("Non-standard filters argument. Using argument 'filters = NULL'") + filters <- NULL + } + + # Inform user with message if keepFlags == TRUE cannot be delivered + if (keepFlags && !is.null(filters)) { + message("The keepFlags argument of the get_eurostat function + can be used only without filters. No Flags returned.") + keepFlags <- FALSE + } + + # Sanity check + type <- tolower(type) + time_format <- tolower(time_format) + lang <- check_lang(lang) + + if (cache) { + + # check option for update + update_cache <- update_cache | getOption("eurostat_update", FALSE) + + # get cache directory + cache_dir <- eur_helper_cachedir(cache_dir) + + cache_list <- file.path( + cache_dir, + paste0( + "cache_list", + ".json" + ) + ) + + # cache file connection + cache_list_conn <- file(cache_list, "a") + + # Sort filters alphabetically #### + # Subsetting with NULL turns list("") (List of 1) to list() (List of 0) + # This needs to be looked into, even if it's useful, it's unexpected + # if structure below prevents subsetting when names(filters) is NULL + if (!is.null(names(filters))) { + filters <- filters[sort(names(filters), decreasing = FALSE)] } - - # No cache for json - if (is.null(filters) || identical(filters, "none")) { - cache <- FALSE + + # Sort items inside each individual filter to alphabetical order + for (i in seq_along(filters)) { + if (length(filters[i]) > 1) { + filters[i] <- sort(filters[i]) + } } - - if (cache) { - - # check option for update - update_cache <- update_cache | getOption("eurostat_update", FALSE) - - # get cache directory - cache_dir <- eur_helper_cachedir(cache_dir) - - # cache filename - cache_file <- file.path( - cache_dir, - paste0( - id, "_", time_format, - "_", type, select_time, "_", - strtrim(stringsAsFactors, 1), - strtrim(keepFlags, 1), - ".rds" + + # Turn query into lists with predefined order + # Order is defined by the order of arguments in function documentation + query <- list( + list( + id = id, + time_format = time_format, + filters = filters, + type = type, + select_time = select_time, + stringsAsFactors = stringsAsFactors, + keepFlags = keepFlags, + source = ifelse(is.null(filters), "bulk", "json"), + download_date = Sys.Date() + ) + ) + + if (is.null(filters)) { + query_unfiltered <- list( + list( + id = id, + time_format = time_format, + filters = NULL, + type = type, + select_time = select_time, + stringsAsFactors = stringsAsFactors, + keepFlags = keepFlags, + source = "bulk", + download_date = Sys.Date() + ) + ) + } else { + # This is to make it possible to filter local dataset + # The only way to return a whole dataset from JSON API is to use + # empty list with filters argument + query_unfiltered <- list( + list( + id = id, + time_format = time_format, + filters = list(), + type = type, + select_time = select_time, + stringsAsFactors = stringsAsFactors, + keepFlags = keepFlags, + source = "json", + download_date = Sys.Date() ) ) } - - # if cache = FALSE or update or new: dowload else read from cache - if (!cache || update_cache || !file.exists(cache_file)) { - if (is.null(filters) || is.list(filters)) { - - # JSON API Download - y <- get_eurostat_json(id, filters, - type = type, - stringsAsFactors = stringsAsFactors, ... + + query_hash <- digest::digest(query, algo = "md5") + query_hash_unfiltered <- digest::digest(query_unfiltered, algo = "md5") + names(query) <- digest::digest(query, algo = "md5") + cache_list_current <- readLines(cache_list) + + if (any(grepl(query_hash, cache_list_current))) { + # Check if the same query has already been made + message("Dataset query already saved in cache_list.json...") + } else if (!any(grepl(query_hash, cache_list_current))) { + # If query was not made, append cache_list with new json query + if (length(cache_list_current) == 0) { + # close previous connection with mode "a" + close(cache_list_conn) + cache_list_conn <- file(cache_list, "w") + + json_query <- jsonlite::toJSON( + query, + pretty = TRUE, + null = "null" + ) + + writeLines(text = json_query, + con = cache_list_conn, + sep = "\n") + + } else if (length(cache_list_current) != 0) { + # read previously saved queries and save them + cache_list_history <- jsonlite::fromJSON(cache_list) + # close previous connection with mode "a" + close(cache_list_conn) + # open a new connection with mode "w" that wipes the file + cache_list_conn <- file(cache_list, "w") + cache_list_history_and_query <- c(cache_list_history, query) + + json_query <- jsonlite::toJSON( + cache_list_history_and_query, + pretty = TRUE, + null = "null" + ) + + writeLines( + text = paste0(json_query), + con = cache_list_conn, + sep = "\n" ) - y$time <- convert_time_col2(factor(y$time), time_format = time_format) - - # Bulk download - } else if (filters == "none") { - - if (legacy_bulk_download == TRUE) { - # Download from old bulk download facilities - # with old get_eurostat_raw function - # This if-else construct is temporary until the old Bulk Download is - # removed from use by Eurostat - y_raw <- try(get_eurostat_raw(id)) - - if ("try-error" %in% class(y_raw)) { - stop(paste("get_eurostat_raw fails with the id", id, "\n")) - } - - # If download from old bulk download facilities was successful - # Then tidy the dataset with old tidy_eurostat function - y <- tidy_eurostat(y_raw, - time_format, - select_time, - stringsAsFactors = stringsAsFactors, - keepFlags = keepFlags - ) - } else { - message("Trying to download from the new dissemination API... \n") - # Download from new dissemination API in TSV file format - y_raw <- try(get_eurostat_raw2(id)) - if ("try-error" %in% class(y_raw)) { - stop(paste("get_eurostat_raw fails with the id", id)) - } - # If download from new dissemination API is successful - # Then tidy the dataset with the new tidy_eurostat2 function - y <- tidy_eurostat2(y_raw, - time_format, - select_time, - stringsAsFactors = stringsAsFactors, - keepFlags = keepFlags - ) - } - - if (type == "code") { - y <- y - } else if (type == "label" && legacy_bulk_download == TRUE) { - y <- label_eurostat(y) - } else if (type == "label" && legacy_bulk_download == FALSE){ - y <- label_eurostat2(y) - } else if (type == "both") { - stop("type = \"both\" can be only used with JSON API. Set filters argument") - } else { - stop("Invalid type.") - } } + } + + close(cache_list_conn) + + # If query_hash and query_hash_unfiltered are not identical + # it means that it makes sense to see if a superset of the data exists + data_superset_exists <- FALSE + + # Re-read cache_list file if there were any changes + cache_list_current <- readLines(cache_list) + + if (!identical(query_hash, query_hash_unfiltered) && + any(grepl(query_hash_unfiltered, cache_list_current))) { + message("Dataset query not in cache_list.json but the whole dataset is") + data_superset_exists <- TRUE + } + + # cache filename + cache_file <- file.path( + cache_dir, + paste0( + query_hash, + ".rds" + ) + ) + + # bulk cache filename + cache_file_bulk <- file.path( + cache_dir, + paste0( + query_hash_unfiltered, + ".rds" + ) + ) + } + + # Download always files from server if any of the following is TRUE + # cache = FALSE + # -> no caching, always downloading + # update_cache = TRUE + # -> want to update a cache -> redownload + # suitable cache_file AND cache_file_bulk do not exist + # -> no cache files -> no reading from cache -> download + if (!cache || update_cache || + (!file.exists(cache_file) && !file.exists(cache_file_bulk))) { + if (is.list(filters)) { + # If filters value is some type of a list + # -> Download from Eurostat Web Service (replaces "JSON API") + + y <- get_eurostat_json( + id, + filters, + type, + lang, + stringsAsFactors, + ... + ) + y$time <- convert_time_col(factor(y$time), time_format = time_format) + + } else if (is.null(filters)) { + # If filters value is NULL + # -> Download from SDMX 2.1 REST API (replaces old "Bulk download") + + y <- try(get_eurostat_raw(id, use.data.table = use.data.table), silent = TRUE) + if ("try-error" %in% class(y)) { + stop(paste("get_eurostat_raw fails with the id", id)) + } + + # If download from SDMX 2.1 REST API is successful + # -> tidy the dataset with tidy_eurostat function + + y <- tidy_eurostat( + y, + time_format, + select_time, + stringsAsFactors = stringsAsFactors, + keepFlags = keepFlags, use.data.table = use.data.table + ) + + if (identical(type, "code")) { + # do nothing + # y <- y + } else if (identical(type, "label")) { + y <- label_eurostat(y, lang) + } else if (identical(type, "both")) { + stop(paste("type = \"both\" can be only used with JSON API.", + "Set filters argument")) + } else { + stop("Invalid type.") + } + } + } else if (file.exists(cache_file_bulk) && data_superset_exists) { + # Somewhat redundant as data_superset_exists checks cache_list.json + # which lists files downloaded and saved to cache but maybe in some + # situations the cached file could go missing? Not very likely though + + message(paste("Reading cache file", cache_file_bulk, "and filtering it")) + y <- readRDS(cache_file_bulk) + for (i in seq_along(filters)) { + y <- dplyr::filter(y, + !!rlang::sym(names(filters)[i]) == filters[i]) + } + # y <- y_raw + } else if (file.exists(cache_file)) { + cf <- path.expand(cache_file) + message(paste("Reading cache file", cf)) + y <- readRDS(cache_file) + message(paste("Table ", id, " read from cache file: ", cf)) + } + + # if update_cache = TRUE or cache file does not yet exist + # -> save cache file to cache directory + if (cache && (update_cache || !file.exists(cache_file))) { + saveRDS(y, file = cache_file, compress = compress_file) + message("Table ", id, " cached at ", path.expand(cache_file)) + } + + y +} + +#' @title Get all datasets in a folder +#' @description +#' Loops over all files in a Eurostat database folder, downloads the data and +#' assigns the datasets to environment. +#' @details +#' The datasets are assigned into .EurostatEnv by default, using dataset codes +#' as object names. The datasets are downloaded from SDMX API as TSV files, +#' meaning that they are returned without filtering. No filters can be +#' provided using this function. +#' +#' Please do not attempt to download too many datasets or the whole database +#' at once. The number of datasets that can be downloaded at once is hardcoded +#' to 20. The function also asks the user for confirmation if the number of +#' datasets in a folder is more than 10. This is by design to discourage +#' straining Eurostat API. +#' @param code Folder code from Eurostat Table of Contents. +#' @param env Name of the environment where downloaded datasets are assigned. +#' Default is .EurostatEnv. If NULL, datasets are returned as a list object. +#' +#' @inheritSection eurostat-package Data source: Eurostat Table of Contents +#' @inheritSection eurostat-package Data source: Eurostat SDMX 2.1 Dissemination API +#' +#' @author Pyry Kantanen +#' +#' @inherit set_eurostat_toc seealso +#' +#' @importFrom stringr str_glue +#' @importFrom utils menu +#' +#' +#' @export +get_eurostat_folder <- function(code, env = .EurostatEnv) { + + # Limit after which the function prompts the user whether they really want + # to proceed + soft_limit <- 10 + # Limit that cannot be crossed with this function + hard_limit <- 20 + + toc <- get_eurostat_toc() + if (toc[["type"]][which(toc[["code"]] == code)] != "folder") { + warning("The code you provided is not a folder.") + return(invisible()) + } + children <- toc_list_children(code) + # Filter out potential subfolders + children <- children[which(children$type %in% c("dataset", "table")), ] + + if (nrow(children) == 0) { + warning("The folder code you provided did not have any items.") + return(invisible()) + } + + if (nrow(children) > hard_limit) { + warning(stringr::str_glue( + "The number of datasets in folder ({nrow(children)}) is too large. ", + "Please use some other method for retrieving datasets." + )) + return(invisible()) + } + + if (nrow(children) > soft_limit) { + title_msg <- stringr::str_glue( + "The number of items in the folder is more than {soft_limit}. ", + "Do you wish to proceed?") + switch(menu(c("Yes", "No"), title = title_msg) + 1, + cat("Nothing done\n"), + message("Proceeding to download datasets in folder..."), + return(invisible())) + } + + if (!is.null(env)) { + for (i in seq_len(nrow(children))) { + dataset <- get_eurostat(children$code[i], cache = TRUE) + assign(children$code[i], dataset, envir = env) + message( + stringr::str_glue( + "Dataset {i} / {nrow(children)} assigned to environment\n\n") + ) + } + return(invisible()) + } else { + list_of_datasets <- list() + for (i in seq_len(nrow(children))) { + dataset <- get_eurostat(children$code[i], cache = TRUE) + list_of_datasets[[i]] <- dataset + # names(list_of_datasets[i]) <- children$code[i] + message( + stringr::str_glue( + "Dataset {i} / {nrow(children)} assigned to a list\n\n") + ) + } + names(list_of_datasets) <- children[["code"]] + return(list_of_datasets) + } +} + +#' @title Get Eurostat data interactive +#' @description +#' A simple interactive helper function to go through the steps of downloading +#' and/or finding suitable eurostat datasets. +#' +#' @details +#' This function is intended to enable easy exploration of different eurostat +#' package functionalities and functions. In order to not drown the end user +#' in endless menus this function does not allow for setting +#' all possible [get_eurostat()] function arguments. It is possible to set +#' `time_format`, `type`, `lang`, `stringsAsFactors`, `keepFlags`, and +#' `use.data.table` in the interactive menus. +#' +#' In some datasets setting these parameters may result in a +#' "Error in label_eurostat" error, for example: +#' "labels for XXXXXX includes duplicated labels in the Eurostat dictionary". +#' In these cases, and with other more complex queries, please +#' use [get_eurostat()] function directly. +#' +#' @param code +#' A unique identifier / code for the dataset of interest. If code is not +#' known [search_eurostat()] function can be used to search Eurostat table +#' of contents. +#' +#' @seealso [get_eurostat()] +#' @importFrom stringr str_glue +#' @importFrom utils capture.output +#' @export +get_eurostat_interactive <- function(code = NULL) { + # Interactive function, not feasible to test + # nocov start + lang_selection <- switch( + menu(c("English", "French", "German"), title = "Select language") + 1, + return(invisible()), + "en", + "fr", + "de" + ) + + if (is.null(code)) { + + search_term <- readline(prompt = "Enter search term for data: ") + results <- search_eurostat(pattern = search_term, lang = lang_selection) + code_and_title <- paste0("[", results$code, "] ", results$title) + if (nrow(results) > 0) { + choice <- menu(choices = code_and_title, title = "Which dataset would you like to download?") + if (choice == 0) { + # message("Nothing done\n") + return(invisible()) + } } else { - cf <- path.expand(cache_file) - message(paste("Reading cache file", cf)) - y <- readRDS(cache_file) - message(paste("Table ", id, " read from cache file: ", cf)) + stop(paste("No data found with given search term:", search_term)) } + code <- results$code[choice] + } + + download_selection <- switch( + menu(choices = c("Yes", "No"), + title = "Download the dataset?") + 1, + return(invisible()), + TRUE, + FALSE + ) + # Set manual_selection to FALSE here to make it possible to print code + # for downloading dataset later + manual_selection <- FALSE + + if (download_selection) { + manual_selection <- switch( + menu(choices = c("Default", "Manually selected"), + title = "Would you like to use default download arguments or set them manually?") + 1, + return(invisible()), + FALSE, + TRUE + ) - # if update or new: save - if (cache && (update_cache || !file.exists(cache_file))) { - saveRDS(y, file = cache_file, compress = compress_file) - message("Table ", id, " cached at ", path.expand(cache_file)) + if (manual_selection) { + time_format_selection <- switch( + menu(choices = c("Convert to date, first day of the period (2000-04-01) (default)", + "Convert to date, last day of the period (2000-06-30)", + "Convert to numeric (2000.25)", + "Use raw data (2000-Q2)")) + 1, + "date", + "date", + "date_last", + "num", + "raw" + ) + + type_selection <- switch( + menu(choices = c("Return categorical variables as short codes (default)", + "Return categorical variables in labeled (long) format"), + title = "Note: The option 'both' is supported only when using the JSON API.") + 1, + "code", + "code", + "label" + ) + + stringsAsFactors_selection <- switch( + menu(choices = c("Return categorical data as characters (default)", + "Convert categorical data into factors"), + title = "Converting text data into factors may help reduce time used in data processing, reduce RAM usage and cache file size") + 1, + FALSE, + FALSE, + TRUE + ) + + keepFlags_selection <- switch( + menu(choices = c("Do not return flags, just remove them (default)", + "Return flags in separate column")) + 1, + FALSE, + FALSE, + TRUE + ) + + use.data.table_selection <- switch( + menu(choices = c("Do not use data.table functions (default", + "Use data.table functions"), + title = "Using data.table functions may help reduce time used in data processing and reduce RAM usage. It is advisable especially when dealing with large datasets.") + 1, + FALSE, + FALSE, + TRUE + ) + eurostat_data <- tryCatch({ + get_eurostat(id = code, + time_format = time_format_selection, + type = type_selection, + lang = lang_selection, + stringsAsFactors = stringsAsFactors_selection, + keepFlags = keepFlags_selection, + use.data.table = use.data.table_selection) + }, error=function(error_message) { + message("\nEncountered the following error message while attempting to modify the downloaded data:\n") + message(error_message) + message("\nUsing default options for downloading data...\n") + # Use scoping assignment here to influence code print below + time_format_selection <<- "date" + type_selection <<- "code" + lang_selection <<- lang_selection + stringsAsFactors_selection <<- FALSE + keepFlags_selection <<- FALSE + use.data.table_selection <<- FALSE + get_eurostat(id = code, + time_format = time_format_selection, + type = type_selection, + lang = lang_selection, + stringsAsFactors = stringsAsFactors_selection, + keepFlags = keepFlags_selection, + use.data.table = use.data.table_selection) + }) + } else if (!manual_selection) { + eurostat_data <- get_eurostat(id = code) } + } + + tempfile_for_sinking <- tempfile() + + # eurostat_data <- get_eurostat(id = code) + print_citation <- switch( + menu(choices = c("Yes", "No"), + title = "Print dataset citation?") + 1, + return(invisible()), + TRUE, + FALSE + ) + + if (print_citation) { + citation <- get_bibentry(code, lang = lang_selection) + capture.output(cat("##### DATASET CITATION:\n\n"), file = tempfile_for_sinking, append = TRUE) + capture.output(print(citation), file = tempfile_for_sinking, append = TRUE) + capture.output(cat("\n"), file = tempfile_for_sinking, append = TRUE) + } + + print_code <- switch( + menu(choices = c("Yes", "No"), + title = "Print code for downloading dataset?") + 1, + return(invisible()), + TRUE, + FALSE + ) + + if (print_code == TRUE && manual_selection == TRUE) { + capture.output(cat("##### DOWNLOAD PARAMETERS:\n\n")) + capture.output(print(stringr::str_glue(paste0("get_eurostat(id = '{code}', time_format = '{time_format_selection}', ", + "type = '{type_selection}', lang = '{lang_selection}', ", + "stringsAsFactors = {stringsAsFactors_selection}, ", + "keepFlags = {keepFlags_selection}, ", + "use.data.table = {use.data.table_selection})"))), file = tempfile_for_sinking, append = TRUE) + capture.output(cat("\n")) + } else if (print_code == TRUE && manual_selection == FALSE) { + capture.output(cat("##### DOWNLOAD PARAMETERS:\n\n"), file = tempfile_for_sinking, append = TRUE) + capture.output(print(stringr::str_glue("get_eurostat(id = '{code}')")), file = tempfile_for_sinking, append = TRUE) + capture.output(cat("\n"), file = tempfile_for_sinking, append = TRUE) + } + + if (exists("eurostat_data")) { + print_code <- switch( + menu(choices = c("Yes", "No"), + title = "Print dataset fixity checksum?") + 1, + return(invisible()), + TRUE, + FALSE + ) - y + if (print_code) { + capture.output(cat("##### FIXITY CHECKSUM:\n\n"), file = tempfile_for_sinking, append = TRUE) + capture.output(print(stringr::str_glue("Fixity checksum (md5) for dataset {code}: {eurostat:::fixity_checksum(eurostat_data, algorithm = 'md5')}")), file = tempfile_for_sinking, append = TRUE) + capture.output(cat("\n"), file = tempfile_for_sinking, append = TRUE) + } } + + if (exists("eurostat_data")) { + cat(readLines(tempfile_for_sinking), sep = "\n") + return(eurostat_data) + } else { + cat(readLines(tempfile_for_sinking), sep = "\n") + return(invisible()) + } + # nocov end } - diff --git a/R/get_eurostat_dic.R b/R/get_eurostat_dic.R index 204ae5bd..b4236869 100755 --- a/R/get_eurostat_dic.R +++ b/R/get_eurostat_dic.R @@ -18,7 +18,8 @@ #' ``` #' #' @author Przemyslaw Biecek and Leo Lahti . Thanks to -#' Wietse Dol for contributions. +#' Wietse Dol for contributions. Updated by Pyry Kantanen to support XML +#' codelists. #' @examplesIf check_access_to_data() #' \donttest{ #' get_eurostat_dic("crop_pro") @@ -31,13 +32,16 @@ #' #' @keywords utilities database get_eurostat_dic <- function(dictname, lang = "en") { + + lang <- check_lang(lang) + dictlang <- paste0(dictname, "_", lang) if (!exists(dictlang, envir = .EurostatEnv)) { url <- getOption("eurostat_url") tname <- paste0( url, - "estat-navtree-portlet-prod/BulkDownloadListing?file=dic%2F", lang, "%2F", - dictname, ".dic" + "api/dissemination/sdmx/2.1/codelist/ESTAT/", dictname, + "?format=TSV&lang=", lang ) dict <- readr::read_tsv(url(tname), col_names = c("code_name", "full_name"), diff --git a/R/get_eurostat_geospatial.R b/R/get_eurostat_geospatial.R index f6b1d824..6f7525c6 100755 --- a/R/get_eurostat_geospatial.R +++ b/R/get_eurostat_geospatial.R @@ -1,10 +1,14 @@ #' @title Download Geospatial Data from GISCO #' -#' @description Downloads either a simple features (sf), -#' SpatialPolygonDataFrame or a data_frame preprocessed using [broom::tidy()]. -#' @param output_class A string. Class of object returned, -#' either `sf` `simple features`, `df` (`data_frame`) or -#' `spdf` (`SpatialPolygonDataFrame`) +#' @description Downloads either a simple features (sf) or a data_frame +#' of NUTS regions. This function is a wrapper of [giscoR::gisco_get_nuts()]. +#' This function requires to have installed the packages \CRANpkg{sf} and +#' \CRANpkg{giscoR}. +#' +#' @seealso [giscoR::gisco_get_nuts()] +#' @param output_class Class of object returned, +#' either `sf` `simple features` or `df` (`data_frame`). `spdf` output has +#' been soft-deprecated, the function would switch to `sf`. #' @param resolution Resolution of the geospatial data. One of #' * "60" (1:60million), #' * "20" (1:20million) @@ -15,476 +19,267 @@ #' "0", "1", "2", "3" or "all" (mimics the original behaviour) #' @param year NUTS release year. One of #' "2003", "2006", "2010", "2013", "2016" or "2021" -#' @param cache a logical whether to do caching. Default is `TRUE`. Affects -#' only queries from the bulk download facility. +#' @param cache a logical whether to do caching. Default is `TRUE`. #' @param update_cache a logical whether to update cache. Can be set also with -#' options(eurostat_update = TRUE) -#' @param cache_dir a path to a cache directory. The directory have to exist. -#' The `NULL` (default) uses and creates -#' 'eurostat' directory in the temporary directory from -#' [tempdir()]. Directory can also be set with -#' `option` eurostat_cache_dir. +#' `options(eurostat_update = TRUE)` +#' @param cache_dir a path to a cache directory. See +#' [set_eurostat_cache_dir()]. If `NULL` and the cache dir has not been set +#' globally the file would be stored in the [tempdir()]. #' @param crs projection of the map: 4-digit #' [EPSG code](https://spatialreference.org/ref/epsg/). One of: #' * "4326" - WGS84 #' * "3035" - ETRS89 / ETRS-LAEA #' * "3857" - Pseudo-Mercator #' -#' @param make_valid logical; ensure that valid (multi-)polygon features are -#' returned if `output_class="sf"`, see Details. Current default -#' `FALSE`, will be changed in the future. +#' @param make_valid Deprecated +#' +#' @inheritDotParams giscoR::gisco_get_nuts -epsg #' -#' @details The data source URL is -#' . -#' The source provides feature collections as line strings (GeoJSON format), -#' not as (multi-)polygons which, in some cases, yields invalid -#' self-intersecting (multi-)polygon geometries (for some years/resolutions). -#' This can cause problems, e.g., when using these geometries as input argument -#' to [sf::st_interpolate_aw()]. `make_valid = TRUE` makes sure that -#' only valid (multi-)polygons are returned, example included below. -#' -#' The objects downloaded from GISCO should contain all or some of the +#' @details +#' The objects downloaded from GISCO should contain all or some of the #' following variable columns: -#' * **id**: JSON id code, the same as NUTS_ID. See NUTS_ID below for further clarification. -#' * **LEVL_CODE**: NUTS level code: 0 (national level), 1 (major socio-economic regions), 2 (basic regions for the application of regional policies) or 3 (small regions). -#' * **NUTS_ID**: NUTS ID code, consisting of country code and numbers (1 for NUTS 1, 2 for NUTS 2 and 3 for NUTS 3) -#' * **CNTR_CODE**: Country code: two-letter ISO code (ISO 3166 alpha-2), except in the case of Greece (EL). +#' * **id**: JSON id code, the same as **NUTS_ID**. See **NUTS_ID** below for +#' further clarification. +#' * **LEVL_CODE**: NUTS level code: 0 (national level), 1 (major +#' socio-economic regions), 2 (basic regions for the application of regional +#' policies) or 3 (small regions). +#' * **NUTS_ID**: NUTS ID code, consisting of country code and numbers (1 for +#' NUTS 1, 2 for NUTS 2 and 3 for NUTS 3) +#' * **CNTR_CODE**: Country code: two-letter ISO code (ISO 3166 alpha-2), except +#' in the case of Greece (EL). #' * **NAME_LATN**: NUTS name in local language, transliterated to Latin script #' * **NUTS_NAME**: NUTS name in local language, in local script. #' * **MOUNT_TYPE**: Mountain typology for NUTS 3 regions. -#' \itemize{ -#' \item{1: "where more than 50 % of the surface is covered by topographic mountain areas"} -#' \item{2: "in which more than 50 % of the regional population lives in topographic mountain areas"} -#' \item{3: "where more than 50 % of the surface is covered by topographic mountain areas and where more than 50 % of the regional population lives in these mountain areas"} -#' \item{4: non-mountain region / other region} -#' \item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 and non-EU countries)} -#' } +#' * 1: "where more than 50 % of the surface is covered by topographic +#' mountain areas" +#' * 2: "in which more than 50 % of the regional population lives in +#' topographic mountain areas" +#' * 3: "where more than 50 % of the surface is covered by topographic +#' mountain areas and where more than 50 % of the regional population lives +#' in these mountain areas" +#' * 4: non-mountain region / other region +#' * 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 and +#' non-EU countries) #' * **URBN_TYPE**: Urban-rural typology for NUTS 3 regions. -#' \itemize{ -#' \item{1: predominantly urban region} -#' \item{2: intermediate region} -#' \item{3: predominantly rural region} -#' \item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 regions)} -#' } -#' * **COAST_TYPE**: Coastal typology for NUTS 3 regions. -#' \itemize{ -#' \item{1: coastal (on coast)} -#' \item{2: coastal (>= 50% of population living within 50km of the coastline)} -#' \item{3: non-coastal region} -#' \item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 regions)} -#' } +#' * 1: predominantly urban region +#' * 2: intermediate region +#' * 3: predominantly rural region +#' * 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 +#' regions) +#' * **COAST_TYPE**: Coastal typology for NUTS 3 regions. +#' * 1: coastal (on coast) +#' * 2: coastal (>= 50% of population living within 50km of the coastline) +#' * 3: non-coastal region +#' * 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 +#' regions) #' * **FID**: Same as NUTS_ID. +#' * **geo**: Same as NUTS_ID, added for for easier joins with dplyr. Consider +#' the status of this column "questioning" and use other columns for joins +#' when possible. #' * **geometry**: geospatial information. -#' * **geo**: Same as NUTS_ID, added for for easier joins with dplyr. However, it is recommended to use other identical fields for this purpose. -#' -#' @author Markus Kainu -#' @return a sf, data_frame or SpatialPolygonDataFrame. -#' -#' @source +#' +#' @author +#' Markus Kainu , Diego Hernangomez +#' +#' @return a sf or data_frame +#' +#' @source #' Data source: Eurostat -#' +#' #' © EuroGeographics for the administrative boundaries -#' -#' Data downloaded from: \url{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units} -#' @references -#' The following copyright notice is provided for end user convenience. -#' Please check up-to-date copyright information from the eurostat website: -#' [GISCO: Geographical information and maps - Administrative units/statistical units](https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units) -#' -#' "In addition to the [general copyright and licence policy](https://ec.europa.eu/eurostat/web/main/about/policies/copyright) applicable to the whole Eurostat website, the following specific provisions apply to the datasets you are downloading. The download and usage of these data is subject to the acceptance of the following clauses: -#' -#' 1. The Commission agrees to grant the non-exclusive and not transferable -#' right to use and process the Eurostat/GISCO geographical data downloaded -#' from this page (the "data"). -#' -#' 1. The permission to use the data is granted on condition that: -#' \enumerate{ -#' \item{the data will not be used for commercial purposes;} -#' \item{the source will be acknowledged. A copyright notice, as specified -#' below, will have to be visible on any printed or electronic publication -#' using the data downloaded from this page.} -#' } -#' ## Copyright notice -#' -#' When data downloaded from this page is used in any printed or electronic -#' publication, in addition to any other provisions applicable to the whole -#' Eurostat website, data source will have to be acknowledged in the legend of -#' the map and in the introductory page of the publication with the following -#' copyright notice: -#' -#' EN: © EuroGeographics for the administrative boundaries -#' -#' FR: © EuroGeographics pour les limites administratives -#' -#' DE: © EuroGeographics bezüglich der Verwaltungsgrenzen -#' -#' For publications in languages other than English, French or German, the -#' translation of the copyright notice in the language of the publication shall -#' be used. -#' -#' If you intend to use the data commercially, please contact EuroGeographics -#' for information regarding their licence agreements." -#' +#' +#' Data downloaded using \pkg{giscoR} +#' +#' @inheritSection eurostat-package Eurostat: Copyright notice and free re-use of data +#' @inheritSection eurostat-package Data source: GISCO - General Copyright +#' @inheritSection eurostat-package Data source: GISCO - Administrative Units / Statistical Units +#' #' @family geospatial #' @examples #' \donttest{ +#' # Uses cached dataset #' sf <- get_eurostat_geospatial( #' output_class = "sf", #' resolution = "60", #' nuts_level = "all" #' ) +#' # Downloads dataset from server +#' sf2 <- get_eurostat_geospatial( +#' output_class = "sf", +#' resolution = "20", +#' nuts_level = "all" +#' ) #' df <- get_eurostat_geospatial( #' output_class = "df", -#' resolution = "20", #' nuts_level = "0" #' ) #' } #' -#' \dontrun{ -#' spdf <- get_eurostat_geospatial( -#' output_class = "spdf", -#' resolution = "10", -#' nuts_level = "3" -#' ) -#' } -#' -#' \dontrun{ -#' # ------------------------------------------------------------------- -#' # Minimal example to demonstrate reason/effect of 'make_valid = TRUE' -#' # Spatial data set; rectangle spanning the entire globe with a constant value of 1L. -#' # Requires the R package sf. -#' library("sf") -#' d <- c(-180, -90, -180, 90, 180, 90, 180, -90, -180, -90) -#' poly <- st_polygon(list(matrix(d, ncol = 2, byrow = TRUE))) -#' data <- st_sf(data.frame(geom = st_sfc(poly), data = 1L), -#' crs = st_crs(4326) -#' ) -#' -#' # Causing an error: Self-intersection of some points of the geometry -#' NUTS2_A <- get_eurostat_geospatial("sf", 60, -#' nuts_level = 2, year = 2013, -#' crs = 4326, make_valid = FALSE -#' ) -#' res <- tryCatch(st_interpolate_aw(data, NUTS2_A, extensive = FALSE), -#' error = function(e) e -#' ) -#' print(res) -#' -#' # Resolving the problem using -#' # make_valid = TRUE. 'extensive = FALSE' returns -#' # average over each area, thus resulting in a -#' # constant value of 1 for each geometry in NUTS2_B. -#' NUTS2_B <- get_eurostat_geospatial("sf", 60, -#' nuts_level = 2, year = 2013, -#' crs = 4326, make_valid = TRUE -#' ) -#' res <- st_interpolate_aw(data, NUTS2_B, extensive = FALSE) -#' print(head(res)) -#' } -#' -#' @importFrom utils data -#' @importFrom broom tidy -#' @importFrom httr http_error content RETRY -#' @importFrom methods as -#' @importFrom dplyr left_join -#' #' @export get_eurostat_geospatial <- function(output_class = "sf", resolution = "60", nuts_level = "all", year = "2016", cache = TRUE, update_cache = FALSE, cache_dir = NULL, crs = "4326", - make_valid = FALSE) { - # Check if package "sf" is installed + make_valid = "DEPRECATED", ...) { + # nocov start if (!requireNamespace("sf")) { message("'sf' package is required for geospatial functionalities") return(invisible()) } + # nocov end + # Simplified and leaving most of the heavy-lifting to giscoR - if (output_class == "spdf" && !requireNamespace("sp")) { - message("'sp' package is required for spdf output") - return(invisible()) + # Deprecation messages + stopifnot(length(output_class) == 1L) + if (output_class == "spdf") { + message("'spdf' output deprecated. Switching to sf output") + output_class <- "sf" } - # Check if you have access to ec.europe.eu. - if (!check_access_to_data()) { - message("You have no access to ec.europe.eu. - Please check your connection and/or review your proxy settings") - } else { - eurostat_geodata_60_2016 <- NULL - LEVL_CODE <- NULL - utils::data("eurostat_geodata_60_2016", - envir = environment(), - package = "eurostat" - ) + if (!identical(make_valid, "DEPRECATED")) { + message("'make_valid' argument has been deprecated") + } - # Check output_class is of correct format - stopifnot(length(output_class) == 1L) - output_class <- match.arg(as.character(output_class), c("sf", "df", "spdf")) + # Leaving only specific validations - rest of call would be handled by giscoR + output_class <- match.arg(as.character(output_class), c("sf", "df")) - # Check resolution is of correct format - stopifnot(length(resolution) == 1L) - resolution <- as.integer(regmatches(resolution, regexpr( - "^[0-9]+", - resolution - ))) - resolution <- sprintf("%02d", match.arg( - as.character(resolution), - c(1, 3, 10, 20, 60) - )) + # Sanity check for nuts_level + stopifnot(length(nuts_level) == 1L) + nuts_level <- regmatches(nuts_level, regexpr("^(all|[0-9]+)", nuts_level)) + nuts_level <- match.arg(nuts_level, c("all", 0:3)) - # Sanity check for nuts_level - stopifnot(length(nuts_level) == 1L) - nuts_level <- regmatches(nuts_level, regexpr("^(all|[0-9]+)", nuts_level)) - nuts_level <- match.arg(nuts_level, c("all", 0:3)) + # Performance - If df requested resolution and crs are meaningless. Switching + # to 60 and 4326 for speed (except for 2003, no available) + if (output_class == "df") { + resolution <- "60" + crs <- "4326" - # Check year is of correct format - year <- match.arg(as.character(year), c(2003, 2006, 2010, 2013, 2016, 2021)) + if (as.integer(year) == 2003) resolution <- "20" + } - # Sanity check for cache and update_cache - stopifnot(is.logical(cache) && length(cache) == 1 && - cache %in% c(TRUE, FALSE)) - stopifnot(is.logical(update_cache) && length(update_cache) == 1 && - update_cache %in% c(TRUE, FALSE)) - # Sanity check for cache_dir - stopifnot(is.null(cache_dir) || (is.character(cache_dir) && - length(cache_dir) == 1L)) + # If cache file requested get the info from the internal dataset + capture_dots <- list(...) - # Check crs is of correct format - crs <- match.arg(as.character(crs), c(4326, 3035, 3857)) + # Check if the pre-set call to the function has been modified on + # relevant parameters + use_local <- all( + as.character(resolution) == "60", + as.character(year) == "2016", + isFALSE(update_cache), + as.character(crs) == "4326", + # Check dots are empty + length(capture_dots) == 0 + ) - # Invalid combination of year and resolution: stop and show - # hint/error message. - if (as.numeric(year) == 2003 & as.numeric(resolution) == 60) { - stop("NUTS 2003 is not provided at 1:60 million resolution. - Try 1:1 million, 1:3 million, 1:10 million or 1:20 million") + if (use_local) { + # Not modified - using dataset included with eurostat package + message("Extracting data from eurostat::eurostat_geodata_60_2016") + shp <- eurostat::eurostat_geodata_60_2016 + if (nuts_level != "all") { + shp <- shp[shp$LEVL_CODE == nuts_level, ] + } + } else { + # Check if package "giscoR" is installed + # nocov start + if (!requireNamespace("giscoR")) { + message("'giscoR' package is required for geospatial functionalities") + return(invisible()) } + # nocov end - # Sanity check for input `make_valid` - stopifnot(is.logical(make_valid) && length(make_valid) == 1L && - make_valid %in% c(TRUE, FALSE)) + message(paste0( + "Extracting data using giscoR package, please report issues", + " on https://github.com/rOpenGov/giscoR/issues" + )) - # message(" - # COPYRIGHT NOTICE - # - # When data downloaded from this page - # - # is used in any printed or electronic publication, - # in addition to any other provisions - # applicable to the whole Eurostat website, - # data source will have to be acknowledged - # in the legend of the map and - # in the introductory page of the publication - # with the following copyright notice: - # - # - EN: (C) EuroGeographics for the administrative boundaries - # - FR: (C) EuroGeographics pour les limites administratives - # - DE: (C) EuroGeographics bezuglich der Verwaltungsgrenzen - # - # For publications in languages other than - # English, French or German, - # the translation of the copyright notice - # in the language of the publication shall be used. - # - # If you intend to use the data commercially, - # please contact EuroGeographics for - # information regarding their licence agreements. - # ") + # Manage cache: Priority is eurostat cache (if set) + # If not make use of giscoR default options + detect_eurostat_cache <- eur_helper_detect_cache_dir() + if (!is.null(cache_dir)) { + # Already set by the user, no need message + cache_dir <- eur_helper_cachedir(cache_dir) + } else if (identical( + detect_eurostat_cache, + file.path(tempdir(), "eurostat") + )) { + # eurostat not set, using default giscoR cache management + message("Cache management as per giscoR. see 'giscoR::gisco_get_nuts()'") + } else { + cache_dir <- eur_helper_cachedir(cache_dir) + } - if (resolution == "60" && year == "2016" && crs == "4326") { + # giscoR call with parameters + # on input errors giscoR would show warnings, etc + shp <- giscoR::gisco_get_nuts( + resolution = resolution, + nuts_level = nuts_level, year = year, + cache = cache, update_cache = update_cache, + cache_dir = cache_dir, epsg = crs, + ... + ) + } - # nuts_levels are mutually exclusive; either "all" - # or one of "0", "1", "2", "3". - if (nuts_level == c("all")) { - shp <- eurostat_geodata_60_2016 - } else { - shp <- filter(eurostat_geodata_60_2016, LEVL_CODE == as.integer(nuts_level)) - } + # Just to capture potential NULL outputs from giscoR - this can happen + # on some errors + if (is.null(shp)) { + return(NULL) + } - if (output_class == "df") { - nuts_sp <- as(shp, "Spatial") - nuts_sp$id <- row.names(nuts_sp) - nuts_ff <- broom::tidy(nuts_sp) - shp <- dplyr::left_join(nuts_ff, nuts_sp@data) - } else if (output_class == "spdf") { - shp <- methods::as(shp, "Spatial") - } - } else { - if (cache) { + # Post-data treatments + # Manage col names + shp <- geo_names(shp) - # check option for update - update_cache <- update_cache | getOption("eurostat_update", FALSE) + # to df + if (output_class == "df") { + # Remove geometry + shp <- sf::st_drop_geometry(shp) + } - # get cache directory - cache_dir <- eur_helper_cachedir(cache_dir) + return(shp) +} - # cache filename - cache_file <- file.path( - cache_dir, - paste0( - output_class, resolution, - nuts_level, year, crs, ".RData" - ) - ) - message("Object cached at ", path.expand(cache_file)) - } +# Helper function, add names and reorder +geo_names <- function(x) { + # Case for border (BN), there are no NUTS_ID , do nothing + if (!"NUTS_ID" %in% names(x)) { + return(x) + } - # if cache = FALSE or update or new: download else read from cache - if (!cache | update_cache | !file.exists(cache_file)) { - burl <- "http://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/nuts/geojson/NUTS_RG_" - if (nuts_level %in% c("0", "all")) { - url <- paste0(burl, resolution, "M_", year, "_", crs, "_LEVL_0.geojson") - resp <- httr::RETRY("GET", url, terminate_on = c(404)) - if (httr::http_error(resp)) { - stop(paste("The requested url cannot be found within - the get_eurostat_geospatial function:", url)) - } else { - nuts0 <- sf::st_read(httr::content(resp, as = "text", encoding = "UTF-8"), - stringsAsFactors = FALSE, quiet = TRUE - ) - } - } - if (nuts_level %in% c("1", "all")) { - url <- paste0(burl, resolution, "M_", year, "_", crs, "_LEVL_1.geojson") - resp <- httr::RETRY("GET", url, terminate_on = c(404)) - if (httr::http_error(resp)) { - stop(paste("The requested url cannot be found within the get_eurostat_geospatial function:", url)) - } else { - nuts1 <- sf::st_read(httr::content(resp, as = "text", encoding = "UTF-8"), - stringsAsFactors = FALSE, quiet = TRUE - ) - } - } - if (nuts_level %in% c("2", "all")) { - resp <- httr::RETRY("GET", paste0(burl, resolution, "M_", year, "_", crs, "_LEVL_2.geojson"), terminate_on = c(404)) - if (httr::http_error(resp)) { - stop(paste("The requested url cannot be found within the get_eurostat_geospatial function:", url)) - } else { - nuts2 <- sf::st_read(httr::content(resp, as = "text", encoding = "UTF-8"), - stringsAsFactors = FALSE, quiet = TRUE - ) - } - } - if (nuts_level %in% c("3", "all")) { - resp <- httr::RETRY("GET", paste0(burl, resolution, "M_", year, "_", crs, "_LEVL_3.geojson"), terminate_on = c(404)) - if (httr::http_error(resp)) { - stop(paste("The requested url cannot be found within the get_eurostat_geospatial function:", url)) - } else { - nuts3 <- sf::st_read(httr::content(resp, as = "text", encoding = "UTF-8"), - stringsAsFactors = FALSE, quiet = TRUE - ) - } - } + # Add `id` and `geo` column for easier joins with dplyr + x$geo <- x$NUTS_ID + x$id <- x$geo - if (nuts_level == "all") { - shp <- rbind(nuts0, nuts1, nuts2, nuts3) - } else { - shp <- eval(parse(text = paste0("nuts", nuts_level))) - } + # Arrange names in proper order + the_geom <- sf::st_geometry(x) + the_df <- sf::st_drop_geometry(x) + rest <- c( + "id", "LEVL_CODE", "NUTS_ID", "CNTR_CODE", "NAME_LATN", "NUTS_NAME", + "MOUNT_TYPE", "URBN_TYPE", "COAST_TYPE", "FID", "geo" + ) - if (output_class == "df") { - nuts_sp <- as(shp, "Spatial") - nuts_sp$id <- row.names(nuts_sp) - nuts_ff <- broom::tidy(nuts_sp) - shp <- left_join(nuts_ff, nuts_sp@data) - } - if (output_class == "spdf") { - shp <- as(shp, "Spatial") - } - } - } + # Check what needed columns are not present in the source file + miss_cols <- setdiff(unique(rest), names(the_df)) + extra_cols <- setdiff(names(the_df), rest) - if (!(resolution == "60" & year == "2016" & crs == "4326")) { - if (cache & file.exists(cache_file)) { - cf <- path.expand(cache_file) - message(paste("Reading cache file", cf)) - load(file = cache_file) - if (output_class == "sf") { - message(paste( - "sf at resolution 1:", - resolution, " from year ", - year, " read from cache file: ", - cf - )) - } - if (output_class == "df") { - message(paste( - "data_frame at resolution 1:", - resolution, " from year ", - year, " read from cache file: ", - cf - )) - } - if (output_class == "spdf") { - message(paste( - "SpatialPolygonDataFrame at resolution 1:", - resolution, " from year ", - year, " read from cache file: ", - cf - )) - } - } - # if update or new: save - if (cache && (update_cache || !file.exists(cache_file))) { - save(shp, file = cache_file) - if (output_class == "sf") { - message(paste( - "sf at resolution 1:", - resolution, " cached at: ", - path.expand(cache_file) - )) - } - if (output_class == "df") { - message(paste( - "data_frame at resolution 1:", - resolution, " cached at: ", - path.expand(cache_file) - )) - } - if (output_class == "spdf") { - message(paste( - "SpatialPolygonDataFrame at resolution 1:", - resolution, " cached at: ", - path.expand(cache_file) - )) - } - } - } + # Add missing cols with NAs + list_df <- lapply(miss_cols, function(x) { + template_df <- data.frame(somecol = NA) + names(template_df) <- x + template_df + }) + new_df <- dplyr::bind_cols(c(list(the_df), list_df)) - if (resolution == "60" & year == 2016 & crs == "4326") { - if (output_class == "sf") message("sf at resolution 1:60 read from local file") - if (output_class == "df") message("data_frame at resolution 1:60 read from local file") - if (output_class == "spdf") message("SpatialPolygonDataFrame at resolution 1:60 read from local file") - } + # Final column order + order_cols <- unique(c(rest, extra_cols)) + xend <- new_df[, order_cols] - # message(" - # # -------------------------- - # HEADS UP!! - # - # Function get_eurostat_geospatial now returns the data in 'sf'-class (simple features) - # by default which is different from previous behaviour's 'SpatialPolygonDataFrame'. - # - # If you prefer either 'SpatialPolygonDataFrame' or - # fortified 'data_frame' (for ggplot2::geom_polygon), - # please specify it explicitly to 'output_class'-argument! - # - # # -------------------------- - # ") - if (output_class == "sf" & make_valid) { - shp <- sf::st_buffer(shp, 0) - } else { - warning(paste( - "Default of 'make_valid' for 'output_class=\"sf\"'", - "will be changed in the future (see function details)." - )) - } + # Back to sf + final_sf <- sf::st_sf(xend, geometry = the_geom) - # Adding a `geo` column for easier joins with dplyr - shp$geo <- shp$NUTS_ID - return(shp) - } + final_sf } diff --git a/R/get_eurostat_json.R b/R/get_eurostat_json.R index c0797d93..3549e327 100755 --- a/R/get_eurostat_json.R +++ b/R/get_eurostat_json.R @@ -2,7 +2,7 @@ #' @description Retrieve data from Eurostat API in JSON format. #' @details #' Data to retrieve from -#' [The Eurostat Web Services](https://ec.europa.eu/eurostat/web/main/data/web-services) +#' [The Eurostat Web Services](https://ec.europa.eu/eurostat/web/main/data/web-services) #' can be specified with filters. Normally, it is #' better to use JSON query through [get_eurostat()], than to use #' [get_eurostat_json()] directly. @@ -11,40 +11,37 @@ #' filtered with fixed "time" filter or with "sinceTimePeriod" and #' "lastTimePeriod" filters. A `sinceTimePeriod = 2000` returns #' observations from 2000 to a last available. A `lastTimePeriod = 10` -#' returns a 10 last observations. +#' returns a 10 last observations. See "Filtering datasets" section below +#' for more detailed information about filters. #' -#' To use a proxy to connect, a [httr::use_proxy()] can be -#' passed to [httr::GET()]. For example -#' `get_eurostat_json(id, filters, -#' config = httr::use_proxy(url, port, username, password))`. +#' To use a proxy to connect, proxy arguments can be +#' passed to [httr2::req_perform()] via [httr2::req_proxy()] - see latter +#' function documentation for parameter names that can be passed with `...`. +#' A non-functional example: +#' `get_eurostat_json(id, filters, proxy = TRUE, url = "127.0.0.1", port = 80)`. #' -#' @param id A code name for the dataset of interested. See the table of -#' contents of eurostat datasets for more details. -#' @param filters A named list of filters. Names of list objects are Eurostat -#' variable codes and values are vectors of observation codes. If `NULL` -#' (default) the whole dataset is returned. See details for more on filters -#' and limitations per query. -#' @param lang A language used for metadata. Default is `EN`, other options are -#' `FR` and `DE`. -#' @param type A type of variables, "`code`" (default), "`label`" or "`both`". -#' The parameter "`both`" will return a data_frame with named vectors, -#' labels as values and codes as names. -#' @param stringsAsFactors if `FALSE` (the default) the variables are -#' returned as characters. If `TRUE` the variables are converted to -#' factors in original Eurostat order. -#' @param ... Other arguments passed on to [httr::GET()]. For example -#' a proxy parameters, see details. -#' @inheritDotParams httr::GET -#' @return A dataset as an object of `data.frame` class. -#' @export -#' @author Przemyslaw Biecek, Leo Lahti, Janne Huovari Markus Kainu and Pyry Kantanen -#' @references -#' See `citation("eurostat")`: +#' When retrieving data from Eurostat JSON API the user may encounter errors. +#' For end user convenience, we have provided a ready-made internal dataset +#' `sdmx_http_errors` that contains descriptive labels and descriptions about +#' the possible interpretation or cause of each error. These messages are +#' returned if the API returns a status indicating a HTTP error +#' (400 or greater). #' -#' ```{r, echo=FALSE, comment="#" } -#' citation("eurostat") -#' ``` +#' The Eurostat implementation seems to be based on SDMX 2.1, which is the +#' reason we've used SDMX Standards guidelines as a supplementary source +#' that we have included in the dataset. What this means in practice is that +#' the dataset contains error codes and their mappings that are not mentioned +#' in the Eurostat website. We hope you never encounter them. #' +#' @param proxy Use proxy, TRUE or FALSE (default). +#' @inheritParams get_eurostat +#' @inheritDotParams httr2::req_proxy +#' @inherit get_eurostat references +#' +#' @return A dataset as an object of `data.frame` class. +#' @author +#' Przemyslaw Biecek, Leo Lahti, Janne Huovari Markus Kainu and Pyry Kantanen + #' @examples #' \dontrun{ #' # Generally speaking these queries would be done through get_eurostat @@ -56,7 +53,7 @@ #' na_item = "B1GQ", #' unit = "CLV_I10" #' )) -#' +#' #' # TIME_PERIOD filter works also with the new JSON API #' yy2 <- get_eurostat_json("nama_10_gdp", filters = list( #' geo = c("FI", "SE", "EU28"), @@ -65,7 +62,7 @@ #' na_item = "B1GQ", #' unit = "CLV_I10" #' )) -#' +#' #' # An example from get_eurostat #' dd <- get_eurostat("nama_10_gdp", #' filters = list( @@ -74,28 +71,34 @@ #' unit = "CLV_I10" #' )) #' } -#' @importFrom httr http_error status_code +#' @importFrom httr2 request req_user_agent req_retry req_perform req_proxy +#' @importFrom httr2 resp_body_json resp_content_type resp_is_error req_error #' @importFrom jsonlite fromJSON #' @importFrom tibble as_tibble -#' @seealso -#' [httr::GET()] +#' @importFrom stringr str_glue +#' @importFrom httr2 %>% #' -#' Eurostat Data Browser online help: API Statistics - data query: -#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query} +#' @inheritSection eurostat-package Data source: Eurostat API Statistics (JSON API) +#' @inheritSection eurostat-package Filtering datasets +#' @inheritSection eurostat-package Eurostat: Copyright notice and free re-use of data +#' @inheritSection eurostat-package Citing Eurostat data +#' @inheritSection eurostat-package Disclaimer: Availability of filtering functionalities #' -#' Eurostat Data Browser online help: migrating from JSON web service to API -#' Statistics: -#' \url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+migrating+from+JSON+web+service+to+API+Statistics} +#' @seealso +#' [httr2::req_proxy()] +#' #' @keywords utilities database -get_eurostat_json <- function(id, +#' @export +get_eurostat_json <- function(id, filters = NULL, type = "code", - lang = "EN", + lang = "en", stringsAsFactors = FALSE, + proxy = FALSE, ...) { ## Special products that must be built to matrix - ## User gets message to use iotables::iotables_download() and halt this operation. + ## User is prompted to halt and use iotables::iotables_download() user_want_stop <- special_id_values(id) if (user_want_stop) { return(NULL) @@ -103,99 +106,160 @@ get_eurostat_json <- function(id, # Check if you have access to ec.europe.eu. if (!check_access_to_data()) { + # nocov start message("You have no access to ec.europe.eu. Please check your connection and/or review your proxy settings") - } else { - - # get response - # url <- try(eurostat_json_url(id = id, filters = filters, lang = lang)) - # if (class(url) == "try-error") { stop(paste("The requested data set cannot be found with the following specifications to get_eurostat_json function: ", "id: ", id, "/ filters: ", filters, "/ lang: ", lang)) } - url <- eurostat_json_url(id = id, filters = filters, lang = lang) + # nocov end + } - # resp <- try(httr::GET(url, ...)) - # if (class(resp) == "try-error") { stop(paste("The requested url cannot be found within the get_eurostat_json function:", url)) } - resp <- httr::RETRY("GET", url, terminate_on = c(404)) - if (httr::http_error(resp)) { - stop(paste("The requested url cannot be found within the get_eurostat_json function:", url)) + # construct url + url <- eurostat_json_url(id = id, filters = filters, lang = lang) + # set user agent with version + # ua <- httr::user_agent(paste0("eurostat_", + # packageDescription("eurostat", fields = "Version"))) + # ua <- httr::user_agent("https://github.com/rOpenGov/eurostat") + + if (proxy == TRUE) { + # Check if "..." has arguments needed for proxy + args <- list(...) + dot_url <- dot_port <- dot_username <- dot_password <- NULL + if("url" %in% names(args)) dot_url <- args$url + if("port" %in% names(args)) dot_port <- as.numeric(args$port) + if("username" %in% names(args)) dot_username <- args$username + if("password" %in% names(args)) dot_port <- args$password + if("auth" %in% names(args)) { + dot_auth <- args$auth + } else { + dot_auth <- "basic" } + + resp <- httr2::request(url) %>% + httr2::req_user_agent(string = "https://github.com/rOpenGov/eurostat") %>% + httr2::req_proxy(url = dot_url, + port = dot_port, + username = dot_username, + password = dot_password, + auth = dot_auth) %>% + httr2::req_retry(max_tries = 3, max_seconds = 60) %>% + httr2::req_error(is_error = function(resp) FALSE) %>% + httr2::req_perform() + } + resp <- httr2::request(url) %>% + httr2::req_user_agent(string = "https://github.com/rOpenGov/eurostat") %>% + httr2::req_retry(max_tries = 3, max_seconds = 60) %>% + httr2::req_error(is_error = function(resp) FALSE) %>% + httr2::req_perform() - status <- httr::status_code(resp) + # RETRY GET 3 times + # resp <- httr::RETRY(verb = "GET", + # url = url, + # times = 3, + # terminate_on = c(404), + # ua) - # check status and get json + # Source: httr vignette "Best practices for API packages" [httr_vignette] + if (httr2::resp_content_type(resp) != "application/json") { + stop("API did not return json", call. = FALSE) + } - msg <- ". Some datasets are not accessible via the eurostat - interface. You can try to search the data manually from the comext - database at http://epp.eurostat.ec.europa.eu/newxtweb/ or bulk - download facility at - http://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing - or annual Excel files - http://ec.europa.eu/eurostat/web/prodcom/data/excel-files-nace-rev.2" + # parse JSON data into R object (as per [httr_vignette]) + # assume that content encoding is utf8 + result <- httr2::resp_body_json( + resp = resp, + simplifyVector = TRUE) - if (status == 200) { - jdat <- jsonlite::fromJSON(url) - } else if (status == 400) { - stop( - "Failure to get data. Probably invalid dataset id. Status code: ", - status, msg - ) - } else if (status == 500) { - stop("Failure to get data. Probably filters did not return any data - or data exceeded query size limitation. Status code: ", status, msg) - } else if (status == 416) { - stop( - "Too many categories have been requested. Maximum is 50.", - status, msg + if (httr2::resp_is_error(resp)) { + + # These objects are only needed if there is an error + json_data_frame <- as.data.frame(result) + status <- json_data_frame$error.status + id <- json_data_frame$error.id + label <- json_data_frame$error.label + + # sdmx_http_errors is stored in R/sysdata.rda + # same data in extdata/sdmx_to_http_error_mapping.csv file + faultstring <- sdmx_http_errors$sdmx.faultstring[which(sdmx_http_errors$sdmx.faultcode == id & sdmx_http_errors$http.status_code == status)] + status_code_label <- sdmx_http_errors$http.status_code.label[grep(status, sdmx_http_errors$http.status_code)][1] + + if (status == 416) { + stop(stringr::str_glue("Too many categories have been requested. Maximum is 50.\n", + "HTTP status: {status} ({status_code_label})\n", + " Error id: {id} ({faultstring})\n", + " Error label from API: {label}") ) } else { - stop("Failure to get data. Status code: ", status, msg) + stop(stringr::str_glue("\n", + "HTTP status: {status} ({status_code_label})\n", + " Error id: {id} ({faultstring})\n", + " Error label from API: {label}") + ) } + } + + if (resp$status_code == 200 && length(result$value) == 0) { + + # nocov start + msg <- paste(" Please also note that some datasets are not accessible via", + "the eurostat API interface. You can try to search the data", + "manually from the comext database at", + "https://ec.europa.eu/eurostat/comext/newxtweb/ or explore", + "data at https://ec.europa.eu/eurostat/web/main/data/database") + # nocov end - # get json data - # dims <- jdat[[1]]$dimension # Was called like this in API v1.1 - dims <- jdat$dimension # Switched to this with API v2.1 - # ids <- dims$id # v1.1 - ids <- jdat$id # v2.1 - - dims_list <- lapply(dims[rev(ids)], function(x) { - y <- x$category$label - if (type == "label") { - y <- unlist(y, use.names = FALSE) - } else if (type == "code") { - y <- names(unlist(y)) - } else if (type == "both") { - y <- unlist(y) - } else { - stop("Invalid type ", type) - } - }) - - variables <- expand.grid(dims_list, - KEEP.OUT.ATTRS = FALSE, - stringsAsFactors = stringsAsFactors + stop(paste("HTTP status: 200, but the dataset didn't have any values.\n", + " Editing the query parameters may resolve the issue.\n", + msg) ) + } - # dat <- data.frame(variables[rev(names(variables))], values = jdat[[1]]$value) # v1.1 - dat <- as.data.frame(variables[rev(names(variables))]) - vals <- unlist(jdat$value, use.names = FALSE) - dat$values <- rep(NA, nrow(dat)) - inds <- 1 + as.numeric(names(jdat$value)) # 0-indexed - if (!length(vals) == length(inds)) { - stop("Complex indexing not implemented.") - } - dat$values[inds] <- vals + #status <- httr::status_code(resp) + # check status and get json + jdat <- result + # no need to download same data twice + # jdat <- jsonlite::fromJSON(url, simplifyVector = TRUE) + # dims <- jdat[[1]]$dimension # Was called like this in API v1.1 + dims <- jdat$dimension # Switched to this with API v2.1 + # ids <- dims$id # v1.1 + ids <- jdat$id # v2.1 - tibble::as_tibble(dat) + dims_list <- lapply(dims[rev(ids)], function(x) { + y <- x$category$label + if (type == "label") { + y <- unlist(y, use.names = FALSE) + } else if (type == "code") { + y <- names(unlist(y)) + } else if (type == "both") { + y <- unlist(y) + } else { + stop("Invalid type ", type) + } + }) + + variables <- expand.grid(dims_list, + KEEP.OUT.ATTRS = FALSE, + stringsAsFactors = stringsAsFactors + ) + + # dat <- data.frame(variables[rev(names(variables))], values = jdat[[1]]$value) # v1.1 + dat <- as.data.frame(variables[rev(names(variables))]) + vals <- unlist(jdat$value, use.names = FALSE) + dat$values <- rep(NA, nrow(dat)) + inds <- 1 + as.numeric(names(jdat$value)) # 0-indexed + if (!length(vals) == length(inds)) { + stop("Complex indexing not implemented.") } -} + dat$values[inds] <- vals + tibble::as_tibble(dat) +} #' @title Internal function to build json url #' @description Internal function to build json url #' @importFrom utils hasName -#' @importFrom httr parse_url build_url +#' @importFrom httr2 url_parse url_build #' @noRd #' @keywords internal utilities eurostat_json_url <- function(id, filters = NULL, lang = NULL) { @@ -204,44 +268,31 @@ eurostat_json_url <- function(id, filters = NULL, lang = NULL) { filters2 <- as.list(unlist(filters)) # Give items names without numbers names(filters2) <- rep(names(filters), lapply(filters, length)) - + # The “format” parameter’s only possible value is "JSON". if (!hasName(filters2, "format")) { filters2$format <- "JSON" } - - if (!is.null(lang)) { - # The Language parameter (“lang”) can have only three values: - # "EN" (English), "FR" (French), and "DE" (German). - if (toupper(lang) %in% c("EN", "FR", "DE")) { - filters2$lang <- toupper(lang) - } else { - message("Unsupported language code used. Using the default language: \"EN\"") - filters2$lang <- "EN" - } - } else { - # In case the parameter isn’t specified, the default value "EN" is taken. - message("Using the default language: \"EN\"") - filters2$lang <- "EN" - } + + filters2$lang <- check_lang(lang) host_url <- "https://ec.europa.eu/eurostat/api/dissemination/" service <- "statistics/" version <- "1.0/" response_type <- "data/" datasetCode <- id - + # Parse host_url and add relevant information in the standard list - url_list <- httr::parse_url(host_url) + url_list <- httr2::url_parse(host_url) # Paste "statistics/1.0/data/{id}" at the end of the fixed part of the URL - url_list$path <- paste0(url_list$path, - service, - version, - response_type, + url_list$path <- paste0(url_list$path, + service, + version, + response_type, datasetCode) url_list$query <- filters2 - url <- httr::build_url(url_list) + url <- httr2::url_build(url_list) url } diff --git a/R/get_eurostat_raw.R b/R/get_eurostat_raw.R index 88606501..edb01459 100755 --- a/R/get_eurostat_raw.R +++ b/R/get_eurostat_raw.R @@ -1,16 +1,19 @@ -#' @title Download Data from Eurostat Database -#' @description Download data from the eurostat database. -#' @param id A code name for the dataset of interested. See the table of -#' contents of eurostat datasets for more details. +#' @title Download Data from Eurostat Dissemination API +#' @description Download data from the eurostat database through the new +#' dissemination API. +#' @inheritParams get_eurostat #' @return A dataset in tibble format. First column contains comma #' separated codes of cases. Other columns usually corresponds to #' years and column names are years with preceding X. Data is in #' character format as it contains values together with eurostat #' flags for data. -#' @seealso [get_eurostat()]. -#' @details Data is downloaded from -#' -#' and transformed into tabular format. +#' @seealso +#' [get_eurostat()] +#' +#' @inheritSection eurostat-package Data source: Eurostat SDMX 2.1 Dissemination API +#' @inheritSection eurostat-package Eurostat: Copyright notice and free re-use of data +#' @inheritSection eurostat-package Citing Eurostat data +#' @inheritSection eurostat-package Disclaimer: Availability of filtering functionalities #' @references #' See `citation("eurostat")`: #' @@ -18,7 +21,7 @@ #' citation("eurostat") #' ``` #' -#' @author Przemyslaw Biecek, Leo Lahti and Janne Huovari +#' @author Przemyslaw Biecek, Leo Lahti, Janne Huovari and Pyry Kantanen #' @examplesIf check_access_to_data() #' \donttest{ #' eurostat:::get_eurostat_raw("educ_iste") @@ -26,31 +29,68 @@ #' #' @importFrom readr read_tsv cols col_character #' @importFrom utils download.file +#' @importFrom tibble as_tibble +#' @importFrom curl curl_download +#' @importFrom data.table fread #' #' @keywords utilities database -get_eurostat_raw <- function(id) { +get_eurostat_raw <- function(id, use.data.table = FALSE) { base <- getOption("eurostat_url") url <- paste0( base, - "estat-navtree-portlet-prod/BulkDownloadListing?sort=1&file=data%2F", - id, ".tsv.gz" + "api/dissemination/sdmx/2.1/data/", + id, + "?format=TSV&compressed=true" ) tfile <- tempfile() on.exit(unlink(tfile)) - utils::download.file(url, tfile) - - dat <- readr::read_tsv(gzfile(tfile), - na = ":", - col_types = readr::cols(.default = readr::col_character()) - ) - + if (.Platform$OS.type == "windows") { + curl::curl_download(url = url, destfile = tfile) + } else { + # R Packages (2e): Restore state with base::on.exit() + # timeout = 120 should in most cases be enough for even the biggest datasets + op <- options(timeout = 120) + on.exit(options(op), add = TRUE) + utils::download.file(url, tfile) + } + + if (!use.data.table) { + # OLD CODE + dat <- readr::read_tsv(gzfile(tfile), + na = ":", + progress = TRUE, + col_types = readr::cols(.default = readr::col_character()) + ) + } else if (use.data.table) { + # NEW CODE: data.table + dat <- data.table::fread(cmd = paste("gzip -dc", tfile), + na.strings = ":", + header = TRUE, + colClasses = "character") + + # OLD CODE + # data.table object does not need to be converted into a tibble at this + # point as it will handled by data.table functions in tidy_eurostat. + # dat <- tibble::as_tibble(dat) + } # check validity - if (ncol(dat) < 2 | nrow(dat) < 1) { - msg <- ". Some datasets (for instance the comext type) are not accessible via the eurostat interface. You can try to search the data manually from the comext database at http://epp.eurostat.ec.europa.eu/newxtweb/ or bulk download facility at http://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing or annual Excel files http://ec.europa.eu/eurostat/web/prodcom/data/excel-files-nace-rev.2" + if (ncol(dat) < 2 || nrow(dat) < 1) { + # nocov start + msg <- paste0( + ". Some datasets (for instance the comext type) are not ", + "accessible via the eurostat interface. You can try to ", + "search the data manually from the comext database at ", + "http://epp.eurostat.ec.europa.eu/newxtweb/ ", + "or bulk download facility at ", + "http://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing ", + "or annual Excel files at ", + "http://ec.europa.eu/eurostat/web/prodcom/data/excel-files-nace-rev.2" + ) + # nocov end if (grepl("does not exist or is not readable", dat[1])) { stop(id, " does not exist or is not readable", msg) diff --git a/R/get_eurostat_raw2.R b/R/get_eurostat_raw2.R deleted file mode 100755 index fffb41b2..00000000 --- a/R/get_eurostat_raw2.R +++ /dev/null @@ -1,69 +0,0 @@ -#' @title Download Data from Eurostat Dissemination API -#' @description Download data from the eurostat database through the new -#' dissemination API. -#' @param id A code name for the dataset of interested. See the table of -#' contents of eurostat datasets for more details. -#' @return A dataset in tibble format. First column contains comma -#' separated codes of cases. Other columns usually corresponds to -#' years and column names are years with preceding X. Data is in -#' character format as it contains values together with eurostat -#' flags for data. -#' @seealso [get_eurostat()]. -#' @details Data is downloaded from -#' -#' and transformed into tabular format. -#' @references -#' See `citation("eurostat")`: -#' -#' ```{r, echo=FALSE, comment="#" } -#' citation("eurostat") -#' ``` -#' -#' @author Przemyslaw Biecek, Leo Lahti, Janne Huovari and Pyry Kantanen -#' @examplesIf check_access_to_data() -#' \donttest{ -#' eurostat:::get_eurostat_raw("educ_iste") -#' } -#' -#' @importFrom readr read_tsv cols col_character -#' @importFrom utils download.file -#' -#' @keywords utilities database -get_eurostat_raw2 <- function(id) { - base <- getOption("eurostat_url") - - url <- paste0( - base, - "api/dissemination/sdmx/2.1/data/", - id, - "?format=TSV&compressed=true" - ) - - tfile <- tempfile() - on.exit(unlink(tfile)) - - if (.Platform$OS.type == "windows") { - curl::curl_download(url = url, destfile = tfile) - } else { - utils::download.file(url, tfile) - } - - dat <- readr::read_tsv(gzfile(tfile), - na = ":", - col_types = readr::cols(.default = readr::col_character()) - ) - - - # check validity - if (ncol(dat) < 2 | nrow(dat) < 1) { - msg <- ". Some datasets (for instance the comext type) are not accessible via the eurostat interface. You can try to search the data manually from the comext database at http://epp.eurostat.ec.europa.eu/newxtweb/ or bulk download facility at http://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing or annual Excel files http://ec.europa.eu/eurostat/web/prodcom/data/excel-files-nace-rev.2" - - if (grepl("does not exist or is not readable", dat[1])) { - stop(id, " does not exist or is not readable", msg) - } else { - stop(paste("Could not download ", id, msg)) - } - } - - dat -} diff --git a/R/get_eurostat_toc.R b/R/get_eurostat_toc.R index e129061f..3c1d13bf 100755 --- a/R/get_eurostat_toc.R +++ b/R/get_eurostat_toc.R @@ -1,38 +1,82 @@ #' @title Download Table of Contents of Eurostat Data Sets #' @description Download table of contents (TOC) of eurostat datasets. -#' @return -#' A tibble with eight columns: -#' * title: The name of dataset of theme. -#' * code: The codename of dataset of theme, will be used by the -#' [get_eurostat()] and [get_eurostat_raw()] functions. -#' * type: Is it a dataset, folder or table. -#' * last.update.of.data, last.table.structure.change, -#' data.start, data.end: Dates. -#' @export -#' @seealso [get_eurostat()], [search_eurostat()]. -#' @details The TOC is downloaded from . The values in column 'code' should be used to download a selected dataset. -#' @references -#' See `citation("eurostat")`: -#' -#' ```{r, echo=FALSE, comment="#" } -#' citation("eurostat") -#' ``` -#' -#' @author Przemyslaw Biecek and Leo Lahti +#' @details In the downloaded Eurostat Table of Contents the 'code' column +#' values are refer to the function 'id' that is used as an argument in certain +#' functions when downloading datasets. +#' @return A tibble with nine columns: +#' \describe{ +#' \item{title}{Dataset title in English (default)} +#' \item{code}{ Each item (dataset, table and folder) of the TOC has a +#' unique code which allows it to be identified in the API. Used in the +#' [get_eurostat()] and [get_eurostat_raw()] functions to retrieve datasets.} +#' \item{type}{dataset, folder or table} +#' \item{last.update.of.data}{Date, indicates the last time the +#' dataset/table was updated (format `DD.MM.YYYY` or `%d.%m.%Y`)} +#' \item{last.table.structure.change}{Date, indicates the last time the +#' dataset/table structure was modified (format `DD.MM.YYYY` or `%d.%m.%Y`)} +#' \item{data.start}{Date of the oldest value included in the dataset +#' (if available) (format usually `YYYY` or `%Y` but can also be `YYYY-MM`, +#' `YYYY-MM-DD`, `YYYY-SN`, `YYYY-QN` etc.)} +#' \item{data.end}{Date of the most recent value included in the dataset +#' (if available) (format usually `YYYY` or `%Y` but can also be `YYYY-MM`, +#' `YYYY-MM-DD`, `YYYY-SN`, `YYYY-QN` etc.)} +#' \item{values}{Number of actual values included in the dataset} +#' \item{hierarchy}{Hierarchy of the data navigation tree, represented +#' in the original txt file by a 4-spaces indentation prefix in the title} +#' } +#' +#' @seealso [get_eurostat()], [search_eurostat()] +#' @inheritSection eurostat-package Data source: Eurostat Table of Contents +#' @inherit get_eurostat references +#' @inheritParams get_eurostat +#' +#' @author +#' Przemyslaw Biecek, Leo Lahti and Pyry Kantanen +#' #' @examplesIf check_access_to_data() #' \donttest{ #' tmp <- get_eurostat_toc() #' head(tmp) +#' +#' # Convert columns containing dates as character into Date class +#' # Last update of data +#' tmp[[4]] <- as.Date(tmp[[4]], format = c("%d.%m.%Y")) +#' # Last table structure change +#' tmp[[5]] <- as.Date(tmp[[5]], format = c("%d.%m.%Y")) +#' # Data start, contains several formats (date, week, month quarter, semester) +#' # Unfortunately semesters are not directly supported so they need to be +#' # changed into quarters +#' tmp$data.start <- gsub("S2", "Q3", tmp$data.start) +#' tmp$data.start <- lubridate::as_date( +#' x = tmp$data.start, +#' format = c("%Y", "%Y-Q%q", "%Y-W%W", "%Y-S%q", "%Y-%m-%d", "%Y-%m") +#' ) +#' # Data end, same as data start +#' tmp$data.end <- gsub("S2", "Q3", tmp$data.end) +#' tmp$data.end <- lubridate::as_date( +#' x = tmp$data.end, +#' format = c("%Y", "%Y-Q%q", "%Y-W%W", "%Y-S%q", "%Y-%m-%d", "%Y-%m") +#' ) #' } +#' #' @keywords utilities database -get_eurostat_toc <- function() { - set_eurostat_toc() - invisible(get(".eurostatTOC", envir = .EurostatEnv)) +#' @export +get_eurostat_toc <- function(lang = "en") { + + lang <- check_lang(lang) + + language_version <- switch(lang, + en = ".eurostatTOC", + fr = ".eurostatTOC_fr", + de = ".eurostatTOC_de") + + set_eurostat_toc(lang = lang) + + invisible(get(language_version, envir = .EurostatEnv)) } -# @describeIn get_eurostat_toc Old deprecated version -# @export -# getEurostatTOC <- function() { -# .Deprecated("get_eurostat_toc") -# get_eurostat_toc() -# } +clean_eurostat_toc <- function() { + objects_in_env <- objects(envir = .EurostatEnv, all.names = TRUE) + toc_objects_in_env <- objects_in_env[grep(".eurostatTOC", objects_in_env)] + remove(list = toc_objects_in_env, envir = .EurostatEnv) +} diff --git a/R/label_eurostat.R b/R/label_eurostat.R index 1667e303..bf2ad8bf 100755 --- a/R/label_eurostat.R +++ b/R/label_eurostat.R @@ -1,4 +1,4 @@ -#' @title Get Eurostat Codes +#' @title Get Eurostat Codes for data downloaded from new dissemination API #' @description Get definitions for Eurostat codes from Eurostat dictionaries. #' @details A character or a factor vector of codes returns a corresponding #' vector of definitions. [label_eurostat()] labels also data_frames from @@ -20,8 +20,6 @@ #' should be retained. The suffix "_code" is added to code column names. #' @param eu_order Logical. Should Eurostat ordering used for label levels. #' Affects only factors. -#' @param lang A character, code for language. Available are "en" (default), -#' "fr" and "de". #' @param countrycode A `NULL` or a name of the coding scheme for #' the [countrycode::countrycode()] #' to label "geo" variable with countrycode-package. It can be used to @@ -39,6 +37,7 @@ #' @param fix_duplicated A logical. If TRUE, the code is added to the #' duplicated label values. If FALSE (default) error is given if #' labeling produce duplicates. +#' @inheritParams get_eurostat #' @author Janne Huovari #' @family helpers #' @seealso [countrycode::countrycode()] @@ -50,22 +49,37 @@ #' str(lpl) #' lpl_order <- label_eurostat(lp, eu_order = TRUE) #' lpl_code <- label_eurostat(lp, code = "unit") -#' label_eurostat_vars(names(lp)) +#' # Note that the dataset id must be provided in label_eurostat_vars +#' label_eurostat_vars(id = "nama_10_lp_ulc", x = "geo", lang = "en") #' label_eurostat_tables("nama_10_lp_ulc") #' label_eurostat(c("FI", "DE", "EU28"), dic = "geo") -#' label_eurostat(c("FI", "DE", "EU28"), dic = "geo", custom_dic = c(DE = "Germany")) -#' label_eurostat(c("FI", "DE", "EU28"), +#' label_eurostat( +#' c("FI", "DE", "EU28"), +#' dic = "geo", +#' custom_dic = c(DE = "Germany") +#' ) +#' label_eurostat( +#' c("FI", "DE", "EU28"), #' dic = "geo", countrycode = "country.name", #' custom_dic = c(EU28 = "EU") #' ) -#' label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "country.name") +#' label_eurostat( +#' c("FI", "DE", "EU28"), +#' dic = "geo", +#' countrycode = "country.name" +#' ) #' # In Finnish -#' label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "cldr.short.fi") +#' label_eurostat( +#' c("FI", "DE", "EU28"), +#' dic = "geo", +#' countrycode = "cldr.short.fi" +#' ) #' } #' #' @importFrom countrycode countrycode #' @importFrom tibble as_tibble #' @importFrom dplyr filter coalesce +#' @importFrom stringr str_glue #' #' @export label_eurostat <- @@ -81,8 +95,8 @@ label_eurostat <- # Check if you have access to ec.europe.eu. if (!check_access_to_data()) { - message("You have no access to ec.europe.eu. -Please check your connection and/or review your proxy settings") + message(paste("You have no access to ec.europe.eu. Please check your", + "connection and/or review your proxy settings")) } else { # Avoid warnings @@ -91,10 +105,14 @@ Please check your connection and/or review your proxy settings") if (is.data.frame(x)) { y <- x - mynams <- names(y)[!(names(y) %in% c("time", "values", "flags"))] + mynams <- names(y)[!(names(y) %in% + c("TIME_PERIOD", "time", "values", "flags"))] - for (i in names(y)[!(names(y) %in% c("time", "values", "flags"))]) { - y[[i]] <- label_eurostat(y[[i]], i, + for (i in names(y)[!(names(y) %in% + c("TIME_PERIOD", "time", "values", "flags"))]) { + y[[i]] <- label_eurostat( + y[[i]], + i, eu_order = eu_order, lang = lang, countrycode = countrycode, @@ -115,7 +133,11 @@ Please check your connection and/or review your proxy settings") if (!is.null(code)) { code_in <- code %in% names(y) if (!all(code_in)) { - stop("code column name(s) ", shQuote(code[!code_in]), " not found on x") + stop( + stringr::str_glue( + "The following code column name(s) not found on x:\n", + "{code[!code_in]}") + ) } y_code <- x[, code, drop = FALSE] names(y_code) <- paste0(names(y_code), "_code") @@ -137,30 +159,50 @@ Please check your connection and/or review your proxy settings") ord <- seq_along(levels(x)) } - y <- factor(x, levels(x)[ord], - labels = label_eurostat(levels(x), - dic = dic, - eu_order = eu_order, - lang = lang, - countrycode = countrycode, - countrycode_nomatch = countrycode_nomatch, - custom_dic = custom_dic, - fix_duplicated = fix_duplicated - )[ord] + y <- factor( + x, + levels(x)[ord], + labels = + label_eurostat( + levels(x), + dic = dic, + eu_order = eu_order, + lang = lang, + countrycode = countrycode, + countrycode_nomatch = countrycode_nomatch, + custom_dic = custom_dic, + fix_duplicated = fix_duplicated + )[ord] ) # return factor return(y) - } else if (dic == "geo" & !is.null(countrycode)) { + } else if (dic == "geo" && !is.null(countrycode)) { if (is.null(countrycode_nomatch)) { - y <- countrycode::countrycode(x, origin = "eurostat", destination = countrycode, nomatch = NULL) + y <- countrycode::countrycode(x, + origin = "eurostat", + destination = countrycode, + nomatch = NULL) } else if (is.na(countrycode_nomatch)) { - y <- countrycode::countrycode(x, origin = "eurostat", destination = countrycode, nomatch = NA) + y <- countrycode::countrycode(x, + origin = "eurostat", + destination = countrycode, + nomatch = NA) } else if (countrycode_nomatch == "eurostat") { - y <- countrycode::countrycode(x, origin = "eurostat", destination = countrycode, nomatch = NA) - y[is.na(y)] <- label_eurostat(x[is.na(y)], dic = "geo", lang = lang, fix_duplicated = fix_duplicated) + y <- countrycode::countrycode(x, + origin = "eurostat", + destination = countrycode, + nomatch = NA) + y[is.na(y)] <- label_eurostat(x[is.na(y)], + dic = "geo", + lang = lang, + fix_duplicated = fix_duplicated) } else { - stop("unknown argument ", countrycode_nomatch, " for countrycode_nomatch") + stop( + stringr::str_glue( + "unknown argument {countrycode_nomatch} for countrycode_nomatch" + ) + ) } } else { # dics are in upper case, change if x is not @@ -173,9 +215,10 @@ Please check your connection and/or review your proxy settings") if (anyDuplicated(dic_sel$full_name)) { if (fix_duplicated) { - dup_labels <- - dic_sel$full_name %in% dic_sel$full_name[duplicated(dic_sel$full_name)] - modif_dup_labels <- paste(dic_sel$code_name[dup_labels], + dup_labels <- dic_sel$full_name %in% + dic_sel$full_name[duplicated(dic_sel$full_name)] + modif_dup_labels <- paste( + dic_sel$code_name[dup_labels], dic_sel$full_name[dup_labels], sep = " " ) @@ -193,8 +236,8 @@ Please check your connection and/or review your proxy settings") "Labels for ", dic, " includes duplicated labels in the Eurostat dictionary. ", - "Use fix_duplicated = TRUE with label_eurostat() to fix duplicated - labels automatically." + "Use fix_duplicated = TRUE with label_eurostat() to fix ", + "duplicated labels automatically." ) } } @@ -213,271 +256,148 @@ Please check your connection and/or review your proxy settings") } } - - y } } -#' @describeIn label_eurostat Get definitions for variable (column) names. For -#' objects other than characters or factors definitions are get for names. -#' @export -label_eurostat_vars <- function(x, lang = "en") { - if (!(is.character(x) | is.factor(x))) { - x <- names(x) - } - x <- x[!grepl("values", x)] # remove values column - label_eurostat(x, dic = "dimlst", lang = lang) -} +## OLD CODE +# @rdname eurostat-deprecated +# @inheritParams label_eurostat +# @export +# label_eurostat_vars <- function(x, lang = "en") { +# .Deprecated("label_eurostat_vars2") +# dictname <- "dimlst" +# +# if (!(is.character(x) || is.factor(x))) { +# x <- names(x) +# } +# x <- x[!grepl("values", x)] # remove values column +# +# url <- getOption("eurostat_url") +# tname <- paste0( +# url, +# "estat-navtree-portlet-prod/BulkDownloadListing?file=dic%2F", lang, "%2F", +# dictname, ".dic" +# ) +# dict <- readr::read_tsv(url(tname), +# col_names = c("code_name", "full_name"), +# col_types = readr::cols(.default = readr::col_character()) +# ) +# dict$full_name <- gsub( +# pattern = "\u0092", replacement = "'", +# dict$full_name +# ) +# +# +# y <- dict$full_name[which(dict$code_name %in% toupper(x))] +# +# if (length(y) < length(x)) { +# warning(paste( +# "The query did not return names for the following variables:\n", +# x[which(!(toupper(x) %in% dict$code_name))] +# ) +# ) +# } +# +# y +# } -#' @describeIn label_eurostat Get definitions for table names -#' @export -label_eurostat_tables <- function(x, lang = "en") { - if (!(is.character(x) | - is.factor(x))) { - stop("x have to be a character or a factor") - } - label_eurostat(x, dic = "table_dic", lang = lang) -} -#' @title Get Eurostat Codes for data downloaded from new dissemination API -#' @description Get definitions for Eurostat codes from Eurostat dictionaries. -#' @details A character or a factor vector of codes returns a corresponding -#' vector of definitions. [label_eurostat()] labels also data_frames from -#' [get_eurostat()]. For vectors a dictionary name have to be -#' supplied. For data_frames dictionary names are taken from column names. -#' "time" and "values" columns are returned as they were, so you can supply -#' data_frame from [get_eurostat()] and get data_frame with -#' definitions instead of codes. -#' -#' Some Eurostat dictionaries includes duplicated labels. By default -#' duplicated labels cause an error, but they can be fixed automatically -#' with `fix_duplicated = TRUE`. -#' -#' @param x A character or a factor vector or a data_frame. -#' @param dic A string (vector) naming eurostat dictionary or dictionaries. -#' If `NULL` (default) dictionary names taken from column names of -#' the data_frame. -#' @param code For data_frames names of the column for which also code columns -#' should be retained. The suffix "_code" is added to code column names. -#' @param eu_order Logical. Should Eurostat ordering used for label levels. -#' Affects only factors. -#' @param lang A character, code for language. Available are "en" (default), -#' "fr" and "de". -#' @param countrycode A `NULL` or a name of the coding scheme for -#' the [countrycode::countrycode()] -#' to label "geo" variable with countrycode-package. It can be used to -#' convert to short and long country names in many different languages. -#' If `NULL` (default) eurostat dictionary is used instead. -#' @param countrycode_nomatch What to do when using the countrycode to label -#' a "geo" and countrycode fails to find a match, for example other than -#' country codes like EU28. The original code is used with -#' a `NULL` (default), eurostat dictionary label is used with "eurostat", -#' and `NA` is used with NA. -#' @param custom_dic a named vector or named list of named vectors to give an -#' own dictionary for (part of) codes. Names of the vector should be codes -#' and values labels. List can be used to specify dictionaries and then -#' list names should be dictionary codes. -#' @param fix_duplicated A logical. If TRUE, the code is added to the -#' duplicated label values. If FALSE (default) error is given if -#' labeling produce duplicates. -#' @author Janne Huovari -#' @family helpers -#' @seealso [countrycode::countrycode()] -#' @return a vector or a data_frame. -#' @examples -#' \dontrun{ -#' lp <- get_eurostat("nama_10_lp_ulc") -#' lpl <- label_eurostat(lp) -#' str(lpl) -#' lpl_order <- label_eurostat(lp, eu_order = TRUE) -#' lpl_code <- label_eurostat(lp, code = "unit") -#' label_eurostat_vars(names(lp)) -#' label_eurostat_tables("nama_10_lp_ulc") -#' label_eurostat(c("FI", "DE", "EU28"), dic = "geo") -#' label_eurostat(c("FI", "DE", "EU28"), dic = "geo", custom_dic = c(DE = "Germany")) -#' label_eurostat(c("FI", "DE", "EU28"), -#' dic = "geo", countrycode = "country.name", -#' custom_dic = c(EU28 = "EU") -#' ) -#' label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "country.name") -#' # In Finnish -#' label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "cldr.short.fi") -#' } -#' -#' @importFrom countrycode countrycode -#' @importFrom tibble as_tibble -#' @importFrom dplyr filter coalesce -#' +#' @describeIn label_eurostat Get definitions for variable (column) names. +#' @inheritParams get_eurostat +#' @importFrom httr2 url_build url_parse +#' #' @export -label_eurostat2 <- - function(x, - dic = NULL, - code = NULL, - eu_order = FALSE, - lang = "en", - countrycode = NULL, - countrycode_nomatch = NULL, - custom_dic = NULL, - fix_duplicated = FALSE) { +label_eurostat_vars <- function(x = NULL, id, lang = "en") { + + eurostat_base_url <- getOption("eurostat_url") + api_base_uri <- paste0(eurostat_base_url, "api/dissemination/sdmx/2.1") + resource <- "conceptscheme" + agencyID <- "ESTAT" + resourceID <- id + parameters <- list( + compressed = "false" + ) + + lang <- check_lang(lang) + + req_url <- paste(api_base_uri, resource, agencyID, resourceID, sep = "/") + req_url <- httr2::url_parse(req_url) + req_url$query <- parameters + req_url <- httr2::url_build(req_url) + + columns <- c("code_name", "full_name") + dict = data.frame(matrix(nrow = 0, ncol = length(columns))) + + xml_obj <- xml2::read_xml(req_url) + concepts <- xml_obj %>% + xml2::xml_find_all(xpath = stringr::str_glue(".//s:Concept")) %>% + xml2::xml_attr(attr = "id") + + for (i in seq_len(length(concepts))) { + concept <- concepts[i] + var_name <- xml2::xml_find_all( + xml_obj, + xpath = stringr::str_glue(".//s:Concept[@id='{concept}']/c:Name[@xml:lang='{lang}']") + ) %>% + xml2::xml_text() - # Check if you have access to ec.europe.eu. - if (!check_access_to_data()) { - message("You have no access to ec.europe.eu. -Please check your connection and/or review your proxy settings") - } else { - - # Avoid warnings - code_name <- NULL - - if (is.data.frame(x)) { - y <- x - - mynams <- names(y)[!(names(y) %in% c("TIME_PERIOD", "values", "flags"))] - - for (i in names(y)[!(names(y) %in% c("TIME_PERIOD", "values", "flags"))]) { - y[[i]] <- label_eurostat(y[[i]], i, - eu_order = eu_order, - lang = lang, - countrycode = countrycode, - countrycode_nomatch = countrycode_nomatch, - custom_dic = custom_dic, - fix_duplicated = fix_duplicated - ) - } - - # Fix the first two variables - # nams <- names(y) - # y <- cbind(as.vector(unlist(x[[1]])), - # as.vector(unlist(x[[2]])), - # x[, 3:ncol(x)]) - # colnames(y) <- nams - - # Codes added if asked - if (!is.null(code)) { - code_in <- code %in% names(y) - if (!all(code_in)) { - stop("code column name(s) ", shQuote(code[!code_in]), " not found on x") - } - y_code <- x[, code, drop = FALSE] - names(y_code) <- paste0(names(y_code), "_code") - y <- cbind(y_code, y) - } - - return(tibble::as_tibble(y)) - } else { - if (is.null(dic)) { - stop("Dictionary information is missing") - } - - dic_df <- get_eurostat_dic(dic, lang = lang) - - if (is.factor(x)) { - if (eu_order) { - ord <- dic_order(levels(x), dic_df, "code") - } else { - ord <- seq_along(levels(x)) - } - - y <- factor(x, levels(x)[ord], - labels = label_eurostat(levels(x), - dic = dic, - eu_order = eu_order, - lang = lang, - countrycode = countrycode, - countrycode_nomatch = countrycode_nomatch, - custom_dic = custom_dic, - fix_duplicated = fix_duplicated - )[ord] - ) - - # return factor - return(y) - } else if (dic == "geo" & !is.null(countrycode)) { - if (is.null(countrycode_nomatch)) { - y <- countrycode::countrycode(x, origin = "eurostat", destination = countrycode, nomatch = NULL) - } else if (is.na(countrycode_nomatch)) { - y <- countrycode::countrycode(x, origin = "eurostat", destination = countrycode, nomatch = NA) - } else if (countrycode_nomatch == "eurostat") { - y <- countrycode::countrycode(x, origin = "eurostat", destination = countrycode, nomatch = NA) - y[is.na(y)] <- label_eurostat(x[is.na(y)], dic = "geo", lang = lang, fix_duplicated = fix_duplicated) - } else { - stop("unknown argument ", countrycode_nomatch, " for countrycode_nomatch") - } - } else { - # dics are in upper case, change if x is not - test_n <- min(length(x), 5) - if (!all(toupper(x[1:test_n]) == x[1:test_n])) { - x <- toupper(x) - } - # test duplicates - dic_sel <- dplyr::filter(dic_df, code_name %in% x) - - if (anyDuplicated(dic_sel$full_name)) { - if (fix_duplicated) { - dup_labels <- - dic_sel$full_name %in% dic_sel$full_name[duplicated(dic_sel$full_name)] - modif_dup_labels <- paste(dic_sel$code_name[dup_labels], - dic_sel$full_name[dup_labels], - sep = " " - ) - dic_sel$full_name[dup_labels] <- modif_dup_labels - message( - "Labels for ", - dic, - " includes duplicated labels in the Eurostat dictionary. ", - "Codes have been added as a prefix for duplicated.\n", - "Modified labels are: ", - paste0(modif_dup_labels, collapse = ", ") - ) - } else { - stop( - "Labels for ", - dic, - " includes duplicated labels in the Eurostat dictionary. ", - "Use fix_duplicated = TRUE with label_eurostat() to fix duplicated - labels automatically." - ) - } - } - # mapvalues - y <- dic_sel[[2]][match(x, dic_sel[[1]])] - } - - # apply custom_dic - if (!is.null(custom_dic)) { - if (is.list(custom_dic)) custom_dic <- custom_dic[[dic]] - y <- dplyr::coalesce(unname(custom_dic[x]), y) - } - - if (any(is.na(y))) { - warning("All labels for ", dic, " were not found.") - } - } - - - - y - } + dict <- rbind(dict, c(concept, var_name), make.row.names = FALSE) } - -#' @describeIn label_eurostat Get definitions for variable (column) names. For -#' objects other than characters or factors definitions are get for names. -#' @export -label_eurostat_vars <- function(x, lang = "en") { - if (!(is.character(x) | is.factor(x))) { - x <- names(x) + + colnames(dict) <- columns + + if (nrow(dict) == 0) { + warning("The query did not return any names for dataset columns") + return(invisible()) + } else if (nrow(dict) < length(concepts)) { + warning("The query did not return names for all concepts") + } + + if (!is.null(x)) { + filtered_dict <- dict$full_name[which(dict$code_name %in% x)] + return(filtered_dict) } - x <- x[!grepl("values", x)] # remove values column - label_eurostat(x, dic = "dimlst", lang = lang) + + unfiltered_dict <- dict$full_name + unfiltered_dict } #' @describeIn label_eurostat Get definitions for table names +#' @importFrom xml2 xml_find_all xml_text read_xml +#' @importFrom httr2 url_parse url_build +#' @importFrom dplyr %>% +#' @importFrom stringr str_glue #' @export label_eurostat_tables <- function(x, lang = "en") { - if (!(is.character(x) | - is.factor(x))) { + if (!(is.character(x) || is.factor(x))) { stop("x have to be a character or a factor") } - label_eurostat(x, dic = "table_dic", lang = lang) + eurostat_base_url <- getOption("eurostat_url") + api_base_uri <- paste0(eurostat_base_url, "api/dissemination/sdmx/2.1") + resource <- "dataflow" + agencyID <- "ESTAT" + resourceID <- x + parameters <- list( + compressed = "false" + ) + + lang <- check_lang(lang) + + req_url <- paste(api_base_uri, resource, agencyID, resourceID, sep = "/") + req_url <- httr2::url_parse(req_url) + req_url$query <- parameters + req_url <- httr2::url_build(req_url) + + xml_obj <- xml2::read_xml(req_url) + table_name <- xml_obj %>% + xml2::xml_find_all(xpath = stringr::str_glue(".//c:Name[@xml:lang='{lang}']")) %>% + xml2::xml_text() + + if (length(table_name) == 0) { + warning("The query did not return a name for the dataset") + return(invisible()) + } + + table_name } diff --git a/R/search_eurostat.R b/R/search_eurostat.R index a653b61b..ae439dbc 100755 --- a/R/search_eurostat.R +++ b/R/search_eurostat.R @@ -1,35 +1,34 @@ #' @title Grep Datasets Titles from Eurostat -#' @description Lists names of dataset from eurostat with the particular -#' pattern in the description. +#' @description Lists datasets from eurostat table of contents with the +#' particular pattern in item titles. #' @details Downloads list of all datasets available on #' eurostat and return list of names of datasets that contains particular #' pattern in the dataset description. E.g. all datasets related to -#' education of teaching. -#' @param pattern Character, datasets, folder or tables with this pattern in -#' the description will be returned (depending on the 'type' argument) -#' @param type Grep the Eurostat table of contents either for -#' 'dataset' (default), 'folder', 'table' or "all" (for all types). -#' @param fixed logical. If TRUE, pattern is a string to be matched as is. -#' Change to FALSE if more complex regex matching is needed. -#' @return A tibble with eight columns -#' -#' * **title**: The name of dataset of theme -#' * **code**: The codename of dataset of theme, will be used by the -#' [get_eurostat()] and [get_eurostat_raw()] functions. -#' * **type**: Is it a dataset, folder or table. -#' * **last.update.of.data, last.table.structure.change, data.start, -#' data.end**: Dates. -#' -#' @export -#' @seealso [get_eurostat()], [get_eurostat_toc()] -#' @references -#' See `citation("eurostat")`: -#' -#' ```{r, echo=FALSE, comment="#" } -#' citation("eurostat") -#' ``` -#' +#' education of teaching. +#' +#' If you wish to perform searches on other fields than item title, +#' you can download the Eurostat Table of Contents manually using +#' `get_eurostat_toc()` function and use `grep()` function normally. The data +#' browser on Eurostat website may also return useful results. +#' @param pattern +#' Text string that is used to search from dataset, folder or table titles, +#' depending on the type argument. +#' @param type +#' Selection for types of datasets to be searched. Default is `dataset`, other +#' possible options are `table`, `folder` and `all` for all types. +#' @param column +#' Selection for the column of TOC where search is done. Default is `title`, +#' other possible option is `code`. +#' @param fixed +#' logical. If TRUE (default), pattern is a string to be matched as is. +#' See `grep()` documentation for more information. +#' @inheritParams get_eurostat +#' @inherit get_eurostat_toc return seealso +#' @inherit eurostat-package references +#' @inheritSection eurostat-package Data source: Eurostat Table of Contents +#' #' @author Przemyslaw Biecek and Leo Lahti +#' #' @examplesIf check_access_to_data() #' \donttest{ #' tmp <- search_eurostat("education") @@ -38,25 +37,49 @@ #' # Here, parentheses would normally need to be escaped in regex #' tmp <- search_eurostat("Live births (total) by NUTS 3 region", fixed = TRUE) #' } +#' #' @keywords utilities database -search_eurostat <- function(pattern, type = "dataset", fixed = TRUE) { +#' +#' @export +search_eurostat <- function(pattern, + type = "dataset", + column = "title", + fixed = TRUE, + lang = "en") { + + # Sanity check + type <- tolower(as.character(type)) + column <- tolower(as.character(column)) + lang <- check_lang(lang) + + if (!type %in% c("dataset", "table", "folder", "all")) { + warning(stringr::str_glue("The type \"{type}\" is not recognized, ", + "will return the search results using the ", + "default argument: type = \"dataset\".")) + type <- "dataset" + } + + if (!column %in% c("title", "code")) { + warning(stringr::str_glue("The column \"{column}\" is not recognized, ", + "will return the search results using the ", + "default argument: column = \"title\".")) + column <- "title" + } # Check if you have access to ec.europe.eu. if (!check_access_to_data()) { message("You have no access to ec.europe.eu. Please check your connection and/or review your proxy settings") - } else { - set_eurostat_toc() - tmp <- get(".eurostatTOC", envir = .EurostatEnv) - if (type != "all") tmp <- tmp[tmp$type %in% type, ] - tmp[grep(tmp$title, pattern = pattern, fixed = fixed), ] + return(invisible()) } -} + #set_eurostat_toc() + #tmp <- get(".eurostatTOC", envir = .EurostatEnv) + tmp <- get_eurostat_toc(lang = lang) -#' @describeIn search_eurostat Old deprecated version -#' @export -grepEurostatTOC <- function(pattern, type = "dataset") { - .Deprecated("search_eurostat") - search_eurostat(pattern = pattern, type = type) + + if (!identical(type, "all")) { + tmp <- tmp[tmp$type %in% type, ] + } + tmp <- tmp[grep(tmp[[column]], pattern = pattern, fixed = fixed), ] } diff --git a/R/set_eurostat_cache.R b/R/set_eurostat_cache.R index a33bd120..eaf66c6e 100644 --- a/R/set_eurostat_cache.R +++ b/R/set_eurostat_cache.R @@ -161,12 +161,8 @@ eur_helper_detect_cache_dir <- function() { cached_path <- readLines(cache_config) # Case on empty cached path - would default - if (is.null(cached_path) || - is.na(cached_path) || cached_path == "") { - cache_dir <- set_eurostat_cache_dir( - overwrite = TRUE, - verbose = FALSE - ) + if (is.null(cached_path) || is.na(cached_path) || cached_path == "") { + cache_dir <- set_eurostat_cache_dir(overwrite = TRUE, verbose = FALSE) return(cache_dir) } @@ -209,3 +205,40 @@ eur_helper_cachedir <- function(cache_dir = NULL) { } return(cache_dir) } + +#' Output cache information as data.frame +#' @description +#' Parses cache_list.json file and returns a data.frame +#' @return +#' A data.frame object with 3 columns: dataset code, download date and +#' query md5 hash +#' +#' @inheritParams get_eurostat +#' @importFrom jsonlite fromJSON +#' @export +list_eurostat_cache_items <- function(cache_dir = NULL) { + if (is.null(cache_dir)) { + cache_dir <- eur_helper_detect_cache_dir() + } + + path <- paste0(cache_dir, "/cache_list.json") + + if (!file.exists(path)) { + warning("No cache_list.json file found!") + return(invisible()) + } + + json_file <- jsonlite::fromJSON(path) + # return(json_file) + columns <- c("code", "download_date", "query_md5_hash") + df <- data.frame(matrix(nrow = 0, ncol = length(columns))) + for (i in seq_len(length(json_file))) { + df_i <- data.frame( + code = json_file[[i]][["id"]], + download_date = json_file[[i]][["download_date"]], + query_md5_hash = names(json_file[i]) + ) + df <- rbind(df, df_i) + } + df +} \ No newline at end of file diff --git a/R/set_eurostat_toc.R b/R/set_eurostat_toc.R index 5722434a..bf1b58b2 100755 --- a/R/set_eurostat_toc.R +++ b/R/set_eurostat_toc.R @@ -1,25 +1,213 @@ #' @title Set Eurostat TOC #' @description Internal function. -#' @param ... Arguments to be passed +#' @inheritParams get_eurostat #' @return Empty element #' @references see citation("eurostat") #' @author Przemyslaw Biecek and Leo Lahti #' #' @importFrom readr read_tsv cols col_character +#' @importFrom stringr str_glue +#' +#' @seealso [get_eurostat_toc()] [toc_count_children()] [toc_determine_hierarchy()] +#' [toc_list_children()] [toc_count_whitespace()] #' #' @keywords internal -set_eurostat_toc <- function(...) { - if (!exists(".eurostatTOC", envir = .EurostatEnv)) { +set_eurostat_toc <- function(lang = "en") { + lang <- check_lang(lang) + + language_version <- switch(lang, + en = ".eurostatTOC", + fr = ".eurostatTOC_fr", + de = ".eurostatTOC_de") + + if (!exists(language_version, envir = .EurostatEnv)) { base <- getOption("eurostat_url") - url <- paste(base, "estat-navtree-portlet-prod/", - "BulkDownloadListing?sort=1&downfile=table_of_contents_en.txt", - sep = "" + url <- stringr::str_glue( + paste0(base, "api/dissemination/catalogue/toc/txt?lang={lang}") ) - .eurostatTOC <- readr::read_tsv(url(url), - col_types = readr::cols(.default = readr::col_character()) + + .eurostatTOC <- readr::read_tsv( + file = url(url), + col_types = readr::cols(.default = readr::col_character()), + name_repair = make.names, + trim_ws = FALSE ) - - assign(".eurostatTOC", .eurostatTOC, envir = .EurostatEnv) + + .eurostatTOC$hierarchy <- toc_determine_hierarchy(.eurostatTOC$title) + .eurostatTOC$title <- trimws(.eurostatTOC$title, which = "left") + .eurostatTOC$values <- as.numeric(.eurostatTOC$values) + + assign(language_version, .eurostatTOC, envir = .EurostatEnv) } invisible(0) } + +#' @title Count white space at the start of the title +#' @description Counts the number of white space characters at the start +#' of the string. +#' @inherit toc_determine_hierarchy details +#' @inheritParams toc_determine_hierarchy +#' @return Numeric (number of white space characters) +#' @importFrom stringr str_extract +#' @examples +#' strings <- c(" abc", " cdf", "no_spaces") +#' for (string in strings) { +#' whitespace_count <- eurostat:::toc_count_whitespace(string) +#' cat("String:", string, "\tWhitespace Count:", whitespace_count, "\n") +#' } +#' +#' @inherit set_eurostat_toc seealso +#' +#' @author Pyry Kantanen +#' +#' @keywords internal +toc_count_whitespace <- function(input_string) { + # Counts white space chars \s before encountering the 1st non-ws char \S + pattern <- "^\\s*(?=\\S)" + extracted_ws <- stringr::str_extract(input_string, pattern) + + nchar(extracted_ws) +} + +#' @title Determine level in hierarchy +#' @description Divides the number of spaces before alphanumeric characters +#' with 4 and uses the result to determine hierarchy. Top level is 0. +#' @details Used in toc_determine_hierarchy function to determine hierarchy. +#' Hierarchy is defined in Eurostat .txt format TOC files by the number of +#' white space characters at intervals of four. For example, +#' " Foo" (4 white space characters) is one level higher than +#' " Bar" (8 white space characters). +#' "Database by themes" (0 white space characters before the first +#' alphanumeric character) is highest in the hierarchy. +#' +#' The function will return a warning if the input has white space in anything +#' else than as increments of 4. 0, 4, 8... are acceptable but 3, 6, 10... +#' are not. +#' @param input_string +#' A string containing Eurostat TOC titles +#' @return Numeric +#' @examples +#' strings <- c(" abc", " cdf", "no_spaces") +#' eurostat:::toc_determine_hierarchy(strings) +#' +#' @inherit set_eurostat_toc seealso +#' +#' @author Pyry Kantanen +#' +#' @keywords internal +toc_determine_hierarchy <- function(input_string) { + number_of_whitespace <- toc_count_whitespace(input_string) + + # If all x mod y calculations equal 0 everything is ok. + # If not, input is somehow mangled + # For example " General and regional statistics" (4 whitespace) returns 1 + # whereas " " (12 whitespace without any letters) returns also 1 + # Normally all dataset items are expected to have a title to determine + # their place in hierarchy. Testing for this might be a bit tricky. + if (!all((number_of_whitespace %% 4) %in% c(0))) { + warning( + paste( + "TOC indentation was not uniform in all rows or there were some", + "items that were missing a proper title. Hierarchy value set to NA", + "for problematic rows." + ) + ) + invalid_rows <- which(!(number_of_whitespace %% 4) %in% c(0)) + # return(invisible()) + hierarchy <- number_of_whitespace %/% 4 + hierarchy[invalid_rows] <- NA + return(hierarchy) + } + + # If white space is 0, it gets number 0 in hierarchy + hierarchy <- number_of_whitespace %/% 4 + hierarchy + # Or should it be 1? + # (number_of_whitespace %/% 4) + 1 +} + +#' @title Count number of children +#' @description +#' Determine how many children a certain TOC item (usually a folder) has. +#' @param code Eurostat TOC item code (folder, dataset, table) +#' +#' @importFrom stringr str_glue +#' +#' @inherit set_eurostat_toc seealso +#' +#' @author Pyry Kantanen +#' +#' @keywords internal +#' +toc_count_children <- function(code) { + toc <- get_eurostat_toc() + + # Line number for hit + initial_pos <- which(toc$code == code) + + if (length(initial_pos) > 1) { + warning(stringr::str_glue( + "Unambiguous code input: \"{code}\". ", + "TOC contains multiple items with the same code.")) + return(invisible()) + } + + initial_hierarchy <- toc$hierarchy[initial_pos] + i <- initial_pos + 1 + num_children <- 0 + + while (toc$hierarchy[i] > initial_hierarchy) { + # Check for the 1st iteration: If the next item is of the same hierarchy + # break the while loop and determine that the number of children is 0 + if (toc$hierarchy[i] == initial_hierarchy && num_children == 0) { + num_children <- 0 + break + } + num_children <- i - initial_pos + i <- i + 1 + } + num_children +} + +#' @title List children +#' @description +#' List children of a specific folder. +#' @inheritParams toc_count_children +#' +#' @importFrom stringr str_glue +#' +#' @inherit set_eurostat_toc seealso +#' +#' @author Pyry Kantanen +#' +#' @keywords internal +#' +toc_list_children <- function(code) { + toc <- get_eurostat_toc() + # Line number for hit + initial_pos <- which(toc$code == code) + + if (length(initial_pos) > 1) { + warning(stringr::str_glue( + "Unambiguous code input: \"{code}\". ", + "TOC contains multiple items with the same code.")) + return(invisible()) + } + + final_pos <- initial_pos + toc_count_children(code) + + if (final_pos == initial_pos) { + initial_pos_type <- toc$type[initial_pos] + message(stringr::str_glue( + "The TOC item with code \"{code}\" (type: {initial_pos_type}) ", + "does not have any children. Please use another code.") + ) + return(invisible()) + } + + # Add 1 to omit root folder + initial_pos <- initial_pos + 1 + + children <- toc[initial_pos:final_pos, ] + children +} diff --git a/R/sysdata.rda b/R/sysdata.rda new file mode 100644 index 00000000..689c70af Binary files /dev/null and b/R/sysdata.rda differ diff --git a/R/tidy_eurostat.R b/R/tidy_eurostat.R index dd392984..ee3e9aa9 100755 --- a/R/tidy_eurostat.R +++ b/R/tidy_eurostat.R @@ -1,112 +1,185 @@ #' @title Transform Data into Row-Column-Value Format -#' @description Transform raw Eurostat data table into the row-column-value -#' format (RCV). -#' @param dat a data_frame from [get_eurostat_raw()]. -#' @param time_format a string giving a type of the conversion of the -#' time column from the eurostat format. -#' A "date" (default) converts to a [Date()] -#' with a first date of the period. A "date_last" -#' converts to a [Date()] with -#' a last date of the period. A "num" converts to a numeric and "raw" -#' does not do conversion. See [eurotime2date()] and -#' [eurotime2num()]. -#' @param select_time a character symbol for a time frequency or NULL -#' (default). -#' @param stringsAsFactors if `TRUE` (the default) variables are -#' converted to factors in original Eurostat order. If `FALSE` -#' they are returned as strings. -#' @param keepFlags a logical whether the flags (e.g. "confidential", -#' "provisional") should be kept in a separate column or if they -#' can be removed. Default is `FALSE` -#' @return tibble in the molten format with the last column 'values'. -#' @seealso [get_eurostat()] -#' @references See citation("eurostat"). -#' @author Przemyslaw Biecek, Leo Lahti and Janne Huovari +#' @description Transform raw Eurostat data table downloaded from the +#' API into a tidy row-column-value format (RCV). +#' @param dat +#' a data_frame from [get_eurostat_raw()]. +#' @inheritParams get_eurostat +#' @return tibble in the melted format with the last column 'values'. +#' @seealso [get_eurostat()], [convert_time_col()], [eurotime2date()] +#' @inherit eurostat-package references +#' @author Przemyslaw Biecek, Leo Lahti, Janne Huovari and Pyry Kantanen #' -#' @importFrom stringi stri_extract_first_regex -#' @importFrom tidyr separate gather +#' @importFrom stringi stri_extract_first_regex stri_replace_all_regex +#' @importFrom stringi stri_replace_all_fixed +#' @importFrom tidyr separate pivot_longer #' @importFrom dplyr filter +#' @importFrom data.table setDT melt .SD := +#' @importFrom stats na.omit +#' +#' @examples +#' \dontrun{ +#' # Example of a dataset with multiple time series +#' get_eurostat("AVIA_GOR_ME", +#' time_format = "date_last", +#' cache = F +#' ) +#' } #' #' @keywords internal utilities database -tidy_eurostat <- function(dat, time_format = "date", select_time = NULL, +tidy_eurostat <- function(dat, + time_format = "date", + select_time = NULL, stringsAsFactors = FALSE, - keepFlags = FALSE) { + keepFlags = FALSE, + use.data.table = FALSE) { # To avoid warnings - time <- values <- NULL + TIME_PERIOD <- values <- NULL # Separate codes to columns cnames <- strsplit(colnames(dat)[1], split = "[\\,]")[[1]] cnames1 <- cnames[-length(cnames)] # for columns cnames2 <- cnames[length(cnames)] # for colnames - - # Separe variables from first column + + # Separate variables from first column + # OLD CODE dat <- tidyr::separate(dat, - col = colnames(dat)[1], - into = cnames1, - sep = ",", - convert = FALSE - ) - - # Get variable from column names - - cnames2_quo <- as.name(cnames2) - dat <- tidyr::gather(dat, !!cnames2_quo, values, - -seq_along(cnames1), - convert = FALSE + col = colnames(dat)[1], + into = cnames1, + sep = ",", + convert = FALSE ) - - # to save memory (and backward compatibility) - dat <- dplyr::filter(dat, !is.na(values)) - - ## separate flags into separate column - if (keepFlags == TRUE) { - dat$flags <- as.vector( - stringi::stri_extract_first_regex( - dat$values, - c("(^0n( [A-Za-z]+)*)|[A-Za-z]+") + if (!use.data.table) { + + # Get variable from column names + # OLD CODE + dat <- tidyr::pivot_longer(data = dat, + cols = -seq_along(cnames1), + names_to = cnames2, + values_to = "values") + + # to save memory (and backward compatibility) + # OLD CODE + dat <- dplyr::filter(dat, !is.na(values)) + + ## separate flags into separate column + if (keepFlags == TRUE) { + dat$flags <- as.vector( + stringi::stri_extract_first_regex( + dat$values, + c("(^0n( [A-Za-z]+)*)|[A-Za-z]+") + ) ) - ) - } - - # clean time and values - dat$time <- gsub("X", "", dat$time) - dat$values <- as.numeric(gsub("[^0-9.-]+", "", as.character(dat$values))) - - # variable columns - var_cols <- names(dat)[!(names(dat) %in% c("time", "values"))] - - # reorder to standard order - dat <- dat[c(var_cols, "time", "values")] + } + + # clean time and values + # OLD CODE + dat$TIME_PERIOD <- gsub("X", "", dat$TIME_PERIOD, fixed = TRUE) + dat$values <- as.numeric(gsub("[^0-9.-]+", "", as.character(dat$values))) + + # variable columns + var_cols <- names(dat)[!(names(dat) %in% c("TIME_PERIOD", "values"))] + + # reorder to standard order + # OLD CODE + dat <- dat[c(var_cols, "TIME_PERIOD", "values")] + + # columns from var_cols are converted into factors + # avoid convert = FALSE since it converts T into TRUE instead of TOTAL + if (stringsAsFactors) { + dat[, var_cols] <- lapply( + dat[, var_cols, drop = FALSE], + function(x) factor(x, levels = unique(x)) + ) + } + } else if (use.data.table) { + # NEW CODE: data.table + # defining dat as data.table object is necessary to use data.table functions + # dat <- data.table::as.data.table(dat) + # Coerce data.frame to data.table by reference + data.table::setDT(dat) + + # Use factors by default to reduce RAM use (?) + dat[, (cnames1) := lapply(.SD, as.factor), .SDcols = cnames1] + + # NEW CODE: data.table + # Use pipe to reduce RAM use (?) + dat <- data.table::melt(data = dat, + measure.vars = setdiff(names(dat), cnames1), + variable.name = cnames2, + value.name = "values") %>% + na.omit(cols = "values") + + # NEW CODE: data.table + # should be using S3 method for data.table here... + # Problem has been with "vector memory exhausted (limit reached?)" + # dat <- na.omit(object = dat, cols = "values") + + ## separate flags into separate column + # Use data.table update := for smaller RAM footprint + if (keepFlags == TRUE) { + dat[, `:=`(flags = as.vector( + stringi::stri_extract_first_regex(values, c("(^0n( [A-Za-z]+)*)|[A-Za-z]+")) + ))] + } + + # clean time and values + # NEW CODE: use stringi instead of gsub for faster execution + # Use data.table update := for smaller RAM footprint + dat[, TIME_PERIOD := stringi::stri_replace_all_fixed(TIME_PERIOD, "X", "")] + # dat$TIME_PERIOD <- stringi::stri_replace_all_fixed(dat$TIME_PERIOD, "X", "") + dat[, values := stringi::stri_replace_all_regex(values, "[^0-9.-]+", "")] + dat[, values := as.numeric(values)] + # dat$values <- as.numeric( + # stringi::stri_replace_all_regex(as.character(dat$values), "[^0-9.-]+", "") + # ) + + # variable columns + # cnames1 is the same as var_cols so cnames1 is used + # var_cols <- names(dat)[!(names(dat) %in% c("TIME_PERIOD", "values"))] + # selected_cols <- c(var_cols, "TIME_PERIOD", "values") + + # reorder to standard order + # NEW CODE: data.table + # either this way + # dat <- dat[, ..selected_cols] + # or this way + # reorder to standard order + data.table::setcolorder(dat, c(cnames1, "TIME_PERIOD", "values")) + + # Turn factors back into characters if stringsAsFactors = FALSE + # columns from cnames1 (var_cols) are converted into factors + if (!stringsAsFactors) { + dat[, (cnames1) := lapply(.SD, as.character), .SDcols = cnames1] + } - # columns from var_cols are converted into factors - # avoid convert = FALSE since it converts T into TRUE instead of TOTAL - if (stringsAsFactors) { - dat[, var_cols] <- lapply( - dat[, var_cols, drop = FALSE], - function(x) factor(x, levels = unique(x)) - ) + dat <- tibble::as_tibble(dat) } # For multiple time frequency - freqs <- available_freq(dat$time) + freqs <- unique(dat$freq) if (!is.null(select_time)) { if (length(select_time) > 1) { - stop( - "Only one frequency should be selected in select_time. Selected: ", + message( + "Selected multiple time frequencies with select_time parameter: ", shQuote(select_time) ) } - # Annual - if (select_time == "Y") { - dat <- subset(dat, nchar(time) == 4) - # Others + # Filter dataset according to select_time filter + # This only works when a single frequency is chosen + if (identical(select_time, "Y")) { + # Annual with old style notation, "Y" for annual + dat <- subset(dat, dat$freq == "A") + } else if (identical(select_time, "A")) { + # Annual with new notation, "A" for annual + dat <- subset(dat, dat$freq == "A") } else { - dat <- subset(dat, grepl(select_time, time)) + # Others, subset the data with whatever choices + dat <- subset(dat, dat$freq %in% select_time) } - # Test if data + # Test if filtered dataset actually contains any data if (nrow(dat) == 0) { stop( "No data selected with select_time:", dQuote(select_time), "\n", @@ -114,28 +187,48 @@ tidy_eurostat <- function(dat, time_format = "date", select_time = NULL, ) } } else { - if (length(freqs) > 1 & time_format != "raw") { - stop( - "Data includes several time frequencies. Select frequency with - select_time or use time_format = \"raw\". - Available frequencies: ", shQuote(freqs) + + if (length(freqs) > 1 && time_format != "raw") { + message( + "Data includes several time frequencies. Select a single frequency \n", + "with select_time or use time_format = \"raw\" to return all data \n", + "without any filtering. Available frequencies: ", shQuote(freqs), "\n", + "Returning the dataset with multiple frequencies." ) } } - # convert time column - dat$time <- convert_time_col(dat$time, - time_format = time_format - ) + if (length(select_time) > 1) { + dat_copy <- data.frame() + for (i in seq_along(select_time)) { + dat_subset <- subset(dat, dat$freq == select_time[i]) + dat_subset$TIME_PERIOD <- convert_time_col(x = dat_subset$TIME_PERIOD, + time_format = time_format) + dat_copy <- rbind(dat_copy, dat_subset) + } + dat <- dat_copy + } else { + # convert time column to Date + dat$TIME_PERIOD <- convert_time_col(x = dat$TIME_PERIOD, + time_format = time_format) + } + # NEW CODE: data.table + # This is needed if we still want to return tibbles at the end + # dat <- tibble::as_tibble(dat) dat } -#' @title Time Column Conversions -#' @description Internal function to convert time column. -#' @param x A time column (vector) -#' @param time_format see [tidy_eurostat()] +#' @title +#' Time Column Conversions for data from new dissemination API +#' @description +#' Internal function to convert time column. +#' @param x +#' A time column (vector) from a downloaded dataset +#' @param time_format +#' one of the following: `date`, `date_last`, or `num`. +#' See [tidy_eurostat()] for more information. #' @keywords internal convert_time_col <- function(x, time_format) { if (time_format == "raw") { @@ -148,8 +241,6 @@ convert_time_col <- function(x, time_format) { y <- eurotime2date(x, last = TRUE) } else if (time_format == "num") { y <- eurotime2num(x) - } else if (time_format == "raw") { - } else { stop( "An unknown time_format argument: ", time_format, diff --git a/R/tidy_eurostat2.R b/R/tidy_eurostat2.R deleted file mode 100755 index 188ad0d9..00000000 --- a/R/tidy_eurostat2.R +++ /dev/null @@ -1,193 +0,0 @@ -#' @title Transform Data from the New Dissemination API into Row-Column-Value Format -#' @description Transform raw Eurostat data table downloaded from the new -#' dissemination API into the row-column-value format (RCV). -#' @param dat -#' a data_frame from [get_eurostat_raw()]. -#' @param time_format -#' a string giving a type of the conversion of the time column from the -#' eurostat format. A "date" (default) converts to a [Date()] -#' with a first date of the period. A "date_last" converts to a [Date()] with -#' a last date of the period. A "num" converts to a numeric and "raw" -#' does not do conversion. See [eurotime2date()] and [eurotime2num()]. -#' @param select_time -#' a single character symbol for a time frequency, a vector -#' containing multiple time frequencies, or `NULL` (default). -#' Available options are "A" (annual), "Q" (quarterly), "S" -#' (semester, 1st or 2nd half of the year), "M" (monthly) and "D" (daily). -#' When downloading data from the New Dissemination API, it is now possible -#' to select multiple time frequencies and return them in the same data.frame -#' object. -#' @param stringsAsFactors -#' if `TRUE` (the default) variables are -#' converted to factors in original Eurostat order. If `FALSE` -#' they are returned as strings. -#' @param keepFlags a logical whether the flags (e.g. "confidential", -#' "provisional") should be kept in a separate column or if they -#' can be removed. Default is `FALSE` -#' @return tibble in the molten format with the last column 'values'. -#' @seealso [get_eurostat()], [convert_time_col2()], [eurotime2date2()] -#' @references See citation("eurostat"). -#' @author Przemyslaw Biecek, Leo Lahti, Janne Huovari and Pyry Kantanen -#' -#' @importFrom stringi stri_extract_first_regex -#' @importFrom tidyr separate pivot_longer -#' @importFrom dplyr filter -#' -#' @examples -#' \dontrun{ -#' # Example of a dataset with multiple time series -#' get_eurostat("AVIA_GOR_ME", time_format = "date_last", cache = F, bulk_new_style = TRUE) -#' } -#' -#' @keywords internal utilities database -tidy_eurostat2 <- function(dat, - time_format = "date", - select_time = NULL, - stringsAsFactors = FALSE, - keepFlags = FALSE) { - - # To avoid warnings - TIME_PERIOD <- values <- NULL - - # Separate codes to columns - cnames <- strsplit(colnames(dat)[1], split = "[\\,]")[[1]] - cnames1 <- cnames[-length(cnames)] # for columns - cnames2 <- cnames[length(cnames)] # for colnames - - # Separe variables from first column - dat <- tidyr::separate(dat, - col = colnames(dat)[1], - into = cnames1, - sep = ",", - convert = FALSE - ) - - # Get variable from column names - dat <- tidyr::pivot_longer(data = dat, - cols = -seq_along(cnames1), - names_to = cnames2, - values_to = "values") - - # to save memory (and backward compatibility) - dat <- dplyr::filter(dat, !is.na(values)) - - ## separate flags into separate column - if (keepFlags == TRUE) { - dat$flags <- as.vector( - stringi::stri_extract_first_regex( - dat$values, - c("(^0n( [A-Za-z]+)*)|[A-Za-z]+") - ) - ) - } - - # clean time and values - dat$TIME_PERIOD <- gsub("X", "", dat$TIME_PERIOD) - dat$values <- as.numeric(gsub("[^0-9.-]+", "", as.character(dat$values))) - - # variable columns - var_cols <- names(dat)[!(names(dat) %in% c("TIME_PERIOD", "values"))] - - # reorder to standard order - dat <- dat[c(var_cols, "TIME_PERIOD", "values")] - - # columns from var_cols are converted into factors - # avoid convert = FALSE since it converts T into TRUE instead of TOTAL - if (stringsAsFactors) { - dat[, var_cols] <- lapply( - dat[, var_cols, drop = FALSE], - function(x) factor(x, levels = unique(x)) - ) - } - - # For multiple time frequency - freqs <- unique(dat$freq) - - if (!is.null(select_time)) { - if (length(select_time) > 1) { - message( - "Selected multiple time frequencies with select_time parameter: ", - shQuote(select_time) - ) - } - - # Filter dataset according to select_time filter - # This only works when a single frequency is chosen - if (identical(select_time, "Y")) { - # Annual with old style notation, "Y" for annual - dat <- subset(dat, dat$freq == "A") - } else if (identical(select_time, "A")) { - # Annual with new notation, "A" for annual - dat <- subset(dat, dat$freq == "A") - } else { - # Others, subset the data with whatever choices - dat <- subset(dat, dat$freq %in% select_time) - } - # Test if filtered dataset actually contains any data - if (nrow(dat) == 0) { - stop( - "No data selected with select_time:", dQuote(select_time), "\n", - "Available frequencies: ", shQuote(freqs) - ) - } - } else { - - if (length(freqs) > 1 & time_format != "raw") { - message( - "Data includes several time frequencies. Select a single frequency \n", - "with select_time or use time_format = \"raw\" to return all data \n", - "without any filtering. Available frequencies: ", shQuote(freqs), "\n", - "Returning the dataset with multiple frequencies." - ) - } - } - - if (length(select_time) > 1) { - dat_copy <- data.frame() - for (i in seq_along(select_time)) { - dat_subset <- subset(dat, dat$freq == select_time[i]) - dat_subset$TIME_PERIOD <- convert_time_col2(x = dat_subset$TIME_PERIOD, - time_format = time_format) - dat_copy <- rbind(dat_copy, dat_subset) - } - dat <- dat_copy - } else { - # convert time column to Date - dat$TIME_PERIOD <- convert_time_col2(x = dat$TIME_PERIOD, - time_format = time_format) - } - - dat -} - - -#' @title -#' Time Column Conversions for data from new dissemination API -#' @description -#' Internal function to convert time column. -#' @param x -#' A time column (vector) from a downloaded dataset -#' @param time_format -#' one of the following: `date`, `date_last`, or `num`. -#' See [tidy_eurostat()] for more information. -#' @keywords internal -convert_time_col2 <- function(x, time_format) { - if (time_format == "raw") { - y <- x - } else { - x <- factor(x) - if (time_format == "date") { - y <- eurotime2date2(x, last = FALSE) - } else if (time_format == "date_last") { - y <- eurotime2date2(x, last = TRUE) - } else if (time_format == "num") { - y <- eurotime2num2(x) - } else { - stop( - "An unknown time_format argument: ", time_format, - " Allowed are date, date_last, num and raw" - ) - } - } - y -} diff --git a/R/utils.R b/R/utils.R index b5312222..71b323c9 100755 --- a/R/utils.R +++ b/R/utils.R @@ -30,3 +30,79 @@ load_package_data <- function(dataset) { } .new_data_environment[[dataset]] } + +check_lang <- function(lang) { + if (!is.null(lang)) { + # The Language parameter (“lang”) can have only three values: + # "en" (English), "fr" (French), and "de" (German). + lang <- tolower(lang) + if (lang %in% c("en", "fr", "de")) { + return(lang) + } else { + message( + "Unsupported language code used. Using the default language: \"en\"" + ) + lang <- "en" + } + } else { + # In case the parameter isn’t specified, the default value "en" is taken. + message("Using the default language: \"en\"") + lang <- "en" + } + lang +} + +#' @title Calculate a fixity checksum for an object +#' @description +#' Uses a hash function (md5) on an object and calculates a digest of the object +#' in the form of a character string. +#' +#' @details +#' “Fixity, in the preservation sense, means the assurance that a digital file +#' has remained unchanged, i.e. fixed.” (Bailey, 2014). In practice, fixity +#' can most easily be established by calculating a checksum for the data object +#' that changes if anything in the data object has changed. What we use as a +#' checksum here is by default calculated with md5 hash algorithm. It is +#' possible to use other algorithms supported by the imported digest function, +#' see function documentation. +#' +#' In the case of big objects with millions of rows of data calculating a +#' checksum can take a bit longer and require some amount of RAM to be +#' available. Selecting another algorithm might perform faster and/or more +#' efficiently. Whichever algorithm you are using, please make sure to report +#' it transparently in your work for transparency and ensuring replicability. +#' +#' This function takes the whole data object as an input, meaning that +#' everything counts when calculating the fixity checksum. If the dataset +#' column names are labeled, if the data itself is labeled, if stringsAsFactors +#' is TRUE, if flags are removed or kept, if data is somehow edited... all these +#' affect the calculated checksum. It is advisable to calculate the checksum +#' immediately after downloading the data, before adding any labels or doing +#' other mutating operations. If you are using other arguments than the default +#' ones when downloading data, it is also good to report the exact arguments +#' used. +#' +#' This implementation fulfills the level 1 requirement of National Digital +#' Stewardship Alliance (NDSA) preservation levels by creating "fixity info +#' if it wasn’t provided with the content". In the current version of the +#' package, fixity information has to be created manually and is at the +#' responsibility of the user. +#' +#' @param data_object A dataset downloaded with some eurostat package function. +#' @param algorithm Algorithm to use when calculating a checksum for a dataset. +#' Default is 'md5', but can be any supported algorithm in digest function. +#' +#' @seealso [digest::digest()] +#' @source https://www.dpconline.org/handbook/technical-solutions-and-tools/fixity-and-checksums +#' @importFrom digest digest +#' @keywords internal utilities +fixity_checksum <- function(data_object, algorithm = "md5") { + if (!(algorithm %in% c("md5", "sha1", "crc32", "sha256", "sha512", + "xxhash32", "xxhash64", "murmur32", "spookyhash", + "blake3", "crc32c"))) { + stop("Use a valid algorithm. See digest::digest function documentation") + } + + fixity <- digest::digest(data_object, algo = algorithm) + fixity +} diff --git a/README.Rmd b/README.Rmd index eda89676..e45d6ccb 100755 --- a/README.Rmd +++ b/README.Rmd @@ -27,7 +27,7 @@ knitr::opts_chunk$set( [![Watch on GitHub][github-watch-badge]][github-watch] [![Star on GitHub][github-star-badge]][github-star] -[![Follow](https://img.shields.io/twitter/follow/ropengov.svg?style=social)](https://twitter.com/intent/follow?screen_name=ropengov) +[![Follow](https://img.shields.io/twitter/follow/ropengov.svg?style=social)](https://twitter.com/ropengov) @@ -106,7 +106,13 @@ Contributions are very welcome: ### Acknowledgements -**Kindly cite this package** as follows: [Leo Lahti](https://github.com/antagomir), Przemyslaw Biecek, Markus Kainu and Janne Huovari. Retrieval and analysis of Eurostat open data with the eurostat package. [R Journal 9(1):385-392, 2017](https://journal.r-project.org/archive/2017/RJ-2017-019/index.html). R package version `r sessionInfo()$otherPkgs$eurostat$Version`. DOI: [10.32614/RJ-2017-019](https://doi.org/10.32614/RJ-2017-019). URL: [https://ropengov.github.io/eurostat/](https://ropengov.github.io/eurostat/) +**Kindly cite this package** by citing the following R Journal article: + +[Lahti L.](https://github.com/antagomir), Huovari J., Kainu M., and Biecek P. (2017). Retrieval and analysis of Eurostat open data with the eurostat package. [The R Journal 9(1), pp. 385-392](https://journal.r-project.org/archive/2017/RJ-2017-019/index.html). doi: [10.32614/RJ-2017-019](https://doi.org/10.32614/RJ-2017-019). + +In addition, please provide a citation to the specific software version used: + +Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data [Computer software]. R package version 4.0.0.9003. https://github.com/rOpenGov/eurostat We are grateful to all [contributors](https://github.com/ropengov/eurostat/graphs/contributors), including Daniel Antal, Joona Lehtomäki, Francois Briatte, and Oliver Reiter, and for the [Eurostat](https://ec.europa.eu/eurostat/) open data portal! This project is part of [rOpenGov](https://ropengov.org). diff --git a/README.md b/README.md index 3db706b6..77c3263d 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ version](http://www.r-pkg.org/badges/version/eurostat)](https://CRAN.R-project.o GitHub](https://img.shields.io/github/watchers/ropengov/eurostat.svg?style=social)](https://github.com/ropengov/eurostat/watchers) [![Star on GitHub](https://img.shields.io/github/stars/ropengov/eurostat.svg?style=social)](https://github.com/ropengov/eurostat/stargazers) -[![Follow](https://img.shields.io/twitter/follow/ropengov.svg?style=social)](https://twitter.com/intent/follow?screen_name=ropengov) +[![Follow](https://img.shields.io/twitter/follow/ropengov.svg?style=social)](https://twitter.com/ropengov) @@ -81,14 +81,14 @@ passengers <- search_eurostat("passenger transport") knitr::kable(head(passengers)) ``` -| title | code | type | last update of data | last table structure change | data start | data end | values | -|:---------------------------------------------------------------------------------------------|:-----------------|:--------|:--------------------|:----------------------------|:-----------|:---------|:-------| -| Air passenger transport | enps_avia_pa | dataset | 10.02.2022 | 10.02.2022 | 2005 | 2020 | NA | -| Modal split of air, sea and inland passenger transport | tran_hv_ms_psmod | dataset | 31.01.2023 | NA | 2008 | 2020 | NA | -| Modal split of inland passenger transport | tran_hv_psmod | dataset | 13.07.2022 | 13.07.2022 | 1990 | 2020 | NA | -| Volume of passenger transport relative to GDP | tran_hv_pstra | dataset | 13.07.2022 | 13.07.2022 | 1990 | 2020 | NA | -| Maritime passenger transport performed in the Exclusive Economic Zone (EEZ) of the countries | mar_tp_pa | dataset | 21.02.2023 | 21.02.2023 | 2005 | 2021 | NA | -| Air passenger transport by reporting country | avia_paoc | dataset | 13.02.2023 | 13.02.2023 | 1993 | 2022Q4 | NA | +| title | code | type | last.update.of.data | last.table.structure.change | data.start | data.end | values | hierarchy | +|:---------------------------------------------------------------------------------------------|:-----------------|:--------|:--------------------|:----------------------------|:-----------|:---------|--------:|----------:| +| Air passenger transport | enps_avia_pa | dataset | 13.03.2023 | 13.03.2023 | 2005 | 2021 | 406 | 6 | +| Modal split of air, sea and inland passenger transport | tran_hv_ms_psmod | dataset | 29.06.2023 | 29.06.2023 | 2008 | 2021 | 2100 | 4 | +| Modal split of inland passenger transport | tran_hv_psmod | dataset | 29.06.2023 | 29.06.2023 | 1990 | 2021 | 4219 | 4 | +| Volume of passenger transport relative to GDP | tran_hv_pstra | dataset | 11.08.2023 | 29.06.2023 | 1990 | 2021 | 969 | 4 | +| Maritime passenger transport performed in the Exclusive Economic Zone (EEZ) of the countries | mar_tp_pa | dataset | 21.02.2023 | 21.02.2023 | 2005 | 2021 | 1752 | 4 | +| Air passenger transport by reporting country | avia_paoc | dataset | 04.12.2023 | 28.11.2023 | 1993 | 2023-Q3 | 2482969 | 5 | See the [Tutorial](https://ropengov.github.io/eurostat/articles/articles/eurostat_tutorial.html) @@ -116,14 +116,21 @@ Contributions are very welcome: ### Acknowledgements -**Kindly cite this package** as follows: [Leo -Lahti](https://github.com/antagomir), Przemyslaw Biecek, Markus Kainu -and Janne Huovari. Retrieval and analysis of Eurostat open data with the -eurostat package. [R Journal 9(1):385-392, -2017](https://journal.r-project.org/archive/2017/RJ-2017-019/index.html). -R package version 3.7.15. DOI: -[10.32614/RJ-2017-019](https://doi.org/10.32614/RJ-2017-019). URL: - +**Kindly cite this package** by citing the following R Journal article: + +[Lahti L.](https://github.com/antagomir), Huovari J., Kainu M., and +Biecek P. (2017). Retrieval and analysis of Eurostat open data with the +eurostat package. [The R Journal 9(1), +pp. 385-392](https://journal.r-project.org/archive/2017/RJ-2017-019/index.html). +doi: [10.32614/RJ-2017-019](https://doi.org/10.32614/RJ-2017-019). + +In addition, please provide a citation to the specific software version +used: + +Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., +and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data +\[Computer software\]. R package version 4.0.0.9003. + We are grateful to all [contributors](https://github.com/ropengov/eurostat/graphs/contributors), diff --git a/data-raw/eurostat_geodata_60_2016.R b/data-raw/eurostat_geodata_60_2016.R new file mode 100644 index 00000000..46f0254f --- /dev/null +++ b/data-raw/eurostat_geodata_60_2016.R @@ -0,0 +1,35 @@ +## code to prepare `eurostat_geodata_60_2016` dataset goes here +library(giscoR) +library(tidyverse) + +# Current names internal) +from_gisco <- gisco_get_nuts( + year = 2016, resolution = 60, + epsg = 4326, update_cache = TRUE, + verbose = TRUE +) + +from_gisco$geo <- from_gisco$NUTS_ID +from_gisco$id <- from_gisco$NUTS_ID + +# End + +eurostat_geodata_60_2016 <- from_gisco +unique(sf::st_is_valid(from_gisco)) + +# Sort by level and alphabetically +eurostat_geodata_60_2016 <- eurostat_geodata_60_2016 %>% + arrange(LEVL_CODE, NUTS_ID) + +# Arrange names in proper order +sfcol <- attr(eurostat_geodata_60_2016, "sf_column") +rest <- c( + "id", "LEVL_CODE", "NUTS_ID", "CNTR_CODE", "NAME_LATN", + "NUTS_NAME", "MOUNT_TYPE", "URBN_TYPE", "COAST_TYPE", + "FID", "geo" +) + +reorder <- intersect(unique(c(rest, sfcol)), names(eurostat_geodata_60_2016)) +eurostat_geodata_60_2016 <- eurostat_geodata_60_2016[, reorder] + +usethis::use_data(eurostat_geodata_60_2016, overwrite = TRUE, compress = "xz") diff --git a/data-raw/nuts_coding.R b/data-raw/nuts_coding.R index 09fca141..80803208 100755 --- a/data-raw/nuts_coding.R +++ b/data-raw/nuts_coding.R @@ -13,7 +13,7 @@ download.file( regional_changes_2016 <- readxl::read_excel(tf, sheet = "NUTS2013-NUTS2016", - skip = 1, col_names = T + skip = 1, col_names = TRUE ) %>% select(1:12) %>% purrr::set_names(., c( @@ -34,7 +34,7 @@ regional_changes_2016 <- readxl::read_excel(tf, nuts1_correspondence <- readxl::read_excel( tf, sheet = "Correspondence NUTS-1", - skip = 0, col_names = T + skip = 0, col_names = TRUE ) %>% purrr::set_names(., c( "code13", "code16", @@ -50,7 +50,7 @@ warning("FR7 - Centre-Est appears to be an errorneous line and it is removed fro nuts2_correspondence <- readxl::read_excel( tf, sheet = "Correspondence NUTS-2", - skip = 0, col_names = T + skip = 0, col_names = TRUE ) %>% select(1:5) %>% purrr::set_names(., c( @@ -64,7 +64,7 @@ nuts2_correspondence <- readxl::read_excel( nuts3_correspondence <- readxl::read_excel( tf, sheet = "Correspondence NUTS-3", - skip = 0, col_names = T + skip = 0, col_names = TRUE ) %>% select(1:5) %>% purrr::set_names(., c( diff --git a/data/eurostat_geodata_60_2016.rda b/data/eurostat_geodata_60_2016.rda index 1ff1c9c8..0e453269 100644 Binary files a/data/eurostat_geodata_60_2016.rda and b/data/eurostat_geodata_60_2016.rda differ diff --git a/docs/articles/vignette_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/vignette_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100755 index ca349fd6..00000000 --- a/docs/articles/vignette_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/vignette_files/header-attrs-2.6.4/header-attrs.js b/docs/articles/vignette_files/header-attrs-2.6.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/vignette_files/header-attrs-2.6.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/vignette_files/header-attrs-2.7.12/header-attrs.js b/docs/articles/vignette_files/header-attrs-2.7.12/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/vignette_files/header-attrs-2.7.12/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/vignette_files/header-attrs-2.8.4/header-attrs.js b/docs/articles/vignette_files/header-attrs-2.8.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/vignette_files/header-attrs-2.8.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/vignette_files/header-attrs-2.8/header-attrs.js b/docs/articles/vignette_files/header-attrs-2.8/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/vignette_files/header-attrs-2.8/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/blogposts_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/website/blogposts_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100755 index ca349fd6..00000000 --- a/docs/articles/website/blogposts_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/website/blogposts_files/header-attrs-2.6.4/header-attrs.js b/docs/articles/website/blogposts_files/header-attrs-2.6.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/blogposts_files/header-attrs-2.6.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/blogposts_files/header-attrs-2.7.12/header-attrs.js b/docs/articles/website/blogposts_files/header-attrs-2.7.12/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/blogposts_files/header-attrs-2.7.12/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/blogposts_files/header-attrs-2.8.4/header-attrs.js b/docs/articles/website/blogposts_files/header-attrs-2.8.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/blogposts_files/header-attrs-2.8.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/blogposts_files/header-attrs-2.8/header-attrs.js b/docs/articles/website/blogposts_files/header-attrs-2.8/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/blogposts_files/header-attrs-2.8/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/cheatsheet_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/website/cheatsheet_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100755 index ca349fd6..00000000 --- a/docs/articles/website/cheatsheet_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/website/cheatsheet_files/header-attrs-2.6.4/header-attrs.js b/docs/articles/website/cheatsheet_files/header-attrs-2.6.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/cheatsheet_files/header-attrs-2.6.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/cheatsheet_files/header-attrs-2.7.12/header-attrs.js b/docs/articles/website/cheatsheet_files/header-attrs-2.7.12/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/cheatsheet_files/header-attrs-2.7.12/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/cheatsheet_files/header-attrs-2.8.4/header-attrs.js b/docs/articles/website/cheatsheet_files/header-attrs-2.8.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/cheatsheet_files/header-attrs-2.8.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/cheatsheet_files/header-attrs-2.8/header-attrs.js b/docs/articles/website/cheatsheet_files/header-attrs-2.8/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/cheatsheet_files/header-attrs-2.8/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/eurostat_tutorial_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/website/eurostat_tutorial_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100755 index ca349fd6..00000000 --- a/docs/articles/website/eurostat_tutorial_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/website/eurostat_tutorial_files/header-attrs-2.6.4/header-attrs.js b/docs/articles/website/eurostat_tutorial_files/header-attrs-2.6.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/eurostat_tutorial_files/header-attrs-2.6.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/eurostat_tutorial_files/header-attrs-2.7.12/header-attrs.js b/docs/articles/website/eurostat_tutorial_files/header-attrs-2.7.12/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/eurostat_tutorial_files/header-attrs-2.7.12/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/eurostat_tutorial_files/header-attrs-2.8.4/header-attrs.js b/docs/articles/website/eurostat_tutorial_files/header-attrs-2.8.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/eurostat_tutorial_files/header-attrs-2.8.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/eurostat_tutorial_files/header-attrs-2.8/header-attrs.js b/docs/articles/website/eurostat_tutorial_files/header-attrs-2.8/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/eurostat_tutorial_files/header-attrs-2.8/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/mapping.html b/docs/articles/website/mapping.html deleted file mode 100755 index 09f8b801..00000000 --- a/docs/articles/website/mapping.html +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - - -Mapping Regional Data, Mapping Metadata Problems • eurostat - - - - - - - - - - -
-
- - - - -
-
- - - - -
-

-Mapping Regional Data, Mapping Metadata Problems

-

The regions package offers tools two work with regional statistics. It is an offspring of the eurostat package of rOpenGov, which offers data search, download, manipulation and visualization for Eurostat’s European statistics. While you can use regions for any European regional statistics, and with a limited functionality, any regional statistics from other parts of the world, this article provides a combined use case for the two packages.

-

Eurostat’s main function for data access is get_eurostat(), but in this case we will use the more specific get_eurostat_json to avoid downloading unnecessary aspects of this data product. Let us get a long-established regional dataset, the full-time equivalent (FTE) R&D workforce, in both sexes, in all sectors and all professional positions, and limit our data to two years only:

-
-regional_rd_personnel <- eurostat::get_eurostat_json (
-  id = "rd_p_persreg", 
-  filters = list (
-    sex = "T",     
-    prof_pos = "TOTAL",
-    sectperf = "TOTAL", 
-    unit = "FTE" )
-)
-
-regional_rd_personnel <- regional_rd_personnel %>%
-  filter ( .data$time %in% c("2009", "2018") ) 
-

We have saved this filtered datasets as regional_rd_personnel in the regions package.

-
-data("regional_rd_personnel")
-

We have quiet a few missing cases:

-
-summary(is.na(regional_rd_personnel$values))
-#>    Mode   FALSE    TRUE 
-#> logical     673     283
-

But this is not the only problem with the dataset.

-
-

-Choropleth Map

-

Let us try to place the data on a ggplot2 map.

-

Let us download a map with get_eurostat_geospatial. We will use the NUTS2016, i.e., year = 2016, which is the regional boundary definition set in 2016 and used in the period 2018-2020. This is the most used definition in 2021.

-
-map_nuts_2 <- eurostat::get_eurostat_geospatial(
-  resolution = "60",
-  nuts_level = "2",
-  year = 2016)
-

You should always join your data with the geometric information of the regions starting from left with the map:

-
-indicator_with_map <- map_nuts_2 %>% 
-  left_join ( regional_rd_personnel, by = "geo" ) 
-

Huge parts of Europe are not covered, but the missing values are not randomly missing. France went under a regional reform; Turkey and Albania did not provide this data earlier. Ireland has no regional statistics available.

-
-indicator_with_map  %>%
-  ggplot () +
-  geom_sf(aes(fill=values),
-          color="dim grey", size=.1) + 
-  scale_fill_gradient( low ="#FAE000", high = "#00843A") +
-  facet_wrap ( facets = "time") +
-  labs(title="R&D Personnel & Researchers",
-       subtitle = "In all sectors, both sexes by NUTS 2 regions",
-       caption="\ua9 EuroGeographics for the administrative boundaries 
-                \ua9 Tutorial and ready-to-use data on economy.dataobservatory.eu", 
-       fill = NULL) +
-  theme_light() + 
-  theme(legend.position="none") +
-  coord_sf(xlim=c(-22,48), ylim=c(34,70))
-

-
-
-

-Missing Values and Seemingly Missing Values

-

Some of these problems are real missing data problems, but some of them are coding problem. In other words, the data is there, but it is not conforming the boundaries that you have on the NUTS2016 map. First we need to validate the geographical coding of the dataset. This is the task of validate_nuts_regions().

-
-validated_indicator <- regions::validate_nuts_regions(regional_rd_personnel)
-

If we validate the dataset, we will see many interesting metadata observations.

-
-library(dplyr)
-validation_summary_2016 <- validated_indicator %>%
-  group_by ( .data$time, .data$typology) %>%
-  summarize ( observations = n(),
-              values_missing = sum(is.na(.data$values)), 
-              values_present = sum(!is.na(.data$values)), 
-              valid_present = values_present /observations)
-

Even though the dataset is called R&D personnel and researchers by sector of performance, sex and NUTS 2 regions \[rd_p_persreg\], in fact, it contains data on country and NUTS1 levels. And it has data on non-EU countries that in 2009 were not part of the NUTS system.

-
-validation_summary_2016  %>%
-  ungroup() %>%
-  filter (.data$time == "2009")
-#> # A tibble: 7 × 6
-#>   time  typology            observations values_missing values_present valid_present
-#>   <chr> <chr>                      <int>          <int>          <int>         <dbl>
-#> 1 2009  country                       28              1             27         0.964
-#> 2 2009  non_eu_country                 7              2              5         0.714
-#> 3 2009  non_eu_nuts_level_1            7              4              3         0.429
-#> 4 2009  non_eu_nuts_level_2           10              5              5         0.5  
-#> 5 2009  nuts_level_1                 105             14             91         0.867
-#> 6 2009  nuts_level_2                 265             49            216         0.815
-#> 7 2009  <NA>                          56              3             53         0.946
-

The situation is not better in 2018:

-
-validation_summary_2016  %>%
-  ungroup() %>%
-  filter (.data$time == "2018")
-#> # A tibble: 7 × 6
-#>   time  typology            observations values_missing values_present valid_present
-#>   <chr> <chr>                      <int>          <int>          <int>         <dbl>
-#> 1 2018  country                       28              0             28         1    
-#> 2 2018  non_eu_country                 7              1              6         0.857
-#> 3 2018  non_eu_nuts_level_1            7              1              6         0.857
-#> 4 2018  non_eu_nuts_level_2           10              0             10         1    
-#> 5 2018  nuts_level_1                 105             45             60         0.571
-#> 6 2018  nuts_level_2                 265            113            152         0.574
-#> 7 2018  <NA>                          56             45             11         0.196
-

The dataset is plagued with data that has no place in the NUTS2016 boundary definition, and therefore on a NUTS2016 map!

-

What are the non-conforming bits?

-
- validated_indicator %>%
-  filter ( ! .data$valid_2016 ) %>%
-  select ( all_of("geo") ) %>% 
-  unlist %>% as.character()
-#>   [1] "BA"        "BA"        "CN_X_HK"   "CN_X_HK"   "EA19"      "EA19"     
-#>   [7] "EU27_2020" "EU27_2020" "EU28"      "EU28"      "FR2"       "FR2"      
-#>  [13] "FR21"      "FR21"      "FR22"      "FR22"      "FR23"      "FR23"     
-#>  [19] "FR24"      "FR24"      "FR25"      "FR25"      "FR26"      "FR26"     
-#>  [25] "FR3"       "FR3"       "FR30"      "FR30"      "FR4"       "FR4"      
-#>  [31] "FR41"      "FR41"      "FR42"      "FR42"      "FR43"      "FR43"     
-#>  [37] "FR5"       "FR5"       "FR51"      "FR51"      "FR52"      "FR52"     
-#>  [43] "FR53"      "FR53"      "FR6"       "FR6"       "FR61"      "FR61"     
-#>  [49] "FR62"      "FR62"      "FR63"      "FR63"      "FR7"       "FR7"      
-#>  [55] "FR71"      "FR71"      "FR72"      "FR72"      "FR8"       "FR8"      
-#>  [61] "FR81"      "FR81"      "FR82"      "FR82"      "FR83"      "FR83"     
-#>  [67] "FRA"       "FRA"       "HR02"      "HR02"      "HU10"      "HU10"     
-#>  [73] "IE01"      "IE01"      "IE02"      "IE02"      "JP"        "JP"       
-#>  [79] "KR"        "KR"        "LT00"      "LT00"      "NO01"      "NO01"     
-#>  [85] "NO03"      "NO03"      "NO04"      "NO04"      "NO05"      "NO05"     
-#>  [91] "PL1"       "PL1"       "PL11"      "PL11"      "PL12"      "PL12"     
-#>  [97] "PL3"       "PL3"       "PL31"      "PL31"      "PL32"      "PL32"     
-#> [103] "PL33"      "PL33"      "PL34"      "PL34"      "RU"        "RU"       
-#> [109] "UKM2"      "UKM2"      "UKM3"      "UKM3"
-
    -
  • Plenty of French units. France went under a regional administrative reform, and we have data about its past, but not in the current boundaries and coding.
  • -
  • To a lesser extent, we have the same problem with Poland and the UK.
  • -
  • We have comparative data from Asia on country level, which ended up in a regional dataset.
  • -
  • We have Norway, which is a member of the EEA, and from 2021 it is officially part of the NUTS2021 system. They were nice to provide their data consistently for the past.
  • -
  • We have aggregates like the entire EU or the eurozone.
  • -
-
-
-

-Recoding and Renaming

-

The question is, can we save some of the French data? If the boundaries of regions changed, then we cannot: somebody must reaggregate the number of researchers who used to work in the newly defined region back then, before the reform.

-

But in some cases, the regional boundaries did not change, only the name and the code of the region, which is the task performed by recode_nuts():

-
-recoded_indicator <- regional_rd_personnel %>% 
-  regions::recode_nuts(
-    geo_var = "geo", # your geograhical ID variable name
-    nuts_year = 2016 # change this for other definitions
-    )
-
-recoding_summary <- recoded_indicator %>%
-  mutate ( observations  = nrow(.data)) %>%
-  mutate ( typology_change = ifelse ( grepl("Recoded", .data$typology_change), 
-                                      yes = "Recoded", 
-                                      no = .data$typology_change) ) %>%
-  group_by ( .data$typology_change, .data$time ) %>%
-  summarize ( values_missing = sum(is.na(.data$values)), 
-              values_present = sum(!is.na(.data$values)), 
-              pct = values_present / (values_present + values_missing ))
-

Let us take a look at the problems identified by regions::recode_nuts():

-
-recoding_summary 
-#> # A tibble: 12 × 5
-#> # Groups:   typology_change [6]
-#>    typology_change        time  values_missing values_present   pct
-#>    <chr>                  <chr>          <int>          <int> <dbl>
-#>  1 Not found in NUTS      2009               1             11 0.917
-#>  2 Not found in NUTS      2018               1             11 0.917
-#>  3 Recoded                2009              12             42 0.778
-#>  4 Recoded                2018              32             22 0.407
-#>  5 unchanged              2009              64            334 0.839
-#>  6 unchanged              2018             158            240 0.603
-#>  7 Used in NUTS 1999-2013 2009               1              7 0.875
-#>  8 Used in NUTS 1999-2013 2018               8              0 0    
-#>  9 Used in NUTS 2006-2013 2009               0              5 1    
-#> 10 Used in NUTS 2006-2013 2018               5              0 0    
-#> 11 Used in NUTS 2021-2021 2009               0              1 1    
-#> 12 Used in NUTS 2021-2021 2018               1              0 0
-
    -
  • We were able to recode quite a few data points to the NUTS2016 definition for the time of observation 2009 as well as 2018. Sometimes we are recoding rows that have missing values, which does not help that much: we know where the data should be, but it is missing anyway. But particularly for the year 2009 we can save plenty of data by recorded the obsolete coding.

  • -
  • We identify further problems. We have coding the that was used in various time periods, but there is no clear recoding possibility, because the regions boundaries have changed. To have the history of the data, we would need to recalculate them, say, by adding up the R&D personnel from each settlement in the new regional boundary.

  • -
-

The following non-empty cases were present in the dataset, just not with the coding that we used in the 2018-2020 period (i.e., the NUTS2016 coding.) We are able to save 27 observations just by fixing the regional codes!

-
-recoded_indicator %>%
-  filter ( .data$typology == "nuts_level_2" ) %>%
-  filter ( !is.na(.data$typology_change) )  %>%
-  filter ( 
-    # Keep only pairs where we actually save 
-    # non-missing observations
-    !is.na(values) ) %>%
-  distinct ( .data$geo, .data$code_2016 ) %>%
-  filter ( 
-    # We filter out cases of countries who 
-    # joined the NUTS system later
-    .data$geo != .data$code_2016 )
-#> # A tibble: 27 × 2
-#>    geo   code_2016
-#>    <chr> <chr>    
-#>  1 FR21  FRF2     
-#>  2 FR22  FRE2     
-#>  3 FR23  FRD2     
-#>  4 FR24  FRB0     
-#>  5 FR25  FRD1     
-#>  6 FR26  FRC1     
-#>  7 FR3   FRE1     
-#>  8 FR30  FRE1     
-#>  9 FR41  FRF3     
-#> 10 FR42  FRF1     
-#> # … with 17 more rows
-

So, let us do the trick: change the geo variable to code_2016, which is, whenever there is an equivalent geo code in the NUTS2016 definition, the data that you should have. Your original geo variable contains codes that were used, for example, in the NUTS2010 or NUTS2013 boundary definitions.

-
-recoded_with_map <- map_nuts_2 %>% 
-  left_join ( 
-    recoded_indicator %>%
-      mutate (geo = .data$code_2016),
-    by = "geo"  ) 
-

Let us make our work visible by creating three observation type variables:

-
    -
  • -missing which is not present in the dataset;
  • -
  • -before which were correctly coded before our recoding;
  • -
  • -after which became visible after recoding.
  • -
-
-regional_rd_personnel_recoded <- recoded_indicator %>%
-  mutate ( geo = .data$code_2016 ) %>%
-  rename ( values_2016 = .data$values ) %>%
-  select ( -all_of(c("typology", "typology_change", "code_2016"))) %>%
-  full_join ( 
-    regional_rd_personnel, 
-    by = c("prof_pos", "sex", "sectperf", "unit", "geo", "time")
-             ) %>%
-  mutate ( type = case_when ( 
-    is.na(.data$values_2016) & is.na(.data$values) ~ "missing",
-    is.na(.data$values) ~ "after",
-    TRUE ~ "before"
-    ))
-

And let’s place it now on the map:

-
-map_nuts_2 %>% 
-  left_join ( regional_rd_personnel_recoded , by = "geo") %>%
-  filter ( 
-    # remove completely missing cases
-    !is.na(.data$time) ) %>%
-  ggplot () +
-  geom_sf(aes(fill=type),
-          color="dim grey", size=.1) + 
-  scale_fill_manual ( values = c( "#FAE000", "#007CBB", "grey70") ) +
-  guides(fill = guide_legend(reverse=T, title = NULL)) +
-  facet_wrap ( facets = "time") +
-  labs(title="R&D Personnel & Researchers",
-       subtitle = "In all sectors, both sexes by NUTS 2 regions",
-       caption="\ua9 EuroGeographics for the administrative boundaries 
-                \ua9 Daniel Antal, rOpenGov", 
-       fill = NULL) +
-  theme_light() + 
-  theme(legend.position=c(.93,.7)) +
-  coord_sf(xlim=c(-22,48), ylim=c(34,70))
-

-
-
-

-Conclusion

-

We did improve our dataset, and this improvement would not have worked with traditional imputation techniques very well. For example, replacing the missing French data with the median value of Europe would have created a huge bias in our dataset.

-

This example is a simplification. There are many territorial typologies in use in Europe and globally, but the main takeaway is clear: sub-national boundaries are changing very fast, and you must make sure that you join datasets, or data with a map with the same boundary definitions.

-
-
- -
-

-Version info

-

This tutorial was created with

-
-sessionInfo()
-#> R version 4.1.0 (2021-05-18)
-#> Platform: x86_64-pc-linux-gnu (64-bit)
-#> Running under: Ubuntu 21.04
-#> 
-#> Matrix products: default
-#> BLAS:   /home/lemila/bin/R-4.1.0/lib/libRblas.so
-#> LAPACK: /home/lemila/bin/R-4.1.0/lib/libRlapack.so
-#> 
-#> locale:
-#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
-#>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
-#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
-#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
-#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
-#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
-#> 
-#> attached base packages:
-#> [1] stats     graphics  grDevices utils     datasets  methods   base     
-#> 
-#> other attached packages:
-#> [1] ggplot2_3.3.5  dplyr_1.0.7    eurostat_3.7.7 regions_0.1.8 
-#> 
-#> loaded via a namespace (and not attached):
-#>  [1] Rcpp_1.0.7         lubridate_1.7.10   here_1.0.1         countrycode_1.3.0 
-#>  [5] tidyr_1.1.3        class_7.3-19       assertthat_0.2.1   rprojroot_2.0.2   
-#>  [9] digest_0.6.27      utf8_1.2.2         R6_2.5.0           cellranger_1.1.0  
-#> [13] plyr_1.8.6         backports_1.2.1    evaluate_0.14      e1071_1.7-8       
-#> [17] highr_0.9          httr_1.4.2         pillar_1.6.2       rlang_0.4.11      
-#> [21] curl_4.3.2         readxl_1.3.1       jquerylib_0.1.4    rmarkdown_2.10    
-#> [25] pkgdown_1.6.1      textshaping_0.3.4  desc_1.3.0         RefManageR_1.3.0  
-#> [29] readr_2.0.1        stringr_1.4.0      munsell_0.5.0      proxy_0.4-26      
-#> [33] broom_0.7.9        compiler_4.1.0     xfun_0.25          pkgconfig_2.0.3   
-#> [37] systemfonts_1.0.2  htmltools_0.5.1.1  tidyselect_1.1.1   tibble_3.1.3      
-#> [41] fansi_0.5.0        withr_2.4.2        crayon_1.4.1       tzdb_0.1.2        
-#> [45] grid_4.1.0         gtable_0.3.0       jsonlite_1.7.2     lifecycle_1.0.0   
-#> [49] DBI_1.1.1          magrittr_2.0.1     scales_1.1.1       KernSmooth_2.23-20
-#> [53] cli_3.0.1          stringi_1.7.3      cachem_1.0.5       fs_1.5.0          
-#> [57] xml2_1.3.2         bslib_0.2.5.1      ellipsis_0.3.2     ragg_1.1.2        
-#> [61] generics_0.1.0     vctrs_0.3.8        tools_4.1.0        glue_1.4.2        
-#> [65] purrr_0.3.4        hms_1.1.0          fastmap_1.1.0      yaml_2.2.1        
-#> [69] colorspace_2.0-2   classInt_0.4-3     memoise_2.0.0      knitr_1.33        
-#> [73] sass_0.4.0
-
-
- - - -
- - - -
- -
-

Site built with pkgdown 1.6.1.

-
- -
-
- - - - - - diff --git a/docs/articles/website/mapping_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/website/mapping_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100755 index ca349fd6..00000000 --- a/docs/articles/website/mapping_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/website/mapping_files/header-attrs-2.8.4/header-attrs.js b/docs/articles/website/mapping_files/header-attrs-2.8.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/mapping_files/header-attrs-2.8.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/maps_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/website/maps_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100755 index ca349fd6..00000000 --- a/docs/articles/website/maps_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/website/maps_files/header-attrs-2.6.4/header-attrs.js b/docs/articles/website/maps_files/header-attrs-2.6.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/maps_files/header-attrs-2.6.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/maps_files/header-attrs-2.7.12/header-attrs.js b/docs/articles/website/maps_files/header-attrs-2.7.12/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/maps_files/header-attrs-2.7.12/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/maps_files/header-attrs-2.8.4/header-attrs.js b/docs/articles/website/maps_files/header-attrs-2.8.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/maps_files/header-attrs-2.8.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/maps_files/header-attrs-2.8/header-attrs.js b/docs/articles/website/maps_files/header-attrs-2.8/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/maps_files/header-attrs-2.8/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/publications_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/website/publications_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100755 index ca349fd6..00000000 --- a/docs/articles/website/publications_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/website/publications_files/header-attrs-2.6.4/header-attrs.js b/docs/articles/website/publications_files/header-attrs-2.6.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/publications_files/header-attrs-2.6.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/publications_files/header-attrs-2.7.12/header-attrs.js b/docs/articles/website/publications_files/header-attrs-2.7.12/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/publications_files/header-attrs-2.7.12/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/publications_files/header-attrs-2.8.4/header-attrs.js b/docs/articles/website/publications_files/header-attrs-2.8.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/publications_files/header-attrs-2.8.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/publications_files/header-attrs-2.8/header-attrs.js b/docs/articles/website/publications_files/header-attrs-2.8/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/publications_files/header-attrs-2.8/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/regional_data_files/accessible-code-block-0.0.1/empty-anchor.js b/docs/articles/website/regional_data_files/accessible-code-block-0.0.1/empty-anchor.js deleted file mode 100755 index ca349fd6..00000000 --- a/docs/articles/website/regional_data_files/accessible-code-block-0.0.1/empty-anchor.js +++ /dev/null @@ -1,15 +0,0 @@ -// Hide empty tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) --> -// v0.0.1 -// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020. - -document.addEventListener('DOMContentLoaded', function() { - const codeList = document.getElementsByClassName("sourceCode"); - for (var i = 0; i < codeList.length; i++) { - var linkList = codeList[i].getElementsByTagName('a'); - for (var j = 0; j < linkList.length; j++) { - if (linkList[j].innerHTML === "") { - linkList[j].setAttribute('aria-hidden', 'true'); - } - } - } -}); diff --git a/docs/articles/website/regional_data_files/header-attrs-2.6.4/header-attrs.js b/docs/articles/website/regional_data_files/header-attrs-2.6.4/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/regional_data_files/header-attrs-2.6.4/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/regional_data_files/header-attrs-2.7.12/header-attrs.js b/docs/articles/website/regional_data_files/header-attrs-2.7.12/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/regional_data_files/header-attrs-2.7.12/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/articles/website/regional_data_files/header-attrs-2.8/header-attrs.js b/docs/articles/website/regional_data_files/header-attrs-2.8/header-attrs.js deleted file mode 100755 index dd57d92e..00000000 --- a/docs/articles/website/regional_data_files/header-attrs-2.8/header-attrs.js +++ /dev/null @@ -1,12 +0,0 @@ -// Pandoc 2.9 adds attributes on both header and div. We remove the former (to -// be compatible with the behavior of Pandoc < 2.8). -document.addEventListener('DOMContentLoaded', function(e) { - var hs = document.querySelectorAll("div.section[class*='level'] > :first-child"); - var i, h, a; - for (i = 0; i < hs.length; i++) { - h = hs[i]; - if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6 - a = h.attributes; - while (a.length > 0) h.removeAttribute(a[0].name); - } -}); diff --git a/docs/pkgdown.css b/docs/pkgdown.css deleted file mode 100755 index 1273238d..00000000 --- a/docs/pkgdown.css +++ /dev/null @@ -1,367 +0,0 @@ -/* Sticky footer */ - -/** - * Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/ - * Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css - * - * .Site -> body > .container - * .Site-content -> body > .container .row - * .footer -> footer - * - * Key idea seems to be to ensure that .container and __all its parents__ - * have height set to 100% - * - */ - -html, body { - height: 100%; -} - -body { - position: relative; -} - -body > .container { - display: flex; - height: 100%; - flex-direction: column; -} - -body > .container .row { - flex: 1 0 auto; -} - -footer { - margin-top: 45px; - padding: 35px 0 36px; - border-top: 1px solid #e5e5e5; - color: #666; - display: flex; - flex-shrink: 0; -} -footer p { - margin-bottom: 0; -} -footer div { - flex: 1; -} -footer .pkgdown { - text-align: right; -} -footer p { - margin-bottom: 0; -} - -img.icon { - float: right; -} - -img { - max-width: 100%; -} - -/* Fix bug in bootstrap (only seen in firefox) */ -summary { - display: list-item; -} - -/* Typographic tweaking ---------------------------------*/ - -.contents .page-header { - margin-top: calc(-60px + 1em); -} - -dd { - margin-left: 3em; -} - -/* Section anchors ---------------------------------*/ - -a.anchor { - margin-left: -30px; - display:inline-block; - width: 30px; - height: 30px; - visibility: hidden; - - background-image: url(./link.svg); - background-repeat: no-repeat; - background-size: 20px 20px; - background-position: center center; -} - -.hasAnchor:hover a.anchor { - visibility: visible; -} - -@media (max-width: 767px) { - .hasAnchor:hover a.anchor { - visibility: hidden; - } -} - - -/* Fixes for fixed navbar --------------------------*/ - -.contents h1, .contents h2, .contents h3, .contents h4 { - padding-top: 60px; - margin-top: -40px; -} - -/* Navbar submenu --------------------------*/ - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu>.dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover>.dropdown-menu { - display: block; -} - -.dropdown-submenu>a:after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #cccccc; - margin-top: 5px; - margin-right: -10px; -} - -.dropdown-submenu:hover>a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left>.dropdown-menu { - left: -100%; - margin-left: 10px; - border-radius: 6px 0 6px 6px; -} - -/* Sidebar --------------------------*/ - -#pkgdown-sidebar { - margin-top: 30px; - position: -webkit-sticky; - position: sticky; - top: 70px; -} - -#pkgdown-sidebar h2 { - font-size: 1.5em; - margin-top: 1em; -} - -#pkgdown-sidebar h2:first-child { - margin-top: 0; -} - -#pkgdown-sidebar .list-unstyled li { - margin-bottom: 0.5em; -} - -/* bootstrap-toc tweaks ------------------------------------------------------*/ - -/* All levels of nav */ - -nav[data-toggle='toc'] .nav > li > a { - padding: 4px 20px 4px 6px; - font-size: 1.5rem; - font-weight: 400; - color: inherit; -} - -nav[data-toggle='toc'] .nav > li > a:hover, -nav[data-toggle='toc'] .nav > li > a:focus { - padding-left: 5px; - color: inherit; - border-left: 1px solid #878787; -} - -nav[data-toggle='toc'] .nav > .active > a, -nav[data-toggle='toc'] .nav > .active:hover > a, -nav[data-toggle='toc'] .nav > .active:focus > a { - padding-left: 5px; - font-size: 1.5rem; - font-weight: 400; - color: inherit; - border-left: 2px solid #878787; -} - -/* Nav: second level (shown on .active) */ - -nav[data-toggle='toc'] .nav .nav { - display: none; /* Hide by default, but at >768px, show it */ - padding-bottom: 10px; -} - -nav[data-toggle='toc'] .nav .nav > li > a { - padding-left: 16px; - font-size: 1.35rem; -} - -nav[data-toggle='toc'] .nav .nav > li > a:hover, -nav[data-toggle='toc'] .nav .nav > li > a:focus { - padding-left: 15px; -} - -nav[data-toggle='toc'] .nav .nav > .active > a, -nav[data-toggle='toc'] .nav .nav > .active:hover > a, -nav[data-toggle='toc'] .nav .nav > .active:focus > a { - padding-left: 15px; - font-weight: 500; - font-size: 1.35rem; -} - -/* orcid ------------------------------------------------------------------- */ - -.orcid { - font-size: 16px; - color: #A6CE39; - /* margins are required by official ORCID trademark and display guidelines */ - margin-left:4px; - margin-right:4px; - vertical-align: middle; -} - -/* Reference index & topics ----------------------------------------------- */ - -.ref-index th {font-weight: normal;} - -.ref-index td {vertical-align: top; min-width: 100px} -.ref-index .icon {width: 40px;} -.ref-index .alias {width: 40%;} -.ref-index-icons .alias {width: calc(40% - 40px);} -.ref-index .title {width: 60%;} - -.ref-arguments th {text-align: right; padding-right: 10px;} -.ref-arguments th, .ref-arguments td {vertical-align: top; min-width: 100px} -.ref-arguments .name {width: 20%;} -.ref-arguments .desc {width: 80%;} - -/* Nice scrolling for wide elements --------------------------------------- */ - -table { - display: block; - overflow: auto; -} - -/* Syntax highlighting ---------------------------------------------------- */ - -pre { - word-wrap: normal; - word-break: normal; - border: 1px solid #eee; -} - -pre, code { - background-color: #f8f8f8; - color: #333; -} - -pre code { - overflow: auto; - word-wrap: normal; - white-space: pre; -} - -pre .img { - margin: 5px 0; -} - -pre .img img { - background-color: #fff; - display: block; - height: auto; -} - -code a, pre a { - color: #375f84; -} - -a.sourceLine:hover { - text-decoration: none; -} - -.fl {color: #1514b5;} -.fu {color: #000000;} /* function */ -.ch,.st {color: #036a07;} /* string */ -.kw {color: #264D66;} /* keyword */ -.co {color: #888888;} /* comment */ - -.message { color: black; font-weight: bolder;} -.error { color: orange; font-weight: bolder;} -.warning { color: #6A0366; font-weight: bolder;} - -/* Clipboard --------------------------*/ - -.hasCopyButton { - position: relative; -} - -.btn-copy-ex { - position: absolute; - right: 0; - top: 0; - visibility: hidden; -} - -.hasCopyButton:hover button.btn-copy-ex { - visibility: visible; -} - -/* headroom.js ------------------------ */ - -.headroom { - will-change: transform; - transition: transform 200ms linear; -} -.headroom--pinned { - transform: translateY(0%); -} -.headroom--unpinned { - transform: translateY(-100%); -} - -/* mark.js ----------------------------*/ - -mark { - background-color: rgba(255, 255, 51, 0.5); - border-bottom: 2px solid rgba(255, 153, 51, 0.3); - padding: 1px; -} - -/* vertical spacing after htmlwidgets */ -.html-widget { - margin-bottom: 10px; -} - -/* fontawesome ------------------------ */ - -.fab { - font-family: "Font Awesome 5 Brands" !important; -} - -/* don't display links in code chunks when printing */ -/* source: https://stackoverflow.com/a/10781533 */ -@media print { - code a:link:after, code a:visited:after { - content: ""; - } -} diff --git a/docs/sitemap.xml b/docs/sitemap.xml deleted file mode 100755 index 74e6ec4d..00000000 --- a/docs/sitemap.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - /404.html - - - /LICENSE-text.html - - - /articles/index.html - - - /articles/vignette.html - - - /articles/website/blogposts.html - - - /articles/website/cheatsheet.html - - - /articles/website/eurostat_tutorial.html - - - /articles/website/maps.html - - - /articles/website/publications.html - - - /articles/website/regional_data.html - - - /authors.html - - - /index.html - - - /reference/add_nuts_level.html - - - /reference/check_access_to_data.html - - - /reference/clean_eurostat_cache.html - - - /reference/convert_time_col.html - - - /reference/cut_to_classes.html - - - /reference/dic_order.html - - - /reference/eu_countries.html - - - /reference/eurostat-package.html - - - /reference/eurostat_geodata_60_2016.html - - - /reference/eurotime2date.html - - - /reference/eurotime2num.html - - - /reference/get_bibentry.html - - - /reference/get_eurostat.html - - - /reference/get_eurostat_dic.html - - - /reference/get_eurostat_geospatial.html - - - /reference/get_eurostat_json.html - - - /reference/get_eurostat_raw.html - - - /reference/get_eurostat_toc.html - - - /reference/harmonize_country_code.html - - - /reference/harmonize_geo_code.html - - - /reference/index.html - - - /reference/label_eurostat.html - - - /reference/nuts_correspondence.html - - - /reference/recode_to_nuts_2013.html - - - /reference/recode_to_nuts_2016.html - - - /reference/regional_changes_2016.html - - - /reference/search_eurostat.html - - - /reference/set_eurostat_toc.html - - - /reference/tgs00026.html - - - /reference/tidy_eurostat.html - - diff --git a/inst/CITATION b/inst/CITATION index c0edebb6..ca7e261b 100755 --- a/inst/CITATION +++ b/inst/CITATION @@ -1,8 +1,10 @@ citHeader("Kindly cite the eurostat R package as follows:") -note <- sprintf("Version %s", meta$Version) +year <- sub("-.*", "", meta$Date) +vers <- paste("R package version", meta$Version) bibentry("Article", + key = "10.32614/RJ-2017-019", title = "Retrieval and Analysis of Eurostat Open Data with the eurostat Package", author = c( person("Leo", "Lahti"), @@ -18,11 +20,35 @@ bibentry("Article", doi = "10.32614/RJ-2017-019", url = "https://doi.org/10.32614/RJ-2017-019", textVersion = - paste("(C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek.", - "Retrieval and analysis of Eurostat open data with the eurostat package. R Journal 9(1):385-392, 2017.", + paste("Lahti L., Huovari J., Kainu M., and Biecek P. (2017).", + "Retrieval and analysis of Eurostat open data with the eurostat package. The R Journal 9(1), pp. 385-392.", "doi: 10.32614/RJ-2017-019", - "Package URL: http://ropengov.github.io/eurostat", - "Article URL: https://journal.r-project.org/archive/2017/RJ-2017-019/index.html", sep = " " ) ) + +bibentry(bibtype = "Misc", + key = "eurostat", + title = "eurostat: Tools for Eurostat Open Data", + author = c( + person("Leo", "Lahti"), + person("Janne", "Huovari"), + person("Markus", "Kainu"), + person("Przemyslaw", "Biecek"), + person("Diego", "Hernangomez"), + person("Daniel", "Antal"), + person("Pyry", "Kantanen") + ), + url = "https://github.com/rOpenGov/eurostat", + type = "Computer software", + year = year, + note = vers, + textVersion = + paste0( + "Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., and Kantanen P. (", + sub("-.*", "", meta$Date), + "). eurostat: Tools for Eurostat Open Data [Computer software]. ", + vers, + ". https://github.com/rOpenGov/eurostat" + ) +) \ No newline at end of file diff --git a/inst/extdata/sdmx_to_http_error_mapping.csv b/inst/extdata/sdmx_to_http_error_mapping.csv new file mode 100644 index 00000000..303fdf49 --- /dev/null +++ b/inst/extdata/sdmx_to_http_error_mapping.csv @@ -0,0 +1,11 @@ +type;sdmx.faultcode;sdmx.faultstring;http.status_code;http.status_code.label;detail +Client error;100;No results found;400;Bad request;The result from the query is empty +Client error;100;No results found;404;Not found;The requested resource is not available +Client error;140;Syntax error;400;Bad request;The query is invalid +Client error;150;Semantic error;400;Bad request;The request is syntactically correct but fails a semantic validation or violates agreed business rules +Client error;110;Unauthorized;401;Unauthorized;Authentication is needed but has failed or has not yet been provided +Client error;130;Response too large due to client request;413;Request entity too large;The request results in a response that is larger than the client is willing or able to process +Server error;500;Internal server error;500;Internal server error;The webservice returns this error code when none of the other error codes better describe the reason for the failure of the service to provide a meaningful response +Server error;501;Not implemented;501;Not implemented;The webservice has not yet implemented one of the methods defined in the API +Server error;503;Service unavailable;503;Service unavailable;The web service is temporarily unavailable because of maintenance or for some other similar reason +Server error;510;Response size exceeds service limit;413;Request entity too large;The request results in a response that is larger than the server is willing or able to process \ No newline at end of file diff --git a/man/clean_eurostat_cache.Rd b/man/clean_eurostat_cache.Rd index 09c34f94..7c6b1418 100755 --- a/man/clean_eurostat_cache.Rd +++ b/man/clean_eurostat_cache.Rd @@ -10,8 +10,7 @@ clean_eurostat_cache(cache_dir = NULL, config = FALSE) \item{cache_dir}{A path to cache directory. If \code{NULL} (default) tries to clean default temporary cache directory.} -\item{config}{Logical \code{TRUE/FALSE}. Should the cached path be -deleted?} +\item{config}{Logical \code{TRUE/FALSE}. Should the cached path be deleted?} } \description{ Delete all .rds files from the eurostat cache directory. diff --git a/man/convert_time_col.Rd b/man/convert_time_col.Rd index 7283dcb2..5f48f6e0 100755 --- a/man/convert_time_col.Rd +++ b/man/convert_time_col.Rd @@ -2,14 +2,15 @@ % Please edit documentation in R/tidy_eurostat.R \name{convert_time_col} \alias{convert_time_col} -\title{Time Column Conversions} +\title{Time Column Conversions for data from new dissemination API} \usage{ convert_time_col(x, time_format) } \arguments{ -\item{x}{A time column (vector)} +\item{x}{A time column (vector) from a downloaded dataset} -\item{time_format}{see \code{\link[=tidy_eurostat]{tidy_eurostat()}}} +\item{time_format}{one of the following: \code{date}, \code{date_last}, or \code{num}. +See \code{\link[=tidy_eurostat]{tidy_eurostat()}} for more information.} } \description{ Internal function to convert time column. diff --git a/man/convert_time_col2.Rd b/man/convert_time_col2.Rd deleted file mode 100644 index 23ce1ea7..00000000 --- a/man/convert_time_col2.Rd +++ /dev/null @@ -1,18 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tidy_eurostat2.R -\name{convert_time_col2} -\alias{convert_time_col2} -\title{Time Column Conversions for data from new dissemination API} -\usage{ -convert_time_col2(x, time_format) -} -\arguments{ -\item{x}{A time column (vector) from a downloaded dataset} - -\item{time_format}{one of the following: \code{date}, \code{date_last}, or \code{num}. -See \code{\link[=tidy_eurostat]{tidy_eurostat()}} for more information.} -} -\description{ -Internal function to convert time column. -} -\keyword{internal} diff --git a/man/cut_to_classes.Rd b/man/cut_to_classes.Rd index 62dd58cc..eb34cc09 100755 --- a/man/cut_to_classes.Rd +++ b/man/cut_to_classes.Rd @@ -20,7 +20,7 @@ cut_to_classes( \item{n}{A numeric. number of classes/categories} -\item{style}{chosen style: one of "fixed", "sd", "equal", "pretty", "quantile", "kmeans", "hclust", "bclust", "fisher", "jenks", "dpih", "headtails", or "maximum"} +\item{style}{chosen style: one of "fixed", "sd", "equal", "pretty", "quantile", "kmeans", "hclust", "bclust", "fisher", "jenks", "dpih", "headtails", "maximum", or "box"} \item{manual}{Logical. If manual breaks are being used} @@ -51,12 +51,9 @@ lp$class <- cut_to_classes(lp$values, n = 5, style = "equal", decimals = 1) Other helpers: \code{\link{dic_order}()}, -\code{\link{eurotime2date2}()}, \code{\link{eurotime2date}()}, -\code{\link{eurotime2num2}()}, \code{\link{eurotime2num}()}, \code{\link{harmonize_country_code}()}, -\code{\link{label_eurostat2}()}, \code{\link{label_eurostat}()} } \author{ diff --git a/man/dic_order.Rd b/man/dic_order.Rd index 5f1e4019..3ba550f8 100755 --- a/man/dic_order.Rd +++ b/man/dic_order.Rd @@ -31,12 +31,9 @@ of labels with argument \code{eu_order = TRUE}. \seealso{ Other helpers: \code{\link{cut_to_classes}()}, -\code{\link{eurotime2date2}()}, \code{\link{eurotime2date}()}, -\code{\link{eurotime2num2}()}, \code{\link{eurotime2num}()}, \code{\link{harmonize_country_code}()}, -\code{\link{label_eurostat2}()}, \code{\link{label_eurostat}()} } \author{ diff --git a/man/eu_countries.Rd b/man/eu_countries.Rd index e4d6e23e..e7112547 100755 --- a/man/eu_countries.Rd +++ b/man/eu_countries.Rd @@ -38,4 +38,10 @@ eu_candidate_countries Countries and country codes in EU, Euro area, EFTA and EU candidate countries. } +\seealso{ +Other datasets: +\code{\link{eurostat_geodata_60_2016}}, +\code{\link{tgs00026}} +} +\concept{datasets} \keyword{datasets} diff --git a/man/eurostat-defunct.Rd b/man/eurostat-defunct.Rd new file mode 100644 index 00000000..ac0e69e1 --- /dev/null +++ b/man/eurostat-defunct.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/eurostat-defunct.R +\name{eurostat-defunct} +\alias{eurostat-defunct} +\alias{grepEurostatTOC} +\title{Defunct functions in eurostat} +\usage{ +grepEurostatTOC(...) +} +\arguments{ +\item{...}{Generic representation of old arguments} +} +\description{ +This list of defunct functions is maintained to document changes to eurostat functions in a +transparent manner. +} +\details{ +The following functions are defunct: + +\itemize{ +\item \code{\link{grepEurostatTOC}}: Use \code{search_eurostat} instead +} +} diff --git a/man/eurostat-package.Rd b/man/eurostat-package.Rd index efb07862..19643fc5 100755 --- a/man/eurostat-package.Rd +++ b/man/eurostat-package.Rd @@ -6,22 +6,336 @@ \alias{eurostat} \title{R Tools for Eurostat open data} \description{ -Brief summary of the eurostat package +Tools to download data from the Eurostat database +\url{https://ec.europa.eu/eurostat} together with search and manipulation +utilities. } \details{ \tabular{ll}{ \tab \cr \strong{Package} \tab eurostat \cr \strong{Type} \tab Package \cr - \strong{Version} \tab 3.8.3 \cr - \strong{Date} \tab 2014-2022 \cr + \strong{Version} \tab 4.0.0 \cr + \strong{Date} \tab 2014-2023 \cr \strong{License} \tab BSD_2_clause + file LICENSE \cr \strong{LazyLoad} \tab yes \cr } +} +\section{Eurostat}{ +Eurostat website: \url{https://ec.europa.eu/eurostat} +Eurostat database: \url{https://ec.europa.eu/eurostat/web/main/data/database} + +Information about the data update schedule from Eurostat: +"Eurostat datasets are updated twice a day at 11:00 and 23:00 CET, if newer +data is available or for structural changes, for example for the +dimensions in the dataset. + +The Eurostat database always contains the latest version of the datasets, +meaning that there is no versioning or documentation of past versions of +the data." +} + +\section{Data source: Eurostat SDMX 2.1 Dissemination API}{ +Data is downloaded from Eurostat SDMX 2.1 API endpoint +as compressed TSV files that are transformed into tabular format. +See Eurostat documentation for more information: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+query} + +The new dissemination API replaces the old bulk download facility that was +used by Eurostat before October 2023 and by the eurostat R package versions +before 4.0.0. +See Eurostat documentation about the transition from Bulk Download to API +for more information about the differences between the old bulk download +facility and the data provided by the new API connection: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/Transition+-+from+Eurostat+Bulk+Download+to+API} + +See especially the document Migrating_to_API_TSV.pdf that describes the +changes in TSV file format in new applications. + +For more information about SDMX 2.1, see SDMX standards: Section 7: +Guidelines for the use of web services, Version 2.1: +\url{https://sdmx.org/wp-content/uploads/SDMX_2-1_SECTION_7_WebServicesGuidelines.pdf} +} + +\section{Disclaimer: Availability of filtering functionalities}{ +Currently it only possible to download filtered data through API Statistics +(JSON API) when using \code{eurostat} package, although technically filtering +datasets downloaded through the SDMX Dissemination API is also supported by +Eurostat. We may support this feature in the future. In the meantime, if you +are interested in filtering Dissemination API data queries manually, please +consult the following Eurostat documentation: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+filtering} +} + +\section{Data source: Eurostat API Statistics (JSON API)}{ +Data is downloaded from Eurostat API Statistics. See Eurostat documentation +for more information about data queries in API Statistics +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query} + +This replaces the old JSON Web Services that was used by Eurostat before +February 2023 and by the eurostat R package versions before 3.7.13. +See Eurostat documentation about the migration from JSON web service to API +Statistics for more information about the differences between the old and +the new service: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+migrating+from+JSON+web+service+to+API+Statistics} + +For easily viewing which filtering options are available - in addition to +the default ones, time and language - Eurostat Web services Query builder +tool may be useful: +\url{https://ec.europa.eu/eurostat/web/query-builder} +} + +\section{Filtering datasets}{ +When using Eurostat API Statistics (JSON API), datasets can be filtered +before they are downloaded and saved in local memory. The general format +for filter parameters is \verb{=}. + +Filter parameters are optional but the used dimension codes must be present +in the data product that is being queried. Dimension codes can +vary between different data products so it may be useful to examine new +datasets in Eurostat data browser beforehand. However, most if not all +Eurostat datasets concern European countries and contain information that +was gathered at some point in time, so \code{geo} and \code{time} dimension codes +can usually be used. + +\verb{} and \verb{} are case-insensitive and they can be written +in lowercase or uppercase in the query. + +Parameters are passed onto the \code{eurostat} package functions \code{\link[=get_eurostat]{get_eurostat()}} +and \code{\link[=get_eurostat_json]{get_eurostat_json()}} as a list item. If an individual item contains +multiple items, as it often can be in the case of \code{geo} parameters and +other optional items, they must be in the form of a vector: \code{c("FI", "SE")}. +For examples on how to use these parameters, see function examples below. +\subsection{Time parameters}{ + +\code{time} and \code{time_period} address the same \code{TIME_PERIOD} dimension in the +dataset and can be used interchangeably. In the Eurostat documentation +it is stated that "Using more than one Time parameter in the same query +is not accepted", but practice has shown that actually Eurostat API allows +multiple \code{time} parameters in the same query. This makes it possible to +use R colon operator when writing queries, so \code{time = c(2015:2018)} +translates to \verb{&time=2015&time=2016&time=2017&time=2018}. + +The only exception +to this is when the queried dataset contains e.g. quarterly data and +\code{TIME_PERIOD} is saved as \code{2015-Q1}, \code{2015-Q2} etc. Then it is possible +to use \code{time=2015-Q1&time=2015-Q2} style in the query URL, but this makes it +unfeasible to use the colon operator and requires a lot of manual typing. + +Because of this, it is useful to know about other time parameters as well: +\itemize{ +\item \code{untilTimePeriod}: return dataset items from the oldest record up until the +set time, for example "all data until 2000": \code{untilTimePeriod = 2000} +\item \code{sinceTimePeriod}: return dataset items starting from set time, for example +"all datastarting from 2008": \code{sinceTimePeriod = 2008} +\item \code{lastTimePeriod}: starting from the most recent time period, how many +preceding time periods should be returned? For example 10 most +recent observations: \code{lastTimePeriod = 10} +} + +Using both \code{untilTimePeriod} and \code{sinceTimePeriod} parameters in the same +query is allowed, making the usage of the R colon operator unnecessary. +In the case of quarterly data, using \code{untilTimePeriod} and \code{sinceTimePeriod} +parameters also works, as opposed to the colon operator, so it is generally +safer to use them as well. +} + +\subsection{Other dimensions}{ + +In \code{\link[=get_eurostat_json]{get_eurostat_json()}} examples \code{nama_10_gdp} dataset is filtered with +two additional filter parameters: +\itemize{ +\item \code{na_item = "B1GQ"} +\item \code{unit = "CLV_I10"} +} + +Filters like these are most likely unique to the \code{nama_10_gdp} dataset +(or other datasets within the same domain) and should +not be used with others dataset without user discretion. +By using \code{\link[=label_eurostat]{label_eurostat()}} we know that \code{"B1GQ"} stands for +"Gross domestic product at market prices" and +\code{"CLV_I10"} means "Chain linked volumes, index 2010=100". + +Different dimension codes can be translated to a natural language by using +the \code{\link[=get_eurostat_dic]{get_eurostat_dic()}} function, which returns labels for individual +dimension items such as \code{na_item} and \code{unit}, as opposed to +\code{\link[=label_eurostat]{label_eurostat()}} which does it for whole datasets. For example, the +parameter \code{na_item} stands for "National accounts indicator (ESA 2010)" and +\code{unit} stands for "Unit of measure". +} + +\subsection{Language}{ + +All datasets have metadata available in English, French and German. If no +parameter is given, the labels are returned in English. + +Example: +\itemize{ +\item \code{lang = "fr"} +} +} + +\subsection{More information}{ + +For more information about data filtering see Eurostat documentation +on API Statistics: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query#APIStatisticsdataquery-TheparametersdefinedintheRESTrequest} +} +} + +\section{Data source: Eurostat Table of Contents}{ +The Eurostat Table of Contents (TOC) is downloaded from +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=en} +(default) or from French or German language variants: +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=fr} +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=de} +See Eurostat documentation on TOC items: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+-+Detailed+guidelines+-+Catalogue+API+-+TOC} +} + +\section{Data source: GISCO - General Copyright}{ +"Eurostat's general copyright notice and licence policy is applicable and +can be consulted here: +\url{https://ec.europa.eu/eurostat/about-us/policies/copyright} + +Please also be aware of the European Commission's general conditions: +\url{https://commission.europa.eu/legal-notice_en} + +Moreover, there are specific provisions applicable to some of the following +datasets available for downloading. The download and usage of these data +is subject to their acceptance: +\itemize{ +\item Administrative Units / Statistical Units +\item Population distribution / Demography +\item Transport Networks +\item Land Cover +\item Elevation (DEM)" +} + +Of the abovementioned datasets, Administrative Units / Statistical Units +is applicable if the user wants to draw maps with borders provided by +GISCO / EuroGeographics. +} + +\section{Data source: GISCO - Administrative Units / Statistical Units}{ +The following copyright notice is provided for end user convenience. +Please check up-to-date copyright information from the GISCO website: +\href{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units}{GISCO: Geographical information and maps - Administrative units/statistical units} + +"In addition to the \href{https://ec.europa.eu/eurostat/web/main/about/policies/copyright}{general copyright and licence policy} applicable to the whole Eurostat website, the following +specific provisions apply to the datasets you are downloading. The download +and usage of these data is subject to the acceptance of the following +clauses: +\enumerate{ +\item The Commission agrees to grant the non-exclusive and not transferable +right to use and process the Eurostat/GISCO geographical data downloaded +from this page (the "data"). +\item The permission to use the data is granted on condition that: +\enumerate{ +\item the data will not be used for commercial purposes; +\item the source will be acknowledged. A copyright notice, as specified +below, will have to be visible on any printed or electronic publication +using the data downloaded from this page." +} +} +\subsection{Copyright notice}{ + +When data downloaded from this page is used in any printed or electronic +publication, in addition to any other provisions applicable to the whole +Eurostat website, data source will have to be acknowledged in the legend of +the map and in the introductory page of the publication with the following +copyright notice: + +EN: © EuroGeographics for the administrative boundaries + +FR: © EuroGeographics pour les limites administratives + +DE: © EuroGeographics bezüglich der Verwaltungsgrenzen + +For publications in languages other than English, French or German, the +translation of the copyright notice in the language of the publication shall +be used. + +If you intend to use the data commercially, please contact EuroGeographics +for information regarding their licence agreements." +} +} + +\section{Eurostat: Copyright notice and free re-use of data}{ +The following copyright notice is provided for end user convenience. +Please check up-to-date copyright information from the eurostat website: +\url{https://ec.europa.eu/eurostat/about-us/policies/copyright} + +"(c) European Union, 1995 - today -R Tools for Eurostat Open Data +Eurostat has a policy of encouraging free re-use of its data, both for +non-commercial and commercial purposes. All statistical data, metadata, +content of web pages or other dissemination tools, official publications +and other documents published on its website, with the exceptions listed +below, can be reused without any payment or written licence provided that: +\itemize{ +\item the source is indicated as Eurostat; +\item when re-use involves modifications to the data or text, this must be +stated clearly to the end user of the information." } + +For exceptions to the abovementioned principles see +\href{https://ec.europa.eu/eurostat/about-us/policies/copyright}{Eurostat website} +} + +\section{Citing Eurostat data}{ +For citing datasets, use \code{\link[=get_bibentry]{get_bibentry()}} to build a bibliography that +is suitable for your reference manager of choice. + +When using Eurostat data in other contexts than academic publications that +in-text citations or footnotes/endnotes, the following guidelines may be +helpful: +\itemize{ +\item The origin of the data should always be mentioned as "Source: Eurostat". +\item The online dataset codes(s) should also be provided in order to ensure +transparency and facilitate access to the Eurostat data and related +methodological information. For example: +"Source: Eurostat (online data code: namq_10_gdp)" +\item Online publications (e.g. web pages, PDF) should include a clickable +link to the dataset using the bookmark functionality available in the +Eurostat data browser. +} + +It should be avoided to associate different entities (e.g. Eurostat, +National Statistical Offices, other data providers) to the same dataset or +indicator without specifying the role of each of them in the treatment of +data. + +See also section "Eurostat: Copyright notice and free re-use of data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. +} + +\section{Strategies for handling large datasets more efficiently}{ +Most Eurostat datasets are relatively manageable, at least on a machine +with 16 GB of RAM. The largest dataset in Eurostat database, at the time +of writing this, had 148362539 (148 million) values, which results in an +object with 148 million rows in tidy data (long) format. The test machine +with 16 GB of RAM was able to handle the second largest dataset in the +database with 91 million values (rows). + +There are still some methods to make data fetching +functions perform faster: +\itemize{ +\item turn caching off: \code{get_eurostat(cache = FALSE)} +\item turn cache compression off (may result in rather large cache files!): +\code{get_eurostat(compress_file = FALSE)} +\item if you want faster caching with manageable file sizes, use stringsAsFactors: +\code{get_eurostat(cache = TRUE, compress_file = TRUE, stringsAsFactors = TRUE)} +\item Use faster data.table functions: \code{get_eurostat(use.data.table = TRUE)} +\item Keep column processing to a minimum: +\code{get_eurostat(time_format = "raw", type = "code")} etc. +\item Read \code{get_eurostat()} function documentation carefully so you understand +what different arguments do +\item Filter the dataset so that you fetch only the parts you need! +} +} + \section{regions functions}{ For working with sub-national statistics the basic functions of the @@ -34,29 +348,45 @@ library(eurostat) \references{ See \code{citation("eurostat")}: -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: -# -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html -# -# A BibTeX entry for LaTeX users is -# -# @Article\{, -# title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, -# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, -# journal = \{The R Journal\}, -# volume = \{9\}, -# number = \{1\}, -# pages = \{385--392\}, -# year = \{2017\}, -# doi = \{10.32614/RJ-2017-019\}, -# url = \{https://doi.org/10.32614/RJ-2017-019\}, -# \} +\if{html}{\out{
}}\preformatted{Kindly cite the eurostat R package as follows: + + Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and + analysis of Eurostat open data with the eurostat package. The R + Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 + +A BibTeX entry for LaTeX users is + + @Article\{10.32614/RJ-2017-019, + title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, + journal = \{The R Journal\}, + volume = \{9\}, + number = \{1\}, + pages = \{385--392\}, + year = \{2017\}, + doi = \{10.32614/RJ-2017-019\}, + url = \{https://doi.org/10.32614/RJ-2017-019\}, + \} + + Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., + and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data + [Computer software]. R package version 4.0.0. + https://github.com/rOpenGov/eurostat + +A BibTeX entry for LaTeX users is + + @Misc\{eurostat, + title = \{eurostat: Tools for Eurostat Open Data\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, + url = \{https://github.com/rOpenGov/eurostat\}, + type = \{Computer software\}, + year = \{2023\}, + note = \{R package version 4.0.0\}, + \} }\if{html}{\out{
}} + +When citing data downloaded from Eurostat, see section "Citing Eurostat data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. } \seealso{ \code{help("regions")}, \url{https://regions.dataobservatory.eu/} diff --git a/man/eurostat_geodata_60_2016.Rd b/man/eurostat_geodata_60_2016.Rd index ec846d29..fcce0288 100755 --- a/man/eurostat_geodata_60_2016.Rd +++ b/man/eurostat_geodata_60_2016.Rd @@ -9,14 +9,12 @@ year 2016} sf object } \source{ -Data source: Eurostat +Data source: Eurostat via \code{\link[giscoR:gisco_get_nuts]{giscoR::gisco_get_nuts()}}. © EuroGeographics for the administrative boundaries -Data downloaded from: \url{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units} -} -\usage{ -eurostat_geodata_60_2016 +Data downloaded from: +\url{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units} } \description{ Geospatial data of Europe from GISCO in 1:60 million scale @@ -27,58 +25,100 @@ The dataset contains 2016 observations (rows) and 12 variables (columns). The object contains the following columns: \itemize{ -\item \strong{id}: JSON id code, the same as NUTS_ID. See NUTS_ID below for further clarification. -\item \strong{LEVL_CODE}: NUTS level code: 0 (national level), 1 (major socio-economic regions), 2 (basic regions for the application of regional policies) or 3 (small regions). -\item \strong{NUTS_ID}: NUTS ID code, consisting of country code and numbers (1 for NUTS 1, 2 for NUTS 2 and 3 for NUTS 3) -\item \strong{CNTR_CODE}: Country code: two-letter ISO code (ISO 3166 alpha-2), except in the case of Greece (EL). +\item \strong{id}: JSON id code, the same as \strong{NUTS_ID}. See \strong{NUTS_ID} below for +further clarification. +\item \strong{LEVL_CODE}: NUTS level code: 0 (national level), 1 (major +socio-economic regions), 2 (basic regions for the application of regional +policies) or 3 (small regions). +\item \strong{NUTS_ID}: NUTS ID code, consisting of country code and numbers (1 for +NUTS 1, 2 for NUTS 2 and 3 for NUTS 3) +\item \strong{CNTR_CODE}: Country code: two-letter ISO code (ISO 3166 alpha-2), except +in the case of Greece (EL). \item \strong{NAME_LATN}: NUTS name in local language, transliterated to Latin script \item \strong{NUTS_NAME}: NUTS name in local language, in local script. \item \strong{MOUNT_TYPE}: Mountain typology for NUTS 3 regions. \itemize{ -\item{1: "where more than 50 \% of the surface is covered by topographic mountain areas"} -\item{2: "in which more than 50 \% of the regional population lives in topographic mountain areas"} -\item{3: "where more than 50 \% of the surface is covered by topographic mountain areas and where more than 50 \% of the regional population lives in these mountain areas"} -\item{4: non-mountain region / other region} -\item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 and non-EU countries)} +\item 1: "where more than 50 \% of the surface is covered by topographic +mountain areas" +\item 2: "in which more than 50 \% of the regional population lives in +topographic mountain areas" +\item 3: "where more than 50 \% of the surface is covered by topographic +mountain areas and where more than 50 \% of the regional population lives +in these mountain areas" +\item 4: non-mountain region / other region +\item 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 and +non-EU countries) } \item \strong{URBN_TYPE}: Urban-rural typology for NUTS 3 regions. \itemize{ -\item{1: predominantly urban region} -\item{2: intermediate region} -\item{3: predominantly rural region} -\item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 regions)} +\item 1: predominantly urban region +\item 2: intermediate region +\item 3: predominantly rural region +\item 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 +regions) } \item \strong{COAST_TYPE}: Coastal typology for NUTS 3 regions. \itemize{ -\item{1: coastal (on coast)} -\item{2: coastal (>= 50\% of population living within 50km of the coastline)} -\item{3: non-coastal region} -\item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 regions)} +\item 1: coastal (on coast) +\item 2: coastal (>= 50\% of population living within 50km of the coastline) +\item 3: non-coastal region +\item 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 +regions) } \item \strong{FID}: Same as NUTS_ID. +\item \strong{geo}: Same as NUTS_ID, added for for easier joins with dplyr. However, +it is recommended to use other identical fields for this purpose. \item \strong{geometry}: geospatial information. -\item \strong{geo}: Same as NUTS_ID, added for for easier joins with dplyr. However, it is recommended to use other identical fields for this purpose. } -Dataset updated: 2022-06-28. For a more recent version, please use \code{\link[=get_eurostat_geospatial]{get_eurostat_geospatial()}} function. +Dataset updated: 2023-06-29. For a more recent version, please use +\code{\link[giscoR:gisco_get_nuts]{giscoR::gisco_get_nuts()}} function. +} +\examples{ + +eurostat_geodata_60_2016 <- eurostat::eurostat_geodata_60_2016 + +# Manipulate and plot +if (require(sf)) { + library(sf) + # Filter NUTS3 from select countries like in a regular data frame + example_nuts <- subset(eurostat_geodata_60_2016, LEVL_CODE == 3 & + CNTR_CODE \%in\% c("DK", "DE", "PL")) + + plot(example_nuts["CNTR_CODE"]) +} + } \references{ The following copyright notice is provided for end user convenience. Please check up-to-date copyright information from the eurostat website: \href{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units}{GISCO: Geographical information and maps - Administrative units/statistical units} -"In addition to the \href{https://ec.europa.eu/eurostat/web/main/about/policies/copyright}{general copyright and licence policy} applicable to the whole Eurostat website, the following specific provisions apply to the datasets you are downloading. The download and usage of these data is subject to the acceptance of the following clauses: +"In addition to the +\href{https://ec.europa.eu/eurostat/web/main/about/policies/copyright}{general copyright and licence policy} +applicable to the whole Eurostat website, the following +specific provisions apply to the datasets you are downloading. The download +and usage of these data is subject to the acceptance of the following +clauses: \enumerate{ -\item The Commission agrees to grant the non-exclusive and not transferable right to use and process the Eurostat/GISCO geographical data downloaded from this page (the "data"). +\item The Commission agrees to grant the non-exclusive and not transferable +right to use and process the Eurostat/GISCO geographical data downloaded +from this page (the "data"). \item The permission to use the data is granted on condition that: \enumerate{ -\item{the data will not be used for commercial purposes;} -\item{the source will be acknowledged. A copyright notice, as specified below, will have to be visible on any printed or electronic publication using the data downloaded from this page.} +\item the data will not be used for commercial purposes; +\item the source will be acknowledged. A copyright notice, as specified +below, will have to be visible on any printed or electronic publication +using the data downloaded from this page. } } \subsection{Copyright notice}{ -When data downloaded from this page is used in any printed or electronic publication, in addition to any other provisions applicable to the whole Eurostat website, data source will have to be acknowledged in the legend of the map and in the introductory page of the publication with the following copyright notice: +When data downloaded from this page is used in any printed or electronic +publication, in addition to any other provisions applicable to the whole +Eurostat website, data source will have to be acknowledged in the legend of +the map and in the introductory page of the publication with the following +copyright notice: EN: © EuroGeographics for the administrative boundaries @@ -86,15 +126,20 @@ FR: © EuroGeographics pour les limites administratives DE: © EuroGeographics bezüglich der Verwaltungsgrenzen -For publications in languages other than English, French or German, the translation of the copyright notice in the language of the publication shall be used. +For publications in languages other than English, French or German, the +translation of the copyright notice in the language of the publication shall +be used. -If you intend to use the data commercially, please contact EuroGeographics for information regarding their licence agreements." +If you intend to use the data commercially, please contact EuroGeographics +for information regarding their licence agreements." } } \seealso{ +\code{\link[giscoR:gisco_get_nuts]{giscoR::gisco_get_nuts()}} and \href{https://ec.europa.eu/eurostat/web/products-manuals-and-guidelines/-/ks-gq-18-008}{Eurostat. (2019). Methodological manual on territorial typologies -- 2018 edition. Manuals and guidelines.} Other datasets: +\code{\link{eu_countries}}, \code{\link{tgs00026}} Other geospatial: @@ -102,4 +147,3 @@ Other geospatial: } \concept{datasets} \concept{geospatial} -\keyword{datasets} diff --git a/man/eurotime2date.Rd b/man/eurotime2date.Rd index f78c2581..06a925c7 100755 --- a/man/eurotime2date.Rd +++ b/man/eurotime2date.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/eurotime2date.R \name{eurotime2date} \alias{eurotime2date} -\title{Date Conversion from Eurostat Time Format} +\title{Date Conversion from New Eurostat Time Format} \usage{ eurotime2date(x, last = FALSE) } @@ -21,30 +21,40 @@ Date conversion from Eurostat time format. A function to convert Eurostat time values to objects of class \code{\link[=Date]{Date()}} representing calendar dates. } +\details{ +Available patterns are YYYY (year), YYYY-SN (semester), YYYY-QN (quarter), +YYYY-MM (month), YYYY-WNN (week) and YYYY-MM-DD (day). +} \examples{ \dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ na_q <- get_eurostat("namq_10_pc", time_format = "raw") -na_q$time <- eurotime2date(x = na_q$time) -unique(na_q$time) +na_q$TIME_PERIOD <- eurotime2date(x = na_q$TIME_PERIOD) +unique(na_q$TIME_PERIOD) +} + +\dontrun{ +# Test for weekly data +get_eurostat( + id = "lfsi_abs_w", + select_time = c("W"), + time_format = "date" + ) } \dontshow{\}) # examplesIf} } \references{ See \code{citation("eurostat")}: -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: +\if{html}{\out{
}}\preformatted{# Kindly cite the eurostat R package as follows: # -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html +# Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and +# analysis of Eurostat open data with the eurostat package. The R +# Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 # # A BibTeX entry for LaTeX users is # -# @Article\{, +# @Article\{10.32614/RJ-2017-019, # title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, # author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, # journal = \{The R Journal\}, @@ -55,6 +65,22 @@ See \code{citation("eurostat")}: # doi = \{10.32614/RJ-2017-019\}, # url = \{https://doi.org/10.32614/RJ-2017-019\}, # \} +# +# Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., +# and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data +# [Computer software]. R package version 4.0.0. +# https://github.com/rOpenGov/eurostat +# +# A BibTeX entry for LaTeX users is +# +# @Misc\{eurostat, +# title = \{eurostat: Tools for Eurostat Open Data\}, +# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, +# url = \{https://github.com/rOpenGov/eurostat\}, +# type = \{Computer software\}, +# year = \{2023\}, +# note = \{R package version 4.0.0\}, +# \} }\if{html}{\out{
}} } \seealso{ @@ -63,11 +89,8 @@ See \code{citation("eurostat")}: Other helpers: \code{\link{cut_to_classes}()}, \code{\link{dic_order}()}, -\code{\link{eurotime2date2}()}, -\code{\link{eurotime2num2}()}, \code{\link{eurotime2num}()}, \code{\link{harmonize_country_code}()}, -\code{\link{label_eurostat2}()}, \code{\link{label_eurostat}()} } \author{ diff --git a/man/eurotime2date2.Rd b/man/eurotime2date2.Rd deleted file mode 100644 index a78ac81e..00000000 --- a/man/eurotime2date2.Rd +++ /dev/null @@ -1,90 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/eurotime2date.R -\name{eurotime2date2} -\alias{eurotime2date2} -\title{Date Conversion from New Eurostat Time Format} -\usage{ -eurotime2date2(x, last = FALSE) -} -\arguments{ -\item{x}{a charter string with time information in Eurostat time format.} - -\item{last}{a logical. If \code{FALSE} (default) the date is -the first date of the period (month, quarter or year). If \code{TRUE} -the date is the last date of the period.} -} -\value{ -an object of class \code{\link[=Date]{Date()}}. -} -\description{ -Date conversion from Eurostat time format. A function to -convert Eurostat time values to objects of class \code{\link[=Date]{Date()}} -representing calendar dates. -} -\details{ -Available patterns are YYYY (year), YYYY-SN (semester), YYYY-QN (quarter), -YYYY-MM (month), YYYY-WNN (week) and YYYY-MM-DD (day). -} -\examples{ -\dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -\donttest{ -na_q <- get_eurostat("namq_10_pc", time_format = "raw") -na_q$time <- eurotime2date(x = na_q$time) -unique(na_q$time) -} - -\dontrun{ -# Test for weekly data -get_eurostat( - id = "lfsi_abs_w", - select_time = c("W"), - time_format = "date", - legacy_bulk_download = FALSE - ) -} -\dontshow{\}) # examplesIf} -} -\references{ -See \code{citation("eurostat")}: - -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: -# -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html -# -# A BibTeX entry for LaTeX users is -# -# @Article\{, -# title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, -# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, -# journal = \{The R Journal\}, -# volume = \{9\}, -# number = \{1\}, -# pages = \{385--392\}, -# year = \{2017\}, -# doi = \{10.32614/RJ-2017-019\}, -# url = \{https://doi.org/10.32614/RJ-2017-019\}, -# \} -}\if{html}{\out{
}} -} -\seealso{ -\code{\link[lubridate:ymd]{lubridate::ymd()}} - -Other helpers: -\code{\link{cut_to_classes}()}, -\code{\link{dic_order}()}, -\code{\link{eurotime2date}()}, -\code{\link{eurotime2num2}()}, -\code{\link{eurotime2num}()}, -\code{\link{harmonize_country_code}()}, -\code{\link{label_eurostat2}()}, -\code{\link{label_eurostat}()} -} -\author{ -Janne Huovari \href{mailto:janne.huovari@ptt.fi}{janne.huovari@ptt.fi} -} -\concept{helpers} diff --git a/man/eurotime2num.Rd b/man/eurotime2num.Rd index 4ef45caa..5e408d4d 100755 --- a/man/eurotime2num.Rd +++ b/man/eurotime2num.Rd @@ -16,17 +16,17 @@ see \code{\link[=as.numeric]{as.numeric()}}. A conversion of a Eurostat time format to numeric. } \details{ -Bi-annual, quarterly and monthly data is presented as fraction of -the year in beginning of the period. Conversion of daily data is not -supported. +Bi-annual (semester), quarterly, monthly and weekly data can be presented as +a fraction of the year in beginning of the period. Conversion of daily data +is not supported. } \examples{ \dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ na_q <- get_eurostat("namq_10_pc", time_format = "raw") -na_q$time <- eurotime2num(x = na_q$time) +na_q$TIME_PERIOD <- eurotime2num(x = na_q$TIME_PERIOD) -unique(na_q$time) +unique(na_q$TIME_PERIOD) } \dontshow{\}) # examplesIf} } @@ -34,14 +34,11 @@ unique(na_q$time) Other helpers: \code{\link{cut_to_classes}()}, \code{\link{dic_order}()}, -\code{\link{eurotime2date2}()}, \code{\link{eurotime2date}()}, -\code{\link{eurotime2num2}()}, \code{\link{harmonize_country_code}()}, -\code{\link{label_eurostat2}()}, \code{\link{label_eurostat}()} } \author{ -Janne Huovari \href{mailto:janne.huovari@ptt.fi}{janne.huovari@ptt.fi} +Janne Huovari \href{mailto:janne.huovari@ptt.fi}{janne.huovari@ptt.fi}, Pyry Kantanen } \concept{helpers} diff --git a/man/eurotime2num2.Rd b/man/eurotime2num2.Rd deleted file mode 100644 index 05f9d2f1..00000000 --- a/man/eurotime2num2.Rd +++ /dev/null @@ -1,47 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/eurotime2num.R -\name{eurotime2num2} -\alias{eurotime2num2} -\title{Conversion of Eurostat Time Format to Numeric} -\usage{ -eurotime2num2(x) -} -\arguments{ -\item{x}{a charter string with time information in Eurostat time format.} -} -\value{ -see \code{\link[=as.numeric]{as.numeric()}}. -} -\description{ -A conversion of a Eurostat time format to numeric. -} -\details{ -Bi-annual (semester), quarterly, monthly and weekly data can be presented as -a fraction of the year in beginning of the period. Conversion of daily data -is not supported. -} -\examples{ -\dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -\donttest{ -na_q <- get_eurostat("namq_10_pc", time_format = "raw") -na_q$time <- eurotime2num(x = na_q$time) - -unique(na_q$time) -} -\dontshow{\}) # examplesIf} -} -\seealso{ -Other helpers: -\code{\link{cut_to_classes}()}, -\code{\link{dic_order}()}, -\code{\link{eurotime2date2}()}, -\code{\link{eurotime2date}()}, -\code{\link{eurotime2num}()}, -\code{\link{harmonize_country_code}()}, -\code{\link{label_eurostat2}()}, -\code{\link{label_eurostat}()} -} -\author{ -Janne Huovari \href{mailto:janne.huovari@ptt.fi}{janne.huovari@ptt.fi}, Pyry Kantanen -} -\concept{helpers} diff --git a/man/fixity_checksum.Rd b/man/fixity_checksum.Rd new file mode 100644 index 00000000..74b426b2 --- /dev/null +++ b/man/fixity_checksum.Rd @@ -0,0 +1,57 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{fixity_checksum} +\alias{fixity_checksum} +\title{Calculate a fixity checksum for an object} +\source{ +https://www.dpconline.org/handbook/technical-solutions-and-tools/fixity-and-checksums +} +\usage{ +fixity_checksum(data_object, algorithm = "md5") +} +\arguments{ +\item{data_object}{A dataset downloaded with some eurostat package function.} + +\item{algorithm}{Algorithm to use when calculating a checksum for a dataset. +Default is 'md5', but can be any supported algorithm in digest function.} +} +\description{ +Uses a hash function (md5) on an object and calculates a digest of the object +in the form of a character string. +} +\details{ +“Fixity, in the preservation sense, means the assurance that a digital file +has remained unchanged, i.e. fixed.” (Bailey, 2014). In practice, fixity +can most easily be established by calculating a checksum for the data object +that changes if anything in the data object has changed. What we use as a +checksum here is by default calculated with md5 hash algorithm. It is +possible to use other algorithms supported by the imported digest function, +see function documentation. + +In the case of big objects with millions of rows of data calculating a +checksum can take a bit longer and require some amount of RAM to be +available. Selecting another algorithm might perform faster and/or more +efficiently. Whichever algorithm you are using, please make sure to report +it transparently in your work for transparency and ensuring replicability. + +This function takes the whole data object as an input, meaning that +everything counts when calculating the fixity checksum. If the dataset +column names are labeled, if the data itself is labeled, if stringsAsFactors +is TRUE, if flags are removed or kept, if data is somehow edited... all these +affect the calculated checksum. It is advisable to calculate the checksum +immediately after downloading the data, before adding any labels or doing +other mutating operations. If you are using other arguments than the default +ones when downloading data, it is also good to report the exact arguments +used. + +This implementation fulfills the level 1 requirement of National Digital +Stewardship Alliance (NDSA) preservation levels by creating "fixity info +if it wasn’t provided with the content". In the current version of the +package, fixity information has to be created manually and is at the +responsibility of the user. +} +\seealso{ +\code{\link[digest:digest]{digest::digest()}} +} +\keyword{internal} +\keyword{utilities} diff --git a/man/get_bibentry.Rd b/man/get_bibentry.Rd index 43f4325e..76a800be 100755 --- a/man/get_bibentry.Rd +++ b/man/get_bibentry.Rd @@ -4,7 +4,7 @@ \alias{get_bibentry} \title{Create A Data Bibliography} \usage{ -get_bibentry(code, keywords = NULL, format = "Biblatex") +get_bibentry(code, keywords = NULL, format = "Biblatex", lang = "en") } \arguments{ \item{code}{A Eurostat data code or a vector of Eurostat data codes as @@ -14,7 +14,10 @@ character or factor.} to \code{NULL}.} \item{format}{Default is \code{'Biblatex'}, alternatives are \code{'bibentry'} -or \code{'Bibtex'} (not case sensitive.)} +or \code{'Bibtex'} (not case sensitive)} + +\item{lang}{2-letter language code, default is "\code{en}" (English), other +options are "\code{fr}" (French) and "\code{de}" (German). Used for labeling datasets.} } \value{ a bibentry, Bibtex or Biblatex object. @@ -24,14 +27,41 @@ Creates a bibliography from selected Eurostat data files, including last Eurostat update, URL access data, and optional keywords set by the user. } +\section{Citing Eurostat data}{ +For citing datasets, use \code{\link[=get_bibentry]{get_bibentry()}} to build a bibliography that +is suitable for your reference manager of choice. + +When using Eurostat data in other contexts than academic publications that +in-text citations or footnotes/endnotes, the following guidelines may be +helpful: +\itemize{ +\item The origin of the data should always be mentioned as "Source: Eurostat". +\item The online dataset codes(s) should also be provided in order to ensure +transparency and facilitate access to the Eurostat data and related +methodological information. For example: +"Source: Eurostat (online data code: namq_10_gdp)" +\item Online publications (e.g. web pages, PDF) should include a clickable +link to the dataset using the bookmark functionality available in the +Eurostat data browser. +} + +It should be avoided to associate different entities (e.g. Eurostat, +National Statistical Offices, other data providers) to the same dataset or +indicator without specifying the role of each of them in the treatment of +data. + +See also section "Eurostat: Copyright notice and free re-use of data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. +} + \examples{ \dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \dontrun{ my_bibliography <- get_bibentry( - code = c("tran_hv_frtra", "t2020_rk310", "tec00001"), + code = c("tran_hv_frtra", "tec00001"), keywords = list( - c("railways", "freight", "transport"), - c("railways", "passengers", "modal split") + c("transport", "freight", "multimodal data", "GDP"), + c("economy and finance", "annual", "national accounts", "GDP") ), format = "Biblatex" ) @@ -39,6 +69,9 @@ set by the user. } \dontshow{\}) # examplesIf} } +\seealso{ +\link[utils:bibentry]{utils::bibentry} \link[RefManageR:toBiblatex]{RefManageR::toBiblatex} +} \author{ Daniel Antal, Przemyslaw Biecek } diff --git a/man/get_eurostat.Rd b/man/get_eurostat.Rd index e5e5ef68..1e0ee2a8 100755 --- a/man/get_eurostat.Rd +++ b/man/get_eurostat.Rd @@ -2,47 +2,53 @@ % Please edit documentation in R/get_eurostat.R \name{get_eurostat} \alias{get_eurostat} -\title{Read Eurostat Data} +\title{Get Eurostat Data} \usage{ get_eurostat( id, time_format = "date", - filters = "none", + filters = NULL, type = "code", select_time = NULL, + lang = "en", cache = TRUE, update_cache = FALSE, cache_dir = NULL, compress_file = TRUE, stringsAsFactors = FALSE, keepFlags = FALSE, - legacy_bulk_download = TRUE, + use.data.table = FALSE, ... ) } \arguments{ -\item{id}{A code name for the dataset of interest. -See \code{\link[=search_eurostat]{search_eurostat()}} or details for how to get code.} - -\item{time_format}{a string giving a type of the conversion of the time -column from the eurostat format. A "date" (default) converts to -a \code{\link[=Date]{Date()}} with a first date of the period. -A "date_last" converts to a \code{\link[=Date]{Date()}} with -a last date of the period. A "num" converts to a numeric and "raw" -does not do conversion. See \code{\link[=eurotime2date]{eurotime2date()}} and -\code{\link[=eurotime2num]{eurotime2num()}}.} - -\item{filters}{a "none" (default) to get a whole dataset or a named list of -filters to get just part of the table. Names of list objects are -Eurostat variable codes and values are vectors of observation codes. -If \code{NULL} the whole -dataset is returned via API. More on details. See more on filters and -limitations per query via API from for -\code{\link[=get_eurostat_json]{get_eurostat_json()}}.} - -\item{type}{A type of variables, "code" (default) or "label".} - -\item{select_time}{a character symbol for a time frequency or NULL, +\item{id}{A unique identifier / code for the dataset of interest. If code is not +known \code{\link[=search_eurostat]{search_eurostat()}} function can be used to search Eurostat table +of contents.} + +\item{time_format}{a string giving a type of the conversion of the time column from the +eurostat format. The default argument "\code{date}" converts to a \code{\link[=Date]{Date()}} class +with the date being the first day of the period. A "\code{date_last}" argument +converts the dataset date to a \code{\link[=Date]{Date()}} class object with the difference +that the exact date is the last date of the period. Period can be year, +semester (half year), quarter, month, or week (See \code{\link[=eurotime2date]{eurotime2date()}} for +more information). +Argument "\code{num}" converts the date into a numeric (integer) meaning that +the first day of the year 2000 is close to 2000.01 and the last day of the +year is close to 2000.99 (see \code{\link[=eurotime2num]{eurotime2num()}} for more information). +Using the argument "\code{raw}" preserves the dates as they were in the original +Eurostat data.} + +\item{filters}{A named list of filters. Names of list objects are Eurostat +variable codes and values are vectors of observation codes. If \code{NULL} +(default) the whole dataset is returned. See details for more information +on filters and limitations per query.} + +\item{type}{A type of variables, "\code{code}" (default), "\code{label}" or "\code{both}". +The parameter "\code{both}" will return a data_frame with named vectors, +labels as values and codes as names.} + +\item{select_time}{a character symbol for a time frequency or \code{NULL}, which is used by default as most datasets have just one time frequency. For datasets with multiple time frequencies, select one or more of the desired frequencies with: @@ -50,25 +56,24 @@ frequencies, select one or more of the desired frequencies with: "M" = monthly, "W" = weekly. For all frequencies in same data frame \code{time_format = "raw"} should be used.} -\item{cache}{a logical whether to do caching. Default is \code{TRUE}. Affects -only queries from the bulk download facility.} +\item{lang}{2-letter language code, default is "\code{en}" (English), other +options are "\code{fr}" (French) and "\code{de}" (German). Used for labeling datasets.} + +\item{cache}{a logical whether to do caching. Default is \code{TRUE}.} \item{update_cache}{a logical whether to update cache. Can be set also with -options(eurostat_update = TRUE)} +\code{options(eurostat_update = TRUE)}} -\item{cache_dir}{a -path to a cache directory. The directory must exist. -The \code{NULL} (default) uses and creates -'eurostat' directory in the temporary directory from -\code{\link[=tempdir]{tempdir()}}. The directory can also be set with -\code{\link[=set_eurostat_cache_dir]{set_eurostat_cache_dir()}}.} +\item{cache_dir}{a path to a cache directory. \code{NULL} (default) uses and creates +'eurostat' directory in the temporary directory defined by base R +\code{\link[=tempdir]{tempdir()}} function. The user can set the cache directory to an existing +directory by using this argument. The cache directory can also be set with +\code{\link[=set_eurostat_cache_dir]{set_eurostat_cache_dir()}} function.} -\item{compress_file}{a logical whether to compress the -RDS-file in caching. Default is \code{TRUE}.} +\item{compress_file}{a logical whether to compress the RDS-file in caching. Default is \code{TRUE}.} -\item{stringsAsFactors}{if \code{FALSE} (the default) the variables are -returned as characters. If \code{TRUE} the variables are converted to -factors in original Eurostat order.} +\item{stringsAsFactors}{if \code{TRUE} (the default) variables are converted to factors in the original +Eurostat order. If \code{FALSE} they are returned as strings.} \item{keepFlags}{a logical whether the flags (e.g. "confidential", "provisional") should be kept in a separate column or if they @@ -78,18 +83,13 @@ Also possible non-real zero "0n" is indicated in flags column. Flags are not available for eurostat API, so \code{keepFlags} can not be used with a \code{filters}.} -\item{legacy_bulk_download}{a logical, whether to use the new dissemination API to -download TSV files instead of the old Bulk Download facilities. -Default is \code{TRUE}. This is a temporary parameter that will be deleted -after the old Bulk Download facilities will are decommissioned. Please -use caution if you intend to build any automated scripts that use this -parameter.} +\item{use.data.table}{Use faster data.table functions? Default is FALSE. +On Windows requires that RTools is installed.} \item{...}{ Arguments passed on to \code{\link[=get_eurostat_json]{get_eurostat_json}} \describe{ - \item{\code{lang}}{A language used for metadata. Default is \code{EN}, other options are -\code{FR} and \code{DE}.} + \item{\code{proxy}}{Use proxy, TRUE or FALSE (default).} }} } \value{ @@ -107,12 +107,12 @@ bulk download facility can be completed for example with \code{\link[tidyr:compl Download data sets from Eurostat \url{https://ec.europa.eu/eurostat} } \details{ -Data sets are downloaded from -\href{https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing}{the Eurostat bulk download facility} or from The Eurostat Web Services -\href{https://ec.europa.eu/eurostat/web/main/data/web-services}{JSON API}. +Datasets are downloaded from +\href{https://wikis.ec.europa.eu/display/EUROSTATHELP/Transition+-+from+Eurostat+Bulk+Download+to+API}{the Eurostat SDMX 2.1 API} +in TSV format or from The Eurostat +\href{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query}{API Statistics JSON API}. If only the table \code{id} is given, the whole table is downloaded from the -bulk download facility. If also \code{filters} are defined the JSON API is -used. +SDMX API. If any \code{filters} are given JSON API is used instead. The bulk download facility is the fastest method to download whole datasets. It is also often the only way as the JSON API has limitation of maximum @@ -121,12 +121,11 @@ it seems that multi frequency datasets can only be retrieved via bulk download facility and the \code{select_time} is not available for JSON API method. -If your connection is thru a proxy, you probably have to set proxy parameters +If your connection is through a proxy, you may have to set proxy parameters to use JSON API, see \code{\link[=get_eurostat_json]{get_eurostat_json()}}. -By default datasets from the bulk download facility are cached as they are -often rather large. Caching is not (currently) possible for datasets from -JSON API. +By default datasets are cached to reduce load on Eurostat services and +because some datasets can be quite large. Cache files are stored in a temporary directory by default or in a named directory (See \code{\link[=set_eurostat_cache_dir]{set_eurostat_cache_dir()}}). The cache can be emptied with \code{\link[=clean_eurostat_cache]{clean_eurostat_cache()}}. @@ -137,6 +136,188 @@ the \code{\link[=search_eurostat]{search_eurostat()}} or from the Eurostat datab database gives codes in the Data Navigation Tree after every dataset in parenthesis. } +\section{Eurostat: Copyright notice and free re-use of data}{ +The following copyright notice is provided for end user convenience. +Please check up-to-date copyright information from the eurostat website: +\url{https://ec.europa.eu/eurostat/about-us/policies/copyright} + +"(c) European Union, 1995 - today + +Eurostat has a policy of encouraging free re-use of its data, both for +non-commercial and commercial purposes. All statistical data, metadata, +content of web pages or other dissemination tools, official publications +and other documents published on its website, with the exceptions listed +below, can be reused without any payment or written licence provided that: +\itemize{ +\item the source is indicated as Eurostat; +\item when re-use involves modifications to the data or text, this must be +stated clearly to the end user of the information." +} + +For exceptions to the abovementioned principles see +\href{https://ec.europa.eu/eurostat/about-us/policies/copyright}{Eurostat website} +} + +\section{Filtering datasets}{ +When using Eurostat API Statistics (JSON API), datasets can be filtered +before they are downloaded and saved in local memory. The general format +for filter parameters is \verb{=}. + +Filter parameters are optional but the used dimension codes must be present +in the data product that is being queried. Dimension codes can +vary between different data products so it may be useful to examine new +datasets in Eurostat data browser beforehand. However, most if not all +Eurostat datasets concern European countries and contain information that +was gathered at some point in time, so \code{geo} and \code{time} dimension codes +can usually be used. + +\verb{} and \verb{} are case-insensitive and they can be written +in lowercase or uppercase in the query. + +Parameters are passed onto the \code{eurostat} package functions \code{\link[=get_eurostat]{get_eurostat()}} +and \code{\link[=get_eurostat_json]{get_eurostat_json()}} as a list item. If an individual item contains +multiple items, as it often can be in the case of \code{geo} parameters and +other optional items, they must be in the form of a vector: \code{c("FI", "SE")}. +For examples on how to use these parameters, see function examples below. +\subsection{Time parameters}{ + +\code{time} and \code{time_period} address the same \code{TIME_PERIOD} dimension in the +dataset and can be used interchangeably. In the Eurostat documentation +it is stated that "Using more than one Time parameter in the same query +is not accepted", but practice has shown that actually Eurostat API allows +multiple \code{time} parameters in the same query. This makes it possible to +use R colon operator when writing queries, so \code{time = c(2015:2018)} +translates to \verb{&time=2015&time=2016&time=2017&time=2018}. + +The only exception +to this is when the queried dataset contains e.g. quarterly data and +\code{TIME_PERIOD} is saved as \code{2015-Q1}, \code{2015-Q2} etc. Then it is possible +to use \code{time=2015-Q1&time=2015-Q2} style in the query URL, but this makes it +unfeasible to use the colon operator and requires a lot of manual typing. + +Because of this, it is useful to know about other time parameters as well: +\itemize{ +\item \code{untilTimePeriod}: return dataset items from the oldest record up until the +set time, for example "all data until 2000": \code{untilTimePeriod = 2000} +\item \code{sinceTimePeriod}: return dataset items starting from set time, for example +"all datastarting from 2008": \code{sinceTimePeriod = 2008} +\item \code{lastTimePeriod}: starting from the most recent time period, how many +preceding time periods should be returned? For example 10 most +recent observations: \code{lastTimePeriod = 10} +} + +Using both \code{untilTimePeriod} and \code{sinceTimePeriod} parameters in the same +query is allowed, making the usage of the R colon operator unnecessary. +In the case of quarterly data, using \code{untilTimePeriod} and \code{sinceTimePeriod} +parameters also works, as opposed to the colon operator, so it is generally +safer to use them as well. +} + +\subsection{Other dimensions}{ + +In \code{\link[=get_eurostat_json]{get_eurostat_json()}} examples \code{nama_10_gdp} dataset is filtered with +two additional filter parameters: +\itemize{ +\item \code{na_item = "B1GQ"} +\item \code{unit = "CLV_I10"} +} + +Filters like these are most likely unique to the \code{nama_10_gdp} dataset +(or other datasets within the same domain) and should +not be used with others dataset without user discretion. +By using \code{\link[=label_eurostat]{label_eurostat()}} we know that \code{"B1GQ"} stands for +"Gross domestic product at market prices" and +\code{"CLV_I10"} means "Chain linked volumes, index 2010=100". + +Different dimension codes can be translated to a natural language by using +the \code{\link[=get_eurostat_dic]{get_eurostat_dic()}} function, which returns labels for individual +dimension items such as \code{na_item} and \code{unit}, as opposed to +\code{\link[=label_eurostat]{label_eurostat()}} which does it for whole datasets. For example, the +parameter \code{na_item} stands for "National accounts indicator (ESA 2010)" and +\code{unit} stands for "Unit of measure". +} + +\subsection{Language}{ + +All datasets have metadata available in English, French and German. If no +parameter is given, the labels are returned in English. + +Example: +\itemize{ +\item \code{lang = "fr"} +} +} + +\subsection{More information}{ + +For more information about data filtering see Eurostat documentation +on API Statistics: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query#APIStatisticsdataquery-TheparametersdefinedintheRESTrequest} +} +} + +\section{Citing Eurostat data}{ +For citing datasets, use \code{\link[=get_bibentry]{get_bibentry()}} to build a bibliography that +is suitable for your reference manager of choice. + +When using Eurostat data in other contexts than academic publications that +in-text citations or footnotes/endnotes, the following guidelines may be +helpful: +\itemize{ +\item The origin of the data should always be mentioned as "Source: Eurostat". +\item The online dataset codes(s) should also be provided in order to ensure +transparency and facilitate access to the Eurostat data and related +methodological information. For example: +"Source: Eurostat (online data code: namq_10_gdp)" +\item Online publications (e.g. web pages, PDF) should include a clickable +link to the dataset using the bookmark functionality available in the +Eurostat data browser. +} + +It should be avoided to associate different entities (e.g. Eurostat, +National Statistical Offices, other data providers) to the same dataset or +indicator without specifying the role of each of them in the treatment of +data. + +See also section "Eurostat: Copyright notice and free re-use of data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. +} + +\section{Disclaimer: Availability of filtering functionalities}{ +Currently it only possible to download filtered data through API Statistics +(JSON API) when using \code{eurostat} package, although technically filtering +datasets downloaded through the SDMX Dissemination API is also supported by +Eurostat. We may support this feature in the future. In the meantime, if you +are interested in filtering Dissemination API data queries manually, please +consult the following Eurostat documentation: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+filtering} +} + +\section{Strategies for handling large datasets more efficiently}{ +Most Eurostat datasets are relatively manageable, at least on a machine +with 16 GB of RAM. The largest dataset in Eurostat database, at the time +of writing this, had 148362539 (148 million) values, which results in an +object with 148 million rows in tidy data (long) format. The test machine +with 16 GB of RAM was able to handle the second largest dataset in the +database with 91 million values (rows). + +There are still some methods to make data fetching +functions perform faster: +\itemize{ +\item turn caching off: \code{get_eurostat(cache = FALSE)} +\item turn cache compression off (may result in rather large cache files!): +\code{get_eurostat(compress_file = FALSE)} +\item if you want faster caching with manageable file sizes, use stringsAsFactors: +\code{get_eurostat(cache = TRUE, compress_file = TRUE, stringsAsFactors = TRUE)} +\item Use faster data.table functions: \code{get_eurostat(use.data.table = TRUE)} +\item Keep column processing to a minimum: +\code{get_eurostat(time_format = "raw", type = "code")} etc. +\item Read \code{get_eurostat()} function documentation carefully so you understand +what different arguments do +\item Filter the dataset so that you fetch only the parts you need! +} +} + \examples{ \dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \dontrun{ @@ -167,47 +348,70 @@ dd <- get_eurostat("nama_10_gdp", # A dataset with multiple time series in one dd2 <- get_eurostat("AVIA_GOR_ME", select_time = c("A", "M", "Q"), - time_format = "date_last", - legacy_bulk_download = FALSE + time_format = "date_last" +) + +# An example of downloading whole dataset from JSON API +dd3 <- get_eurostat("AVIA_GOR_ME", + filters = list() +) + +# Filtering a dataset from a local file +dd3_filter <- get_eurostat("AVIA_GOR_ME", + filters = list( + tra_meas = "FRM_BRD" + ) ) + } \dontshow{\}) # examplesIf} } \references{ See \code{citation("eurostat")}: -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: -# -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html -# -# A BibTeX entry for LaTeX users is -# -# @Article\{, -# title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, -# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, -# journal = \{The R Journal\}, -# volume = \{9\}, -# number = \{1\}, -# pages = \{385--392\}, -# year = \{2017\}, -# doi = \{10.32614/RJ-2017-019\}, -# url = \{https://doi.org/10.32614/RJ-2017-019\}, -# \} +\if{html}{\out{
}}\preformatted{Kindly cite the eurostat R package as follows: + + Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and + analysis of Eurostat open data with the eurostat package. The R + Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 + +A BibTeX entry for LaTeX users is + + @Article\{10.32614/RJ-2017-019, + title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, + journal = \{The R Journal\}, + volume = \{9\}, + number = \{1\}, + pages = \{385--392\}, + year = \{2017\}, + doi = \{10.32614/RJ-2017-019\}, + url = \{https://doi.org/10.32614/RJ-2017-019\}, + \} + + Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., + and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data + [Computer software]. R package version 4.0.0. + https://github.com/rOpenGov/eurostat + +A BibTeX entry for LaTeX users is + + @Misc\{eurostat, + title = \{eurostat: Tools for Eurostat Open Data\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, + url = \{https://github.com/rOpenGov/eurostat\}, + type = \{Computer software\}, + year = \{2023\}, + note = \{R package version 4.0.0\}, + \} }\if{html}{\out{
}} -When citing data, please indicate that the data source is Eurostat. If the -re-use of data involves modification to the data or text, state this clearly. -For more detailed information and exceptions regarding commercial use, -see \href{https://ec.europa.eu/eurostat/web/main/about/policies/copyright}{Eurostat policy on copyright and free re-use of data}. +When citing data downloaded from Eurostat, see section "Citing Eurostat data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. } \seealso{ \code{\link[=search_eurostat]{search_eurostat()}}, \code{\link[=label_eurostat]{label_eurostat()}} } \author{ -Przemyslaw Biecek, Leo Lahti, Janne Huovari and Markus Kainu +Przemyslaw Biecek, Leo Lahti, Janne Huovari, Markus Kainu and Pyry Kantanen } diff --git a/man/get_eurostat_dic.Rd b/man/get_eurostat_dic.Rd index e561d52f..c236e422 100755 --- a/man/get_eurostat_dic.Rd +++ b/man/get_eurostat_dic.Rd @@ -36,18 +36,15 @@ get_eurostat_dic("crop_pro", lang = "fr") \references{ See \code{citation("eurostat")}: -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: +\if{html}{\out{
}}\preformatted{# Kindly cite the eurostat R package as follows: # -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html +# Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and +# analysis of Eurostat open data with the eurostat package. The R +# Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 # # A BibTeX entry for LaTeX users is # -# @Article\{, +# @Article\{10.32614/RJ-2017-019, # title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, # author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, # journal = \{The R Journal\}, @@ -58,6 +55,22 @@ See \code{citation("eurostat")}: # doi = \{10.32614/RJ-2017-019\}, # url = \{https://doi.org/10.32614/RJ-2017-019\}, # \} +# +# Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., +# and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data +# [Computer software]. R package version 4.0.0. +# https://github.com/rOpenGov/eurostat +# +# A BibTeX entry for LaTeX users is +# +# @Misc\{eurostat, +# title = \{eurostat: Tools for Eurostat Open Data\}, +# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, +# url = \{https://github.com/rOpenGov/eurostat\}, +# type = \{Computer software\}, +# year = \{2023\}, +# note = \{R package version 4.0.0\}, +# \} }\if{html}{\out{
}} } \seealso{ @@ -66,7 +79,8 @@ See \code{citation("eurostat")}: } \author{ Przemyslaw Biecek and Leo Lahti \href{mailto:leo.lahti@iki.fi}{leo.lahti@iki.fi}. Thanks to -Wietse Dol for contributions. +Wietse Dol for contributions. Updated by Pyry Kantanen to support XML +codelists. } \keyword{database} \keyword{utilities} diff --git a/man/get_eurostat_folder.Rd b/man/get_eurostat_folder.Rd new file mode 100644 index 00000000..4551e0db --- /dev/null +++ b/man/get_eurostat_folder.Rd @@ -0,0 +1,70 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_eurostat.R +\name{get_eurostat_folder} +\alias{get_eurostat_folder} +\title{Get all datasets in a folder} +\usage{ +get_eurostat_folder(code, env = .EurostatEnv) +} +\arguments{ +\item{code}{Folder code from Eurostat Table of Contents.} + +\item{env}{Name of the environment where downloaded datasets are assigned. +Default is .EurostatEnv. If NULL, datasets are returned as a list object.} +} +\description{ +Loops over all files in a Eurostat database folder, downloads the data and +assigns the datasets to environment. +} +\details{ +The datasets are assigned into .EurostatEnv by default, using dataset codes +as object names. The datasets are downloaded from SDMX API as TSV files, +meaning that they are returned without filtering. No filters can be +provided using this function. + +Please do not attempt to download too many datasets or the whole database +at once. The number of datasets that can be downloaded at once is hardcoded +to 20. The function also asks the user for confirmation if the number of +datasets in a folder is more than 10. This is by design to discourage +straining Eurostat API. +} +\section{Data source: Eurostat Table of Contents}{ +The Eurostat Table of Contents (TOC) is downloaded from +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=en} +(default) or from French or German language variants: +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=fr} +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=de} + +See Eurostat documentation on TOC items: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+-+Detailed+guidelines+-+Catalogue+API+-+TOC} +} + +\section{Data source: Eurostat SDMX 2.1 Dissemination API}{ +Data is downloaded from Eurostat SDMX 2.1 API endpoint +as compressed TSV files that are transformed into tabular format. +See Eurostat documentation for more information: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+query} + +The new dissemination API replaces the old bulk download facility that was +used by Eurostat before October 2023 and by the eurostat R package versions +before 4.0.0. +See Eurostat documentation about the transition from Bulk Download to API +for more information about the differences between the old bulk download +facility and the data provided by the new API connection: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/Transition+-+from+Eurostat+Bulk+Download+to+API} + +See especially the document Migrating_to_API_TSV.pdf that describes the +changes in TSV file format in new applications. + +For more information about SDMX 2.1, see SDMX standards: Section 7: +Guidelines for the use of web services, Version 2.1: +\url{https://sdmx.org/wp-content/uploads/SDMX_2-1_SECTION_7_WebServicesGuidelines.pdf} +} + +\seealso{ +\code{\link[=get_eurostat_toc]{get_eurostat_toc()}} \code{\link[=toc_count_children]{toc_count_children()}} \code{\link[=toc_determine_hierarchy]{toc_determine_hierarchy()}} +\code{\link[=toc_list_children]{toc_list_children()}} \code{\link[=toc_count_whitespace]{toc_count_whitespace()}} +} +\author{ +Pyry Kantanen +} diff --git a/man/get_eurostat_geospatial.Rd b/man/get_eurostat_geospatial.Rd index 29a9d56b..8634fa4c 100755 --- a/man/get_eurostat_geospatial.Rd +++ b/man/get_eurostat_geospatial.Rd @@ -8,7 +8,7 @@ Data source: Eurostat © EuroGeographics for the administrative boundaries -Data downloaded from: \url{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units} +Data downloaded using \pkg{giscoR} } \usage{ get_eurostat_geospatial( @@ -20,13 +20,14 @@ get_eurostat_geospatial( update_cache = FALSE, cache_dir = NULL, crs = "4326", - make_valid = FALSE + make_valid = "DEPRECATED", + ... ) } \arguments{ -\item{output_class}{A string. Class of object returned, -either \code{sf} \verb{simple features}, \code{df} (\code{data_frame}) or -\code{spdf} (\code{SpatialPolygonDataFrame})} +\item{output_class}{Class of object returned, +either \code{sf} \verb{simple features} or \code{df} (\code{data_frame}). \code{spdf} output has +been soft-deprecated, the function would switch to \code{sf}.} \item{resolution}{Resolution of the geospatial data. One of \itemize{ @@ -43,17 +44,14 @@ either \code{sf} \verb{simple features}, \code{df} (\code{data_frame}) or \item{year}{NUTS release year. One of "2003", "2006", "2010", "2013", "2016" or "2021"} -\item{cache}{a logical whether to do caching. Default is \code{TRUE}. Affects -only queries from the bulk download facility.} +\item{cache}{a logical whether to do caching. Default is \code{TRUE}.} \item{update_cache}{a logical whether to update cache. Can be set also with -options(eurostat_update = TRUE)} +\code{options(eurostat_update = TRUE)}} -\item{cache_dir}{a path to a cache directory. The directory have to exist. -The \code{NULL} (default) uses and creates -'eurostat' directory in the temporary directory from -\code{\link[=tempdir]{tempdir()}}. Directory can also be set with -\code{option} eurostat_cache_dir.} +\item{cache_dir}{a path to a cache directory. See +\code{\link[=set_eurostat_cache_dir]{set_eurostat_cache_dir()}}. If \code{NULL} and the cache dir has not been set +globally the file would be stored in the \code{\link[=tempdir]{tempdir()}}.} \item{crs}{projection of the map: 4-digit \href{https://spatialreference.org/ref/epsg/}{EPSG code}. One of: @@ -63,136 +61,151 @@ The \code{NULL} (default) uses and creates \item "3857" - Pseudo-Mercator }} -\item{make_valid}{logical; ensure that valid (multi-)polygon features are -returned if \code{output_class="sf"}, see Details. Current default -\code{FALSE}, will be changed in the future.} +\item{make_valid}{Deprecated} + +\item{...}{ + Arguments passed on to \code{\link[giscoR:gisco_get_nuts]{giscoR::gisco_get_nuts}} + \describe{ + \item{\code{verbose}}{Logical, displays information. Useful for debugging, +default is \code{FALSE}.} + \item{\code{spatialtype}}{Type of geometry to be returned: +\itemize{ +\item \strong{"BN"}: Boundaries - \code{LINESTRING} object. +\item \strong{"LB"}: Labels - \code{POINT} object. +\item \strong{"RG"}: Regions - \code{MULTIPOLYGON/POLYGON} object. +}} + \item{\code{country}}{Optional. A character vector of country codes. It could be +either a vector of country names, a vector of ISO3 country codes or a +vector of Eurostat country codes. Mixed types (as \code{c("Turkey","US","FRA")}) +would not work. See also \code{\link[countrycode:countrycode]{countrycode::countrycode()}}.} + \item{\code{nuts_id}}{Optional. A character vector of NUTS IDs.} + }} } \value{ -a sf, data_frame or SpatialPolygonDataFrame. +a sf or data_frame } \description{ -Downloads either a simple features (sf), -SpatialPolygonDataFrame or a data_frame preprocessed using \code{\link[broom:reexports]{broom::tidy()}}. +Downloads either a simple features (sf) or a data_frame +of NUTS regions. This function is a wrapper of \code{\link[giscoR:gisco_get_nuts]{giscoR::gisco_get_nuts()}}. +This function requires to have installed the packages \CRANpkg{sf} and +\CRANpkg{giscoR}. } \details{ -The data source URL is -\url{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units}. -The source provides feature collections as line strings (GeoJSON format), -not as (multi-)polygons which, in some cases, yields invalid -self-intersecting (multi-)polygon geometries (for some years/resolutions). -This can cause problems, e.g., when using these geometries as input argument -to \code{\link[sf:interpolate_aw]{sf::st_interpolate_aw()}}. \code{make_valid = TRUE} makes sure that -only valid (multi-)polygons are returned, example included below. - The objects downloaded from GISCO should contain all or some of the following variable columns: \itemize{ -\item \strong{id}: JSON id code, the same as NUTS_ID. See NUTS_ID below for further clarification. -\item \strong{LEVL_CODE}: NUTS level code: 0 (national level), 1 (major socio-economic regions), 2 (basic regions for the application of regional policies) or 3 (small regions). -\item \strong{NUTS_ID}: NUTS ID code, consisting of country code and numbers (1 for NUTS 1, 2 for NUTS 2 and 3 for NUTS 3) -\item \strong{CNTR_CODE}: Country code: two-letter ISO code (ISO 3166 alpha-2), except in the case of Greece (EL). +\item \strong{id}: JSON id code, the same as \strong{NUTS_ID}. See \strong{NUTS_ID} below for +further clarification. +\item \strong{LEVL_CODE}: NUTS level code: 0 (national level), 1 (major +socio-economic regions), 2 (basic regions for the application of regional +policies) or 3 (small regions). +\item \strong{NUTS_ID}: NUTS ID code, consisting of country code and numbers (1 for +NUTS 1, 2 for NUTS 2 and 3 for NUTS 3) +\item \strong{CNTR_CODE}: Country code: two-letter ISO code (ISO 3166 alpha-2), except +in the case of Greece (EL). \item \strong{NAME_LATN}: NUTS name in local language, transliterated to Latin script \item \strong{NUTS_NAME}: NUTS name in local language, in local script. \item \strong{MOUNT_TYPE}: Mountain typology for NUTS 3 regions. \itemize{ -\item{1: "where more than 50 \% of the surface is covered by topographic mountain areas"} -\item{2: "in which more than 50 \% of the regional population lives in topographic mountain areas"} -\item{3: "where more than 50 \% of the surface is covered by topographic mountain areas and where more than 50 \% of the regional population lives in these mountain areas"} -\item{4: non-mountain region / other region} -\item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 and non-EU countries)} +\item 1: "where more than 50 \% of the surface is covered by topographic +mountain areas" +\item 2: "in which more than 50 \% of the regional population lives in +topographic mountain areas" +\item 3: "where more than 50 \% of the surface is covered by topographic +mountain areas and where more than 50 \% of the regional population lives +in these mountain areas" +\item 4: non-mountain region / other region +\item 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 and +non-EU countries) } \item \strong{URBN_TYPE}: Urban-rural typology for NUTS 3 regions. \itemize{ -\item{1: predominantly urban region} -\item{2: intermediate region} -\item{3: predominantly rural region} -\item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 regions)} +\item 1: predominantly urban region +\item 2: intermediate region +\item 3: predominantly rural region +\item 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 +regions) } \item \strong{COAST_TYPE}: Coastal typology for NUTS 3 regions. \itemize{ -\item{1: coastal (on coast)} -\item{2: coastal (>= 50\% of population living within 50km of the coastline)} -\item{3: non-coastal region} -\item{0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 regions)} +\item 1: coastal (on coast) +\item 2: coastal (>= 50\% of population living within 50km of the coastline) +\item 3: non-coastal region +\item 0: no classification provided (e.g. in the case of NUTS 1 and NUTS 2 +regions) } \item \strong{FID}: Same as NUTS_ID. +\item \strong{geo}: Same as NUTS_ID, added for for easier joins with dplyr. Consider +the status of this column "questioning" and use other columns for joins +when possible. \item \strong{geometry}: geospatial information. -\item \strong{geo}: Same as NUTS_ID, added for for easier joins with dplyr. However, it is recommended to use other identical fields for this purpose. } } -\examples{ -\donttest{ -sf <- get_eurostat_geospatial( - output_class = "sf", - resolution = "60", - nuts_level = "all" -) -df <- get_eurostat_geospatial( - output_class = "df", - resolution = "20", - nuts_level = "0" -) +\section{Eurostat: Copyright notice and free re-use of data}{ +The following copyright notice is provided for end user convenience. +Please check up-to-date copyright information from the eurostat website: +\url{https://ec.europa.eu/eurostat/about-us/policies/copyright} + +"(c) European Union, 1995 - today + +Eurostat has a policy of encouraging free re-use of its data, both for +non-commercial and commercial purposes. All statistical data, metadata, +content of web pages or other dissemination tools, official publications +and other documents published on its website, with the exceptions listed +below, can be reused without any payment or written licence provided that: +\itemize{ +\item the source is indicated as Eurostat; +\item when re-use involves modifications to the data or text, this must be +stated clearly to the end user of the information." } -\dontrun{ -spdf <- get_eurostat_geospatial( - output_class = "spdf", - resolution = "10", - nuts_level = "3" -) +For exceptions to the abovementioned principles see +\href{https://ec.europa.eu/eurostat/about-us/policies/copyright}{Eurostat website} } -\dontrun{ -# ------------------------------------------------------------------- -# Minimal example to demonstrate reason/effect of 'make_valid = TRUE' -# Spatial data set; rectangle spanning the entire globe with a constant value of 1L. -# Requires the R package sf. -library("sf") -d <- c(-180, -90, -180, 90, 180, 90, 180, -90, -180, -90) -poly <- st_polygon(list(matrix(d, ncol = 2, byrow = TRUE))) -data <- st_sf(data.frame(geom = st_sfc(poly), data = 1L), - crs = st_crs(4326) -) +\section{Data source: GISCO - General Copyright}{ +"Eurostat's general copyright notice and licence policy is applicable and +can be consulted here: +\url{https://ec.europa.eu/eurostat/about-us/policies/copyright} -# Causing an error: Self-intersection of some points of the geometry -NUTS2_A <- get_eurostat_geospatial("sf", 60, - nuts_level = 2, year = 2013, - crs = 4326, make_valid = FALSE -) -res <- tryCatch(st_interpolate_aw(data, NUTS2_A, extensive = FALSE), - error = function(e) e -) -print(res) - -# Resolving the problem using -# make_valid = TRUE. 'extensive = FALSE' returns -# average over each area, thus resulting in a -# constant value of 1 for each geometry in NUTS2_B. -NUTS2_B <- get_eurostat_geospatial("sf", 60, - nuts_level = 2, year = 2013, - crs = 4326, make_valid = TRUE -) -res <- st_interpolate_aw(data, NUTS2_B, extensive = FALSE) -print(head(res)) +Please also be aware of the European Commission's general conditions: +\url{https://commission.europa.eu/legal-notice_en} + +Moreover, there are specific provisions applicable to some of the following +datasets available for downloading. The download and usage of these data +is subject to their acceptance: +\itemize{ +\item Administrative Units / Statistical Units +\item Population distribution / Demography +\item Transport Networks +\item Land Cover +\item Elevation (DEM)" } +Of the abovementioned datasets, Administrative Units / Statistical Units +is applicable if the user wants to draw maps with borders provided by +GISCO / EuroGeographics. } -\references{ + +\section{Data source: GISCO - Administrative Units / Statistical Units}{ The following copyright notice is provided for end user convenience. -Please check up-to-date copyright information from the eurostat website: +Please check up-to-date copyright information from the GISCO website: \href{https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units}{GISCO: Geographical information and maps - Administrative units/statistical units} -"In addition to the \href{https://ec.europa.eu/eurostat/web/main/about/policies/copyright}{general copyright and licence policy} applicable to the whole Eurostat website, the following specific provisions apply to the datasets you are downloading. The download and usage of these data is subject to the acceptance of the following clauses: +"In addition to the \href{https://ec.europa.eu/eurostat/web/main/about/policies/copyright}{general copyright and licence policy} applicable to the whole Eurostat website, the following +specific provisions apply to the datasets you are downloading. The download +and usage of these data is subject to the acceptance of the following +clauses: \enumerate{ \item The Commission agrees to grant the non-exclusive and not transferable right to use and process the Eurostat/GISCO geographical data downloaded from this page (the "data"). \item The permission to use the data is granted on condition that: \enumerate{ -\item{the data will not be used for commercial purposes;} -\item{the source will be acknowledged. A copyright notice, as specified +\item the data will not be used for commercial purposes; +\item the source will be acknowledged. A copyright notice, as specified below, will have to be visible on any printed or electronic publication -using the data downloaded from this page.} +using the data downloaded from this page." } } \subsection{Copyright notice}{ @@ -216,12 +229,37 @@ be used. If you intend to use the data commercially, please contact EuroGeographics for information regarding their licence agreements." } +} + +\examples{ +\donttest{ +# Uses cached dataset +sf <- get_eurostat_geospatial( + output_class = "sf", + resolution = "60", + nuts_level = "all" +) +# Downloads dataset from server +sf2 <- get_eurostat_geospatial( + output_class = "sf", + resolution = "20", + nuts_level = "all" +) +df <- get_eurostat_geospatial( + output_class = "df", + nuts_level = "0" +) +} + } \seealso{ +\code{\link[giscoR:gisco_get_nuts]{giscoR::gisco_get_nuts()}} + Other geospatial: \code{\link{eurostat_geodata_60_2016}} } \author{ -Markus Kainu \href{mailto:markuskainu@gmail.com}{markuskainu@gmail.com} +Markus Kainu \href{mailto:markuskainu@gmail.com}{markuskainu@gmail.com}, Diego Hernangomez +\url{https://github.com/dieghernan/} } \concept{geospatial} diff --git a/man/get_eurostat_interactive.Rd b/man/get_eurostat_interactive.Rd new file mode 100644 index 00000000..0d5816cb --- /dev/null +++ b/man/get_eurostat_interactive.Rd @@ -0,0 +1,34 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_eurostat.R +\name{get_eurostat_interactive} +\alias{get_eurostat_interactive} +\title{Get Eurostat data interactive} +\usage{ +get_eurostat_interactive(code = NULL) +} +\arguments{ +\item{code}{A unique identifier / code for the dataset of interest. If code is not +known \code{\link[=search_eurostat]{search_eurostat()}} function can be used to search Eurostat table +of contents.} +} +\description{ +A simple interactive helper function to go through the steps of downloading +and/or finding suitable eurostat datasets. +} +\details{ +This function is intended to enable easy exploration of different eurostat +package functionalities and functions. In order to not drown the end user +in endless menus this function does not allow for setting +all possible \code{\link[=get_eurostat]{get_eurostat()}} function arguments. It is possible to set +\code{time_format}, \code{type}, \code{lang}, \code{stringsAsFactors}, \code{keepFlags}, and +\code{use.data.table} in the interactive menus. + +In some datasets setting these parameters may result in a +"Error in label_eurostat" error, for example: +"labels for XXXXXX includes duplicated labels in the Eurostat dictionary". +In these cases, and with other more complex queries, please +use \code{\link[=get_eurostat]{get_eurostat()}} function directly. +} +\seealso{ +\code{\link[=get_eurostat]{get_eurostat()}} +} diff --git a/man/get_eurostat_json.Rd b/man/get_eurostat_json.Rd index 8663caa4..83583600 100755 --- a/man/get_eurostat_json.Rd +++ b/man/get_eurostat_json.Rd @@ -8,46 +8,42 @@ get_eurostat_json( id, filters = NULL, type = "code", - lang = "EN", + lang = "en", stringsAsFactors = FALSE, + proxy = FALSE, ... ) } \arguments{ -\item{id}{A code name for the dataset of interested. See the table of -contents of eurostat datasets for more details.} +\item{id}{A unique identifier / code for the dataset of interest. If code is not +known \code{\link[=search_eurostat]{search_eurostat()}} function can be used to search Eurostat table +of contents.} \item{filters}{A named list of filters. Names of list objects are Eurostat variable codes and values are vectors of observation codes. If \code{NULL} -(default) the whole dataset is returned. See details for more on filters -and limitations per query.} +(default) the whole dataset is returned. See details for more information +on filters and limitations per query.} \item{type}{A type of variables, "\code{code}" (default), "\code{label}" or "\code{both}". The parameter "\code{both}" will return a data_frame with named vectors, labels as values and codes as names.} -\item{lang}{A language used for metadata. Default is \code{EN}, other options are -\code{FR} and \code{DE}.} +\item{lang}{2-letter language code, default is "\code{en}" (English), other +options are "\code{fr}" (French) and "\code{de}" (German). Used for labeling datasets.} -\item{stringsAsFactors}{if \code{FALSE} (the default) the variables are -returned as characters. If \code{TRUE} the variables are converted to -factors in original Eurostat order.} +\item{stringsAsFactors}{if \code{TRUE} (the default) variables are converted to factors in the original +Eurostat order. If \code{FALSE} they are returned as strings.} + +\item{proxy}{Use proxy, TRUE or FALSE (default).} \item{...}{ - Arguments passed on to \code{\link[httr:GET]{httr::GET}} + Arguments passed on to \code{\link[httr2:req_proxy]{httr2::req_proxy}} \describe{ - \item{\code{url}}{the url of the page to retrieve} - \item{\code{config}}{Additional configuration settings such as http -authentication (\code{\link[httr:authenticate]{authenticate()}}), additional headers -(\code{\link[httr:add_headers]{add_headers()}}), cookies (\code{\link[httr:set_cookies]{set_cookies()}}) etc. -See \code{\link[httr:config]{config()}} for full details and list of helpers.} - \item{\code{handle}}{The handle to use with this request. If not -supplied, will be retrieved and reused from the \code{\link[httr:handle_pool]{handle_pool()}} -based on the scheme, hostname and port of the url. By default \pkg{httr} -requests to the same scheme/host/port combo. This substantially reduces -connection time, and ensures that cookies are maintained over multiple -requests to the same host. See \code{\link[httr:handle_pool]{handle_pool()}} for more -details.} + \item{\code{req}}{A \link[httr2]{request}.} + \item{\code{url,port}}{Location of proxy.} + \item{\code{username,password}}{Login details for proxy, if needed.} + \item{\code{auth}}{Type of HTTP authentication to use. Should be one of the +following: \code{basic}, digest, digest_ie, gssnegotiate, ntlm, any.} }} } \value{ @@ -67,12 +63,203 @@ Queries are limited to 50 sub-indicators at a time. A time can be filtered with fixed "time" filter or with "sinceTimePeriod" and "lastTimePeriod" filters. A \code{sinceTimePeriod = 2000} returns observations from 2000 to a last available. A \code{lastTimePeriod = 10} -returns a 10 last observations. +returns a 10 last observations. See "Filtering datasets" section below +for more detailed information about filters. + +To use a proxy to connect, proxy arguments can be +passed to \code{\link[httr2:req_perform]{httr2::req_perform()}} via \code{\link[httr2:req_proxy]{httr2::req_proxy()}} - see latter +function documentation for parameter names that can be passed with \code{...}. +A non-functional example: +\code{get_eurostat_json(id, filters, proxy = TRUE, url = "127.0.0.1", port = 80)}. + +When retrieving data from Eurostat JSON API the user may encounter errors. +For end user convenience, we have provided a ready-made internal dataset +\code{sdmx_http_errors} that contains descriptive labels and descriptions about +the possible interpretation or cause of each error. These messages are +returned if the API returns a status indicating a HTTP error +(400 or greater). + +The Eurostat implementation seems to be based on SDMX 2.1, which is the +reason we've used SDMX Standards guidelines as a supplementary source +that we have included in the dataset. What this means in practice is that +the dataset contains error codes and their mappings that are not mentioned +in the Eurostat website. We hope you never encounter them. +} +\section{Data source: Eurostat API Statistics (JSON API)}{ +Data is downloaded from Eurostat API Statistics. See Eurostat documentation +for more information about data queries in API Statistics +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query} + +This replaces the old JSON Web Services that was used by Eurostat before +February 2023 and by the eurostat R package versions before 3.7.13. +See Eurostat documentation about the migration from JSON web service to API +Statistics for more information about the differences between the old and +the new service: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+migrating+from+JSON+web+service+to+API+Statistics} + +For easily viewing which filtering options are available - in addition to +the default ones, time and language - Eurostat Web services Query builder +tool may be useful: +\url{https://ec.europa.eu/eurostat/web/query-builder} +} + +\section{Filtering datasets}{ +When using Eurostat API Statistics (JSON API), datasets can be filtered +before they are downloaded and saved in local memory. The general format +for filter parameters is \verb{=}. + +Filter parameters are optional but the used dimension codes must be present +in the data product that is being queried. Dimension codes can +vary between different data products so it may be useful to examine new +datasets in Eurostat data browser beforehand. However, most if not all +Eurostat datasets concern European countries and contain information that +was gathered at some point in time, so \code{geo} and \code{time} dimension codes +can usually be used. + +\verb{} and \verb{} are case-insensitive and they can be written +in lowercase or uppercase in the query. + +Parameters are passed onto the \code{eurostat} package functions \code{\link[=get_eurostat]{get_eurostat()}} +and \code{\link[=get_eurostat_json]{get_eurostat_json()}} as a list item. If an individual item contains +multiple items, as it often can be in the case of \code{geo} parameters and +other optional items, they must be in the form of a vector: \code{c("FI", "SE")}. +For examples on how to use these parameters, see function examples below. +\subsection{Time parameters}{ + +\code{time} and \code{time_period} address the same \code{TIME_PERIOD} dimension in the +dataset and can be used interchangeably. In the Eurostat documentation +it is stated that "Using more than one Time parameter in the same query +is not accepted", but practice has shown that actually Eurostat API allows +multiple \code{time} parameters in the same query. This makes it possible to +use R colon operator when writing queries, so \code{time = c(2015:2018)} +translates to \verb{&time=2015&time=2016&time=2017&time=2018}. + +The only exception +to this is when the queried dataset contains e.g. quarterly data and +\code{TIME_PERIOD} is saved as \code{2015-Q1}, \code{2015-Q2} etc. Then it is possible +to use \code{time=2015-Q1&time=2015-Q2} style in the query URL, but this makes it +unfeasible to use the colon operator and requires a lot of manual typing. + +Because of this, it is useful to know about other time parameters as well: +\itemize{ +\item \code{untilTimePeriod}: return dataset items from the oldest record up until the +set time, for example "all data until 2000": \code{untilTimePeriod = 2000} +\item \code{sinceTimePeriod}: return dataset items starting from set time, for example +"all datastarting from 2008": \code{sinceTimePeriod = 2008} +\item \code{lastTimePeriod}: starting from the most recent time period, how many +preceding time periods should be returned? For example 10 most +recent observations: \code{lastTimePeriod = 10} +} + +Using both \code{untilTimePeriod} and \code{sinceTimePeriod} parameters in the same +query is allowed, making the usage of the R colon operator unnecessary. +In the case of quarterly data, using \code{untilTimePeriod} and \code{sinceTimePeriod} +parameters also works, as opposed to the colon operator, so it is generally +safer to use them as well. +} + +\subsection{Other dimensions}{ + +In \code{\link[=get_eurostat_json]{get_eurostat_json()}} examples \code{nama_10_gdp} dataset is filtered with +two additional filter parameters: +\itemize{ +\item \code{na_item = "B1GQ"} +\item \code{unit = "CLV_I10"} +} + +Filters like these are most likely unique to the \code{nama_10_gdp} dataset +(or other datasets within the same domain) and should +not be used with others dataset without user discretion. +By using \code{\link[=label_eurostat]{label_eurostat()}} we know that \code{"B1GQ"} stands for +"Gross domestic product at market prices" and +\code{"CLV_I10"} means "Chain linked volumes, index 2010=100". + +Different dimension codes can be translated to a natural language by using +the \code{\link[=get_eurostat_dic]{get_eurostat_dic()}} function, which returns labels for individual +dimension items such as \code{na_item} and \code{unit}, as opposed to +\code{\link[=label_eurostat]{label_eurostat()}} which does it for whole datasets. For example, the +parameter \code{na_item} stands for "National accounts indicator (ESA 2010)" and +\code{unit} stands for "Unit of measure". +} + +\subsection{Language}{ + +All datasets have metadata available in English, French and German. If no +parameter is given, the labels are returned in English. + +Example: +\itemize{ +\item \code{lang = "fr"} +} +} + +\subsection{More information}{ + +For more information about data filtering see Eurostat documentation +on API Statistics: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query#APIStatisticsdataquery-TheparametersdefinedintheRESTrequest} +} +} + +\section{Eurostat: Copyright notice and free re-use of data}{ +The following copyright notice is provided for end user convenience. +Please check up-to-date copyright information from the eurostat website: +\url{https://ec.europa.eu/eurostat/about-us/policies/copyright} + +"(c) European Union, 1995 - today + +Eurostat has a policy of encouraging free re-use of its data, both for +non-commercial and commercial purposes. All statistical data, metadata, +content of web pages or other dissemination tools, official publications +and other documents published on its website, with the exceptions listed +below, can be reused without any payment or written licence provided that: +\itemize{ +\item the source is indicated as Eurostat; +\item when re-use involves modifications to the data or text, this must be +stated clearly to the end user of the information." +} + +For exceptions to the abovementioned principles see +\href{https://ec.europa.eu/eurostat/about-us/policies/copyright}{Eurostat website} +} + +\section{Citing Eurostat data}{ +For citing datasets, use \code{\link[=get_bibentry]{get_bibentry()}} to build a bibliography that +is suitable for your reference manager of choice. + +When using Eurostat data in other contexts than academic publications that +in-text citations or footnotes/endnotes, the following guidelines may be +helpful: +\itemize{ +\item The origin of the data should always be mentioned as "Source: Eurostat". +\item The online dataset codes(s) should also be provided in order to ensure +transparency and facilitate access to the Eurostat data and related +methodological information. For example: +"Source: Eurostat (online data code: namq_10_gdp)" +\item Online publications (e.g. web pages, PDF) should include a clickable +link to the dataset using the bookmark functionality available in the +Eurostat data browser. +} + +It should be avoided to associate different entities (e.g. Eurostat, +National Statistical Offices, other data providers) to the same dataset or +indicator without specifying the role of each of them in the treatment of +data. -To use a proxy to connect, a \code{\link[httr:use_proxy]{httr::use_proxy()}} can be -passed to \code{\link[httr:GET]{httr::GET()}}. For example -\code{get_eurostat_json(id, filters, config = httr::use_proxy(url, port, username, password))}. +See also section "Eurostat: Copyright notice and free re-use of data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. } + +\section{Disclaimer: Availability of filtering functionalities}{ +Currently it only possible to download filtered data through API Statistics +(JSON API) when using \code{eurostat} package, although technically filtering +datasets downloaded through the SDMX Dissemination API is also supported by +Eurostat. We may support this feature in the future. In the meantime, if you +are interested in filtering Dissemination API data queries manually, please +consult the following Eurostat documentation: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+filtering} +} + \examples{ \dontrun{ # Generally speaking these queries would be done through get_eurostat @@ -93,7 +280,7 @@ yy2 <- get_eurostat_json("nama_10_gdp", filters = list( na_item = "B1GQ", unit = "CLV_I10" )) - + # An example from get_eurostat dd <- get_eurostat("nama_10_gdp", filters = list( @@ -106,39 +293,48 @@ dd <- get_eurostat("nama_10_gdp", \references{ See \code{citation("eurostat")}: -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: -# -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html -# -# A BibTeX entry for LaTeX users is -# -# @Article\{, -# title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, -# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, -# journal = \{The R Journal\}, -# volume = \{9\}, -# number = \{1\}, -# pages = \{385--392\}, -# year = \{2017\}, -# doi = \{10.32614/RJ-2017-019\}, -# url = \{https://doi.org/10.32614/RJ-2017-019\}, -# \} +\if{html}{\out{
}}\preformatted{Kindly cite the eurostat R package as follows: + + Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and + analysis of Eurostat open data with the eurostat package. The R + Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 + +A BibTeX entry for LaTeX users is + + @Article\{10.32614/RJ-2017-019, + title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, + journal = \{The R Journal\}, + volume = \{9\}, + number = \{1\}, + pages = \{385--392\}, + year = \{2017\}, + doi = \{10.32614/RJ-2017-019\}, + url = \{https://doi.org/10.32614/RJ-2017-019\}, + \} + + Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., + and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data + [Computer software]. R package version 4.0.0. + https://github.com/rOpenGov/eurostat + +A BibTeX entry for LaTeX users is + + @Misc\{eurostat, + title = \{eurostat: Tools for Eurostat Open Data\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, + url = \{https://github.com/rOpenGov/eurostat\}, + type = \{Computer software\}, + year = \{2023\}, + note = \{R package version 4.0.0\}, + \} }\if{html}{\out{
}} + +When citing data downloaded from Eurostat, see section "Citing Eurostat data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. } \seealso{ -\code{\link[httr:GET]{httr::GET()}} - -Eurostat Data Browser online help: API Statistics - data query: -\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+data+query} - -Eurostat Data Browser online help: migrating from JSON web service to API -Statistics: -\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+Statistics+-+migrating+from+JSON+web+service+to+API+Statistics} +\code{\link[httr2:req_proxy]{httr2::req_proxy()}} } \author{ Przemyslaw Biecek, Leo Lahti, Janne Huovari Markus Kainu and Pyry Kantanen diff --git a/man/get_eurostat_raw.Rd b/man/get_eurostat_raw.Rd index cbc562c5..d3aca865 100755 --- a/man/get_eurostat_raw.Rd +++ b/man/get_eurostat_raw.Rd @@ -2,13 +2,17 @@ % Please edit documentation in R/get_eurostat_raw.R \name{get_eurostat_raw} \alias{get_eurostat_raw} -\title{Download Data from Eurostat Database} +\title{Download Data from Eurostat Dissemination API} \usage{ -get_eurostat_raw(id) +get_eurostat_raw(id, use.data.table = FALSE) } \arguments{ -\item{id}{A code name for the dataset of interested. See the table of -contents of eurostat datasets for more details.} +\item{id}{A unique identifier / code for the dataset of interest. If code is not +known \code{\link[=search_eurostat]{search_eurostat()}} function can be used to search Eurostat table +of contents.} + +\item{use.data.table}{Use faster data.table functions? Default is FALSE. +On Windows requires that RTools is installed.} } \value{ A dataset in tibble format. First column contains comma @@ -18,13 +22,90 @@ character format as it contains values together with eurostat flags for data. } \description{ -Download data from the eurostat database. +Download data from the eurostat database through the new +dissemination API. +} +\section{Data source: Eurostat SDMX 2.1 Dissemination API}{ +Data is downloaded from Eurostat SDMX 2.1 API endpoint +as compressed TSV files that are transformed into tabular format. +See Eurostat documentation for more information: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+query} + +The new dissemination API replaces the old bulk download facility that was +used by Eurostat before October 2023 and by the eurostat R package versions +before 4.0.0. +See Eurostat documentation about the transition from Bulk Download to API +for more information about the differences between the old bulk download +facility and the data provided by the new API connection: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/Transition+-+from+Eurostat+Bulk+Download+to+API} + +See especially the document Migrating_to_API_TSV.pdf that describes the +changes in TSV file format in new applications. + +For more information about SDMX 2.1, see SDMX standards: Section 7: +Guidelines for the use of web services, Version 2.1: +\url{https://sdmx.org/wp-content/uploads/SDMX_2-1_SECTION_7_WebServicesGuidelines.pdf} +} + +\section{Eurostat: Copyright notice and free re-use of data}{ +The following copyright notice is provided for end user convenience. +Please check up-to-date copyright information from the eurostat website: +\url{https://ec.europa.eu/eurostat/about-us/policies/copyright} + +"(c) European Union, 1995 - today + +Eurostat has a policy of encouraging free re-use of its data, both for +non-commercial and commercial purposes. All statistical data, metadata, +content of web pages or other dissemination tools, official publications +and other documents published on its website, with the exceptions listed +below, can be reused without any payment or written licence provided that: +\itemize{ +\item the source is indicated as Eurostat; +\item when re-use involves modifications to the data or text, this must be +stated clearly to the end user of the information." +} + +For exceptions to the abovementioned principles see +\href{https://ec.europa.eu/eurostat/about-us/policies/copyright}{Eurostat website} +} + +\section{Citing Eurostat data}{ +For citing datasets, use \code{\link[=get_bibentry]{get_bibentry()}} to build a bibliography that +is suitable for your reference manager of choice. + +When using Eurostat data in other contexts than academic publications that +in-text citations or footnotes/endnotes, the following guidelines may be +helpful: +\itemize{ +\item The origin of the data should always be mentioned as "Source: Eurostat". +\item The online dataset codes(s) should also be provided in order to ensure +transparency and facilitate access to the Eurostat data and related +methodological information. For example: +"Source: Eurostat (online data code: namq_10_gdp)" +\item Online publications (e.g. web pages, PDF) should include a clickable +link to the dataset using the bookmark functionality available in the +Eurostat data browser. +} + +It should be avoided to associate different entities (e.g. Eurostat, +National Statistical Offices, other data providers) to the same dataset or +indicator without specifying the role of each of them in the treatment of +data. + +See also section "Eurostat: Copyright notice and free re-use of data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. } -\details{ -Data is downloaded from -\url{https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing} -and transformed into tabular format. + +\section{Disclaimer: Availability of filtering functionalities}{ +Currently it only possible to download filtered data through API Statistics +(JSON API) when using \code{eurostat} package, although technically filtering +datasets downloaded through the SDMX Dissemination API is also supported by +Eurostat. We may support this feature in the future. In the meantime, if you +are interested in filtering Dissemination API data queries manually, please +consult the following Eurostat documentation: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+data+filtering} } + \examples{ \dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ @@ -35,18 +116,15 @@ eurostat:::get_eurostat_raw("educ_iste") \references{ See \code{citation("eurostat")}: -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: +\if{html}{\out{
}}\preformatted{# Kindly cite the eurostat R package as follows: # -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html +# Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and +# analysis of Eurostat open data with the eurostat package. The R +# Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 # # A BibTeX entry for LaTeX users is # -# @Article\{, +# @Article\{10.32614/RJ-2017-019, # title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, # author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, # journal = \{The R Journal\}, @@ -57,13 +135,29 @@ See \code{citation("eurostat")}: # doi = \{10.32614/RJ-2017-019\}, # url = \{https://doi.org/10.32614/RJ-2017-019\}, # \} +# +# Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., +# and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data +# [Computer software]. R package version 4.0.0. +# https://github.com/rOpenGov/eurostat +# +# A BibTeX entry for LaTeX users is +# +# @Misc\{eurostat, +# title = \{eurostat: Tools for Eurostat Open Data\}, +# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, +# url = \{https://github.com/rOpenGov/eurostat\}, +# type = \{Computer software\}, +# year = \{2023\}, +# note = \{R package version 4.0.0\}, +# \} }\if{html}{\out{
}} } \seealso{ -\code{\link[=get_eurostat]{get_eurostat()}}. +\code{\link[=get_eurostat]{get_eurostat()}} } \author{ -Przemyslaw Biecek, Leo Lahti and Janne Huovari +Przemyslaw Biecek, Leo Lahti, Janne Huovari and Pyry Kantanen } \keyword{database} \keyword{utilities} diff --git a/man/get_eurostat_raw2.Rd b/man/get_eurostat_raw2.Rd deleted file mode 100644 index 6fe2ac85..00000000 --- a/man/get_eurostat_raw2.Rd +++ /dev/null @@ -1,70 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_eurostat_raw2.R -\name{get_eurostat_raw2} -\alias{get_eurostat_raw2} -\title{Download Data from Eurostat Dissemination API} -\usage{ -get_eurostat_raw2(id) -} -\arguments{ -\item{id}{A code name for the dataset of interested. See the table of -contents of eurostat datasets for more details.} -} -\value{ -A dataset in tibble format. First column contains comma -separated codes of cases. Other columns usually corresponds to -years and column names are years with preceding X. Data is in -character format as it contains values together with eurostat -flags for data. -} -\description{ -Download data from the eurostat database through the new -dissemination API. -} -\details{ -Data is downloaded from -\url{https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing} -and transformed into tabular format. -} -\examples{ -\dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -\donttest{ -eurostat:::get_eurostat_raw("educ_iste") -} -\dontshow{\}) # examplesIf} -} -\references{ -See \code{citation("eurostat")}: - -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: -# -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html -# -# A BibTeX entry for LaTeX users is -# -# @Article\{, -# title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, -# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, -# journal = \{The R Journal\}, -# volume = \{9\}, -# number = \{1\}, -# pages = \{385--392\}, -# year = \{2017\}, -# doi = \{10.32614/RJ-2017-019\}, -# url = \{https://doi.org/10.32614/RJ-2017-019\}, -# \} -}\if{html}{\out{
}} -} -\seealso{ -\code{\link[=get_eurostat]{get_eurostat()}}. -} -\author{ -Przemyslaw Biecek, Leo Lahti, Janne Huovari and Pyry Kantanen -} -\keyword{database} -\keyword{utilities} diff --git a/man/get_eurostat_toc.Rd b/man/get_eurostat_toc.Rd index 0126bae1..1efe3545 100755 --- a/man/get_eurostat_toc.Rd +++ b/man/get_eurostat_toc.Rd @@ -4,65 +4,130 @@ \alias{get_eurostat_toc} \title{Download Table of Contents of Eurostat Data Sets} \usage{ -get_eurostat_toc() +get_eurostat_toc(lang = "en") +} +\arguments{ +\item{lang}{2-letter language code, default is "\code{en}" (English), other +options are "\code{fr}" (French) and "\code{de}" (German). Used for labeling datasets.} } \value{ -A tibble with eight columns: -\itemize{ -\item title: The name of dataset of theme. -\item code: The codename of dataset of theme, will be used by the -\code{\link[=get_eurostat]{get_eurostat()}} and \code{\link[=get_eurostat_raw]{get_eurostat_raw()}} functions. -\item type: Is it a dataset, folder or table. -\item last.update.of.data, last.table.structure.change, -data.start, data.end: Dates. +A tibble with nine columns: +\describe{ +\item{title}{Dataset title in English (default)} +\item{code}{ Each item (dataset, table and folder) of the TOC has a +unique code which allows it to be identified in the API. Used in the +\code{\link[=get_eurostat]{get_eurostat()}} and \code{\link[=get_eurostat_raw]{get_eurostat_raw()}} functions to retrieve datasets.} +\item{type}{dataset, folder or table} +\item{last.update.of.data}{Date, indicates the last time the +dataset/table was updated (format \code{DD.MM.YYYY} or \verb{\%d.\%m.\%Y})} +\item{last.table.structure.change}{Date, indicates the last time the +dataset/table structure was modified (format \code{DD.MM.YYYY} or \verb{\%d.\%m.\%Y})} +\item{data.start}{Date of the oldest value included in the dataset +(if available) (format usually \code{YYYY} or \verb{\%Y} but can also be \code{YYYY-MM}, +\code{YYYY-MM-DD}, \code{YYYY-SN}, \code{YYYY-QN} etc.)} +\item{data.end}{Date of the most recent value included in the dataset +(if available) (format usually \code{YYYY} or \verb{\%Y} but can also be \code{YYYY-MM}, +\code{YYYY-MM-DD}, \code{YYYY-SN}, \code{YYYY-QN} etc.)} +\item{values}{Number of actual values included in the dataset} +\item{hierarchy}{Hierarchy of the data navigation tree, represented +in the original txt file by a 4-spaces indentation prefix in the title} } } \description{ Download table of contents (TOC) of eurostat datasets. } \details{ -The TOC is downloaded from \url{https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&file=table_of_contents_en.txt}. The values in column 'code' should be used to download a selected dataset. +In the downloaded Eurostat Table of Contents the 'code' column +values are refer to the function 'id' that is used as an argument in certain +functions when downloading datasets. +} +\section{Data source: Eurostat Table of Contents}{ +The Eurostat Table of Contents (TOC) is downloaded from +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=en} +(default) or from French or German language variants: +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=fr} +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=de} + +See Eurostat documentation on TOC items: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+-+Detailed+guidelines+-+Catalogue+API+-+TOC} } + \examples{ \dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ tmp <- get_eurostat_toc() head(tmp) + +# Convert columns containing dates as character into Date class +# Last update of data +tmp[[4]] <- as.Date(tmp[[4]], format = c("\%d.\%m.\%Y")) +# Last table structure change +tmp[[5]] <- as.Date(tmp[[5]], format = c("\%d.\%m.\%Y")) +# Data start, contains several formats (date, week, month quarter, semester) +# Unfortunately semesters are not directly supported so they need to be +# changed into quarters +tmp$data.start <- gsub("S2", "Q3", tmp$data.start) +tmp$data.start <- lubridate::as_date( + x = tmp$data.start, + format = c("\%Y", "\%Y-Q\%q", "\%Y-W\%W", "\%Y-S\%q", "\%Y-\%m-\%d", "\%Y-\%m") + ) +# Data end, same as data start +tmp$data.end <- gsub("S2", "Q3", tmp$data.end) +tmp$data.end <- lubridate::as_date( + x = tmp$data.end, + format = c("\%Y", "\%Y-Q\%q", "\%Y-W\%W", "\%Y-S\%q", "\%Y-\%m-\%d", "\%Y-\%m") + ) } \dontshow{\}) # examplesIf} } \references{ See \code{citation("eurostat")}: -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: -# -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html -# -# A BibTeX entry for LaTeX users is -# -# @Article\{, -# title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, -# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, -# journal = \{The R Journal\}, -# volume = \{9\}, -# number = \{1\}, -# pages = \{385--392\}, -# year = \{2017\}, -# doi = \{10.32614/RJ-2017-019\}, -# url = \{https://doi.org/10.32614/RJ-2017-019\}, -# \} +\if{html}{\out{
}}\preformatted{Kindly cite the eurostat R package as follows: + + Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and + analysis of Eurostat open data with the eurostat package. The R + Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 + +A BibTeX entry for LaTeX users is + + @Article\{10.32614/RJ-2017-019, + title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, + journal = \{The R Journal\}, + volume = \{9\}, + number = \{1\}, + pages = \{385--392\}, + year = \{2017\}, + doi = \{10.32614/RJ-2017-019\}, + url = \{https://doi.org/10.32614/RJ-2017-019\}, + \} + + Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., + and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data + [Computer software]. R package version 4.0.0. + https://github.com/rOpenGov/eurostat + +A BibTeX entry for LaTeX users is + + @Misc\{eurostat, + title = \{eurostat: Tools for Eurostat Open Data\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, + url = \{https://github.com/rOpenGov/eurostat\}, + type = \{Computer software\}, + year = \{2023\}, + note = \{R package version 4.0.0\}, + \} }\if{html}{\out{
}} + +When citing data downloaded from Eurostat, see section "Citing Eurostat data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. } \seealso{ -\code{\link[=get_eurostat]{get_eurostat()}}, \code{\link[=search_eurostat]{search_eurostat()}}. +\code{\link[=get_eurostat]{get_eurostat()}}, \code{\link[=search_eurostat]{search_eurostat()}} } \author{ -Przemyslaw Biecek and Leo Lahti \href{mailto:ropengov-forum@googlegroups.com}{ropengov-forum@googlegroups.com} +Przemyslaw Biecek, Leo Lahti and Pyry Kantanen \href{mailto:ropengov-forum@googlegroups.com}{ropengov-forum@googlegroups.com} } \keyword{database} \keyword{utilities} diff --git a/man/harmonize_country_code.Rd b/man/harmonize_country_code.Rd index 8a30c68a..27e58eb5 100755 --- a/man/harmonize_country_code.Rd +++ b/man/harmonize_country_code.Rd @@ -31,11 +31,8 @@ lp$geo <- harmonize_country_code(lp$geo) Other helpers: \code{\link{cut_to_classes}()}, \code{\link{dic_order}()}, -\code{\link{eurotime2date2}()}, \code{\link{eurotime2date}()}, -\code{\link{eurotime2num2}()}, \code{\link{eurotime2num}()}, -\code{\link{label_eurostat2}()}, \code{\link{label_eurostat}()} } \author{ diff --git a/man/label_eurostat.Rd b/man/label_eurostat.Rd index 66823dbf..21e9d855 100755 --- a/man/label_eurostat.Rd +++ b/man/label_eurostat.Rd @@ -4,7 +4,7 @@ \alias{label_eurostat} \alias{label_eurostat_vars} \alias{label_eurostat_tables} -\title{Get Eurostat Codes} +\title{Get Eurostat Codes for data downloaded from new dissemination API} \usage{ label_eurostat( x, @@ -18,11 +18,7 @@ label_eurostat( fix_duplicated = FALSE ) -label_eurostat_vars(x, lang = "en") - -label_eurostat_tables(x, lang = "en") - -label_eurostat_vars(x, lang = "en") +label_eurostat_vars(x = NULL, id, lang = "en") label_eurostat_tables(x, lang = "en") } @@ -39,8 +35,8 @@ should be retained. The suffix "_code" is added to code column names.} \item{eu_order}{Logical. Should Eurostat ordering used for label levels. Affects only factors.} -\item{lang}{A character, code for language. Available are "en" (default), -"fr" and "de".} +\item{lang}{2-letter language code, default is "\code{en}" (English), other +options are "\code{fr}" (French) and "\code{de}" (German). Used for labeling datasets.} \item{countrycode}{A \code{NULL} or a name of the coding scheme for the \code{\link[countrycode:countrycode]{countrycode::countrycode()}} @@ -62,6 +58,10 @@ list names should be dictionary codes.} \item{fix_duplicated}{A logical. If TRUE, the code is added to the duplicated label values. If FALSE (default) error is given if labeling produce duplicates.} + +\item{id}{A unique identifier / code for the dataset of interest. If code is not +known \code{\link[=search_eurostat]{search_eurostat()}} function can be used to search Eurostat table +of contents.} } \value{ a vector or a data_frame. @@ -84,13 +84,7 @@ with \code{fix_duplicated = TRUE}. } \section{Functions}{ \itemize{ -\item \code{label_eurostat_vars()}: Get definitions for variable (column) names. For -objects other than characters or factors definitions are get for names. - -\item \code{label_eurostat_tables()}: Get definitions for table names - -\item \code{label_eurostat_vars()}: Get definitions for variable (column) names. For -objects other than characters or factors definitions are get for names. +\item \code{label_eurostat_vars()}: Get definitions for variable (column) names. \item \code{label_eurostat_tables()}: Get definitions for table names @@ -102,17 +96,31 @@ lpl <- label_eurostat(lp) str(lpl) lpl_order <- label_eurostat(lp, eu_order = TRUE) lpl_code <- label_eurostat(lp, code = "unit") -label_eurostat_vars(names(lp)) +# Note that the dataset id must be provided in label_eurostat_vars +label_eurostat_vars(id = "nama_10_lp_ulc", x = "geo", lang = "en") label_eurostat_tables("nama_10_lp_ulc") label_eurostat(c("FI", "DE", "EU28"), dic = "geo") -label_eurostat(c("FI", "DE", "EU28"), dic = "geo", custom_dic = c(DE = "Germany")) -label_eurostat(c("FI", "DE", "EU28"), +label_eurostat( + c("FI", "DE", "EU28"), + dic = "geo", + custom_dic = c(DE = "Germany") +) +label_eurostat( + c("FI", "DE", "EU28"), dic = "geo", countrycode = "country.name", custom_dic = c(EU28 = "EU") ) -label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "country.name") +label_eurostat( + c("FI", "DE", "EU28"), + dic = "geo", + countrycode = "country.name" +) # In Finnish -label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "cldr.short.fi") +label_eurostat( + c("FI", "DE", "EU28"), + dic = "geo", + countrycode = "cldr.short.fi" +) } } @@ -122,12 +130,9 @@ label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "cldr.short.fi" Other helpers: \code{\link{cut_to_classes}()}, \code{\link{dic_order}()}, -\code{\link{eurotime2date2}()}, \code{\link{eurotime2date}()}, -\code{\link{eurotime2num2}()}, \code{\link{eurotime2num}()}, -\code{\link{harmonize_country_code}()}, -\code{\link{label_eurostat2}()} +\code{\link{harmonize_country_code}()} } \author{ Janne Huovari \href{mailto:janne.huovari@ptt.fi}{janne.huovari@ptt.fi} diff --git a/man/label_eurostat2.Rd b/man/label_eurostat2.Rd deleted file mode 100644 index 0ba1b8f8..00000000 --- a/man/label_eurostat2.Rd +++ /dev/null @@ -1,112 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/label_eurostat.R -\name{label_eurostat2} -\alias{label_eurostat2} -\title{Get Eurostat Codes for data downloaded from new dissemination API} -\usage{ -label_eurostat2( - x, - dic = NULL, - code = NULL, - eu_order = FALSE, - lang = "en", - countrycode = NULL, - countrycode_nomatch = NULL, - custom_dic = NULL, - fix_duplicated = FALSE -) -} -\arguments{ -\item{x}{A character or a factor vector or a data_frame.} - -\item{dic}{A string (vector) naming eurostat dictionary or dictionaries. -If \code{NULL} (default) dictionary names taken from column names of -the data_frame.} - -\item{code}{For data_frames names of the column for which also code columns -should be retained. The suffix "_code" is added to code column names.} - -\item{eu_order}{Logical. Should Eurostat ordering used for label levels. -Affects only factors.} - -\item{lang}{A character, code for language. Available are "en" (default), -"fr" and "de".} - -\item{countrycode}{A \code{NULL} or a name of the coding scheme for -the \code{\link[countrycode:countrycode]{countrycode::countrycode()}} -to label "geo" variable with countrycode-package. It can be used to -convert to short and long country names in many different languages. -If \code{NULL} (default) eurostat dictionary is used instead.} - -\item{countrycode_nomatch}{What to do when using the countrycode to label -a "geo" and countrycode fails to find a match, for example other than -country codes like EU28. The original code is used with -a \code{NULL} (default), eurostat dictionary label is used with "eurostat", -and \code{NA} is used with NA.} - -\item{custom_dic}{a named vector or named list of named vectors to give an -own dictionary for (part of) codes. Names of the vector should be codes -and values labels. List can be used to specify dictionaries and then -list names should be dictionary codes.} - -\item{fix_duplicated}{A logical. If TRUE, the code is added to the -duplicated label values. If FALSE (default) error is given if -labeling produce duplicates.} -} -\value{ -a vector or a data_frame. -} -\description{ -Get definitions for Eurostat codes from Eurostat dictionaries. -} -\details{ -A character or a factor vector of codes returns a corresponding -vector of definitions. \code{\link[=label_eurostat]{label_eurostat()}} labels also data_frames from -\code{\link[=get_eurostat]{get_eurostat()}}. For vectors a dictionary name have to be -supplied. For data_frames dictionary names are taken from column names. -"time" and "values" columns are returned as they were, so you can supply -data_frame from \code{\link[=get_eurostat]{get_eurostat()}} and get data_frame with -definitions instead of codes. - -Some Eurostat dictionaries includes duplicated labels. By default -duplicated labels cause an error, but they can be fixed automatically -with \code{fix_duplicated = TRUE}. -} -\examples{ -\dontrun{ -lp <- get_eurostat("nama_10_lp_ulc") -lpl <- label_eurostat(lp) -str(lpl) -lpl_order <- label_eurostat(lp, eu_order = TRUE) -lpl_code <- label_eurostat(lp, code = "unit") -label_eurostat_vars(names(lp)) -label_eurostat_tables("nama_10_lp_ulc") -label_eurostat(c("FI", "DE", "EU28"), dic = "geo") -label_eurostat(c("FI", "DE", "EU28"), dic = "geo", custom_dic = c(DE = "Germany")) -label_eurostat(c("FI", "DE", "EU28"), - dic = "geo", countrycode = "country.name", - custom_dic = c(EU28 = "EU") -) -label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "country.name") -# In Finnish -label_eurostat(c("FI", "DE", "EU28"), dic = "geo", countrycode = "cldr.short.fi") -} - -} -\seealso{ -\code{\link[countrycode:countrycode]{countrycode::countrycode()}} - -Other helpers: -\code{\link{cut_to_classes}()}, -\code{\link{dic_order}()}, -\code{\link{eurotime2date2}()}, -\code{\link{eurotime2date}()}, -\code{\link{eurotime2num2}()}, -\code{\link{eurotime2num}()}, -\code{\link{harmonize_country_code}()}, -\code{\link{label_eurostat}()} -} -\author{ -Janne Huovari \href{mailto:janne.huovari@ptt.fi}{janne.huovari@ptt.fi} -} -\concept{helpers} diff --git a/man/list_eurostat_cache_items.Rd b/man/list_eurostat_cache_items.Rd new file mode 100644 index 00000000..7bf3317f --- /dev/null +++ b/man/list_eurostat_cache_items.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/set_eurostat_cache.R +\name{list_eurostat_cache_items} +\alias{list_eurostat_cache_items} +\title{Output cache information as data.frame} +\usage{ +list_eurostat_cache_items(cache_dir = NULL) +} +\arguments{ +\item{cache_dir}{a path to a cache directory. \code{NULL} (default) uses and creates +'eurostat' directory in the temporary directory defined by base R +\code{\link[=tempdir]{tempdir()}} function. The user can set the cache directory to an existing +directory by using this argument. The cache directory can also be set with +\code{\link[=set_eurostat_cache_dir]{set_eurostat_cache_dir()}} function.} +} +\value{ +A data.frame object with 3 columns: dataset code, download date and +query md5 hash +} +\description{ +Parses cache_list.json file and returns a data.frame +} diff --git a/man/search_eurostat.Rd b/man/search_eurostat.Rd index eadeee4b..2f96125b 100755 --- a/man/search_eurostat.Rd +++ b/man/search_eurostat.Rd @@ -2,51 +2,81 @@ % Please edit documentation in R/search_eurostat.R \name{search_eurostat} \alias{search_eurostat} -\alias{grepEurostatTOC} \title{Grep Datasets Titles from Eurostat} \usage{ -search_eurostat(pattern, type = "dataset", fixed = TRUE) - -grepEurostatTOC(pattern, type = "dataset") +search_eurostat( + pattern, + type = "dataset", + column = "title", + fixed = TRUE, + lang = "en" +) } \arguments{ -\item{pattern}{Character, datasets, folder or tables with this pattern in -the description will be returned (depending on the 'type' argument)} +\item{pattern}{Text string that is used to search from dataset, folder or table titles, +depending on the type argument.} + +\item{type}{Selection for types of datasets to be searched. Default is \code{dataset}, other +possible options are \code{table}, \code{folder} and \code{all} for all types.} -\item{type}{Grep the Eurostat table of contents either for -'dataset' (default), 'folder', 'table' or "all" (for all types).} +\item{column}{Selection for the column of TOC where search is done. Default is \code{title}, +other possible option is \code{code}.} -\item{fixed}{logical. If TRUE, pattern is a string to be matched as is. -Change to FALSE if more complex regex matching is needed.} +\item{fixed}{logical. If TRUE (default), pattern is a string to be matched as is. +See \code{grep()} documentation for more information.} + +\item{lang}{2-letter language code, default is "\code{en}" (English), other +options are "\code{fr}" (French) and "\code{de}" (German). Used for labeling datasets.} } \value{ -A tibble with eight columns -\itemize{ -\item \strong{title}: The name of dataset of theme -\itemize{ -\item \strong{code}: The codename of dataset of theme, will be used by the -\code{\link[=get_eurostat]{get_eurostat()}} and \code{\link[=get_eurostat_raw]{get_eurostat_raw()}} functions. -\item \strong{type}: Is it a dataset, folder or table. -\item \strong{last.update.of.data, last.table.structure.change, data.start, -data.end}: Dates. -} +A tibble with nine columns: +\describe{ +\item{title}{Dataset title in English (default)} +\item{code}{ Each item (dataset, table and folder) of the TOC has a +unique code which allows it to be identified in the API. Used in the +\code{\link[=get_eurostat]{get_eurostat()}} and \code{\link[=get_eurostat_raw]{get_eurostat_raw()}} functions to retrieve datasets.} +\item{type}{dataset, folder or table} +\item{last.update.of.data}{Date, indicates the last time the +dataset/table was updated (format \code{DD.MM.YYYY} or \verb{\%d.\%m.\%Y})} +\item{last.table.structure.change}{Date, indicates the last time the +dataset/table structure was modified (format \code{DD.MM.YYYY} or \verb{\%d.\%m.\%Y})} +\item{data.start}{Date of the oldest value included in the dataset +(if available) (format usually \code{YYYY} or \verb{\%Y} but can also be \code{YYYY-MM}, +\code{YYYY-MM-DD}, \code{YYYY-SN}, \code{YYYY-QN} etc.)} +\item{data.end}{Date of the most recent value included in the dataset +(if available) (format usually \code{YYYY} or \verb{\%Y} but can also be \code{YYYY-MM}, +\code{YYYY-MM-DD}, \code{YYYY-SN}, \code{YYYY-QN} etc.)} +\item{values}{Number of actual values included in the dataset} +\item{hierarchy}{Hierarchy of the data navigation tree, represented +in the original txt file by a 4-spaces indentation prefix in the title} } } \description{ -Lists names of dataset from eurostat with the particular -pattern in the description. +Lists datasets from eurostat table of contents with the +particular pattern in item titles. } \details{ Downloads list of all datasets available on eurostat and return list of names of datasets that contains particular pattern in the dataset description. E.g. all datasets related to education of teaching. + +If you wish to perform searches on other fields than item title, +you can download the Eurostat Table of Contents manually using +\code{get_eurostat_toc()} function and use \code{grep()} function normally. The data +browser on Eurostat website may also return useful results. +} +\section{Data source: Eurostat Table of Contents}{ +The Eurostat Table of Contents (TOC) is downloaded from +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=en} +(default) or from French or German language variants: +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=fr} +\url{https://ec.europa.eu/eurostat/api/dissemination/catalogue/toc/txt?lang=de} + +See Eurostat documentation on TOC items: +\url{https://wikis.ec.europa.eu/display/EUROSTATHELP/API+-+Detailed+guidelines+-+Catalogue+API+-+TOC} } -\section{Functions}{ -\itemize{ -\item \code{grepEurostatTOC()}: Old deprecated version -}} \examples{ \dontshow{if (check_access_to_data()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} \donttest{ @@ -61,32 +91,48 @@ tmp <- search_eurostat("Live births (total) by NUTS 3 region", fixed = TRUE) \references{ See \code{citation("eurostat")}: -\if{html}{\out{
}}\preformatted{# -# Kindly cite the eurostat R package as follows: -# -# (C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek. -# Retrieval and analysis of Eurostat open data with the eurostat -# package. R Journal 9(1):385-392, 2017. doi: 10.32614/RJ-2017-019 -# Package URL: http://ropengov.github.io/eurostat Article URL: -# https://journal.r-project.org/archive/2017/RJ-2017-019/index.html -# -# A BibTeX entry for LaTeX users is -# -# @Article\{, -# title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, -# author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, -# journal = \{The R Journal\}, -# volume = \{9\}, -# number = \{1\}, -# pages = \{385--392\}, -# year = \{2017\}, -# doi = \{10.32614/RJ-2017-019\}, -# url = \{https://doi.org/10.32614/RJ-2017-019\}, -# \} +\if{html}{\out{
}}\preformatted{Kindly cite the eurostat R package as follows: + + Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and + analysis of Eurostat open data with the eurostat package. The R + Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 + +A BibTeX entry for LaTeX users is + + @Article\{10.32614/RJ-2017-019, + title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, + journal = \{The R Journal\}, + volume = \{9\}, + number = \{1\}, + pages = \{385--392\}, + year = \{2017\}, + doi = \{10.32614/RJ-2017-019\}, + url = \{https://doi.org/10.32614/RJ-2017-019\}, + \} + + Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., + and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data + [Computer software]. R package version 4.0.0. + https://github.com/rOpenGov/eurostat + +A BibTeX entry for LaTeX users is + + @Misc\{eurostat, + title = \{eurostat: Tools for Eurostat Open Data\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, + url = \{https://github.com/rOpenGov/eurostat\}, + type = \{Computer software\}, + year = \{2023\}, + note = \{R package version 4.0.0\}, + \} }\if{html}{\out{
}} + +When citing data downloaded from Eurostat, see section "Citing Eurostat data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. } \seealso{ -\code{\link[=get_eurostat]{get_eurostat()}}, \code{\link[=get_eurostat_toc]{get_eurostat_toc()}} +\code{\link[=get_eurostat]{get_eurostat()}}, \code{\link[=search_eurostat]{search_eurostat()}} } \author{ Przemyslaw Biecek and Leo Lahti \href{mailto:ropengov-forum@googlegroups.com}{ropengov-forum@googlegroups.com} diff --git a/man/set_eurostat_toc.Rd b/man/set_eurostat_toc.Rd index 86409389..1dd96891 100755 --- a/man/set_eurostat_toc.Rd +++ b/man/set_eurostat_toc.Rd @@ -4,10 +4,11 @@ \alias{set_eurostat_toc} \title{Set Eurostat TOC} \usage{ -set_eurostat_toc(...) +set_eurostat_toc(lang = "en") } \arguments{ -\item{...}{Arguments to be passed} +\item{lang}{2-letter language code, default is "\code{en}" (English), other +options are "\code{fr}" (French) and "\code{de}" (German). Used for labeling datasets.} } \value{ Empty element @@ -18,6 +19,10 @@ Internal function. \references{ see citation("eurostat") } +\seealso{ +\code{\link[=get_eurostat_toc]{get_eurostat_toc()}} \code{\link[=toc_count_children]{toc_count_children()}} \code{\link[=toc_determine_hierarchy]{toc_determine_hierarchy()}} +\code{\link[=toc_list_children]{toc_list_children()}} \code{\link[=toc_count_whitespace]{toc_count_whitespace()}} +} \author{ Przemyslaw Biecek and Leo Lahti \href{mailto:ropengov-forum@googlegroups.com}{ropengov-forum@googlegroups.com} } diff --git a/man/tgs00026.Rd b/man/tgs00026.Rd index 733e3981..548e1dfc 100755 --- a/man/tgs00026.Rd +++ b/man/tgs00026.Rd @@ -20,6 +20,7 @@ Data retrieval date: 2022-06-27 } \seealso{ Other datasets: +\code{\link{eu_countries}}, \code{\link{eurostat_geodata_60_2016}} } \concept{datasets} diff --git a/man/tidy_eurostat.Rd b/man/tidy_eurostat.Rd index 8bf45e84..55156ae6 100755 --- a/man/tidy_eurostat.Rd +++ b/man/tidy_eurostat.Rd @@ -9,47 +9,113 @@ tidy_eurostat( time_format = "date", select_time = NULL, stringsAsFactors = FALSE, - keepFlags = FALSE + keepFlags = FALSE, + use.data.table = FALSE ) } \arguments{ \item{dat}{a data_frame from \code{\link[=get_eurostat_raw]{get_eurostat_raw()}}.} -\item{time_format}{a string giving a type of the conversion of the -time column from the eurostat format. -A "date" (default) converts to a \code{\link[=Date]{Date()}} -with a first date of the period. A "date_last" -converts to a \code{\link[=Date]{Date()}} with -a last date of the period. A "num" converts to a numeric and "raw" -does not do conversion. See \code{\link[=eurotime2date]{eurotime2date()}} and -\code{\link[=eurotime2num]{eurotime2num()}}.} +\item{time_format}{a string giving a type of the conversion of the time column from the +eurostat format. The default argument "\code{date}" converts to a \code{\link[=Date]{Date()}} class +with the date being the first day of the period. A "\code{date_last}" argument +converts the dataset date to a \code{\link[=Date]{Date()}} class object with the difference +that the exact date is the last date of the period. Period can be year, +semester (half year), quarter, month, or week (See \code{\link[=eurotime2date]{eurotime2date()}} for +more information). +Argument "\code{num}" converts the date into a numeric (integer) meaning that +the first day of the year 2000 is close to 2000.01 and the last day of the +year is close to 2000.99 (see \code{\link[=eurotime2num]{eurotime2num()}} for more information). +Using the argument "\code{raw}" preserves the dates as they were in the original +Eurostat data.} -\item{select_time}{a character symbol for a time frequency or NULL -(default).} +\item{select_time}{a character symbol for a time frequency or \code{NULL}, +which is used by default as most datasets have just one time +frequency. For datasets with multiple time +frequencies, select one or more of the desired frequencies with: +"Y" (or "A") = annual, "S" = semi-annual / semester, "Q" = quarterly, +"M" = monthly, "W" = weekly. For all frequencies in same data +frame \code{time_format = "raw"} should be used.} -\item{stringsAsFactors}{if \code{TRUE} (the default) variables are -converted to factors in original Eurostat order. If \code{FALSE} -they are returned as strings.} +\item{stringsAsFactors}{if \code{TRUE} (the default) variables are converted to factors in the original +Eurostat order. If \code{FALSE} they are returned as strings.} \item{keepFlags}{a logical whether the flags (e.g. "confidential", "provisional") should be kept in a separate column or if they -can be removed. Default is \code{FALSE}} +can be removed. Default is \code{FALSE}. For flag values see: +\url{https://ec.europa.eu/eurostat/data/database/information}. +Also possible non-real zero "0n" is indicated in flags column. +Flags are not available for eurostat API, so \code{keepFlags} +can not be used with a \code{filters}.} + +\item{use.data.table}{Use faster data.table functions? Default is FALSE. +On Windows requires that RTools is installed.} } \value{ -tibble in the molten format with the last column 'values'. +tibble in the melted format with the last column 'values'. } \description{ -Transform raw Eurostat data table into the row-column-value -format (RCV). +Transform raw Eurostat data table downloaded from the +API into a tidy row-column-value format (RCV). +} +\examples{ +\dontrun{ +# Example of a dataset with multiple time series +get_eurostat("AVIA_GOR_ME", + time_format = "date_last", + cache = F + ) +} + } \references{ -See citation("eurostat"). +See \code{citation("eurostat")}: + +\if{html}{\out{
}}\preformatted{Kindly cite the eurostat R package as follows: + + Lahti L., Huovari J., Kainu M., and Biecek P. (2017). Retrieval and + analysis of Eurostat open data with the eurostat package. The R + Journal 9(1), pp. 385-392. doi: 10.32614/RJ-2017-019 + +A BibTeX entry for LaTeX users is + + @Article\{10.32614/RJ-2017-019, + title = \{Retrieval and Analysis of Eurostat Open Data with the eurostat Package\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek\}, + journal = \{The R Journal\}, + volume = \{9\}, + number = \{1\}, + pages = \{385--392\}, + year = \{2017\}, + doi = \{10.32614/RJ-2017-019\}, + url = \{https://doi.org/10.32614/RJ-2017-019\}, + \} + + Lahti, L., Huovari J., Kainu M., Biecek P., Hernangomez D., Antal D., + and Kantanen P. (2023). eurostat: Tools for Eurostat Open Data + [Computer software]. R package version 4.0.0. + https://github.com/rOpenGov/eurostat + +A BibTeX entry for LaTeX users is + + @Misc\{eurostat, + title = \{eurostat: Tools for Eurostat Open Data\}, + author = \{Leo Lahti and Janne Huovari and Markus Kainu and Przemyslaw Biecek and Diego Hernangomez and Daniel Antal and Pyry Kantanen\}, + url = \{https://github.com/rOpenGov/eurostat\}, + type = \{Computer software\}, + year = \{2023\}, + note = \{R package version 4.0.0\}, + \} +}\if{html}{\out{
}} + +When citing data downloaded from Eurostat, see section "Citing Eurostat data" +in \code{\link[=get_eurostat]{get_eurostat()}} documentation. } \seealso{ -\code{\link[=get_eurostat]{get_eurostat()}} +\code{\link[=get_eurostat]{get_eurostat()}}, \code{\link[=convert_time_col]{convert_time_col()}}, \code{\link[=eurotime2date]{eurotime2date()}} } \author{ -Przemyslaw Biecek, Leo Lahti and Janne Huovari +Przemyslaw Biecek, Leo Lahti, Janne Huovari and Pyry Kantanen } \keyword{database} \keyword{internal} diff --git a/man/tidy_eurostat2.Rd b/man/tidy_eurostat2.Rd deleted file mode 100644 index 82b379c0..00000000 --- a/man/tidy_eurostat2.Rd +++ /dev/null @@ -1,65 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tidy_eurostat2.R -\name{tidy_eurostat2} -\alias{tidy_eurostat2} -\title{Transform Data from the New Dissemination API into Row-Column-Value Format} -\usage{ -tidy_eurostat2( - dat, - time_format = "date", - select_time = NULL, - stringsAsFactors = FALSE, - keepFlags = FALSE -) -} -\arguments{ -\item{dat}{a data_frame from \code{\link[=get_eurostat_raw]{get_eurostat_raw()}}.} - -\item{time_format}{a string giving a type of the conversion of the time column from the -eurostat format. A "date" (default) converts to a \code{\link[=Date]{Date()}} -with a first date of the period. A "date_last" converts to a \code{\link[=Date]{Date()}} with -a last date of the period. A "num" converts to a numeric and "raw" -does not do conversion. See \code{\link[=eurotime2date]{eurotime2date()}} and \code{\link[=eurotime2num]{eurotime2num()}}.} - -\item{select_time}{a single character symbol for a time frequency, a vector -containing multiple time frequencies, or \code{NULL} (default). -Available options are "A" (annual), "Q" (quarterly), "S" -(semester, 1st or 2nd half of the year), "M" (monthly) and "D" (daily). -When downloading data from the New Dissemination API, it is now possible -to select multiple time frequencies and return them in the same data.frame -object.} - -\item{stringsAsFactors}{if \code{TRUE} (the default) variables are -converted to factors in original Eurostat order. If \code{FALSE} -they are returned as strings.} - -\item{keepFlags}{a logical whether the flags (e.g. "confidential", -"provisional") should be kept in a separate column or if they -can be removed. Default is \code{FALSE}} -} -\value{ -tibble in the molten format with the last column 'values'. -} -\description{ -Transform raw Eurostat data table downloaded from the new -dissemination API into the row-column-value format (RCV). -} -\examples{ -\dontrun{ -# Example of a dataset with multiple time series -get_eurostat("AVIA_GOR_ME", time_format = "date_last", cache = F, bulk_new_style = TRUE) -} - -} -\references{ -See citation("eurostat"). -} -\seealso{ -\code{\link[=get_eurostat]{get_eurostat()}}, \code{\link[=convert_time_col2]{convert_time_col2()}}, \code{\link[=eurotime2date2]{eurotime2date2()}} -} -\author{ -Przemyslaw Biecek, Leo Lahti, Janne Huovari and Pyry Kantanen -} -\keyword{database} -\keyword{internal} -\keyword{utilities} diff --git a/man/toc_count_children.Rd b/man/toc_count_children.Rd new file mode 100644 index 00000000..2822d9a1 --- /dev/null +++ b/man/toc_count_children.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/set_eurostat_toc.R +\name{toc_count_children} +\alias{toc_count_children} +\title{Count number of children} +\usage{ +toc_count_children(code) +} +\arguments{ +\item{code}{Eurostat TOC item code (folder, dataset, table)} +} +\description{ +Determine how many children a certain TOC item (usually a folder) has. +} +\seealso{ +\code{\link[=get_eurostat_toc]{get_eurostat_toc()}} \code{\link[=toc_count_children]{toc_count_children()}} \code{\link[=toc_determine_hierarchy]{toc_determine_hierarchy()}} +\code{\link[=toc_list_children]{toc_list_children()}} \code{\link[=toc_count_whitespace]{toc_count_whitespace()}} +} +\author{ +Pyry Kantanen +} +\keyword{internal} diff --git a/man/toc_count_whitespace.Rd b/man/toc_count_whitespace.Rd new file mode 100644 index 00000000..ca7f08e1 --- /dev/null +++ b/man/toc_count_whitespace.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/set_eurostat_toc.R +\name{toc_count_whitespace} +\alias{toc_count_whitespace} +\title{Count white space at the start of the title} +\usage{ +toc_count_whitespace(input_string) +} +\arguments{ +\item{input_string}{A string containing Eurostat TOC titles} +} +\value{ +Numeric (number of white space characters) +} +\description{ +Counts the number of white space characters at the start +of the string. +} +\details{ +Used in toc_determine_hierarchy function to determine hierarchy. +Hierarchy is defined in Eurostat .txt format TOC files by the number of +white space characters at intervals of four. For example, +" Foo" (4 white space characters) is one level higher than +" Bar" (8 white space characters). +"Database by themes" (0 white space characters before the first +alphanumeric character) is highest in the hierarchy. + +The function will return a warning if the input has white space in anything +else than as increments of 4. 0, 4, 8... are acceptable but 3, 6, 10... +are not. +} +\examples{ +strings <- c(" abc", " cdf", "no_spaces") +for (string in strings) { + whitespace_count <- eurostat:::toc_count_whitespace(string) + cat("String:", string, "\tWhitespace Count:", whitespace_count, "\n") +} + +} +\seealso{ +\code{\link[=get_eurostat_toc]{get_eurostat_toc()}} \code{\link[=toc_count_children]{toc_count_children()}} \code{\link[=toc_determine_hierarchy]{toc_determine_hierarchy()}} +\code{\link[=toc_list_children]{toc_list_children()}} \code{\link[=toc_count_whitespace]{toc_count_whitespace()}} +} +\author{ +Pyry Kantanen +} +\keyword{internal} diff --git a/man/toc_determine_hierarchy.Rd b/man/toc_determine_hierarchy.Rd new file mode 100644 index 00000000..584ca2f8 --- /dev/null +++ b/man/toc_determine_hierarchy.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/set_eurostat_toc.R +\name{toc_determine_hierarchy} +\alias{toc_determine_hierarchy} +\title{Determine level in hierarchy} +\usage{ +toc_determine_hierarchy(input_string) +} +\arguments{ +\item{input_string}{A string containing Eurostat TOC titles} +} +\value{ +Numeric +} +\description{ +Divides the number of spaces before alphanumeric characters +with 4 and uses the result to determine hierarchy. Top level is 0. +} +\details{ +Used in toc_determine_hierarchy function to determine hierarchy. +Hierarchy is defined in Eurostat .txt format TOC files by the number of +white space characters at intervals of four. For example, +" Foo" (4 white space characters) is one level higher than +" Bar" (8 white space characters). +"Database by themes" (0 white space characters before the first +alphanumeric character) is highest in the hierarchy. + +The function will return a warning if the input has white space in anything +else than as increments of 4. 0, 4, 8... are acceptable but 3, 6, 10... +are not. +} +\examples{ +strings <- c(" abc", " cdf", "no_spaces") +eurostat:::toc_determine_hierarchy(strings) + +} +\seealso{ +\code{\link[=get_eurostat_toc]{get_eurostat_toc()}} \code{\link[=toc_count_children]{toc_count_children()}} \code{\link[=toc_determine_hierarchy]{toc_determine_hierarchy()}} +\code{\link[=toc_list_children]{toc_list_children()}} \code{\link[=toc_count_whitespace]{toc_count_whitespace()}} +} +\author{ +Pyry Kantanen +} +\keyword{internal} diff --git a/man/toc_list_children.Rd b/man/toc_list_children.Rd new file mode 100644 index 00000000..69d8c769 --- /dev/null +++ b/man/toc_list_children.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/set_eurostat_toc.R +\name{toc_list_children} +\alias{toc_list_children} +\title{List children} +\usage{ +toc_list_children(code) +} +\arguments{ +\item{code}{Eurostat TOC item code (folder, dataset, table)} +} +\description{ +List children of a specific folder. +} +\seealso{ +\code{\link[=get_eurostat_toc]{get_eurostat_toc()}} \code{\link[=toc_count_children]{toc_count_children()}} \code{\link[=toc_determine_hierarchy]{toc_determine_hierarchy()}} +\code{\link[=toc_list_children]{toc_list_children()}} \code{\link[=toc_count_whitespace]{toc_count_whitespace()}} +} +\author{ +Pyry Kantanen +} +\keyword{internal} diff --git a/pkgdown/_pkgdown.yml b/pkgdown/_pkgdown.yml index a6d3ea6d..83ebd27e 100644 --- a/pkgdown/_pkgdown.yml +++ b/pkgdown/_pkgdown.yml @@ -13,6 +13,6 @@ reference: - title: Additional functions contents: has_concept("helpers") - title: Datasets - contents: has_keyword("datasets") + contents: has_concept("datasets") - title: About the package contents: eurostat diff --git a/revdep/.gitignore b/revdep/.gitignore new file mode 100644 index 00000000..31f6c40d --- /dev/null +++ b/revdep/.gitignore @@ -0,0 +1,6 @@ +checks +library +checks.noindex +library.noindex +data.sqlite +*.html diff --git a/revdep/README.md b/revdep/README.md index 1bf7cb33..5aceec41 100644 --- a/revdep/README.md +++ b/revdep/README.md @@ -1,26 +1,85 @@ # Platform -|field |value | -|:--------|:-------------------------------------------------------------------------------------------| -|version |R version 4.2.2 (2022-10-31) | -|os |macOS Ventura 13.2.1 | -|system |aarch64, darwin20 | -|ui |RStudio | -|language |(EN) | -|collate |en_US.UTF-8 | -|ctype |en_US.UTF-8 | -|tz |Europe/Helsinki | -|date |2023-02-22 | -|rstudio |2022.12.0+353 Elsbeth Geranium (desktop) | -|pandoc |2.19.2 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown) | +|field |value | +|:--------|:------------------------------------------| +|version |R version 4.3.1 (2023-06-16 ucrt) | +|os |Windows 11 x64 (build 22621) | +|system |x86_64, mingw32 | +|ui |RStudio | +|language |(EN) | +|collate |Spanish_Spain.utf8 | +|ctype |Spanish_Spain.utf8 | +|tz |Europe/Madrid | +|date |2023-07-01 | +|rstudio |2023.06.0+421 Mountain Hydrangea (desktop) | +|pandoc |2.19.2 @ C:\PROGRA~1\Pandoc\pandoc.exe | # Dependencies -|package |old |new |Δ | -|:---------|:------|:------|:--| -|eurostat |3.7.10 |3.7.14 |* | -|lubridate |NA |1.9.2 |* | -|readr |NA |2.1.4 |* | +|package |old |new |Δ | +|:-----------|:------|:----------|:--| +|eurostat |3.8.2 |4.0.0.9002 |* | +|askpass |1.1 |1.1 | | +|assertthat |0.2.1 |0.2.1 | | +|backports |1.4.1 |1.4.1 | | +|bibtex |0.5.1 |0.5.1 | | +|bit |4.0.5 |4.0.5 | | +|bit64 |4.0.5 |4.0.5 | | +|broom |1.0.5 |NA |* | +|cellranger |1.1.0 |1.1.0 | | +|classInt |0.4-9 |0.4-9 | | +|cli |3.6.1 |3.6.1 | | +|clipr |0.8.0 |0.8.0 | | +|countrycode |1.5.0 |1.5.0 | | +|cpp11 |0.4.4 |0.4.4 | | +|crayon |1.5.2 |1.5.2 | | +|curl |5.0.1 |5.0.1 | | +|dplyr |1.1.2 |1.1.2 | | +|e1071 |1.7-13 |1.7-13 | | +|ellipsis |0.3.2 |NA |* | +|fansi |1.0.4 |1.0.4 | | +|generics |0.1.3 |0.1.3 | | +|glue |1.6.2 |1.6.2 | | +|here |1.0.1 |1.0.1 | | +|hms |1.1.3 |1.1.3 | | +|httr |1.4.6 |1.4.6 | | +|ISOweek |0.6-2 |0.6-2 | | +|jsonlite |1.8.7 |1.8.7 | | +|lifecycle |1.0.3 |1.0.3 | | +|lubridate |1.9.2 |1.9.2 | | +|magrittr |2.0.3 |2.0.3 | | +|mime |0.12 |0.12 | | +|openssl |2.0.6 |2.0.6 | | +|pillar |1.9.0 |1.9.0 | | +|pkgconfig |2.0.3 |2.0.3 | | +|plyr |1.8.8 |1.8.8 | | +|prettyunits |1.1.1 |1.1.1 | | +|progress |1.2.2 |1.2.2 | | +|proxy |0.4-27 |0.4-27 | | +|purrr |1.0.1 |1.0.1 | | +|R6 |2.5.1 |2.5.1 | | +|rappdirs |0.3.3 |0.3.3 | | +|Rcpp |1.0.10 |1.0.10 | | +|readr |2.1.4 |2.1.4 | | +|readxl |1.4.2 |1.4.2 | | +|RefManageR |1.4.0 |1.4.0 | | +|regions |0.1.8 |0.1.8 | | +|rematch |1.0.1 |1.0.1 | | +|rlang |1.1.1 |1.1.1 | | +|rprojroot |2.0.3 |2.0.3 | | +|stringi |1.7.12 |1.7.12 | | +|stringr |1.5.0 |1.5.0 | | +|sys |3.4.2 |3.4.2 | | +|tibble |3.2.1 |3.2.1 | | +|tidyr |1.3.0 |1.3.0 | | +|tidyselect |1.2.0 |1.2.0 | | +|timechange |0.2.0 |0.2.0 | | +|tzdb |0.4.0 |0.4.0 | | +|utf8 |1.2.3 |1.2.3 | | +|vctrs |0.6.3 |0.6.3 | | +|vroom |1.6.3 |1.6.3 | | +|withr |2.5.0 |2.5.0 | | +|xml2 |1.3.4 |1.3.4 | | # Revdeps diff --git a/revdep/check.R b/revdep/check.R deleted file mode 100755 index e262948c..00000000 --- a/revdep/check.R +++ /dev/null @@ -1,5 +0,0 @@ -library("devtools") - -revdep_check() -revdep_check_save_summary() -revdep_check_print_problems() diff --git a/revdep/checks.noindex/ARPALData/ARPALData_1.2.3.tar.gz b/revdep/checks.noindex/ARPALData/ARPALData_1.2.3.tar.gz deleted file mode 100644 index e3989047..00000000 Binary files a/revdep/checks.noindex/ARPALData/ARPALData_1.2.3.tar.gz and /dev/null differ diff --git a/revdep/checks.noindex/ARPALData/new/libraries.txt b/revdep/checks.noindex/ARPALData/new/libraries.txt deleted file mode 100644 index fb748a9a..00000000 --- a/revdep/checks.noindex/ARPALData/new/libraries.txt +++ /dev/null @@ -1,142 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/new -eurostat (3.7.14) -lubridate (1.9.2) -readr (2.1.4) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/ARPALData -askpass (1.1) -assertthat (0.2.1) -aweek (1.0.3) -backports (1.4.1) -base64enc (0.1-3) -BH (1.81.0-1) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -blob (1.2.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -codetools (0.2-19) -colorspace (2.1-0) -conflicted (1.2.0) -countrycode (1.4.0) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -data.table (1.14.8) -DBI (1.1.3) -dbplyr (2.3.0) -digest (0.6.31) -doParallel (1.0.17) -dplyr (1.1.0) -dtplyr (1.2.2) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -forcats (1.0.0) -foreach (1.5.2) -fs (1.6.1) -gargle (1.3.0) -generics (0.1.3) -ggplot2 (3.4.1) -glue (1.6.2) -googledrive (2.0.0) -googlesheets4 (1.0.1) -gtable (0.3.1) -haven (2.5.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -ids (1.0.1) -isoband (0.2.7) -iterators (1.0.14) -jquerylib (0.1.4) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -lattice (0.20-45) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -modelr (0.1.10) -moments (0.14.1) -mondate (0.10.02) -munsell (0.5.0) -nlme (3.1-162) -NLP (0.2-1) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -plyr (1.8.8) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -ragg (1.2.5) -rappdirs (0.3.3) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -reprex (2.0.2) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -RSocrata (1.7.12-4) -rstudioapi (0.14) -rvest (1.0.3) -s2 (1.1.2) -sass (0.4.5) -scales (1.2.1) -selectr (0.4-2) -sf (1.0-9) -slam (0.1-50) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -systemfonts (1.0.4) -textshaping (0.3.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -tidyverse (2.0.0) -timechange (0.2.0) -tinytex (0.44) -tm (0.7-11) -tzdb (0.3.0) -units (0.8-1) -utf8 (1.2.3) -uuid (1.1-0) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -withr (2.5.0) -wk (0.7.1) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/ARPALData/old/libraries.txt b/revdep/checks.noindex/ARPALData/old/libraries.txt deleted file mode 100644 index 97f36548..00000000 --- a/revdep/checks.noindex/ARPALData/old/libraries.txt +++ /dev/null @@ -1,140 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/old -eurostat (3.7.10) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/ARPALData -askpass (1.1) -assertthat (0.2.1) -aweek (1.0.3) -backports (1.4.1) -base64enc (0.1-3) -BH (1.81.0-1) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -blob (1.2.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -codetools (0.2-19) -colorspace (2.1-0) -conflicted (1.2.0) -countrycode (1.4.0) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -data.table (1.14.8) -DBI (1.1.3) -dbplyr (2.3.0) -digest (0.6.31) -doParallel (1.0.17) -dplyr (1.1.0) -dtplyr (1.2.2) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -forcats (1.0.0) -foreach (1.5.2) -fs (1.6.1) -gargle (1.3.0) -generics (0.1.3) -ggplot2 (3.4.1) -glue (1.6.2) -googledrive (2.0.0) -googlesheets4 (1.0.1) -gtable (0.3.1) -haven (2.5.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -ids (1.0.1) -isoband (0.2.7) -iterators (1.0.14) -jquerylib (0.1.4) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -lattice (0.20-45) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -modelr (0.1.10) -moments (0.14.1) -mondate (0.10.02) -munsell (0.5.0) -nlme (3.1-162) -NLP (0.2-1) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -plyr (1.8.8) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -ragg (1.2.5) -rappdirs (0.3.3) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -reprex (2.0.2) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -RSocrata (1.7.12-4) -rstudioapi (0.14) -rvest (1.0.3) -s2 (1.1.2) -sass (0.4.5) -scales (1.2.1) -selectr (0.4-2) -sf (1.0-9) -slam (0.1-50) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -systemfonts (1.0.4) -textshaping (0.3.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -tidyverse (2.0.0) -timechange (0.2.0) -tinytex (0.44) -tm (0.7-11) -tzdb (0.3.0) -units (0.8-1) -utf8 (1.2.3) -uuid (1.1-0) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -withr (2.5.0) -wk (0.7.1) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/convergEU/convergEU_0.5.4.tar.gz b/revdep/checks.noindex/convergEU/convergEU_0.5.4.tar.gz deleted file mode 100644 index 731b5e30..00000000 Binary files a/revdep/checks.noindex/convergEU/convergEU_0.5.4.tar.gz and /dev/null differ diff --git a/revdep/checks.noindex/convergEU/new/libraries.txt b/revdep/checks.noindex/convergEU/new/libraries.txt deleted file mode 100644 index 86521352..00000000 --- a/revdep/checks.noindex/convergEU/new/libraries.txt +++ /dev/null @@ -1,178 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/new -eurostat (3.7.14) -lubridate (1.9.2) -readr (2.1.4) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/convergEU -abind (1.4-5) -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -bitops (1.0-7) -boot (1.3-28.1) -brew (1.0-8) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -car (3.1-1) -carData (3.0-5) -caTools (1.18.2) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -commonmark (1.8.1) -corrplot (0.92) -countrycode (1.4.0) -cowplot (1.1.1) -cpp11 (0.4.3) -crayon (1.5.2) -credentials (1.3.2) -curl (5.0.0) -desc (1.4.2) -devtools (2.4.5) -diffobj (0.3.5) -digest (0.6.31) -downlit (0.4.2) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -fontawesome (0.5.0) -formattable (0.2.1) -fs (1.6.1) -generics (0.1.3) -gert (1.9.2) -ggplot2 (3.4.1) -ggpubr (0.6.0) -ggrepel (0.9.3) -ggsci (2.9) -ggsignif (0.6.4) -gh (1.3.1) -gitcreds (0.1.2) -glue (1.6.2) -gridExtra (2.3) -gtable (0.3.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -htmlwidgets (1.6.1) -httpuv (1.6.9) -httr (1.4.4) -ini (0.3.1) -isoband (0.2.7) -jquerylib (0.1.4) -jsonlite (1.8.4) -kableExtra (1.3.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -later (1.3.0) -lattice (0.20-45) -lifecycle (1.0.3) -lme4 (1.1-31) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -MatrixModels (0.5-1) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -miniUI (0.1.1.1) -minqa (1.2.5) -munsell (0.5.0) -nlme (3.1-162) -nloptr (2.0.3) -nnet (7.3-18) -numDeriv (2016.8-1.1) -openssl (2.0.5) -pbkrtest (0.5.2) -pillar (1.8.1) -pkgbuild (1.4.0) -pkgconfig (2.0.3) -pkgdown (2.0.7) -pkgload (1.3.2) -plyr (1.8.8) -polynom (1.4-1) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -profvis (0.3.7) -progress (1.2.2) -promises (1.2.0.1) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -quantreg (5.94) -R6 (2.5.1) -ragg (1.2.5) -rappdirs (0.3.3) -rcmdcheck (1.4.0) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -RcppEigen (0.3.3.9.3) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -remotes (2.4.2) -rlang (1.0.6) -rmarkdown (2.20) -roxygen2 (7.2.3) -rprojroot (2.0.3) -rstatix (0.7.2) -rstudioapi (0.14) -rversions (2.1.2) -rvest (1.0.3) -sass (0.4.5) -scales (1.2.1) -selectr (0.4-2) -sessioninfo (1.2.2) -shiny (1.7.4) -sourcetools (0.1.7-1) -SparseM (1.81) -stringi (1.7.12) -stringr (1.5.0) -survival (3.5-3) -svglite (2.1.1) -sys (3.4.1) -systemfonts (1.0.4) -testthat (3.1.6) -textshaping (0.3.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -urlchecker (1.0.1) -usethis (2.1.6) -utf8 (1.2.3) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -webshot (0.5.4) -whisker (0.4.1) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -xopen (1.0.0) -xtable (1.8-4) -yaml (2.3.7) -zip (2.2.2) diff --git a/revdep/checks.noindex/convergEU/old/libraries.txt b/revdep/checks.noindex/convergEU/old/libraries.txt deleted file mode 100644 index 0f79df60..00000000 --- a/revdep/checks.noindex/convergEU/old/libraries.txt +++ /dev/null @@ -1,176 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/old -eurostat (3.7.10) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/convergEU -abind (1.4-5) -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -bitops (1.0-7) -boot (1.3-28.1) -brew (1.0-8) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -car (3.1-1) -carData (3.0-5) -caTools (1.18.2) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -commonmark (1.8.1) -corrplot (0.92) -countrycode (1.4.0) -cowplot (1.1.1) -cpp11 (0.4.3) -crayon (1.5.2) -credentials (1.3.2) -curl (5.0.0) -desc (1.4.2) -devtools (2.4.5) -diffobj (0.3.5) -digest (0.6.31) -downlit (0.4.2) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -fontawesome (0.5.0) -formattable (0.2.1) -fs (1.6.1) -generics (0.1.3) -gert (1.9.2) -ggplot2 (3.4.1) -ggpubr (0.6.0) -ggrepel (0.9.3) -ggsci (2.9) -ggsignif (0.6.4) -gh (1.3.1) -gitcreds (0.1.2) -glue (1.6.2) -gridExtra (2.3) -gtable (0.3.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -htmlwidgets (1.6.1) -httpuv (1.6.9) -httr (1.4.4) -ini (0.3.1) -isoband (0.2.7) -jquerylib (0.1.4) -jsonlite (1.8.4) -kableExtra (1.3.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -later (1.3.0) -lattice (0.20-45) -lifecycle (1.0.3) -lme4 (1.1-31) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -MatrixModels (0.5-1) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -miniUI (0.1.1.1) -minqa (1.2.5) -munsell (0.5.0) -nlme (3.1-162) -nloptr (2.0.3) -nnet (7.3-18) -numDeriv (2016.8-1.1) -openssl (2.0.5) -pbkrtest (0.5.2) -pillar (1.8.1) -pkgbuild (1.4.0) -pkgconfig (2.0.3) -pkgdown (2.0.7) -pkgload (1.3.2) -plyr (1.8.8) -polynom (1.4-1) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -profvis (0.3.7) -progress (1.2.2) -promises (1.2.0.1) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -quantreg (5.94) -R6 (2.5.1) -ragg (1.2.5) -rappdirs (0.3.3) -rcmdcheck (1.4.0) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -RcppEigen (0.3.3.9.3) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -remotes (2.4.2) -rlang (1.0.6) -rmarkdown (2.20) -roxygen2 (7.2.3) -rprojroot (2.0.3) -rstatix (0.7.2) -rstudioapi (0.14) -rversions (2.1.2) -rvest (1.0.3) -sass (0.4.5) -scales (1.2.1) -selectr (0.4-2) -sessioninfo (1.2.2) -shiny (1.7.4) -sourcetools (0.1.7-1) -SparseM (1.81) -stringi (1.7.12) -stringr (1.5.0) -survival (3.5-3) -svglite (2.1.1) -sys (3.4.1) -systemfonts (1.0.4) -testthat (3.1.6) -textshaping (0.3.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -urlchecker (1.0.1) -usethis (2.1.6) -utf8 (1.2.3) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -webshot (0.5.4) -whisker (0.4.1) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -xopen (1.0.0) -xtable (1.8-4) -yaml (2.3.7) -zip (2.2.2) diff --git a/revdep/checks.noindex/dataset/dataset_0.2.0.tar.gz b/revdep/checks.noindex/dataset/dataset_0.2.0.tar.gz deleted file mode 100644 index 3ae59a48..00000000 Binary files a/revdep/checks.noindex/dataset/dataset_0.2.0.tar.gz and /dev/null differ diff --git a/revdep/checks.noindex/dataset/new/libraries.txt b/revdep/checks.noindex/dataset/new/libraries.txt deleted file mode 100644 index 657e7566..00000000 --- a/revdep/checks.noindex/dataset/new/libraries.txt +++ /dev/null @@ -1,148 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/new -eurostat (3.7.14) -lubridate (1.9.2) -readr (2.1.4) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/dataset -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brew (1.0-8) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -commonmark (1.8.1) -countrycode (1.4.0) -covr (3.6.1) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -dataspice (1.1.0) -declared (0.19) -desc (1.4.2) -diffobj (0.3.5) -digest (0.6.31) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -EML (2.0.6.1) -emld (0.5.1) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -fontawesome (0.5.0) -fs (1.6.1) -generics (0.1.3) -ggplot2 (3.4.1) -glue (1.6.2) -gtable (0.3.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -htmlwidgets (1.6.1) -httpuv (1.6.9) -httr (1.4.4) -hunspell (3.0.2) -isoband (0.2.7) -ISOcodes (2022.09.29) -jqr (1.2.3) -jquerylib (0.1.4) -jsonld (2.2) -jsonlite (1.8.4) -kableExtra (1.3.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -later (1.3.0) -lattice (0.20-45) -lazyeval (0.2.2) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -munsell (0.5.0) -nlme (3.1-162) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -promises (1.2.0.1) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -rappdirs (0.3.3) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -rdflib (0.2.5) -readr (2.1.4) -readxl (1.4.2) -redland (1.0.17-16) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -rex (1.2.1) -rhandsontable (0.3.8) -rlang (1.0.6) -rmarkdown (2.20) -roxygen2 (7.2.3) -rprojroot (2.0.3) -rstudioapi (0.14) -rvest (1.0.3) -sass (0.4.5) -scales (1.2.1) -selectr (0.4-2) -shiny (1.7.4) -sourcetools (0.1.7-1) -spelling (2.2) -statcodelists (0.9.2) -stringi (1.7.12) -stringr (1.5.0) -svglite (2.1.1) -sys (3.4.1) -systemfonts (1.0.4) -testthat (3.1.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -utf8 (1.2.3) -uuid (1.1-0) -V8 (4.2.2) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -webshot (0.5.4) -whisker (0.4.1) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -xtable (1.8-4) -yaml (2.3.7) diff --git a/revdep/checks.noindex/dataset/old/libraries.txt b/revdep/checks.noindex/dataset/old/libraries.txt deleted file mode 100644 index 2d5e9a81..00000000 --- a/revdep/checks.noindex/dataset/old/libraries.txt +++ /dev/null @@ -1,146 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/old -eurostat (3.7.10) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/dataset -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brew (1.0-8) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -commonmark (1.8.1) -countrycode (1.4.0) -covr (3.6.1) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -dataspice (1.1.0) -declared (0.19) -desc (1.4.2) -diffobj (0.3.5) -digest (0.6.31) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -EML (2.0.6.1) -emld (0.5.1) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -fontawesome (0.5.0) -fs (1.6.1) -generics (0.1.3) -ggplot2 (3.4.1) -glue (1.6.2) -gtable (0.3.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -htmlwidgets (1.6.1) -httpuv (1.6.9) -httr (1.4.4) -hunspell (3.0.2) -isoband (0.2.7) -ISOcodes (2022.09.29) -jqr (1.2.3) -jquerylib (0.1.4) -jsonld (2.2) -jsonlite (1.8.4) -kableExtra (1.3.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -later (1.3.0) -lattice (0.20-45) -lazyeval (0.2.2) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -munsell (0.5.0) -nlme (3.1-162) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -promises (1.2.0.1) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -rappdirs (0.3.3) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -rdflib (0.2.5) -readr (2.1.4) -readxl (1.4.2) -redland (1.0.17-16) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -rex (1.2.1) -rhandsontable (0.3.8) -rlang (1.0.6) -rmarkdown (2.20) -roxygen2 (7.2.3) -rprojroot (2.0.3) -rstudioapi (0.14) -rvest (1.0.3) -sass (0.4.5) -scales (1.2.1) -selectr (0.4-2) -shiny (1.7.4) -sourcetools (0.1.7-1) -spelling (2.2) -statcodelists (0.9.2) -stringi (1.7.12) -stringr (1.5.0) -svglite (2.1.1) -sys (3.4.1) -systemfonts (1.0.4) -testthat (3.1.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -utf8 (1.2.3) -uuid (1.1-0) -V8 (4.2.2) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -webshot (0.5.4) -whisker (0.4.1) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -xtable (1.8-4) -yaml (2.3.7) diff --git a/revdep/checks.noindex/flagr/flagr_0.3.2.tar.gz b/revdep/checks.noindex/flagr/flagr_0.3.2.tar.gz deleted file mode 100644 index 469b64e9..00000000 Binary files a/revdep/checks.noindex/flagr/flagr_0.3.2.tar.gz and /dev/null differ diff --git a/revdep/checks.noindex/flagr/new/libraries.txt b/revdep/checks.noindex/flagr/new/libraries.txt deleted file mode 100644 index 57f6e2f9..00000000 --- a/revdep/checks.noindex/flagr/new/libraries.txt +++ /dev/null @@ -1,97 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/new -eurostat (3.7.14) -lubridate (1.9.2) -readr (2.1.4) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/flagr -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -countrycode (1.4.0) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -desc (1.4.2) -diffobj (0.3.5) -digest (0.6.31) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -fastmap (1.1.0) -fs (1.6.1) -generics (0.1.3) -glue (1.6.2) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -jquerylib (0.1.4) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -memoise (2.0.1) -mime (0.12) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -rappdirs (0.3.3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -sass (0.4.5) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -testthat (3.1.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -utf8 (1.2.3) -vctrs (0.5.2) -vroom (1.6.1) -waldo (0.4.0) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/flagr/old/libraries.txt b/revdep/checks.noindex/flagr/old/libraries.txt deleted file mode 100644 index e587d298..00000000 --- a/revdep/checks.noindex/flagr/old/libraries.txt +++ /dev/null @@ -1,95 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/old -eurostat (3.7.10) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/flagr -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -countrycode (1.4.0) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -desc (1.4.2) -diffobj (0.3.5) -digest (0.6.31) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -fastmap (1.1.0) -fs (1.6.1) -generics (0.1.3) -glue (1.6.2) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -jquerylib (0.1.4) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -memoise (2.0.1) -mime (0.12) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -rappdirs (0.3.3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -sass (0.4.5) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -testthat (3.1.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -utf8 (1.2.3) -vctrs (0.5.2) -vroom (1.6.1) -waldo (0.4.0) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/giscoR/giscoR_0.3.3.tar.gz b/revdep/checks.noindex/giscoR/giscoR_0.3.3.tar.gz deleted file mode 100644 index ed979ea9..00000000 Binary files a/revdep/checks.noindex/giscoR/giscoR_0.3.3.tar.gz and /dev/null differ diff --git a/revdep/checks.noindex/giscoR/new/libraries.txt b/revdep/checks.noindex/giscoR/new/libraries.txt deleted file mode 100644 index f7b3d97b..00000000 --- a/revdep/checks.noindex/giscoR/new/libraries.txt +++ /dev/null @@ -1,122 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/new -eurostat (3.7.14) -lubridate (1.9.2) -readr (2.1.4) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/giscoR -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -countrycode (1.4.0) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -DBI (1.1.3) -desc (1.4.2) -diffobj (0.3.5) -digest (0.6.31) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -fs (1.6.1) -generics (0.1.3) -geojsonsf (2.0.3) -geometries (0.2.0) -ggplot2 (3.4.1) -glue (1.6.2) -gtable (0.3.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -isoband (0.2.7) -jquerylib (0.1.4) -jsonify (1.2.2) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -lattice (0.20-45) -lifecycle (1.0.3) -lubridate (1.9.2) -lwgeom (0.2-11) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -munsell (0.5.0) -nlme (3.1-162) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -rapidjsonr (1.2.0) -rappdirs (0.3.3) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -s2 (1.1.2) -sass (0.4.5) -scales (1.2.1) -sf (1.0-9) -sfheaders (0.4.0) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -testthat (3.1.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -units (0.8-1) -utf8 (1.2.3) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -withr (2.5.0) -wk (0.7.1) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/giscoR/old/libraries.txt b/revdep/checks.noindex/giscoR/old/libraries.txt deleted file mode 100644 index e8aac55c..00000000 --- a/revdep/checks.noindex/giscoR/old/libraries.txt +++ /dev/null @@ -1,120 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/old -eurostat (3.7.10) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/giscoR -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -countrycode (1.4.0) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -DBI (1.1.3) -desc (1.4.2) -diffobj (0.3.5) -digest (0.6.31) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -fs (1.6.1) -generics (0.1.3) -geojsonsf (2.0.3) -geometries (0.2.0) -ggplot2 (3.4.1) -glue (1.6.2) -gtable (0.3.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -isoband (0.2.7) -jquerylib (0.1.4) -jsonify (1.2.2) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -lattice (0.20-45) -lifecycle (1.0.3) -lubridate (1.9.2) -lwgeom (0.2-11) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -munsell (0.5.0) -nlme (3.1-162) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -rapidjsonr (1.2.0) -rappdirs (0.3.3) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -s2 (1.1.2) -sass (0.4.5) -scales (1.2.1) -sf (1.0-9) -sfheaders (0.4.0) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -testthat (3.1.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -units (0.8-1) -utf8 (1.2.3) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -withr (2.5.0) -wk (0.7.1) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/iotables/iotables_0.9.1.tar.gz b/revdep/checks.noindex/iotables/iotables_0.9.1.tar.gz deleted file mode 100644 index 5346deb2..00000000 Binary files a/revdep/checks.noindex/iotables/iotables_0.9.1.tar.gz and /dev/null differ diff --git a/revdep/checks.noindex/iotables/new/libraries.txt b/revdep/checks.noindex/iotables/new/libraries.txt deleted file mode 100644 index 0cbc76c9..00000000 --- a/revdep/checks.noindex/iotables/new/libraries.txt +++ /dev/null @@ -1,118 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/new -eurostat (3.7.14) -lubridate (1.9.2) -readr (2.1.4) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/iotables -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -commonmark (1.8.1) -countrycode (1.4.0) -covr (3.6.1) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -desc (1.4.2) -diffobj (0.3.5) -digest (0.6.31) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -forcats (1.0.0) -fs (1.6.1) -generics (0.1.3) -glue (1.6.2) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -hunspell (3.0.2) -jquerylib (0.1.4) -jsonlite (1.8.4) -kableExtra (1.3.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -lazyeval (0.2.2) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -memoise (2.0.1) -mime (0.12) -munsell (0.5.0) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -rappdirs (0.3.3) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -rex (1.2.1) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -rstudioapi (0.14) -rvest (1.0.3) -sass (0.4.5) -scales (1.2.1) -selectr (0.4-2) -spelling (2.2) -stringi (1.7.12) -stringr (1.5.0) -svglite (2.1.1) -sys (3.4.1) -systemfonts (1.0.4) -testthat (3.1.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -utf8 (1.2.3) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -webshot (0.5.4) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/iotables/old/libraries.txt b/revdep/checks.noindex/iotables/old/libraries.txt deleted file mode 100644 index 8f38d5a0..00000000 --- a/revdep/checks.noindex/iotables/old/libraries.txt +++ /dev/null @@ -1,116 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/old -eurostat (3.7.10) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/iotables -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -commonmark (1.8.1) -countrycode (1.4.0) -covr (3.6.1) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -desc (1.4.2) -diffobj (0.3.5) -digest (0.6.31) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -forcats (1.0.0) -fs (1.6.1) -generics (0.1.3) -glue (1.6.2) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -hunspell (3.0.2) -jquerylib (0.1.4) -jsonlite (1.8.4) -kableExtra (1.3.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -lazyeval (0.2.2) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -memoise (2.0.1) -mime (0.12) -munsell (0.5.0) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -progress (1.2.2) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -rappdirs (0.3.3) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rematch2 (2.1.2) -rex (1.2.1) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -rstudioapi (0.14) -rvest (1.0.3) -sass (0.4.5) -scales (1.2.1) -selectr (0.4-2) -spelling (2.2) -stringi (1.7.12) -stringr (1.5.0) -svglite (2.1.1) -sys (3.4.1) -systemfonts (1.0.4) -testthat (3.1.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -utf8 (1.2.3) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -webshot (0.5.4) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/libraries.csv b/revdep/checks.noindex/libraries.csv deleted file mode 100644 index c96af949..00000000 --- a/revdep/checks.noindex/libraries.csv +++ /dev/null @@ -1,4 +0,0 @@ -package,old,new,delta -eurostat,3.7.10,3.7.14,* -lubridate,NA,1.9.2,* -readr,NA,2.1.4,* diff --git a/revdep/checks.noindex/potential/new/libraries.txt b/revdep/checks.noindex/potential/new/libraries.txt deleted file mode 100644 index f9d42797..00000000 --- a/revdep/checks.noindex/potential/new/libraries.txt +++ /dev/null @@ -1,109 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/new -eurostat (3.7.14) -lubridate (1.9.2) -readr (2.1.4) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/potential -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -codetools (0.2-19) -countrycode (1.4.0) -covr (3.6.1) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -DBI (1.1.3) -digest (0.6.31) -doParallel (1.0.17) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -fastmap (1.1.0) -foreach (1.5.2) -fs (1.6.1) -generics (0.1.3) -geojsonsf (2.0.3) -geometries (0.2.0) -giscoR (0.3.3) -glue (1.6.2) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -isoband (0.2.7) -iterators (1.0.14) -jquerylib (0.1.4) -jsonify (1.2.2) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -lazyeval (0.2.2) -lifecycle (1.0.3) -lubridate (1.9.2) -lwgeom (0.2-11) -magrittr (2.0.3) -mapiso (0.2.0) -mapsf (0.6.1) -MASS (7.3-58.2) -memoise (2.0.1) -mime (0.12) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -plyr (1.8.8) -prettyunits (1.1.1) -progress (1.2.2) -proxy (0.4-27) -purrr (1.0.1) -R6 (2.5.1) -rapidjsonr (1.2.0) -rappdirs (0.3.3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rex (1.2.1) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -s2 (1.1.2) -sass (0.4.5) -sf (1.0-9) -sfheaders (0.4.0) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytest (1.4.1) -tinytex (0.44) -tzdb (0.3.0) -units (0.8-1) -utf8 (1.2.3) -vctrs (0.5.2) -vroom (1.6.1) -withr (2.5.0) -wk (0.7.1) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/potential/old/libraries.txt b/revdep/checks.noindex/potential/old/libraries.txt deleted file mode 100644 index f9ec371c..00000000 --- a/revdep/checks.noindex/potential/old/libraries.txt +++ /dev/null @@ -1,107 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/old -eurostat (3.7.10) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/potential -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -codetools (0.2-19) -countrycode (1.4.0) -covr (3.6.1) -cpp11 (0.4.3) -crayon (1.5.2) -curl (5.0.0) -DBI (1.1.3) -digest (0.6.31) -doParallel (1.0.17) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -fastmap (1.1.0) -foreach (1.5.2) -fs (1.6.1) -generics (0.1.3) -geojsonsf (2.0.3) -geometries (0.2.0) -giscoR (0.3.3) -glue (1.6.2) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -httr (1.4.4) -isoband (0.2.7) -iterators (1.0.14) -jquerylib (0.1.4) -jsonify (1.2.2) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -lazyeval (0.2.2) -lifecycle (1.0.3) -lubridate (1.9.2) -lwgeom (0.2-11) -magrittr (2.0.3) -mapiso (0.2.0) -mapsf (0.6.1) -MASS (7.3-58.2) -memoise (2.0.1) -mime (0.12) -openssl (2.0.5) -pillar (1.8.1) -pkgconfig (2.0.3) -plyr (1.8.8) -prettyunits (1.1.1) -progress (1.2.2) -proxy (0.4-27) -purrr (1.0.1) -R6 (2.5.1) -rapidjsonr (1.2.0) -rappdirs (0.3.3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -regions (0.1.8) -rematch (1.0.1) -rex (1.2.1) -rlang (1.0.6) -rmarkdown (2.20) -rprojroot (2.0.3) -s2 (1.1.2) -sass (0.4.5) -sf (1.0-9) -sfheaders (0.4.0) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytest (1.4.1) -tinytex (0.44) -tzdb (0.3.0) -units (0.8-1) -utf8 (1.2.3) -vctrs (0.5.2) -vroom (1.6.1) -withr (2.5.0) -wk (0.7.1) -xfun (0.37) -xml2 (1.3.3) -yaml (2.3.7) diff --git a/revdep/checks.noindex/potential/potential_0.2.0.tar.gz b/revdep/checks.noindex/potential/potential_0.2.0.tar.gz deleted file mode 100644 index 394c5e98..00000000 Binary files a/revdep/checks.noindex/potential/potential_0.2.0.tar.gz and /dev/null differ diff --git a/revdep/checks.noindex/regions/new/libraries.txt b/revdep/checks.noindex/regions/new/libraries.txt deleted file mode 100644 index 18b17c28..00000000 --- a/revdep/checks.noindex/regions/new/libraries.txt +++ /dev/null @@ -1,150 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/new -eurostat (3.7.14) -lubridate (1.9.2) -readr (2.1.4) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/regions -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brew (1.0-8) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -commonmark (1.8.1) -countrycode (1.4.0) -covr (3.6.1) -cpp11 (0.4.3) -crayon (1.5.2) -credentials (1.3.2) -curl (5.0.0) -desc (1.4.2) -devtools (2.4.5) -diffobj (0.3.5) -digest (0.6.31) -downlit (0.4.2) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -fontawesome (0.5.0) -fs (1.6.1) -generics (0.1.3) -gert (1.9.2) -ggplot2 (3.4.1) -gh (1.3.1) -gitcreds (0.1.2) -glue (1.6.2) -gtable (0.3.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -htmlwidgets (1.6.1) -httpuv (1.6.9) -httr (1.4.4) -hunspell (3.0.2) -ini (0.3.1) -isoband (0.2.7) -jquerylib (0.1.4) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -later (1.3.0) -lattice (0.20-45) -lazyeval (0.2.2) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -miniUI (0.1.1.1) -munsell (0.5.0) -nlme (3.1-162) -openssl (2.0.5) -pillar (1.8.1) -pkgbuild (1.4.0) -pkgconfig (2.0.3) -pkgdown (2.0.7) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -profvis (0.3.7) -progress (1.2.2) -promises (1.2.0.1) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -ragg (1.2.5) -rappdirs (0.3.3) -rcmdcheck (1.4.0) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -rematch (1.0.1) -rematch2 (2.1.2) -remotes (2.4.2) -rex (1.2.1) -rlang (1.0.6) -rmarkdown (2.20) -roxygen2 (7.2.3) -rprojroot (2.0.3) -rstudioapi (0.14) -rversions (2.1.2) -sass (0.4.5) -scales (1.2.1) -sessioninfo (1.2.2) -shiny (1.7.4) -sourcetools (0.1.7-1) -spelling (2.2) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -systemfonts (1.0.4) -testthat (3.1.6) -textshaping (0.3.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -urlchecker (1.0.1) -usethis (2.1.6) -utf8 (1.2.3) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -whisker (0.4.1) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -xopen (1.0.0) -xtable (1.8-4) -yaml (2.3.7) -zip (2.2.2) diff --git a/revdep/checks.noindex/regions/old/libraries.txt b/revdep/checks.noindex/regions/old/libraries.txt deleted file mode 100644 index 71ecbecc..00000000 --- a/revdep/checks.noindex/regions/old/libraries.txt +++ /dev/null @@ -1,148 +0,0 @@ -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/eurostat/old -eurostat (3.7.10) - -Library: /Users/pyrykantanen/Github/eurostat/revdep/library.noindex/regions -askpass (1.1) -assertthat (0.2.1) -backports (1.4.1) -base64enc (0.1-3) -bibtex (0.5.1) -bit (4.0.5) -bit64 (4.0.5) -brew (1.0-8) -brio (1.1.3) -broom (1.0.3) -bslib (0.4.2) -cachem (1.0.6) -callr (3.7.3) -cellranger (1.1.0) -class (7.3-21) -classInt (0.4-8) -cli (3.6.0) -clipr (0.8.0) -colorspace (2.1-0) -commonmark (1.8.1) -countrycode (1.4.0) -covr (3.6.1) -cpp11 (0.4.3) -crayon (1.5.2) -credentials (1.3.2) -curl (5.0.0) -desc (1.4.2) -devtools (2.4.5) -diffobj (0.3.5) -digest (0.6.31) -downlit (0.4.2) -dplyr (1.1.0) -e1071 (1.7-13) -ellipsis (0.3.2) -evaluate (0.20) -fansi (1.0.4) -farver (2.1.1) -fastmap (1.1.0) -fontawesome (0.5.0) -fs (1.6.1) -generics (0.1.3) -gert (1.9.2) -ggplot2 (3.4.1) -gh (1.3.1) -gitcreds (0.1.2) -glue (1.6.2) -gtable (0.3.1) -here (1.0.1) -highr (0.10) -hms (1.1.2) -htmltools (0.5.4) -htmlwidgets (1.6.1) -httpuv (1.6.9) -httr (1.4.4) -hunspell (3.0.2) -ini (0.3.1) -isoband (0.2.7) -jquerylib (0.1.4) -jsonlite (1.8.4) -KernSmooth (2.23-20) -knitr (1.42) -labeling (0.4.2) -later (1.3.0) -lattice (0.20-45) -lazyeval (0.2.2) -lifecycle (1.0.3) -lubridate (1.9.2) -magrittr (2.0.3) -MASS (7.3-58.2) -Matrix (1.5-3) -memoise (2.0.1) -mgcv (1.8-41) -mime (0.12) -miniUI (0.1.1.1) -munsell (0.5.0) -nlme (3.1-162) -openssl (2.0.5) -pillar (1.8.1) -pkgbuild (1.4.0) -pkgconfig (2.0.3) -pkgdown (2.0.7) -pkgload (1.3.2) -plyr (1.8.8) -praise (1.0.0) -prettyunits (1.1.1) -processx (3.8.0) -profvis (0.3.7) -progress (1.2.2) -promises (1.2.0.1) -proxy (0.4-27) -ps (1.7.2) -purrr (1.0.1) -R6 (2.5.1) -ragg (1.2.5) -rappdirs (0.3.3) -rcmdcheck (1.4.0) -RColorBrewer (1.1-3) -Rcpp (1.0.10) -readr (2.1.4) -readxl (1.4.2) -RefManageR (1.4.0) -rematch (1.0.1) -rematch2 (2.1.2) -remotes (2.4.2) -rex (1.2.1) -rlang (1.0.6) -rmarkdown (2.20) -roxygen2 (7.2.3) -rprojroot (2.0.3) -rstudioapi (0.14) -rversions (2.1.2) -sass (0.4.5) -scales (1.2.1) -sessioninfo (1.2.2) -shiny (1.7.4) -sourcetools (0.1.7-1) -spelling (2.2) -stringi (1.7.12) -stringr (1.5.0) -sys (3.4.1) -systemfonts (1.0.4) -testthat (3.1.6) -textshaping (0.3.6) -tibble (3.1.8) -tidyr (1.3.0) -tidyselect (1.2.0) -timechange (0.2.0) -tinytex (0.44) -tzdb (0.3.0) -urlchecker (1.0.1) -usethis (2.1.6) -utf8 (1.2.3) -vctrs (0.5.2) -viridisLite (0.4.1) -vroom (1.6.1) -waldo (0.4.0) -whisker (0.4.1) -withr (2.5.0) -xfun (0.37) -xml2 (1.3.3) -xopen (1.0.0) -xtable (1.8-4) -yaml (2.3.7) -zip (2.2.2) diff --git a/revdep/checks.noindex/regions/regions_0.1.8.tar.gz b/revdep/checks.noindex/regions/regions_0.1.8.tar.gz deleted file mode 100644 index 020e6f21..00000000 Binary files a/revdep/checks.noindex/regions/regions_0.1.8.tar.gz and /dev/null differ diff --git a/revdep/cran.md b/revdep/cran.md index 02685234..7ac41de3 100644 --- a/revdep/cran.md +++ b/revdep/cran.md @@ -1,6 +1,6 @@ ## revdepcheck results -We checked 8 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package. +We checked 9 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package. * We saw 0 new problems * We failed to check 0 packages diff --git a/revdep/data.sqlite b/revdep/data.sqlite index f4fc31da..fd5dd57d 100644 Binary files a/revdep/data.sqlite and b/revdep/data.sqlite differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/CITATION b/revdep/library.noindex/eurostat/new/eurostat/CITATION deleted file mode 100755 index c0edebb6..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/CITATION +++ /dev/null @@ -1,28 +0,0 @@ -citHeader("Kindly cite the eurostat R package as follows:") - -note <- sprintf("Version %s", meta$Version) - -bibentry("Article", - title = "Retrieval and Analysis of Eurostat Open Data with the eurostat Package", - author = c( - person("Leo", "Lahti"), - person("Janne", "Huovari"), - person("Markus", "Kainu"), - person("Przemyslaw", "Biecek") - ), - journal = "The R Journal", - volume = 9, - number = 1, - pages = "385--392", - year = "2017", - doi = "10.32614/RJ-2017-019", - url = "https://doi.org/10.32614/RJ-2017-019", - textVersion = - paste("(C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek.", - "Retrieval and analysis of Eurostat open data with the eurostat package. R Journal 9(1):385-392, 2017.", - "doi: 10.32614/RJ-2017-019", - "Package URL: http://ropengov.github.io/eurostat", - "Article URL: https://journal.r-project.org/archive/2017/RJ-2017-019/index.html", - sep = " " - ) -) diff --git a/revdep/library.noindex/eurostat/new/eurostat/DESCRIPTION b/revdep/library.noindex/eurostat/new/eurostat/DESCRIPTION deleted file mode 100644 index 4d67dc00..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/DESCRIPTION +++ /dev/null @@ -1,69 +0,0 @@ -Type: Package -Package: eurostat -Title: Tools for Eurostat Open Data -Version: 3.7.14 -Date: 2023-02-22 -Authors@R: c( - person("Leo", "Lahti", , "leo.lahti@iki.fi", role = c("aut", "cre"), - comment = c(ORCID = "0000-0001-5537-637X")), - person("Janne", "Huovari", role = "aut"), - person("Markus", "Kainu", role = "aut"), - person("Przemyslaw", "Biecek", role = "aut"), - person("Daniel", "Antal", role = "ctb"), - person("Diego", "Hernangomez", role = "ctb", - comment = c(ORCID = "0000-0001-8457-4658")), - person("Joona", "Lehtomaki", role = "ctb"), - person("Francois", "Briatte", role = "ctb"), - person("Reto", "Stauffer", role = "ctb"), - person("Paul", "Rougieux", role = "ctb"), - person("Anna", "Vasylytsya", role = "ctb"), - person("Oliver", "Reiter", role = "ctb"), - person("Pyry", "Kantanen", role = "ctb", - comment = c(ORCID = "0000-0003-2853-2765")), - person("Enrico", "Spinielli", , "enrico.spinielli@gmail.com", role = "ctb", - comment = c(ORCID = "0000-0001-8584-9131")) - ) -Description: Tools to download data from the Eurostat database - together with search and manipulation - utilities. -License: BSD_2_clause + file LICENSE -URL: https://ropengov.github.io/eurostat/, - https://github.com/rOpenGov/eurostat -BugReports: https://github.com/rOpenGov/eurostat/issues -Depends: methods, R (>= 3.5.0) -Imports: broom, classInt, countrycode, curl, dplyr, httr, jsonlite, - lubridate, rappdirs, readr, RefManageR, regions, stringi, - stringr, tibble, tidyr (>= 1.0.0), ISOweek -Suggests: RColorBrewer, knitr, rmarkdown, sf, sp, testthat (>= 3.0.0), - remotes -VignetteBuilder: knitr -Config/testthat/edition: 3 -Config/testthat/parallel: false -Encoding: UTF-8 -LazyData: true -MailingList: rOpenGov -NeedsCompilation: no -Repository: CRAN -Roxygen: list(markdown = TRUE) -RoxygenNote: 7.2.3 -X-schema.org-isPartOf: http://ropengov.org/ -X-schema.org-keywords: ropengov -RemoteType: local -RemoteUrl: /Users/pyrykantanen/Github/eurostat -Packaged: 2023-02-22 13:26:54 UTC; pyrykantanen -Author: Leo Lahti [aut, cre] (), - Janne Huovari [aut], - Markus Kainu [aut], - Przemyslaw Biecek [aut], - Daniel Antal [ctb], - Diego Hernangomez [ctb] (), - Joona Lehtomaki [ctb], - Francois Briatte [ctb], - Reto Stauffer [ctb], - Paul Rougieux [ctb], - Anna Vasylytsya [ctb], - Oliver Reiter [ctb], - Pyry Kantanen [ctb] (), - Enrico Spinielli [ctb] () -Maintainer: Leo Lahti -Built: R 4.2.2; ; 2023-02-22 13:26:54 UTC; unix diff --git a/revdep/library.noindex/eurostat/new/eurostat/INDEX b/revdep/library.noindex/eurostat/new/eurostat/INDEX deleted file mode 100644 index d220aef5..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/INDEX +++ /dev/null @@ -1,34 +0,0 @@ -check_access_to_data Check access to ec.europe.eu -clean_eurostat_cache Clean Eurostat Cache -cut_to_classes Cuts the Values Column into Classes and - Polishes the Labels -dic_order Order of Variable Levels from Eurostat - Dictionary. -eu_countries Countries and Country Codes -eurostat-package R Tools for Eurostat open data -eurostat_geodata_60_2016 - Geospatial data of Europe from GISCO in 1:60 - million scale from year 2016 -eurotime2date Date Conversion from Eurostat Time Format -eurotime2date2 Date Conversion from New Eurostat Time Format -eurotime2num Conversion of Eurostat Time Format to Numeric -eurotime2num2 Conversion of Eurostat Time Format to Numeric -get_bibentry Create A Data Bibliography -get_eurostat Read Eurostat Data -get_eurostat_dic Download Eurostat Dictionary -get_eurostat_geospatial - Download Geospatial Data from GISCO -get_eurostat_json Get Data from Eurostat API in JSON -get_eurostat_raw Download Data from Eurostat Database -get_eurostat_raw2 Download Data from Eurostat Dissemination API -get_eurostat_toc Download Table of Contents of Eurostat Data - Sets -harmonize_country_code - Harmonize Country Code -label_eurostat Get Eurostat Codes -label_eurostat2 Get Eurostat Codes for data downloaded from new - dissemination API -search_eurostat Grep Datasets Titles from Eurostat -set_eurostat_cache_dir - Set Eurostat Cache -tgs00026 Auxiliary Data diff --git a/revdep/library.noindex/eurostat/new/eurostat/LICENSE b/revdep/library.noindex/eurostat/new/eurostat/LICENSE deleted file mode 100644 index 1de69c39..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/LICENSE +++ /dev/null @@ -1,2 +0,0 @@ -YEAR: 2014-2022 -COPYRIGHT HOLDER: Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek \ No newline at end of file diff --git a/revdep/library.noindex/eurostat/new/eurostat/NAMESPACE b/revdep/library.noindex/eurostat/new/eurostat/NAMESPACE deleted file mode 100644 index f42115f6..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/NAMESPACE +++ /dev/null @@ -1,73 +0,0 @@ -# Generated by roxygen2: do not edit by hand - -export(add_nuts_level) -export(check_access_to_data) -export(clean_eurostat_cache) -export(cut_to_classes) -export(dic_order) -export(eurotime2date) -export(eurotime2date2) -export(eurotime2num) -export(eurotime2num2) -export(get_bibentry) -export(get_eurostat) -export(get_eurostat_dic) -export(get_eurostat_geospatial) -export(get_eurostat_json) -export(get_eurostat_toc) -export(grepEurostatTOC) -export(harmonize_country_code) -export(harmonize_geo_code) -export(label_eurostat) -export(label_eurostat2) -export(label_eurostat_tables) -export(label_eurostat_vars) -export(recode_nuts) -export(recode_to_nuts_2013) -export(recode_to_nuts_2016) -export(search_eurostat) -export(set_eurostat_cache_dir) -export(validate_geo_code) -export(validate_nuts_regions) -importFrom(ISOweek,ISOweek2date) -importFrom(RefManageR,BibEntry) -importFrom(RefManageR,toBiblatex) -importFrom(broom,tidy) -importFrom(classInt,classIntervals) -importFrom(countrycode,countrycode) -importFrom(curl,curl_download) -importFrom(dplyr,case_when) -importFrom(dplyr,coalesce) -importFrom(dplyr,filter) -importFrom(dplyr,left_join) -importFrom(dplyr,mutate) -importFrom(httr,RETRY) -importFrom(httr,build_url) -importFrom(httr,content) -importFrom(httr,http_error) -importFrom(httr,parse_url) -importFrom(httr,status_code) -importFrom(jsonlite,fromJSON) -importFrom(lubridate,day) -importFrom(lubridate,dmy) -importFrom(lubridate,month) -importFrom(lubridate,year) -importFrom(lubridate,ymd) -importFrom(methods,as) -importFrom(readr,col_character) -importFrom(readr,cols) -importFrom(readr,read_tsv) -importFrom(regions,recode_nuts) -importFrom(regions,validate_geo_code) -importFrom(regions,validate_nuts_regions) -importFrom(stringi,stri_extract_first_regex) -importFrom(stringr,str_replace_all) -importFrom(tibble,as_tibble) -importFrom(tibble,is_tibble) -importFrom(tidyr,gather) -importFrom(tidyr,pivot_longer) -importFrom(tidyr,separate) -importFrom(utils,data) -importFrom(utils,download.file) -importFrom(utils,hasName) -importFrom(utils,toBibtex) diff --git a/revdep/library.noindex/eurostat/new/eurostat/R/eurostat b/revdep/library.noindex/eurostat/new/eurostat/R/eurostat deleted file mode 100644 index 66861563..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/R/eurostat +++ /dev/null @@ -1,27 +0,0 @@ -# File share/R/nspackloader.R -# Part of the R package, https://www.R-project.org -# -# Copyright (C) 1995-2012 The R Core Team -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# A copy of the GNU General Public License is available at -# https://www.r-project.org/Licenses/ - -local({ - info <- loadingNamespaceInfo() - pkg <- info$pkgname - ns <- .getNamespace(as.name(pkg)) - if (is.null(ns)) - stop("cannot find namespace environment for ", pkg, domain = NA); - dbbase <- file.path(info$libname, pkg, "R", pkg) - lazyLoad(dbbase, ns, filter = function(n) n != ".__NAMESPACE__.") -}) diff --git a/revdep/library.noindex/eurostat/new/eurostat/R/eurostat.rdb b/revdep/library.noindex/eurostat/new/eurostat/R/eurostat.rdb deleted file mode 100644 index aadab31c..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/R/eurostat.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/R/eurostat.rdx b/revdep/library.noindex/eurostat/new/eurostat/R/eurostat.rdx deleted file mode 100644 index 5b416ebb..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/R/eurostat.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/WORDLIST b/revdep/library.noindex/eurostat/new/eurostat/WORDLIST deleted file mode 100644 index 4db0c91c..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/WORDLIST +++ /dev/null @@ -1,130 +0,0 @@ -Acknowledgements -Analytics -Biblatex -Bibtex -CNTRY -Categorises -Choropleth -DOI -Dol -EEA -EFTA -EL -EPSG -ETRS -EuroGeographics -Eurostat's -Eurozone -FID -FTE -GISCO -GeoJSON -Geospatial -Gisco -Github -Gitter -Hernangómez -JSON -Kenett -LAEA -LEVL -LazyLoad -Lehtomäki -RCV -RJ -RStudio -Recode -Recoding -Renviron -SDMX -Shmueli -SpatialPolygonDataFrame -TOC -WGS -Wietse -avia -bclust -behaviour -bibentry -codecov -codename -comext -comformity -comparativity -countrycode -countycodes -de -dieghernan -dir -dpih -eXchange -ec -efta -eg -enps -eu -europa -europe -eurozone -facto -fi -geo -geospatial -ggplot -giscoR -github -gmail -googlegroups -hclust -headtails -hostname -http -https -huovari -hv -iki -io -janne -jenks -json -kable -kainu -kapsi -kilometres -kmeans -labelled -lahti -lastTimePeriod -leo -lifecycle -markus -markuskainu -mln -num -paoa -paoc -paocc -persreg -pkm -pre -preprocessed -psmod -pstra -ptt -rOG -rOpenGov -rds -reaggregate -recode -recoding -relabelled -restatapi -rjsdmx -ropengov -rsdmx -sd -sinceTimePeriod -spplot -tibble -tmap -tran diff --git a/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rdb b/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rdb deleted file mode 100644 index 05ff6b88..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rds b/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rds deleted file mode 100644 index 3bf79acb..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rdx b/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rdx deleted file mode 100644 index 875ae27c..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/data/Rdata.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/help/AnIndex b/revdep/library.noindex/eurostat/new/eurostat/help/AnIndex deleted file mode 100644 index c3600dc8..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/help/AnIndex +++ /dev/null @@ -1,45 +0,0 @@ -eurostat-package eurostat-package -add_nuts_level add_nuts_level -check_access_to_data check_access_to_data -clean_eurostat_cache clean_eurostat_cache -convert_time_col convert_time_col -convert_time_col2 convert_time_col2 -cut_to_classes cut_to_classes -dic_order dic_order -ea_countries eu_countries -efta_countries eu_countries -eurostat eurostat-package -eurostat_geodata_60_2016 eurostat_geodata_60_2016 -eurotime2date eurotime2date -eurotime2date2 eurotime2date2 -eurotime2num eurotime2num -eurotime2num2 eurotime2num2 -eu_candidate_countries eu_countries -eu_countries eu_countries -get_bibentry get_bibentry -get_eurostat get_eurostat -get_eurostat_dic get_eurostat_dic -get_eurostat_geospatial get_eurostat_geospatial -get_eurostat_json get_eurostat_json -get_eurostat_raw get_eurostat_raw -get_eurostat_raw2 get_eurostat_raw2 -get_eurostat_toc get_eurostat_toc -grepEurostatTOC search_eurostat -harmonize_country_code harmonize_country_code -harmonize_geo_code harmonize_geo_code -label_eurostat label_eurostat -label_eurostat2 label_eurostat2 -label_eurostat_tables label_eurostat -label_eurostat_vars label_eurostat -recode_nuts reexports -recode_to_nuts_2013 recode_to_nuts_2013 -recode_to_nuts_2016 recode_to_nuts_2016 -reexports reexports -search_eurostat search_eurostat -set_eurostat_cache_dir set_eurostat_cache_dir -set_eurostat_toc set_eurostat_toc -tgs00026 tgs00026 -tidy_eurostat tidy_eurostat -tidy_eurostat2 tidy_eurostat2 -validate_geo_code reexports -validate_nuts_regions reexports diff --git a/revdep/library.noindex/eurostat/new/eurostat/help/aliases.rds b/revdep/library.noindex/eurostat/new/eurostat/help/aliases.rds deleted file mode 100644 index cfb258a3..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/help/aliases.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/help/eurostat.rdb b/revdep/library.noindex/eurostat/new/eurostat/help/eurostat.rdb deleted file mode 100644 index de566ab6..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/help/eurostat.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/help/eurostat.rdx b/revdep/library.noindex/eurostat/new/eurostat/help/eurostat.rdx deleted file mode 100644 index 588f9809..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/help/eurostat.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/help/figures/logo.png b/revdep/library.noindex/eurostat/new/eurostat/help/figures/logo.png deleted file mode 100644 index 4b554470..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/help/figures/logo.png and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/help/paths.rds b/revdep/library.noindex/eurostat/new/eurostat/help/paths.rds deleted file mode 100644 index 6259d430..00000000 Binary files a/revdep/library.noindex/eurostat/new/eurostat/help/paths.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/eurostat/html/00Index.html b/revdep/library.noindex/eurostat/new/eurostat/html/00Index.html deleted file mode 100644 index 9e72238e..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/html/00Index.html +++ /dev/null @@ -1,89 +0,0 @@ - - -R: Tools for Eurostat Open Data - - - -
-

Tools for Eurostat Open Data - -

-
-

Documentation for package ‘eurostat’ version 3.7.14

- - - -

Help Pages

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
eurostat-packageR Tools for Eurostat open data
check_access_to_dataCheck access to ec.europe.eu
clean_eurostat_cacheClean Eurostat Cache
cut_to_classesCuts the Values Column into Classes and Polishes the Labels
dic_orderOrder of Variable Levels from Eurostat Dictionary.
ea_countriesCountries and Country Codes
efta_countriesCountries and Country Codes
eurostatR Tools for Eurostat open data
eurostat_geodata_60_2016Geospatial data of Europe from GISCO in 1:60 million scale from year 2016
eurotime2dateDate Conversion from Eurostat Time Format
eurotime2date2Date Conversion from New Eurostat Time Format
eurotime2numConversion of Eurostat Time Format to Numeric
eurotime2num2Conversion of Eurostat Time Format to Numeric
eu_candidate_countriesCountries and Country Codes
eu_countriesCountries and Country Codes
get_bibentryCreate A Data Bibliography
get_eurostatRead Eurostat Data
get_eurostat_dicDownload Eurostat Dictionary
get_eurostat_geospatialDownload Geospatial Data from GISCO
get_eurostat_jsonGet Data from Eurostat API in JSON
get_eurostat_rawDownload Data from Eurostat Database
get_eurostat_raw2Download Data from Eurostat Dissemination API
get_eurostat_tocDownload Table of Contents of Eurostat Data Sets
grepEurostatTOCGrep Datasets Titles from Eurostat
harmonize_country_codeHarmonize Country Code
label_eurostatGet Eurostat Codes
label_eurostat2Get Eurostat Codes for data downloaded from new dissemination API
label_eurostat_tablesGet Eurostat Codes
label_eurostat_varsGet Eurostat Codes
search_eurostatGrep Datasets Titles from Eurostat
set_eurostat_cache_dirSet Eurostat Cache
tgs00026Auxiliary Data
-
diff --git a/revdep/library.noindex/eurostat/new/eurostat/html/R.css b/revdep/library.noindex/eurostat/new/eurostat/html/R.css deleted file mode 100644 index 2ef6cd60..00000000 --- a/revdep/library.noindex/eurostat/new/eurostat/html/R.css +++ /dev/null @@ -1,120 +0,0 @@ -@media screen { - .container { - padding-right: 10px; - padding-left: 10px; - margin-right: auto; - margin-left: auto; - max-width: 900px; - } -} - -.rimage img { /* from knitr - for examples and demos */ - width: 96%; - margin-left: 2%; -} - -.katex { font-size: 1.1em; } - -code { - color: inherit; - background: inherit; -} - -body { - line-height: 1.4; - background: white; - color: black; -} - -a:link { - background: white; - color: blue; -} - -a:visited { - background: white; - color: rgb(50%, 0%, 50%); -} - -h1 { - background: white; - color: rgb(55%, 55%, 55%); - font-family: monospace; - font-size: 1.4em; /* x-large; */ - text-align: center; -} - -h2 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: 1.2em; /* large; */ - text-align: center; -} - -h3 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: 1.2em; /* large; */ -} - -h4 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; - font-size: 1.2em; /* large; */ -} - -h5 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; -} - -h6 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; -} - -img.toplogo { - width: 4em; - vertical-align: middle; -} - -img.arrow { - width: 30px; - height: 30px; - border: 0; -} - -span.acronym { - font-size: small; -} - -span.env { - font-family: monospace; -} - -span.file { - font-family: monospace; -} - -span.option{ - font-family: monospace; -} - -span.pkg { - font-weight: bold; -} - -span.samp{ - font-family: monospace; -} - -div.vignettes a:hover { - background: rgb(85%, 85%, 85%); -} diff --git a/revdep/library.noindex/eurostat/new/lubridate/CITATION b/revdep/library.noindex/eurostat/new/lubridate/CITATION deleted file mode 100644 index 2130b2c8..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/CITATION +++ /dev/null @@ -1,18 +0,0 @@ -citHeader("To cite lubridate in publications use:") - -bibentry( - bibtype = "Article", - title = "Dates and Times Made Easy with {lubridate}", - author = c(as.person("Garrett Grolemund"), as.person("Hadley Wickham")), - journal = "Journal of Statistical Software", - year = "2011", - volume = "40", - number = "3", - pages = "1--25", - url = "https://www.jstatsoft.org/v40/i03/", - textVersion = - paste("Garrett Grolemund, Hadley Wickham (2011).", - "Dates and Times Made Easy with lubridate.", - "Journal of Statistical Software, 40(3), 1-25.", - "URL https://www.jstatsoft.org/v40/i03/.") -) diff --git a/revdep/library.noindex/eurostat/new/lubridate/DESCRIPTION b/revdep/library.noindex/eurostat/new/lubridate/DESCRIPTION deleted file mode 100644 index 3c714ff1..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/DESCRIPTION +++ /dev/null @@ -1,72 +0,0 @@ -Type: Package -Package: lubridate -Title: Make Dealing with Dates a Little Easier -Version: 1.9.2 -Authors@R: c( - person("Vitalie", "Spinu", , "spinuvit@gmail.com", role = c("aut", "cre")), - person("Garrett", "Grolemund", role = "aut"), - person("Hadley", "Wickham", role = "aut"), - person("Davis", "Vaughan", role = "ctb"), - person("Ian", "Lyttle", role = "ctb"), - person("Imanuel", "Costigan", role = "ctb"), - person("Jason", "Law", role = "ctb"), - person("Doug", "Mitarotonda", role = "ctb"), - person("Joseph", "Larmarange", role = "ctb"), - person("Jonathan", "Boiser", role = "ctb"), - person("Chel Hee", "Lee", role = "ctb") - ) -Maintainer: Vitalie Spinu -Description: Functions to work with date-times and time-spans: fast and - user friendly parsing of date-time data, extraction and updating of - components of a date-time (years, months, days, hours, minutes, and - seconds), algebraic manipulation on date-time and time-span objects. - The 'lubridate' package has a consistent and memorable syntax that - makes working with dates easy and fun. -License: GPL (>= 2) -URL: https://lubridate.tidyverse.org, - https://github.com/tidyverse/lubridate -BugReports: https://github.com/tidyverse/lubridate/issues -Depends: methods, R (>= 3.2) -Imports: generics, timechange (>= 0.1.1) -Suggests: covr, knitr, rmarkdown, testthat (>= 2.1.0), vctrs (>= 0.5.0) -Enhances: chron, data.table, timeDate, tis, zoo -VignetteBuilder: knitr -Config/Needs/website: tidyverse/tidytemplate -Config/testthat/edition: 3 -Encoding: UTF-8 -LazyData: true -RoxygenNote: 7.2.1 -SystemRequirements: C++11, A system with zoneinfo data (e.g. - /usr/share/zoneinfo). On Windows the zoneinfo included with R - is used. -Collate: 'Dates.r' 'POSIXt.r' 'util.r' 'parse.r' 'timespans.r' - 'intervals.r' 'difftimes.r' 'durations.r' 'periods.r' - 'accessors-date.R' 'accessors-day.r' 'accessors-dst.r' - 'accessors-hour.r' 'accessors-minute.r' 'accessors-month.r' - 'accessors-quarter.r' 'accessors-second.r' 'accessors-tz.r' - 'accessors-week.r' 'accessors-year.r' 'am-pm.r' 'time-zones.r' - 'numeric.r' 'coercion.r' 'constants.r' 'cyclic_encoding.r' - 'data.r' 'decimal-dates.r' 'deprecated.r' 'format_ISO8601.r' - 'guess.r' 'hidden.r' 'instants.r' 'leap-years.r' - 'ops-addition.r' 'ops-compare.r' 'ops-division.r' - 'ops-integer-division.r' 'ops-m+.r' 'ops-modulo.r' - 'ops-multiplication.r' 'ops-subtraction.r' 'package.r' - 'pretty.r' 'round.r' 'stamp.r' 'tzdir.R' 'update.r' 'vctrs.R' - 'zzz.R' -NeedsCompilation: yes -Packaged: 2023-02-09 21:36:50 UTC; vspinu -Author: Vitalie Spinu [aut, cre], - Garrett Grolemund [aut], - Hadley Wickham [aut], - Davis Vaughan [ctb], - Ian Lyttle [ctb], - Imanuel Costigan [ctb], - Jason Law [ctb], - Doug Mitarotonda [ctb], - Joseph Larmarange [ctb], - Jonathan Boiser [ctb], - Chel Hee Lee [ctb] -Repository: CRAN -Date/Publication: 2023-02-10 01:30:02 UTC -Built: R 4.2.0; aarch64-apple-darwin20; 2023-02-10 03:11:32 UTC; unix -Archs: lubridate.so.dSYM diff --git a/revdep/library.noindex/eurostat/new/lubridate/INDEX b/revdep/library.noindex/eurostat/new/lubridate/INDEX deleted file mode 100644 index 2b67df14..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/INDEX +++ /dev/null @@ -1,73 +0,0 @@ -%m+% Add and subtract months to a date without - exceeding the last day of the new month -%within% Does a date (or interval) fall within an - interval? -DateTimeUpdate Changes the components of a date object -Duration-class Duration class -Interval-class Interval class -am Does date time occur in the am or pm? -as.duration Change an object to a duration -as.interval Change an object to an 'interval' -as.period Change an object to a period -as_date Convert an object to a date or date-time -cyclic_encoding Cyclic encoding of date-times -date Get/set date component of a date-time -date_decimal Converts a decimal to a date -day Get/set days component of a date-time -days_in_month Get the number of days in the month of a - date-time -decimal_date Converts a date to a decimal of its year -dst Get *d*aylight *s*avings *t*ime indicator of a - date-time -duration Create a duration object. -fit_to_timeline Fit a POSIXlt date-time to the timeline -force_tz Replace time zone to create new date-time -format_ISO8601 Format in ISO8601 character format -guess_formats Guess possible date-times formats from a - character vector -hour Get/set hours component of a date-time -interval Utilities for creation and manipulation of - 'Interval' objects -is.Date Various date utilities -is.POSIXt Various POSIX utilities -is.difftime Is x a difftime object? -is.instant Is x a date-time object? -is.timespan Is x a length of time? -lakers Lakers 2008-2009 basketball data set -leap_year Is a year a leap year? -local_time Get local time from a date-time vector. -make_datetime Efficient creation of date-times from numeric - representations -make_difftime Create a difftime object. -minute Get/set minutes component of a date-time -month Get/set months component of a date-time -ms Parse periods with *h*our, *m*inute, and - *s*econd components -now The current day and time -origin 1970-01-01 UTC -parse_date_time User friendly date-time parsing functions -period Create or parse period objects -period_to_seconds Contrive a period to/from a given number of - seconds -pretty_dates Computes attractive axis breaks for date-time - data -quarter Get the fiscal quarter and semester of a - date-time -rollbackward Roll backward or forward a date the previous, - current or next month -round_date Round, floor and ceiling methods for date-time - objects -second Get/set seconds component of a date-time -stamp Format dates and times based on human-friendly - templates -time_length Compute the exact length of a time span -timespan Description of time span classes in lubridate -tz Get/set time zone component of a date-time -week Get/set weeks component of a date-time -with_tz Get date-time in a different time zone -year Get/set years component of a date-time -ymd Parse dates with *y*ear, *m*onth, and *d*ay - components -ymd_hms Parse date-times with *y*ear, *m*onth, and - *d*ay, *h*our, *m*inute, and *s*econd - components. diff --git a/revdep/library.noindex/eurostat/new/lubridate/NAMESPACE b/revdep/library.noindex/eurostat/new/lubridate/NAMESPACE deleted file mode 100644 index 0eb16cc7..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/NAMESPACE +++ /dev/null @@ -1,299 +0,0 @@ -# Generated by roxygen2: do not edit by hand - -S3method(as.POSIXct,fts) -S3method(as.POSIXct,irts) -S3method(as.POSIXct,timeSeries) -S3method(as.POSIXct,xts) -S3method(as.POSIXct,zoo) -S3method(as.POSIXlt,fts) -S3method(as.POSIXlt,irts) -S3method(as.POSIXlt,timeSeries) -S3method(as.POSIXlt,tis) -S3method(as.POSIXlt,xts) -S3method(as.POSIXlt,zoo) -S3method(as.list,Interval) -S3method(c,Duration) -S3method(c,Interval) -S3method(c,Period) -S3method(date,Period) -S3method(date,default) -S3method(decimal_date,default) -S3method(decimal_date,zoo) -S3method(dst,default) -S3method(force_tz,default) -S3method(format,Duration) -S3method(format,Interval) -S3method(format,Period) -S3method(hour,Period) -S3method(hour,default) -S3method(intersect,Interval) -S3method(mday,Period) -S3method(mday,default) -S3method(minute,Period) -S3method(minute,default) -S3method(month,Period) -S3method(month,default) -S3method(month,numeric) -S3method(months,numeric) -S3method(qday,default) -S3method(reclass_date,Date) -S3method(reclass_date,IDate) -S3method(reclass_date,ITime) -S3method(reclass_date,POSIXct) -S3method(reclass_date,POSIXlt) -S3method(reclass_date,chron) -S3method(reclass_date,ti) -S3method(reclass_date,timeDate) -S3method(second,Period) -S3method(second,default) -S3method(setdiff,Interval) -S3method(summary,Duration) -S3method(summary,Interval) -S3method(summary,Period) -S3method(tz,Date) -S3method(tz,POSIXt) -S3method(tz,character) -S3method(tz,default) -S3method(tz,logical) -S3method(tz,timeSeries) -S3method(tz,yearmon) -S3method(tz,yearqtr) -S3method(tz,zoo) -S3method(tz,zooreg) -S3method(union,Interval) -S3method(unique,Interval) -S3method(update,Date) -S3method(update,POSIXt) -S3method(wday,default) -S3method(wday,numeric) -S3method(with_tz,default) -S3method(xtfrm,Period) -S3method(yday,default) -S3method(year,Period) -S3method(year,default) -export("%--%") -export("%m+%") -export("%m-%") -export("%within%") -export("date<-") -export("day<-") -export("hour<-") -export("int_end<-") -export("int_start<-") -export("mday<-") -export("minute<-") -export("month<-") -export("qday<-") -export("second<-") -export("tz<-") -export("wday<-") -export("week<-") -export("yday<-") -export("year<-") -export(Date) -export(NA_Date_) -export(NA_POSIXct_) -export(POSIXct) -export(add_with_rollback) -export(am) -export(as.difftime) -export(as.duration) -export(as.interval) -export(as.period) -export(as_date) -export(as_datetime) -export(ceiling_date) -export(cyclic_encoding) -export(date) -export(date_decimal) -export(day) -export(days) -export(days_in_month) -export(ddays) -export(decimal_date) -export(dhours) -export(dmicroseconds) -export(dmilliseconds) -export(dminutes) -export(dmonths) -export(dmy) -export(dmy_h) -export(dmy_hm) -export(dmy_hms) -export(dnanoseconds) -export(dpicoseconds) -export(dseconds) -export(dst) -export(duration) -export(dweeks) -export(dyears) -export(dym) -export(epiweek) -export(epiyear) -export(fast_strptime) -export(fit_to_timeline) -export(floor_date) -export(force_tz) -export(force_tzs) -export(format_ISO8601) -export(guess_formats) -export(hm) -export(hms) -export(hour) -export(hours) -export(int_aligns) -export(int_diff) -export(int_end) -export(int_flip) -export(int_length) -export(int_overlaps) -export(int_shift) -export(int_standardize) -export(int_start) -export(intersect) -export(interval) -export(is.Date) -export(is.POSIXct) -export(is.POSIXlt) -export(is.POSIXt) -export(is.difftime) -export(is.duration) -export(is.instant) -export(is.interval) -export(is.period) -export(is.timepoint) -export(is.timespan) -export(isoweek) -export(isoyear) -export(leap_year) -export(local_time) -export(make_date) -export(make_datetime) -export(make_difftime) -export(mday) -export(mdy) -export(mdy_h) -export(mdy_hm) -export(mdy_hms) -export(microseconds) -export(milliseconds) -export(minute) -export(minutes) -export(month) -export(ms) -export(my) -export(myd) -export(nanoseconds) -export(now) -export(origin) -export(parse_date_time) -export(parse_date_time2) -export(period) -export(period_to_seconds) -export(picoseconds) -export(pm) -export(pretty_dates) -export(qday) -export(quarter) -export(reclass_date) -export(reclass_timespan) -export(rollback) -export(rollbackward) -export(rollforward) -export(round_date) -export(second) -export(seconds) -export(seconds_to_period) -export(semester) -export(setdiff) -export(stamp) -export(stamp_date) -export(stamp_time) -export(time_length) -export(today) -export(tz) -export(union) -export(wday) -export(week) -export(weeks) -export(with_tz) -export(yday) -export(ydm) -export(ydm_h) -export(ydm_hm) -export(ydm_hms) -export(year) -export(years) -export(ym) -export(ymd) -export(ymd_h) -export(ymd_hm) -export(ymd_hms) -export(yq) -exportClasses(Duration) -exportClasses(Interval) -exportClasses(Period) -exportClasses(Timespan) -exportMethods("$") -exportMethods("$<-") -exportMethods("%%") -exportMethods("%/%") -exportMethods("%m+%") -exportMethods("%m-%") -exportMethods("*") -exportMethods("+") -exportMethods("-") -exportMethods("/") -exportMethods("[") -exportMethods("[<-") -exportMethods("[[") -exportMethods("[[<-") -exportMethods("date<-") -exportMethods("day<-") -exportMethods("hour<-") -exportMethods("minute<-") -exportMethods("month<-") -exportMethods("second<-") -exportMethods("year<-") -exportMethods(Arith) -exportMethods(Compare) -exportMethods(as.character) -exportMethods(as.difftime) -exportMethods(as.integer) -exportMethods(as.interval) -exportMethods(as.numeric) -exportMethods(as_date) -exportMethods(as_datetime) -exportMethods(format_ISO8601) -exportMethods(reclass_timespan) -exportMethods(rep) -exportMethods(show) -importFrom(generics,as.difftime) -importFrom(generics,intersect) -importFrom(generics,setdiff) -importFrom(generics,union) -importFrom(methods,"coerce<-") -importFrom(methods,"slot<-") -importFrom(methods,Arith) -importFrom(methods,Compare) -importFrom(methods,allNames) -importFrom(methods,callGeneric) -importFrom(methods,initialize) -importFrom(methods,is) -importFrom(methods,new) -importFrom(methods,setClass) -importFrom(methods,setGeneric) -importFrom(methods,show) -importFrom(methods,slot) -importFrom(methods,slotNames) -importFrom(methods,validObject) -importFrom(stats,na.omit) -importFrom(stats,setNames) -importFrom(stats,update) -importFrom(timechange,time_add) -importFrom(timechange,time_force_tz) -importFrom(timechange,time_get) -importFrom(timechange,time_update) -importFrom(utils,packageVersion) -importFrom(utils,read.delim) -useDynLib(lubridate, .registration=TRUE) diff --git a/revdep/library.noindex/eurostat/new/lubridate/NEWS.md b/revdep/library.noindex/eurostat/new/lubridate/NEWS.md deleted file mode 100644 index 915e64be..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/NEWS.md +++ /dev/null @@ -1,768 +0,0 @@ -Version 1.9.2 -============= - -### BUG FIXES - -* [#1104](https://github.com/tidyverse/lubridate/issues/1104) Fix incorrect parsing of months when %a format is present. - -### OTHER - -* Adapt to internal name changes in R-devel - -Version 1.9.1 -============= - -### NEW FEATURES - -* `as_datetime()` accepts multiple formats in format argument, just like `as_date()` does. - -### BUG FIXES - -* [#1091](https://github.com/tidyverse/lubridate/issues/1091) Fix formatting of numeric inputs to parse_date_time. -* [#1092](https://github.com/tidyverse/lubridate/issues/1092) Fix regression in `ymd_hm` on locales where `p` format is not defined. -* [#1097](https://github.com/tidyverse/lubridate/issues/1097) Fix `as_date("character")` to work correctly with formats that include extra characters. -* [#1098](https://github.com/tidyverse/lubridate/issues/1098) Roll over the month boundary in `make_dateime()` when units exceed their maximal values. -* [#1090](https://github.com/tidyverse/lubridate/issues/1090) timechange has been moved from Depends to Imports. - -Version 1.9.0 -============= - -### NEW FEATURES - -* `roll` argument to updating and time-zone manipulation functions is deprecated in favor of a new `roll_dst` parameter. -* [#1042](https://github.com/tidyverse/lubridate/issues/1042) `as_date` with character inputs accepts multiple formats in `format` argument. When `format` is supplied, the input string is parsed with `parse_date_time` instead of the old `strptime`. -* [#1055](https://github.com/tidyverse/lubridate/issues/1055) Implement `as.integer` method for Duration, Period and Interval classes. -* [#1061](https://github.com/tidyverse/lubridate/issues/1061) Make `year<-`, `month<-` etc. accessors truly generic. In order to make them work with arbitrary class XYZ, it's enough to define a `reclass_date.XYZ` method. -* [#1061](https://github.com/tidyverse/lubridate/issues/1061) Add support for `year<-`, `month<-` etc. accessors for `data.table`'s IDate and ITime objects. -* [#1017](https://github.com/tidyverse/lubridate/issues/1017) `week_start` argument in all lubridate functions now accepts full and abbreviated names of the days of the week. -* The assignment value `wday<-` can be a string either in English or as provided by the current locale. -* Date rounding functions accept a date-time `unit` argument for rounding to a vector of date-times. -* [#1005](https://github.com/tidyverse/lubridate/issues/1005) `as.duration` now allows for full roundtrip `duration -> as.character -> as.duration` -* [#911](https://github.com/tidyverse/lubridate/issues/911) C parsers treat multiple spaces as one (just like strptime does) -* `stamp` gained new argument `exact=FALSE` to indicate whether `orders` argument is an exact strptime formats string or not. -* [#1001](https://github.com/tidyverse/lubridate/issues/1001) Add `%within` method with signature (Interval, list), which was documented but not implemented. -* [#941](https://github.com/tidyverse/lubridate/issues/941) `format_ISO8601()` gained a new option `usetz="Z"` to format time zones with a "Z" and convert the time to the UTC time zone. -* [#931](https://github.com/tidyverse/lubridate/issues/931) Usage of `Period` objects in rounding functions is explicitly documented. - -### BUG FIXES - -* [#1036](https://github.com/tidyverse/lubridate/issues/1036) `%within%` now correctly works with flipped intervals -* [#1085](https://github.com/tidyverse/lubridate/issues/1085) `as_datetime()` now preserves the time zone of the POSIXt input. -* [#1072](https://github.com/tidyverse/lubridate/issues/1072) Names are now handled correctly when combining multiple Period or Interval objects. -* [#1003](https://github.com/tidyverse/lubridate/issues/1003) Correctly handle r and R formats in locales which have no p format -* [#1074](https://github.com/tidyverse/lubridate/issues/1074) Fix concatenation of named Period, Interval and Duration vectors. -* [#1044](https://github.com/tidyverse/lubridate/issues/1044) POSIXlt results returned by `fast_strptime()` and `parse_date_time2()` now have a recycled `isdst` field. -* [#1069](https://github.com/tidyverse/lubridate/issues/1069) Internal code handling the addition of period months and years no longer generates partially recycled POSIXlt objects. -* Fix rounding of POSIXlt objects -* [#1007](https://github.com/tidyverse/lubridate/issues/1007) Internal lubridate formats are no longer propagated to stamp formatter. -* `train` argument in `parse_date_time` now takes effect. It was previously ignored. -* [#1004](https://github.com/tidyverse/lubridate/issues/1004) Fix `c.POSIXct` and `c.Date` on empty single POSIXct and Date vectors. -* [#1013](https://github.com/tidyverse/lubridate/issues/1013) Fix c(`POSIXct`,`POSIXlt`) heterogeneous concatenation. -* [#1002](https://github.com/tidyverse/lubridate/issues/1002) Parsing only with format `j` now works on numeric inputs. -* `stamp()` now correctly errors when no formats could be guessed. -* Updating a date with timezone (e.g. `tzs = "UTC"`) now returns a POSIXct. - -### INTERNALS - -* `lubridate` is now relying on `timechange` package for update and time-zone computation. Google's CCTZ code is no longer part of the package. -* `lubridate`'s updating logic is now built on top of `timechange` package. -* Change implementation of `c.Period`, `c.Duration` and `c.Interval` from S4 to S3. - -Version 1.8.0 -============= - -### NEW FEATURES - -* [#960](https://github.com/tidyverse/lubridate/issues/960) `c.POSIXct` and `c.Date` can deal with heterogeneous object types (e.g `c(date, datetime)` works as expected) - -### BUG FIXES - -* [#994](https://github.com/tidyverse/lubridate/issues/994) Subtracting two duration or two period objects no longer results in an ambiguous dispatch note. -* `c.Date` and `c.POSIXct` correctly deal with empty vectors. - -* `as_datetime(date, tz=XYZ)` returns the date-time object with HMS set to 00:00:00 in the corresponding `tz` - -### CHANGES - -* [#966](https://github.com/tidyverse/lubridate/pull/966) Lubridate is now built with cpp11 (contribution of @DavisVaughan) - -Version 1.7.10 -============== - -### NEW FEATURES - -* [#955](https://github.com/tidyverse/lubridate/pull/955) Add `type` argument to `quarter()` for more control over the returned class -* `fast_strptime()` and `parse_date_time2()` now accept multiple formats and apply them in turn - -### BUG FIXES - -* [#926](https://github.com/tidyverse/lubridate/issues/926) Fix incorrect division of intervals by months involving leap years -* Fix incorrect skipping of digits during parsing of the `%z` format - -Version 1.7.9.2 -=============== - -### NEW FEATURES - -* [#914](https://github.com/tidyverse/lubridate/issues/914) New `rollforward()` function -* [#928](https://github.com/tidyverse/lubridate/issues/928) On startup lubridate now resets TZDIR to a proper directory when it is set to non-dir values like "internal" or "macOS" (a change introduced in R4.0.2) -* [#630](https://github.com/tidyverse/lubridate/issues/630) New parsing functions `ym()` and `my()` - -### BUG FIXES - -* [#930](https://github.com/tidyverse/lubridate/issues/930) `as.period()` on intervals now returns valid Periods with double fields (not integers) - - - -Version 1.7.9 -============= - -### NEW FEATURES - -* [#871](https://github.com/tidyverse/lubridate/issues/893) Add `vctrs` support - - -### BUG FIXES - -* [#890](https://github.com/tidyverse/lubridate/issues/890) Correctly compute year in `quarter(..., with_year = TRUE)` -* [#893](https://github.com/tidyverse/lubridate/issues/893) Fix incorrect parsing of abbreviated months in locales with trailing dot (regression in v1.7.8) -* [#886](https://github.com/tidyverse/lubridate/issues/886) Fix `with_tz()` for POSIXlt objects -* [#887](https://github.com/tidyverse/lubridate/issues/887) Error on invalid numeric input to `month()` -* [#889](https://github.com/tidyverse/lubridate/issues/889) Export new dmonth function - -Version 1.7.8 -============= - -### NEW FEATURES - -* (breaking) Year and month durations now assume 365.25 days in a year consistently in conversion and constructors. Particularly `dyears(1) == years(1)` is now `TRUE`. -* Format and print methods for 0-length objects are more consistent. -* New duration constructor `dmonths()` to complement other duration constructors. -* -* `duration()` constructor now accepts `months` and `years` arguments. -* [#629](https://github.com/tidyverse/lubridate/issues/629) Added `format_ISO8601()` methods. -* [#672](https://github.com/tidyverse/lubridate/issues/672) Eliminate all partial argument matches -* [#674](https://github.com/tidyverse/lubridate/issues/674) `as_date()` now ignores the `tz` argument -* [#675](https://github.com/tidyverse/lubridate/issues/675) `force_tz()`, `with_tz()`, `tz<-` convert dates to date-times -* [#681](https://github.com/tidyverse/lubridate/issues/681) New constants `NA_Date_` and `NA_POSIXct_` which parallel built-in primitive constants. -* [#681](https://github.com/tidyverse/lubridate/issues/681) New constructors `Date()` and `POSIXct()` which parallel built-in primitive constructors. -* [#695](https://github.com/tidyverse/lubridate/issues/695) Durations can now be compared with numeric vectors. -* [#707](https://github.com/tidyverse/lubridate/issues/707) Constructors return 0-length inputs when called with no arguments -* [#713](https://github.com/tidyverse/lubridate/issues/713) (breaking) `as_datetime()` always returns a `POSIXct()` -* [#717](https://github.com/tidyverse/lubridate/issues/717) Common generics are now defined in `generics` dependency package. -* [#719](https://github.com/tidyverse/lubridate/issues/719) Negative Durations are now displayed with leading `-`. -* [#829](https://github.com/tidyverse/lubridate/issues/829) `%within%` throws more meaningful messages when applied on unsupported classes -* [#831](https://github.com/tidyverse/lubridate/issues/831) Changing hour, minute or second of Date object now yields POSIXct. -* [#869](https://github.com/tidyverse/lubridate/issues/869) Propagate NAs to all internal components of a Period object - -### BUG FIXES - -* [#682](https://github.com/tidyverse/lubridate/issues/682) Fix quarter extraction with small `fiscal_start`s. -* [#703](https://github.com/tidyverse/lubridate/issues/703) `leap_year()` works with objects supported by `year()`. -* [#778](https://github.com/tidyverse/lubridate/issues/778) `duration()/period()/make_difftime()` work with repeated units -* `c.Period` concatenation doesn't fail with empty components. -* Honor `exact = TRUE` argument in `parse_date_time2`, which was so far ignored. - -Version 1.7.4 -============= - -### NEW FEATURES - -* [#658](https://github.com/tidyverse/lubridate/issues/658) `%within%` now accepts a list of intervals, in which case an instant is checked if it occurs within any of the supplied intervals. - -### CHANGES - -* [#661](https://github.com/tidyverse/lubridate/issues/661) Throw error on invalid multi-unit rounding. -* [#633](https://github.com/tidyverse/lubridate/issues/633) `%%` on intervals relies on `%m+` arithmetic and doesn't produce NAs when intermediate computations result in non-existent dates. -* `tz()` always returns "UTC" when `tzone` attribute cannot be inferred. - -### BUG FIXES - -* [#664](https://github.com/tidyverse/lubridate/issues/664) Fix lookup of period functions in `as.period` -* [#649](https://github.com/tidyverse/lubridate/issues/664) Fix system timezone memoization - -Version 1.7.3 -============= - -### BUG FIXES - -* [#643](https://github.com/tidyverse/lubridate/issues/643), [#640](https://github.com/tidyverse/lubridate/issues/640), [#645](https://github.com/tidyverse/lubridate/issues/645) Fix faulty caching of system timezone. - -Version 1.7.2 -============= - -### NEW FEATURES - -* Durations, Periods and difftimes are now comparable with each other. -* `interval` constructor accepts start and end character vectors in ISO 8601 format -* [#362](https://github.com/tidyverse/lubridate/issues/362) Add support for ISO 8601 formats in interval constructor -* [#622](https://github.com/tidyverse/lubridate/issues/622) Add support for ISO 8601 formats in periods and durations constructor - -### CHANGES - -* Correct license to the originally intended GPL (>= 2) - -### BUG FIXES - -* [#605](https://github.com/tidyverse/lubridate/issues/605) Fix wrong ceiling of days during DST transition. -* [#607](https://github.com/tidyverse/lubridate/issues/607) Re-instate `format` argument to `as_date` and `as_datetime` (regression in v1.7.1) -* Fix intersection of intervals with missing values. -* Fix UBSAN errors in update.cpp - -Version 1.7.1 -============= - -### BUG FIXES - -* [#575](https://github.com/tidyverse/lubridate/issues/598), [#600](https://github.com/tidyverse/lubridate/issues/600), [#602](https://github.com/tidyverse/lubridate/issues/602) Fix zoneinfo lookup on windows and solaris. -* [#598](https://github.com/tidyverse/lubridate/issues/598) Fix broken parsing of `ymd_hms` strings by `as_date`. -* [#597](https://github.com/tidyverse/lubridate/issues/597) Fix broken parsing of `ymd` strings by `as_datetime`. - -Version 1.7.0 -============= - -### NEW FEATURES - -* Reduced memory footprint on `trunc_multi_unit` so that it overwrites the vector argument `x` versus making a new vector `y`. -* [#438](https://github.com/tidyverse/lubridate/issues/438) New function `force_tzs` for "enforcement" of heterogeneous time zones. -* [#438](https://github.com/tidyverse/lubridate/issues/438) New function `local_time` for the retrieval of local day time in different time zones. -* [#560](https://github.com/tidyverse/lubridate/issues/560) New argument `cutoff_2000` for parsing functions to indicate 20th century cutoff for `y` format. -* [#257](https://github.com/tidyverse/lubridate/issues/257) New `week_start` parameter in `wday` and `wday<-` to set week start. -* [#401](https://github.com/tidyverse/lubridate/issues/401) New parameter `locale` in `wday`. Labels of the returned factors (when `label=TRUE`) now respect current locale. -* [#485](https://github.com/tidyverse/lubridate/pull/485) `quarter` gained a new argument `fiscal_start` to address the issue of different fiscal conventions. -* [#492](https://github.com/tidyverse/lubridate/issues/492) New functions `epiweek` and `epiyear`. -* [#508](https://github.com/tidyverse/lubridate/pull/508) New parameter `locale` in `month`. Labels of the returned factors (when `label=TRUE`) now respect current locale. -* [#509](https://github.com/tidyverse/lubridate/issues/509) New parameter `week_start` to `floor_date`, `ceiling_date` and `round_date`. -* [#519](https://github.com/tidyverse/lubridate/issues/519) Support fractional units in duration and period string constructors. -* [#502](https://github.com/tidyverse/lubridate/issues/502) Support rounding to fractions of a seconds. -* [#529](https://github.com/tidyverse/lubridate/issues/529) Internal parser now ignores the case of alpha months (B format) -* [#535](https://github.com/tidyverse/lubridate/issues/535) Rounding to `season` is now supported. -* [#536](https://github.com/tidyverse/lubridate/issues/536) `as_date` and `as_datetime` now understand character vectors. -* New parsing parameters to `parse_date_time` - `train=TRUE` and `drop=FALSE` which allow more refined control of the format guessing. Formats are no longer dropped in the process by default, process which resulted in surprising behavior on several occasions ([#516](https://github.com/tidyverse/lubridate/issues/516),[#308](https://github.com/tidyverse/lubridate/issues/308),[#307](https://github.com/tidyverse/lubridate/issues/307)). - -### CHANGES - -* [#401](https://github.com/tidyverse/lubridate/issues/401) **[Breaking Change]** Labels returned by `wday` and `month` are now in current locale. The abbreviated labels in English locales have been changed to standard abbreviations (Tues -> Tue, Thurs -> Thu etc.). -* [#469](https://github.com/tidyverse/lubridate/issues/469) Throw warning in `with_tz` on invalid timezone. -* [#572](https://github.com/tidyverse/lubridate/issues/572) `B` and `b` formats no longer match numeric months. This corresponds to the original intent, and was always documented as such. - -### BUG FIXES - -* [#314](https://github.com/tidyverse/lubridate/issues/314), [#407](https://github.com/tidyverse/lubridate/issues/407), [#499](https://github.com/tidyverse/lubridate/issues/499) Make `days`, `dhours`, `round_date` work when the methods package is not loaded. -* [#543](https://github.com/tidyverse/lubridate/issues/543) Make `wday` work on character inputs as it is the case with all other day accessors. -* [#566](https://github.com/tidyverse/lubridate/issues/566) Comparing durations and periods no-longer infloops. -* [#556](https://github.com/tidyverse/lubridate/issues/556) Fix incorrect scoring of `y` format when it's the last in format order (as in `mdy`). -* [#584](https://github.com/tidyverse/lubridate/issues/584) Fix interval by period division. -* [#559](https://github.com/tidyverse/lubridate/issues/559) Parsing of alpha-months in English locales now drops correctly to low level C parsing. Thus, parsing with multiple orders containing `m` and `b` formats now works correctly. -* [#570](https://github.com/tidyverse/lubridate/issues/570), [#574](https://github.com/tidyverse/lubridate/issues/574) Fix broken `date()` when called with missing argument. -* [#567](https://github.com/tidyverse/lubridate/issues/567) Fix year update and rounding for leap years. -* [#545](https://github.com/tidyverse/lubridate/pull/545) Fix wrong locale selection in stamp. -* [#466](https://github.com/tidyverse/lubridate/pull/466) Fix wrong formats within ymd_h family of functions. -* [#472](https://github.com/tidyverse/lubridate/pull/472) Printing method for duration doesn't throw format error on fractional seconds. -* [#475](https://github.com/tidyverse/lubridate/pull/475) character<> comparisons is no longer slow. -* [#483](https://github.com/tidyverse/lubridate/pull/483) Fix add_duration_to_date error when duration first element is NA. -* [#486](https://github.com/tidyverse/lubridate/issues/486) ceiling_date handles `NA` properly. -* [#491](https://github.com/tidyverse/lubridate/issues/491) `make_datetime` respects `tz` argument and is much faster now. -* [#507](https://github.com/tidyverse/lubridate/issues/507) Period and duration parsers now understand 0 units. -* [#524](https://github.com/tidyverse/lubridate/pull/524) Correctly compute length of period in months (issue #490) -* [#525](https://github.com/tidyverse/lubridate/pull/525) Fix to prevent `day<-`, `minute<-`, etc. from producing an error when length(x) is 0 (issue #517) -* [#530](https://github.com/tidyverse/lubridate/issues/530) `parse_date_time` now throw warnings only for actual parsing errors (input with all NAs are silent) -* [#534](https://github.com/tidyverse/lubridate/issues/534) Fix arithmetic with large numbers -* [#554](https://github.com/tidyverse/lubridate/pull/554) Fix tests when running in non-English locales - -Version 1.6.0 -============= - -### NEW FEATURES - -* [#464](https://github.com/tidyverse/lubridate/issues/464) New function `semester` to extract semesters form date-time objects. -* [#459](https://github.com/tidyverse/lubridate/issues/459) Flexible C-level parsing for periods and durations has been implemented; `period` and `duration` constructors now accept string as first argument. Same parsing rules apply to the 'unit' parameter in rounding functions. -* [#459](https://github.com/tidyverse/lubridate/issues/459) Comparison between character vectors and periods/durations is now possible. -* [#287](https://github.com/tidyverse/lubridate/issues/287) C-level and derivative parsers now handle English months (%b and %B formats) irrespective of the current locale. -* [#327](https://github.com/tidyverse/lubridate/issues/327) C-level and derivative parsers now handles English AM/PM indicator irrespective of the current locale. -* [#417](https://github.com/tidyverse/lubridate/issues/417) `hms`, `hm`, `ms` gained new argument `roll=TRUE` which rolls minutes and seconds bigger than 59 towards higher units. -* [#445](https://github.com/tidyverse/lubridate/issues/445) Division of intervals by periods is now accurate. -* [#442](https://github.com/tidyverse/lubridate/issues/442) `round_date`, `floor_date` and `ceiling_date` now support rounding to multiple of units. -* [#422](https://github.com/tidyverse/lubridate/issues/422) New parsing function `yq` for parsing most common version of quarter strings. -* [#422](https://github.com/tidyverse/lubridate/issues/422) New format `q` for parsing quarters in all lubridate parsing functions. -* [#441](https://github.com/tidyverse/lubridate/issues/441) Comparison between POSIXt and Date objects is now possible. -* [#437](https://github.com/tidyverse/lubridate/issues/437) New function `as_datetime` to coerce to POSIXct object. A counterpart of `as_date`. -* [#412](https://github.com/tidyverse/lubridate/issues/412) New function `make_date` to produce Date objects. A counterpart of `make_datetime`. -* [#443](https://github.com/tidyverse/lubridate/issues/443) Behavior of `ceiling_date` for `Date` objects was changed to what most of the users expect. Rounding up by months now produces first day of the next months even for first day of the month. -* [#268](https://github.com/tidyverse/lubridate/issues/268) `round_date`, `ceiling_date`, and `floor_date` now accept "quarter", "bimonth", and "halfyear" as `unit` options. -* [#418](https://github.com/tidyverse/lubridate/issues/418) C level parsing functions understand 24:00:00 in datetime strings. - -### CHANGES - -* Low letter specs for HMS (hms,hm,ms) in `parse_date_time` and related functions are now deprecated. -* [#445](https://github.com/tidyverse/lubridate/issues/445) No more warning on occasional imprecise period length conversions. Imprecise arithmetic with periods is extensively documented. -* `pretty.*` family of functions were renamed and are no longer exported. If you need to use them, use `lubridate:::pretty_*` versions. -* `change_on_boundary` argument in `ceiling_date` does not allow for global option anymore. -* `as.duration`, `as.numeric` don't show "only estimate" messages on conversion from periods. The occasional approximate conversion is documented and deemed common knowledge. -* `as.numeric` with `unit="month"` now works on duration objects. -* [#403](https://github.com/tidyverse/lubridate/issues/403) Update on `Date` objects now return `POSIXct` instead of `POSIXlt`. -* [#411](https://github.com/tidyverse/lubridate/issues/411) format `mdy` or `myd` beginning with `"January"` or `"Jan"` now parsing correctly -* `here` and `olson_time_zones` were deprecated in favor of `new` and base `OlsonNames` respectively. -* Internally, S4 Compare and Ops generics were cleaned and simplified. -* [#456](https://github.com/tidyverse/lubridate/issues/456) Evaluation output in documentation examples was removed. - -### BUG FIXES - -* [#479](https://github.com/tidyverse/lubridate/issues/479) Fix the inconsistent behavior in `ceiling_date` when `unit = "week"` -* [#463](https://github.com/tidyverse/lubridate/issues/463) Fix NA subscripting error in %m+% when rollback is involved. -* [#462](https://github.com/tidyverse/lubridate/issues/462) Non-numeric or non-character arguments are disallowed as arguments to `period` and `duration` constructors. -* [#458](https://github.com/tidyverse/lubridate/issues/458) When year is missing in parsing, return consistently year 0. -* [#448](https://github.com/tidyverse/lubridate/issues/448) Correctly handle missing months and days in C parser. -* [#450](https://github.com/tidyverse/lubridate/issues/450) Fix incorrect handling of DST gaps in `date_decimal` and `decimal_date`. -* [#420](https://github.com/tidyverse/lubridate/issues/420) `as.numeric` correctly converts periods to (approximate) numeric time lengths. - -Version 1.5.6 -============ - -### NEW FEATURES - -* [#390](https://github.com/tidyverse/lubridate/issues/390) `ceiling_date` gains new argument `change_on_boundary` to allow ceiling on boundary of date-time objects. -* C parser can now produce a list of date-time components suitable for POSIXlt constructors. -* `parse_date_time2` and `fast_strptime` gain new `lt` argument to control type of output. -* [#373](https://github.com/tidyverse/lubridate/issues/373) New `date` and `date<-` additions to the `year`, `month` etc family of accessors. -* [#365](https://github.com/tidyverse/lubridate/issues/365) New very fast datetime constructor `make_datetime` (dropin replacement of `ISOdatetime`). -* [#344](https://github.com/tidyverse/lubridate/issues/344) `force_tz` and `with_tz` can handle data.frames component-wise. -* [#355](https://github.com/tidyverse/lubridate/issues/355) New `as_date` replacement of `as.Date` with more intuitive behavior with non-UTC timezones. -* [#333](https://github.com/tidyverse/lubridate/issues/333) `hms` parsers now handle negative components. - -### CHANGES - -* [#391](https://github.com/tidyverse/lubridate/issues/391) `ymd` family of functions return `Date` object when `tz` argument is NULL (new default) and POSIXct otherwise. -* [#364](https://github.com/tidyverse/lubridate/issues/364) Remove epoch functions. -* For consistency with `base:strptime` `fast_strptime` now returns `POSIXlt` object. That is, its `lt` argument defaults to `TRUE`. - -### BUG FIXES - -* `interval` constructor treats timezones correctly and works with UTC whenever meaningful. -* [#371](https://github.com/tidyverse/lubridate/issues/371) `as.period` correctly computes months with intervals spanning multiple years. -* [#388](https://github.com/tidyverse/lubridate/issues/388) `time_length` and `add_with_rollback` now work correctly with missing intervals. -* [#394](https://github.com/tidyverse/lubridate/issues/394) `fast_strptime` and `parse_date_time2` correctly treat non-UTC time zones. -* [#399](https://github.com/tidyverse/lubridate/issues/399) `floor_date` and `round_date` are not preserving tz component for larger than day units - -Version 1.5.0 -============= - -### NEW FEATURES - -* New `time_length` method. -* Added `isoyear` function to line up with `isoweek`. -* [#326](https://github.com/tidyverse/lubridate/issues/326) Added `exact = TRUE` option to `parse_date_time` for faster and much more flexible specification of formats. -* New `simple` argument to `fit_to_timeline` and `update` methods mostly intended for internal use. -* [#315](https://github.com/tidyverse/lubridate/issues/315) Implement `unique` method for `interval` class. -* [#295](https://github.com/tidyverse/lubridate/issues/295) New args `preserve_hms` and `roll_to_first` in `rollback` function. -* [#303](https://github.com/tidyverse/lubridate/issues/303) New `quarter` option in `floor_date` and friends. -* [#348](https://github.com/tidyverse/lubridate/issues/348) New `as.list.Interval` S3 method. -* [#278](https://github.com/tidyverse/lubridate/issues/278) Added settors and accessors for `qday` (quarter day). - -### CHANGES - -* New maintainer Vitalie Spinu (@vspinu) -* Time span constructors were re-factored; `new_interval`, `new_period`, `new_duration`, `new_difftime` were deprecated in favour of the more powerful `interval`, `period`, `duration` and `make_difftime` functions. -* `eseconds`, `eminutes` etc. were deprecated in favour of `dsecons`, `dminutes` etc. -* Many documentation improvements. -* New testthat conventions are adopted. Tests are now in `test/testthat`. -* Internally `isodate` was replaced with a much faster `parse_date_time2(paste(...))` alternative -* [#325](https://github.com/tidyverse/lubridate/issues/325) `Lubridate`'s `trunc`, `ceiling` and `floor` functions have been optimised and now are relying on R's `trunc.POSIXct` whenever possible. -* [#285](https://github.com/tidyverse/lubridate/issues/285) Algebraic computations with negative periods are behaving asymmetrically with respect to their positive counterparts. -* Made necessary changes to accommodate new zoo-based `fst` objects. - -### BUG FIXES - -* [#360](https://github.com/tidyverse/lubridate/issues/360) Fix c parser for Z (zulu) indicator. -* [#322](https://github.com/tidyverse/lubridate/issues/322) Explicitly encode formatted string with `enc2utf8`. -* [#302](https://github.com/tidyverse/lubridate/issues/302) Allow parsing long numbers such as 20140911000000 as date+time. -* [#349](https://github.com/tidyverse/lubridate/issues/349) Fix broken interval -> period conversion. -* [#336](https://github.com/tidyverse/lubridate/issues/336) Fix broken interval-> period conversion with negative diffs. -* [#227](https://github.com/tidyverse/lubridate/issues/227) Treat "days" and "years" units specially for pretty.point. -* [#286](https://github.com/tidyverse/lubridate/issues/286) %m+-% correctly handles dHMS period components. -* [#323](https://github.com/tidyverse/lubridate/issues/323) Implement coercion methods for Duration class. -* [#226](https://github.com/tidyverse/lubridate/issues/226) Propagate NAs in `int_standardize` -* [#235](https://github.com/tidyverse/lubridate/issues/235) Fix integer division with months and years. -* [#240](https://github.com/tidyverse/lubridate/issues/240) Make `ceiling_date` skip day light gap. -* [#254](https://github.com/tidyverse/lubridate/issues/254) Don't preprocess a/A formats if expressly specified by the user. -* [#289](https://github.com/tidyverse/lubridate/issues/289) Check for valid day-months combinations in C parser. -* [#306](https://github.com/tidyverse/lubridate/issues/306) When needed double guess with `preproc_wday=T`. -* [#308](https://github.com/tidyverse/lubridate/issues/308) Document sparce format guessing in `parse_date_time`. -* [#313](https://github.com/tidyverse/lubridate/issues/313) Fixed and optimized `fit_to_timeline` function. -* [#311](https://github.com/tidyverse/lubridate/issues/311) Always use UTC in `isoweek` computation -* [#294](https://github.com/tidyverse/lubridate/issues/294) Don't use years in `seconds_to_period`. -* Values on `$<-` assignment for periods are now properly recycled. -* Correctly handle NA subscripting in `round_date`. - - -Version 1.4.0 -============= - -### CHANGES - -* [#219](https://github.com/tidyverse/lubridate/issues/219) In `interval` use UTC when tzone is missing. -* [#255](https://github.com/tidyverse/lubridate/issues/255) Parse yy > 68 as 19yy to comply with `strptime`. - -### BUG FIXES - -* [#266](https://github.com/tidyverse/lubridate/issues/266) Include `time-zones.R` in `coercion.R`. -* [#251](https://github.com/tidyverse/lubridate/issues/251) Correct computation of weeks. -* [#262](https://github.com/tidyverse/lubridate/issues/262) Document that month boundary is the first second of the month. -* [#270](https://github.com/tidyverse/lubridate/issues/270) Add check for empty unit names in `standardise_lt_names`. -* [#276](https://github.com/tidyverse/lubridate/issues/276) Perform conversion in `as.period.period` if `unit != NULL`. -* [#284](https://github.com/tidyverse/lubridate/issues/284) Compute periods in `as.period.interval` without recurring to modulo arithmetic. -* [#272](https://github.com/tidyverse/lubridate/issues/272) Update examples for `hms`, `hm` and `ms` for new printing style. -* [#236](https://github.com/tidyverse/lubridate/issues/236) Don't allow zeros in month and day during parsing. -* [#247](https://github.com/tidyverse/lubridate/issues/247) Uninitialized index was mistakenly used in subseting. -* [#229](https://github.com/tidyverse/lubridate/issues/229) `guess_formats` now matches flex regexp first. -* `dmilliseconds` now correctly returns a `Duration` object. -* Fixed setdiff for discontinuous intervals. - - -Version 1.3.3 -============= - -### CHANGES - -* New low level C parser for numeric formats and two new front-end R functions - parse_date_time2 and fast_strptime. The achieved speed up is 50-100x as - compared to standard as.POSIXct and strptime functions. - - The user level parser functions of ymd_hms family drop to these C routines - whenever plain numeric formats are detected. - -### BUG FIXES - -* olson_time_zones now supports Solaris OS -* infinite recursion on parsing non-existing leap times was fixed - - -Version 1.3.2 -============= - -* Lubridate's s4 methods no longer use the representation argument, which has been deprecated in R 3.0.0 (see ?setClass). As a result, lubridate is no longer backwards compatible with R <3.0.0. - - -Version 1.3.0 -============= - -### CHANGES - -* v1.3.0. treats math with month and year Periods more consistently. If adding or subtracting n months would result in a non-existent date, lubridate will return an NA instead of a day in the following month or year. For example, `ymd("2013-01-31") + months(1)` will return `NA` instead of `2013-03-04` as in v1.2.0. `ymd("2012-02-29") + years(1)` will also return an `NA`. This rule change helps ensure that date + timespan - timespan = date (or NA). If you'd prefer that such arithmetic just returns the last day of the resulting month, see `%m+%` and `%m-%`. -* update.POSIXct and update.POSIXlt have been rewritten to be 7x faster than their versions in v1.2.0. The speed gain is felt in `force_tz`, `with_tz`, `floor_date`, `ceiling_date`, `second<-`, `minute<-`, `hour<-`, `day<-`, `month<-`, `year<-`, and other functions that rely on update (such as math with Periods). -* lubridate includes a Korean translation provided by http://korea.gnu.org/gnustats/ - -### NEW FEATURES - -* lubridate parser and stamp functions now handle ISO8601 date format (e.g., 2013-01-24 19:39:07.880-06:00, 2013-01-24 19:39:07.880Z) -* lubridate v1.3.0 comes with a new R vignette. see `browseVignettes("lubridate")` to view it. -* The accessors `second`, `minute`, `hour`, `day`, `month`, `year` and the settors `second<-`, `minute<-`, `hour<-`, `day<-`, `month<-`, `year<-` now work on Period class objects -* users can control which messages lubridate returns when parsing and estimating with the global option lubridate.verbose. Run `options(lubridate.verbose = TRUE)` to turn parsing messages on. Run `options(lubridate.verbose = FALSE)` to turn estimation and coercion messages off. -* lubridate parser functions now propagate NA's just as as.POSIXct, strptime and other functions do. Previously lubridate's parse functions would only return an error. -* added [[ and [[<- methods for INterval, Period and Duration class objects -* added `%m+%` and `%m-%` methods for Interval and Duration class objects that throw useful errors. -* `olson_time_zones` retrieves a character vector is Olson-style time zone names to use in lubridate -* summary methods for Interval, Period, and Duration classes -* date_decimal converts a date written as a decimal of a year into a POSIXct date-time - -### BUG FIXES - -* fixed bug in way update.POSIXct and update.POSIXlt handle dates that occur in the fall daylight savings overlap. update will choose the date-time closest to the original date time (on the timeline) when two identical clock times exist due to the DST overlap. -* fixed bugs that created unintuitive results for `as.interval`, `int_overlaps`, `%within%` and the interval methods of `c`, `intersect`, `union`, `setdiff`, and `summary`. -* parse functions, `as.interval`, `as.period` and `as.duration` now handlevectors of NA's without returning errors. -* parsers better handle vectors of input that have more than 100 elements and many NAs -* data frames that contain timespan objects with NAs in them no longer fail toprint -* `round_date`, `ceiling_date` and `update` now correctly handle input of length zero -* `decimal_date` no longer returns NaN for first second of the year - -Version 1.2.0 -============= - -### CHANGES - -* lubridate 1.2.0 is significantly faster than lubridate 1.1.0. This is -largely thanks to a parser rewrite submitted by Vitalie Spinu. Thank you, -Vitalie. Some metrics: - - parser speed up - 60x faster - - `with_tz` speed up - 15x faster - - `force_tz` speed up - 3x faster - -* Development for 1.2.0 has also focused on improving the way we work with -months. `rollback` rolls dates back to the last day of the previous month. -provides more options for working with months. `days_in_month` finds the -number of days in a date's month. And, `%m+%` and `%m-%` provide a new way to -### handle unequal month lengths while doing arithmetic. See NEW FEATURES for more -details - -* date parsing can now parse multiple date formats within the same vector of -date-times. Parsing can also recognize a greater variety of date-time formats -as well as incomplete (truncated) date-times. Contributed by Vitalie Spinu. -Thank you, Vitalie. - -* 1.2.0 introduces a new display format for periods. The display is more math -and international friendly. - -* 1.2.0 transforms negative intervals into periods much more gracefully (e.g, - - 3 days instead of -1 years, 11 months, and 27 days) - -* S3 update methods are now exported - -### NEW FEATURES - -* `stamp` allows users to print dates in whatever form they like. Contributed -by Vitalie Spinu. Thank you, Vitalie. - -* periods now handle fractional seconds. Contributed by Vitalie Spinu. Thank -you, Vitalie. - -* date parsing can now parse multiple date formats within the same vector of -date-times. Parsing can also recognize a greater variety of date-time formats -as well as incomplete (truncated) date-times. Contributed by Vitalie Spinu. -Thank you, Vitalie. - -* `sort`, `order`, `rank` and `xtfrm` now work with periods - -* `as.period.Interval` accepts a unit argument. `as.period` will convert -intervals into periods no larger than the supplied unit. - -* `days_in_month` takes a date, returns the number of days in the date's month. - Contributed by Richard Cotton. Thank you, Richard. - -* `%m+%` and `%m-%` perform addition and subtraction with months (and years) -without rollover at the end of a month. These can be used in place of + and -. -These can't be used with periods smaller than a month, which should be handled -separately. An example of the new behavior: - - ymd("2010-01-31") %m+% months(1) - # "2010-02-28 UTC" - - ymd("2010-01-31") + months(1) - # "2010-03-03 UTC" - - ymd("2010-03-31") %m-% months(1) - # "2010-02-28 UTC" - - ymd("2010-01-31") - months(1) - # "2010-03-03 UTC" - -* `rollback` rolls a date back to the last day of the previous month. - -* `quarter` returns the fiscal quarter that a date occurs in. Like `quartes` -in base R, but returns a numeric instead of a character string. - -### BUG FIXES - -* date parsers now handle NAs - -* periods now handle NAs - -* `[<-` now correctly updates all elements of a period inside a vector, list, -or data.frame - -* `period()` now works with unit = "weeks" - -* `ceiling_date` no longer rounds up if a date is already at a ceiling - -* the redundant (i.e, repeated) hour of fall daylight savings time now -displays with the correct time zone - -* `update.POSIXct` and `update.POSIXlt` handle vectors that sum to zero in the -days argument - -* the format method for periods, intervals and duration now accurately -displays objects of length 0. - - - -Version 1.1.0 -============= - -### CHANGES - -* lubridate no longer overwrites base R methods for +, - , *, /, %%, and %/%. -To recreate the previous experience of subtracting two date times to create an -interval, we've added the interval creation function %--%. - -* lubridate has moved to an S4 object system. Timespans, Intervals, Durations, -and Periods have each been redefined as an S4 class with its own methods. - -* arithmetic operations will no longer perform implicit class changes between -timespans. Users must explicitly state how and when they wish class changes to -occur with as.period(), as.duration(), and as.interval(). This makes code -written with lubridate more robust, as such implicit changes often did not -produce consistent behavior across a variety of operations. It also allows -lubridate to be less chatty with fewer console messages. lubridate does not -need to explain what it is doing, because it no longer attempts to do things -whose outcome would not be clear. On the other hand, arithmetic between -multiple time classes will produce informative error messages. - -* the internal structure of lubridate R code has been reorganized at -https://github.com/tidyverse/lubridate to make lubridate more development friendly. - - -### NEW FEATURES - -* intervals are now more useful and lubridate has more ways to manipulate them. -Intervals can be created with %--%; modified with int_shift(), int_flip(), and -int_standardize(); manipulated with intersect(), union(), and setdiff(); and -used in logical tests with int_aligns(), int_overlaps(), and %within%. -lubridate will no longer perform arithmetic between two intervals because the -correct results of such operations is no more obvious than the correct result -of adding two dates. Instead users are encouraged to use the new set -operations or to directly modify intervals with int_start() and int_end(), -which can also be used as settors. lubridate now supports negative intervals -as well as positive intervals. Intervals also now display with a time zone. - -* Modulo methods for timespans have been changed to return a timespan. this -allows modulo methods to be used with integer division in an intuitive manner, -e.g. `a = a %/% b * b + a %% b` - -Users can still achieve a numerical result by using as.numeric() on input -before performing modulo. - -* Periods, durations, and intervals can now all be put into a data frame. - -* Periods, durations, and intervals can be intuitively subset with $ and []. -These operations also can be used as settors with <-. - -* The parsing functions and the as.period method for intervals are now -slightly faster. - -* month<- and wday<- settors accept names as well as numbers - -* parsing functions now have a quiet argument to parse without messages and a -tz argument to directly parse times into the desired time zone. - -* logical comparison methods now work for period objects. - - -Version 0.2.6 -============= - - -* use `test_package` to avoid incompatibility with current version of - `testthat` - -* other minor fixes to pass `R CMD check` - - -Version 0.2.5 -============= - -* added ymdThms() for parsing ISO 8061 formatted combned dates and times - -### BUG FIXES - -* removed bug in parsing dates with "T" in them - -* modified as.period.interval() to display periods in positive units - - -Version 0.2.4 -============= - -* Add citations to JSS article - - -Version 0.2.3 -============= - -### NEW FEATURES - -* ymd_hms(), hms(), and ms() functions can now parse dates that include -decimal values in the seconds element. - -* milliseconds(), microseconds(), nanoseconds(), and picoseconds() create -period objects of the specified lengths. dmilliseconds(), dmicroseconds(), -dnanoseconds(), and dpicoseconds() make duration objects of the specified -lengths. - - -### BUG FIXES - -* lubridate no longer overwrites months(), start(), and end() from base R. -Start and end have been replaced with int_start() and int_end(). - -* lubridate imports plyr and stringr packages, instead of depending on them. - - -Version 0.2.2 -============= - -### NEW FEATURES - -* made division, modulo, and integer division operations compatible with -difftimes - -* created c() methods for periods and durations - - -### BUG FIXES - -* fixed bug in division, modulo, and integer operations with timespans - - - -Version 0.2.1 -============= - -### NEW FEATURES - -* created parsing functions ymd_hm ymd_h dmy_hms dmy_hm dmy_h mdy_hms mdy_hm -mdy_h ydm_hms ydm_hm ydm_h, which operate in the same way as ymd_hms(). - -### BUG FIXES - -* fixed bug in add_dates(). duration objects can now be successfully added to -numeric objects. - - ------------ -Version 0.2 -=========== - -### NEW FEATURES - -* division between timespans: each timespan class (durations, periods, -intervals) can be divided by other timespans. For example, how many weeks are -there between Halloween and Christmas?: (christmas - halloween) / weeks(1) - -* modulo operations between timespans - -* duration objects now have their own class and display format separate from -difftimes - -* interval objects now use an improved data structure and have a cleaner -display format - -* lubridate now loads its own namespace - -* math operations now automatically coerce interval objects to duration objects. -Allows intervals to be used "right out of the box" without error messages. - -* created start() and end() functions for accessing and changing the boundary -date-times of an interval - - -* rep() methods for periods, intervals, and durations - - - -### MINOR CHANGES - -* added a package help page with functions listed by purpose - -* eseconds(), eminutes(), etc. are aliased to dseconds(), dminutes(), etc. to -make it easier to remember they are duration objects. - -* changed leap.years() to leap_years() to maintain consistent naming scheme - - - -### BUG FIXES - -* rewrote as.period() to create only positive periods. - -* fixed rollover bug in update.POSIXct() - -* edited make_diff() to display in days when approporiate, not weeks diff --git a/revdep/library.noindex/eurostat/new/lubridate/R/lubridate b/revdep/library.noindex/eurostat/new/lubridate/R/lubridate deleted file mode 100644 index 66861563..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/R/lubridate +++ /dev/null @@ -1,27 +0,0 @@ -# File share/R/nspackloader.R -# Part of the R package, https://www.R-project.org -# -# Copyright (C) 1995-2012 The R Core Team -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# A copy of the GNU General Public License is available at -# https://www.r-project.org/Licenses/ - -local({ - info <- loadingNamespaceInfo() - pkg <- info$pkgname - ns <- .getNamespace(as.name(pkg)) - if (is.null(ns)) - stop("cannot find namespace environment for ", pkg, domain = NA); - dbbase <- file.path(info$libname, pkg, "R", pkg) - lazyLoad(dbbase, ns, filter = function(n) n != ".__NAMESPACE__.") -}) diff --git a/revdep/library.noindex/eurostat/new/lubridate/R/lubridate.rdb b/revdep/library.noindex/eurostat/new/lubridate/R/lubridate.rdb deleted file mode 100644 index 737b2807..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/R/lubridate.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/R/lubridate.rdx b/revdep/library.noindex/eurostat/new/lubridate/R/lubridate.rdx deleted file mode 100644 index 6947c60b..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/R/lubridate.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/cctz.sh b/revdep/library.noindex/eurostat/new/lubridate/cctz.sh deleted file mode 100644 index 0b68fa44..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/cctz.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -cctz=../src/cctz/ - -rm -rf $cctz -mkdir $cctz -git clone https://github.com/google/cctz.git cctz_tmp -cp -r cctz_tmp/include $cctz/include - -LIBCCTZ="tzfile time_zone_fixed time_zone_if time_zone_impl time_zone_info time_zone_libc time_zone_lookup time_zone_posix" -mkdir $cctz/src/ - -for f in $LIBCCTZ -do - cp ./cctz_tmp/src/$f* $cctz/src/ -done - -rm -rf cctz_tmp diff --git a/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rdb b/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rdb deleted file mode 100644 index 2738236d..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rds b/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rds deleted file mode 100644 index 0b345281..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rdx b/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rdx deleted file mode 100644 index b79aa19f..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/data/Rdata.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/help/AnIndex b/revdep/library.noindex/eurostat/new/lubridate/help/AnIndex deleted file mode 100644 index 7f61fc25..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/help/AnIndex +++ /dev/null @@ -1,554 +0,0 @@ -lubridate-package lubridate-package -!=,Duration,Period hidden_aliases -!=,Duration,Period-method hidden_aliases -!=,numeric,Period hidden_aliases -!=,numeric,Period-method hidden_aliases -!=,Period,Duration hidden_aliases -!=,Period,Duration-method hidden_aliases -!=,Period,numeric hidden_aliases -!=,Period,numeric-method hidden_aliases -!=,Period,Period hidden_aliases -!=,Period,Period-method hidden_aliases -$,Duration-method hidden_aliases -$,Interval-method hidden_aliases -$,Period-method hidden_aliases -$<-,Duration-method hidden_aliases -$<-,Interval-method hidden_aliases -$<-,Period-method hidden_aliases -%%,Duration,Duration-method hidden_aliases -%%,Duration,Interval-method hidden_aliases -%%,Duration,Period-method hidden_aliases -%%,Interval,Duration hidden_aliases -%%,Interval,Duration-method hidden_aliases -%%,Interval,Interval hidden_aliases -%%,Interval,Interval-method hidden_aliases -%%,Interval,Period hidden_aliases -%%,Interval,Period-method hidden_aliases -%%,Period,Duration hidden_aliases -%%,Period,Duration-method hidden_aliases -%%,Period,Interval hidden_aliases -%%,Period,Interval-method hidden_aliases -%%,Period,Period hidden_aliases -%%,Period,Period-method hidden_aliases -%--% interval -%/%,difftime,Timespan-method Timespan-class -%/%,Duration,Interval-method Timespan-class -%/%,Interval,Duration-method Timespan-class -%/%,Interval,Interval-method Timespan-class -%/%,Interval,Period-method Timespan-class -%/%,Period,Interval-method Timespan-class -%/%,Period,Period-method Timespan-class -%/%,Timespan,Timespan-method Timespan-class -%m+% mplus -%m+%,ANY,ANY-method mplus -%m+%,ANY,Duration-method mplus -%m+%,ANY,Interval-method mplus -%m+%,ANY,Period-method mplus -%m+%,Duration,ANY-method mplus -%m+%,Interval,ANY-method mplus -%m+%,Period,ANY-method mplus -%m-% mplus -%m-%,ANY,ANY-method mplus -%m-%,ANY,Duration-method mplus -%m-%,ANY,Interval-method mplus -%m-%,ANY,Period-method mplus -%m-%,Duration,ANY-method mplus -%m-%,Interval,ANY-method mplus -%m-%,Period,ANY-method mplus -%within% within-interval -%within%,ANY,Interval-method within-interval -%within%,Date,list-method within-interval -%within%,Interval,Interval-method within-interval -%within%,Interval,list-method within-interval -%within%,POSIXt,list-method within-interval -*,ANY,Duration-method hidden_aliases -*,ANY,Interval-method hidden_aliases -*,ANY,Period hidden_aliases -*,ANY,Period-method hidden_aliases -*,Duration,ANY-method hidden_aliases -*,Interval,ANY-method hidden_aliases -*,Period,ANY hidden_aliases -*,Period,ANY-method hidden_aliases -*,Timespan,Timespan-method Timespan-class -+,Date,Duration-method hidden_aliases -+,Date,Interval-method hidden_aliases -+,Date,Period-method hidden_aliases -+,difftime,Duration-method hidden_aliases -+,difftime,Interval-method hidden_aliases -+,difftime,Period-method hidden_aliases -+,Duration,Date-method hidden_aliases -+,Duration,difftime-method hidden_aliases -+,Duration,Duration-method hidden_aliases -+,Duration,Interval-method hidden_aliases -+,Duration,numeric-method hidden_aliases -+,Duration,Period-method hidden_aliases -+,Duration,POSIXct-method hidden_aliases -+,Duration,POSIXlt-method hidden_aliases -+,Interval,Date-method hidden_aliases -+,Interval,difftime-method hidden_aliases -+,Interval,Duration-method hidden_aliases -+,Interval,Interval-method hidden_aliases -+,Interval,numeric-method hidden_aliases -+,Interval,Period-method hidden_aliases -+,Interval,POSIXct-method hidden_aliases -+,Interval,POSIXlt-method hidden_aliases -+,numeric,Duration-method hidden_aliases -+,numeric,Interval-method hidden_aliases -+,numeric,Period-method hidden_aliases -+,Period,Date-method hidden_aliases -+,Period,difftime-method hidden_aliases -+,Period,Duration-method hidden_aliases -+,Period,Interval-method hidden_aliases -+,Period,numeric-method hidden_aliases -+,Period,Period-method hidden_aliases -+,Period,POSIXct-method hidden_aliases -+,Period,POSIXlt-method hidden_aliases -+,POSIXct,Duration-method hidden_aliases -+,POSIXct,Interval-method hidden_aliases -+,POSIXct,Period-method hidden_aliases -+,POSIXlt,Duration-method hidden_aliases -+,POSIXlt,Interval-method hidden_aliases -+,POSIXlt,Period-method hidden_aliases --,ANY,Duration-method hidden_aliases --,ANY,Period hidden_aliases --,ANY,Period-method hidden_aliases --,Date,Duration-method hidden_aliases --,Date,Interval hidden_aliases --,Date,Interval-method hidden_aliases --,Date,Period-method hidden_aliases --,Duration,ANY-method hidden_aliases --,Duration,Date-method hidden_aliases --,Duration,Duration-method hidden_aliases --,Duration,Interval hidden_aliases --,Duration,Interval-method hidden_aliases --,Duration,missing-method hidden_aliases --,Duration,numeric-method hidden_aliases --,Duration,Period-method hidden_aliases --,Duration,POSIXct-method hidden_aliases --,Duration,POSIXlt-method hidden_aliases --,Interval,Date hidden_aliases --,Interval,Date-method hidden_aliases --,Interval,Duration-method hidden_aliases --,Interval,Interval hidden_aliases --,Interval,Interval-method hidden_aliases --,Interval,missing-method hidden_aliases --,Interval,numeric hidden_aliases --,Interval,numeric-method hidden_aliases --,Interval,Period-method hidden_aliases --,Interval,POSIXct hidden_aliases --,Interval,POSIXct-method hidden_aliases --,Interval,POSIXlt hidden_aliases --,Interval,POSIXlt-method hidden_aliases --,numeric,Duration-method hidden_aliases --,numeric,Interval hidden_aliases --,numeric,Interval-method hidden_aliases --,numeric,Period-method hidden_aliases --,Period,ANY-method hidden_aliases --,Period,Date-method hidden_aliases --,Period,Duration-method hidden_aliases --,Period,Interval hidden_aliases --,Period,Interval-method hidden_aliases --,Period,missing hidden_aliases --,Period,missing-method hidden_aliases --,Period,numeric-method hidden_aliases --,Period,Period-method hidden_aliases --,Period,POSIXct-method hidden_aliases --,Period,POSIXlt-method hidden_aliases --,POSIXct,Duration-method hidden_aliases --,POSIXct,Interval hidden_aliases --,POSIXct,Interval-method hidden_aliases --,POSIXct,Period-method hidden_aliases --,POSIXlt,Duration-method hidden_aliases --,POSIXlt,Interval hidden_aliases --,POSIXlt,Interval-method hidden_aliases --,POSIXlt,Period-method hidden_aliases -/,difftime,Duration-method hidden_aliases -/,difftime,Interval-method hidden_aliases -/,difftime,Period-method hidden_aliases -/,Duration,difftime-method hidden_aliases -/,Duration,Duration-method hidden_aliases -/,Duration,Interval-method hidden_aliases -/,Duration,numeric-method hidden_aliases -/,Duration,Period-method hidden_aliases -/,Interval,difftime-method hidden_aliases -/,Interval,Duration-method hidden_aliases -/,Interval,Interval-method hidden_aliases -/,Interval,numeric-method hidden_aliases -/,Interval,Period-method hidden_aliases -/,numeric,Duration-method hidden_aliases -/,numeric,Interval-method hidden_aliases -/,numeric,Period hidden_aliases -/,numeric,Period-method hidden_aliases -/,Period,difftime-method hidden_aliases -/,Period,Duration-method hidden_aliases -/,Period,Interval-method hidden_aliases -/,Period,numeric-method hidden_aliases -/,Period,Period-method hidden_aliases -<,Duration,Period hidden_aliases -<,Duration,Period-method hidden_aliases -<,numeric,Period hidden_aliases -<,numeric,Period-method hidden_aliases -<,Period,Duration hidden_aliases -<,Period,Duration-method hidden_aliases -<,Period,numeric hidden_aliases -<,Period,numeric-method hidden_aliases -<,Period,Period hidden_aliases -<,Period,Period-method hidden_aliases -<=,Duration,Period hidden_aliases -<=,Duration,Period-method hidden_aliases -<=,numeric,Period hidden_aliases -<=,numeric,Period-method hidden_aliases -<=,Period,Duration hidden_aliases -<=,Period,Duration-method hidden_aliases -<=,Period,numeric hidden_aliases -<=,Period,numeric-method hidden_aliases -<=,Period,Period hidden_aliases -<=,Period,Period-method hidden_aliases -==,Duration,Period hidden_aliases -==,Duration,Period-method hidden_aliases -==,numeric,Period hidden_aliases -==,numeric,Period-method hidden_aliases -==,Period,Duration hidden_aliases -==,Period,Duration-method hidden_aliases -==,Period,numeric hidden_aliases -==,Period,numeric-method hidden_aliases -==,Period,Period hidden_aliases -==,Period,Period-method hidden_aliases ->,Duration,Period hidden_aliases ->,Duration,Period-method hidden_aliases ->,numeric,Period hidden_aliases ->,numeric,Period-method hidden_aliases ->,Period,Duration hidden_aliases ->,Period,Duration-method hidden_aliases ->,Period,numeric hidden_aliases ->,Period,numeric-method hidden_aliases ->,Period,Period hidden_aliases ->,Period,Period-method hidden_aliases ->=,Duration,Period hidden_aliases ->=,Duration,Period-method hidden_aliases ->=,numeric,Period hidden_aliases ->=,numeric,Period-method hidden_aliases ->=,Period,Duration hidden_aliases ->=,Period,Duration-method hidden_aliases ->=,Period,numeric hidden_aliases ->=,Period,numeric-method hidden_aliases ->=,Period,Period hidden_aliases ->=,Period,Period-method hidden_aliases -add_with_rollback mplus -am am -Arith,ANY,Interval-method hidden_aliases -Arith,ANY,Period-method hidden_aliases -Arith,Duration,Period-method hidden_aliases -Arith,Interval,ANY-method hidden_aliases -Arith,Period,ANY-method hidden_aliases -Arith,Period,Duration-method hidden_aliases -as.character,Duration-method hidden_aliases -as.character,Interval-method hidden_aliases -as.character,Period-method hidden_aliases -as.difftime reexports -as.difftime,Duration-method hidden_aliases -as.difftime,Interval-method hidden_aliases -as.difftime,Period-method hidden_aliases -as.duration as.duration -as.duration,character-method as.duration -as.duration,difftime-method as.duration -as.duration,Duration-method as.duration -as.duration,Interval-method as.duration -as.duration,logical-method as.duration -as.duration,numeric-method as.duration -as.duration,Period-method as.duration -as.integer,Duration-method hidden_aliases -as.integer,Interval-method hidden_aliases -as.integer,Period-method hidden_aliases -as.interval as.interval -as.interval,difftime-method as.interval -as.interval,Duration-method as.interval -as.interval,Interval-method as.interval -as.interval,logical-method as.interval -as.interval,numeric-method as.interval -as.interval,Period-method as.interval -as.interval,POSIXt-method as.interval -as.numeric,Duration-method hidden_aliases -as.numeric,Interval-method hidden_aliases -as.numeric,Period-method hidden_aliases -as.period as.period -as.period,character-method as.period -as.period,difftime-method as.period -as.period,Duration-method as.period -as.period,Interval-method as.period -as.period,logical-method as.period -as.period,numeric-method as.period -as.period,Period-method as.period -as_date as_date -as_date,ANY-method as_date -as_date,character-method as_date -as_date,numeric-method as_date -as_date,POSIXt-method as_date -as_datetime as_date -as_datetime,ANY-method as_date -as_datetime,character-method as_date -as_datetime,Date-method as_date -as_datetime,numeric-method as_date -as_datetime,POSIXt-method as_date -c,Duration-method hidden_aliases -c,Interval-method hidden_aliases -c,Period-method hidden_aliases -ceiling_date round_date -Compare,ANY,Duration-method hidden_aliases -Compare,character,Duration-method hidden_aliases -Compare,character,Period-method hidden_aliases -Compare,difftime,Duration-method hidden_aliases -Compare,difftime,Period-method hidden_aliases -Compare,Duration,ANY-method hidden_aliases -Compare,Duration,character-method hidden_aliases -Compare,Duration,difftime-method hidden_aliases -Compare,Duration,Duration-method hidden_aliases -Compare,Duration,numeric-method hidden_aliases -Compare,Duration,Period-method hidden_aliases -Compare,numeric,Duration-method hidden_aliases -Compare,numeric,Period-method hidden_aliases -Compare,Period,character-method hidden_aliases -Compare,Period,difftime-method hidden_aliases -Compare,Period,Duration-method hidden_aliases -Compare,Period,numeric-method hidden_aliases -Compare,Period,Period-method hidden_aliases -cyclic_encoding cyclic_encoding -Date date_utils -date date -date,Period-method hidden_aliases -date<- date -date<-,Period-method hidden_aliases -DateCoercion DateCoercion -DateTimeUpdate DateTimeUpdate -date_decimal date_decimal -day day -day,Period-method hidden_aliases -day<- day -day<-,Date-method hidden_aliases -day<-,Duration-method hidden_aliases -day<-,Interval-method hidden_aliases -day<-,Period-method hidden_aliases -day<-,POSIXt-method hidden_aliases -days period -days_in_month days_in_month -ddays duration -decimal_date decimal_date -Deprecated-lubridate Deprecated -dhours duration -dmicroseconds duration -dmilliseconds duration -dminutes duration -dmonths duration -dmy ymd -dmy_h ymd_hms -dmy_hm ymd_hms -dmy_hms ymd_hms -dnanoseconds duration -dpicoseconds duration -dseconds duration -dst dst -duration duration -Duration-class Duration-class -durations Duration-class -dweeks duration -dyears duration -dym ymd -epiweek week -epiyear year -fast_strptime parse_date_time -fit_to_timeline fit_to_timeline -floor_date round_date -force_tz force_tz -force_tz.default force_tz -force_tzs force_tz -format_ISO8601 format_ISO8601 -format_ISO8601,Date-method format_ISO8601 -format_ISO8601,Duration-method format_ISO8601 -format_ISO8601,Interval-method format_ISO8601 -format_ISO8601,Period-method format_ISO8601 -format_ISO8601,POSIXt-method format_ISO8601 -format_ISO8601_precision_check format_ISO8601_precision_check -guess_formats guess_formats -hidden_aliases hidden_aliases -hm hms -hms hms -hour hour -hour,Period-method hidden_aliases -hour<- hour -hour<-,Date-method hidden_aliases -hour<-,Duration-method hidden_aliases -hour<-,Interval-method hidden_aliases -hour<-,Period-method hidden_aliases -hour<-,POSIXt-method hidden_aliases -hours period -instant is.instant -instants is.instant -intersect reexports -intersect,Interval,Interval-method hidden_aliases -interval interval -Interval-class Interval-class -intervals Interval-class -int_aligns interval -int_diff interval -int_end interval -int_end<- interval -int_flip interval -int_length interval -int_overlaps interval -int_shift interval -int_standardize interval -int_start interval -int_start<- interval -is.Date date_utils -is.difftime is.difftime -is.duration duration -is.instant is.instant -is.interval interval -is.period period -is.POSIXct posix_utils -is.POSIXlt posix_utils -is.POSIXt posix_utils -is.timepoint is.instant -is.timespan is.timespan -isoweek week -isoyear year -lakers lakers -leap_year leap_year -local_time local_time -lubridate lubridate-package -m+ mplus -m- mplus -make_date make_datetime -make_datetime make_datetime -make_difftime make_difftime -mday day -mday<- day -mdy ymd -mdy_h ymd_hms -mdy_hm ymd_hms -mdy_hms ymd_hms -microseconds period -milliseconds period -minute minute -minute,Period-method hidden_aliases -minute<- minute -minute<-,Date-method hidden_aliases -minute<-,Duration-method hidden_aliases -minute<-,Interval-method hidden_aliases -minute<-,Period-method hidden_aliases -minute<-,POSIXt-method hidden_aliases -minutes period -month month -month,Period-method hidden_aliases -month<- month -month<-,Date-method hidden_aliases -month<-,Duration-method hidden_aliases -month<-,Interval-method hidden_aliases -month<-,Period-method hidden_aliases -month<-,POSIXt-method hidden_aliases -months.numeric period -ms hms -my ymd -myd ymd -nanoseconds period -NA_Date_ date_utils -NA_POSIXct_ posix_utils -now now -origin origin -parse_date_time parse_date_time -parse_date_time2 parse_date_time -period period -Period-class Period-class -periods period -period_to_seconds period_to_seconds -picoseconds period -pm am -POSIXct posix_utils -pretty_dates pretty_dates -qday day -qday<- day -quarter quarter -reclass_date reclass_date -reclass_timespan reclass_timespan -reclass_timespan,ANY,difftime-method reclass_timespan -reclass_timespan,ANY,Duration-method reclass_timespan -reclass_timespan,ANY,Interval-method reclass_timespan -reclass_timespan,ANY,Period-method reclass_timespan -reexports reexports -rep,Duration-method hidden_aliases -rep,Interval-method hidden_aliases -rep,Period-method hidden_aliases -rollback rollbackward -rollbackward rollbackward -rollforward rollbackward -round_date round_date -second second -second,Period-method hidden_aliases -second<- second -second<-,Date-method hidden_aliases -second<-,Duration-method hidden_aliases -second<-,Interval-method hidden_aliases -second<-,Period-method hidden_aliases -second<-,POSIXt-method hidden_aliases -seconds period -seconds_to_period period_to_seconds -semester quarter -setdiff reexports -setdiff,Interval,Interval-method hidden_aliases -show,Duration-method hidden_aliases -show,Interval-method hidden_aliases -show,Period-method hidden_aliases -stamp stamp -stamp_date stamp -stamp_time stamp -timespan timespan -Timespan-class Timespan-class -timespans timespan -time_length time_length -time_length,Interval-method time_length -today now -tz tz -tz<- tz -union reexports -union,Interval,Interval-method hidden_aliases -update.POSIXt DateTimeUpdate -wday day -wday<- day -week week -week<- week -weeks period -with_tz with_tz -with_tz.default with_tz -yday day -yday<- day -ydm ymd -ydm_h ymd_hms -ydm_hm ymd_hms -ydm_hms ymd_hms -year year -year,Period-method hidden_aliases -year<- year -year<-,Date-method hidden_aliases -year<-,Duration-method hidden_aliases -year<-,Interval-method hidden_aliases -year<-,Period-method hidden_aliases -year<-,POSIXt-method hidden_aliases -years period -ym ymd -ymd ymd -ymd_h ymd_hms -ymd_hm ymd_hms -ymd_hms ymd_hms -yq ymd -[,Duration-method hidden_aliases -[,Interval-method hidden_aliases -[,Period-method hidden_aliases -[<-,Duration,ANY,ANY,ANY-method hidden_aliases -[<-,Interval,ANY,ANY,ANY-method hidden_aliases -[<-,Period,ANY,ANY,Period-method hidden_aliases -[[,Duration-method hidden_aliases -[[,Interval-method hidden_aliases -[[,Period-method hidden_aliases -[[<-,Duration,ANY,ANY,ANY-method hidden_aliases -[[<-,Interval,ANY,ANY,ANY-method hidden_aliases -[[<-,Period,ANY,ANY,Period-method hidden_aliases diff --git a/revdep/library.noindex/eurostat/new/lubridate/help/aliases.rds b/revdep/library.noindex/eurostat/new/lubridate/help/aliases.rds deleted file mode 100644 index cbb5ba74..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/help/aliases.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/help/figures/logo.png b/revdep/library.noindex/eurostat/new/lubridate/help/figures/logo.png deleted file mode 100644 index dab4b890..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/help/figures/logo.png and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/help/lubridate.rdb b/revdep/library.noindex/eurostat/new/lubridate/help/lubridate.rdb deleted file mode 100644 index 971a7d7e..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/help/lubridate.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/help/lubridate.rdx b/revdep/library.noindex/eurostat/new/lubridate/help/lubridate.rdx deleted file mode 100644 index 5c07a035..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/help/lubridate.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/help/paths.rds b/revdep/library.noindex/eurostat/new/lubridate/help/paths.rds deleted file mode 100644 index 2851c964..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/help/paths.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/html/00Index.html b/revdep/library.noindex/eurostat/new/lubridate/html/00Index.html deleted file mode 100644 index dd938e1d..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/html/00Index.html +++ /dev/null @@ -1,513 +0,0 @@ - - -R: Make Dealing with Dates a Little Easier - - - -
-

Make Dealing with Dates a Little Easier - -

-
-
-[Up] -[Top] -

Documentation for package ‘lubridate’ version 1.9.2

- - - -

Help Pages

- - -

-A -C -D -E -F -G -H -I -L -M -N -O -P -Q -R -S -T -U -W -Y -misc -

- - -

-- A --

- - - - - - - - - - - - - - - - - - - - - - - - - - -
add_with_rollbackAdd and subtract months to a date without exceeding the last day of the new month
amDoes date time occur in the am or pm?
as.durationChange an object to a duration
as.duration-methodChange an object to a duration
as.intervalChange an object to an 'interval'
as.interval-methodChange an object to an 'interval'
as.periodChange an object to a period
as.period-methodChange an object to a period
as_dateConvert an object to a date or date-time
as_date-methodConvert an object to a date or date-time
as_datetimeConvert an object to a date or date-time
as_datetime-methodConvert an object to a date or date-time
- -

-- C --

- - - - - - -
ceiling_dateRound, floor and ceiling methods for date-time objects
cyclic_encodingCyclic encoding of date-times
- -

-- D --

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DateVarious date utilities
dateGet/set date component of a date-time
date<-Get/set date component of a date-time
DateTimeUpdateChanges the components of a date object
date_decimalConverts a decimal to a date
dayGet/set days component of a date-time
day<-Get/set days component of a date-time
daysCreate or parse period objects
days_in_monthGet the number of days in the month of a date-time
ddaysCreate a duration object.
decimal_dateConverts a date to a decimal of its year
dhoursCreate a duration object.
dmicrosecondsCreate a duration object.
dmillisecondsCreate a duration object.
dminutesCreate a duration object.
dmonthsCreate a duration object.
dmyParse dates with *y*ear, *m*onth, and *d*ay components
dmy_hParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
dmy_hmParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
dmy_hmsParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
dnanosecondsCreate a duration object.
dpicosecondsCreate a duration object.
dsecondsCreate a duration object.
dstGet *d*aylight *s*avings *t*ime indicator of a date-time
durationCreate a duration object.
Duration-classDuration class
durationsDuration class
dweeksCreate a duration object.
dyearsCreate a duration object.
dymParse dates with *y*ear, *m*onth, and *d*ay components
- -

-- E --

- - - - - - -
epiweekGet/set weeks component of a date-time
epiyearGet/set years component of a date-time
- -

-- F --

- - - - - - - - - - - - - - - - - - -
fast_strptimeUser friendly date-time parsing functions
fit_to_timelineFit a POSIXlt date-time to the timeline
floor_dateRound, floor and ceiling methods for date-time objects
force_tzReplace time zone to create new date-time
force_tz.defaultReplace time zone to create new date-time
force_tzsReplace time zone to create new date-time
format_ISO8601Format in ISO8601 character format
format_ISO8601-methodFormat in ISO8601 character format
- -

-- G --

- - - - -
guess_formatsGuess possible date-times formats from a character vector
- -

-- H --

- - - - - - - - - - - - -
hmParse periods with *h*our, *m*inute, and *s*econd components
hmsParse periods with *h*our, *m*inute, and *s*econd components
hourGet/set hours component of a date-time
hour<-Get/set hours component of a date-time
hoursCreate or parse period objects
- -

-- I --

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
instantIs x a date-time object?
instantsIs x a date-time object?
intervalUtilities for creation and manipulation of 'Interval' objects
Interval-classInterval class
intervalsInterval class
int_alignsUtilities for creation and manipulation of 'Interval' objects
int_diffUtilities for creation and manipulation of 'Interval' objects
int_endUtilities for creation and manipulation of 'Interval' objects
int_end<-Utilities for creation and manipulation of 'Interval' objects
int_flipUtilities for creation and manipulation of 'Interval' objects
int_lengthUtilities for creation and manipulation of 'Interval' objects
int_overlapsUtilities for creation and manipulation of 'Interval' objects
int_shiftUtilities for creation and manipulation of 'Interval' objects
int_standardizeUtilities for creation and manipulation of 'Interval' objects
int_startUtilities for creation and manipulation of 'Interval' objects
int_start<-Utilities for creation and manipulation of 'Interval' objects
is.DateVarious date utilities
is.difftimeIs x a difftime object?
is.durationCreate a duration object.
is.instantIs x a date-time object?
is.intervalUtilities for creation and manipulation of 'Interval' objects
is.periodCreate or parse period objects
is.POSIXctVarious POSIX utilities
is.POSIXltVarious POSIX utilities
is.POSIXtVarious POSIX utilities
is.timepointIs x a date-time object?
is.timespanIs x a length of time?
isoweekGet/set weeks component of a date-time
isoyearGet/set years component of a date-time
- -

-- L --

- - - - - - - - -
lakersLakers 2008-2009 basketball data set
leap_yearIs a year a leap year?
local_timeGet local time from a date-time vector.
- -

-- M --

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
m+Add and subtract months to a date without exceeding the last day of the new month
m-Add and subtract months to a date without exceeding the last day of the new month
make_dateEfficient creation of date-times from numeric representations
make_datetimeEfficient creation of date-times from numeric representations
make_difftimeCreate a difftime object.
mdayGet/set days component of a date-time
mday<-Get/set days component of a date-time
mdyParse dates with *y*ear, *m*onth, and *d*ay components
mdy_hParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
mdy_hmParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
mdy_hmsParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
microsecondsCreate or parse period objects
millisecondsCreate or parse period objects
minuteGet/set minutes component of a date-time
minute<-Get/set minutes component of a date-time
minutesCreate or parse period objects
monthGet/set months component of a date-time
month<-Get/set months component of a date-time
months.numericCreate or parse period objects
msParse periods with *h*our, *m*inute, and *s*econd components
myParse dates with *y*ear, *m*onth, and *d*ay components
mydParse dates with *y*ear, *m*onth, and *d*ay components
- -

-- N --

- - - - - - - - - - -
nanosecondsCreate or parse period objects
NA_Date_Various date utilities
NA_POSIXct_Various POSIX utilities
nowThe current day and time
- -

-- O --

- - - - -
origin1970-01-01 UTC
- -

-- P --

- - - - - - - - - - - - - - - - - - - - -
parse_date_timeUser friendly date-time parsing functions
parse_date_time2User friendly date-time parsing functions
periodCreate or parse period objects
periodsCreate or parse period objects
period_to_secondsContrive a period to/from a given number of seconds
picosecondsCreate or parse period objects
pmDoes date time occur in the am or pm?
POSIXctVarious POSIX utilities
pretty_datesComputes attractive axis breaks for date-time data
- -

-- Q --

- - - - - - - - -
qdayGet/set days component of a date-time
qday<-Get/set days component of a date-time
quarterGet the fiscal quarter and semester of a date-time
- -

-- R --

- - - - - - - - - - -
rollbackRoll backward or forward a date the previous, current or next month
rollbackwardRoll backward or forward a date the previous, current or next month
rollforwardRoll backward or forward a date the previous, current or next month
round_dateRound, floor and ceiling methods for date-time objects
- -

-- S --

- - - - - - - - - - - - - - - - - - -
secondGet/set seconds component of a date-time
second<-Get/set seconds component of a date-time
secondsCreate or parse period objects
seconds_to_periodContrive a period to/from a given number of seconds
semesterGet the fiscal quarter and semester of a date-time
stampFormat dates and times based on human-friendly templates
stamp_dateFormat dates and times based on human-friendly templates
stamp_timeFormat dates and times based on human-friendly templates
- -

-- T --

- - - - - - - - - - - - - - - - -
timespanDescription of time span classes in lubridate
timespansDescription of time span classes in lubridate
time_lengthCompute the exact length of a time span
time_length-methodCompute the exact length of a time span
todayThe current day and time
tzGet/set time zone component of a date-time
tz<-Get/set time zone component of a date-time
- -

-- U --

- - - - -
update.POSIXtChanges the components of a date object
- -

-- W --

- - - - - - - - - - - - - - - - -
wdayGet/set days component of a date-time
wday<-Get/set days component of a date-time
weekGet/set weeks component of a date-time
week<-Get/set weeks component of a date-time
weeksCreate or parse period objects
with_tzGet date-time in a different time zone
with_tz.defaultGet date-time in a different time zone
- -

-- Y --

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ydayGet/set days component of a date-time
yday<-Get/set days component of a date-time
ydmParse dates with *y*ear, *m*onth, and *d*ay components
ydm_hParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
ydm_hmParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
ydm_hmsParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
yearGet/set years component of a date-time
year<-Get/set years component of a date-time
yearsCreate or parse period objects
ymParse dates with *y*ear, *m*onth, and *d*ay components
ymdParse dates with *y*ear, *m*onth, and *d*ay components
ymd_hParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
ymd_hmParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
ymd_hmsParse date-times with *y*ear, *m*onth, and *d*ay, *h*our, *m*inute, and *s*econd components.
yqParse dates with *y*ear, *m*onth, and *d*ay components
- -

-- misc --

- - - - - - - - - - - - - - - - -
%--%Utilities for creation and manipulation of 'Interval' objects
%m+%Add and subtract months to a date without exceeding the last day of the new month
%m+%-methodAdd and subtract months to a date without exceeding the last day of the new month
%m-%Add and subtract months to a date without exceeding the last day of the new month
%m-%-methodAdd and subtract months to a date without exceeding the last day of the new month
%within%Does a date (or interval) fall within an interval?
%within%-methodDoes a date (or interval) fall within an interval?
-
diff --git a/revdep/library.noindex/eurostat/new/lubridate/html/R.css b/revdep/library.noindex/eurostat/new/lubridate/html/R.css deleted file mode 100644 index 2ef6cd60..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/html/R.css +++ /dev/null @@ -1,120 +0,0 @@ -@media screen { - .container { - padding-right: 10px; - padding-left: 10px; - margin-right: auto; - margin-left: auto; - max-width: 900px; - } -} - -.rimage img { /* from knitr - for examples and demos */ - width: 96%; - margin-left: 2%; -} - -.katex { font-size: 1.1em; } - -code { - color: inherit; - background: inherit; -} - -body { - line-height: 1.4; - background: white; - color: black; -} - -a:link { - background: white; - color: blue; -} - -a:visited { - background: white; - color: rgb(50%, 0%, 50%); -} - -h1 { - background: white; - color: rgb(55%, 55%, 55%); - font-family: monospace; - font-size: 1.4em; /* x-large; */ - text-align: center; -} - -h2 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: 1.2em; /* large; */ - text-align: center; -} - -h3 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: 1.2em; /* large; */ -} - -h4 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; - font-size: 1.2em; /* large; */ -} - -h5 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; -} - -h6 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; -} - -img.toplogo { - width: 4em; - vertical-align: middle; -} - -img.arrow { - width: 30px; - height: 30px; - border: 0; -} - -span.acronym { - font-size: small; -} - -span.env { - font-family: monospace; -} - -span.file { - font-family: monospace; -} - -span.option{ - font-family: monospace; -} - -span.pkg { - font-weight: bold; -} - -span.samp{ - font-family: monospace; -} - -div.vignettes a:hover { - background: rgb(85%, 85%, 85%); -} diff --git a/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so b/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so deleted file mode 100755 index 7670a15c..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so.dSYM/Contents/Info.plist b/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so.dSYM/Contents/Info.plist deleted file mode 100644 index f9dda1e1..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.lubridate.so - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so.dSYM/Contents/Resources/DWARF/lubridate.so b/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so.dSYM/Contents/Resources/DWARF/lubridate.so deleted file mode 100644 index 4063aa3c..00000000 Binary files a/revdep/library.noindex/eurostat/new/lubridate/libs/lubridate.so.dSYM/Contents/Resources/DWARF/lubridate.so and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/lubridate/pkgdown/assets/tidyverse.css b/revdep/library.noindex/eurostat/new/lubridate/pkgdown/assets/tidyverse.css deleted file mode 100644 index 399bc06e..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/pkgdown/assets/tidyverse.css +++ /dev/null @@ -1,6487 +0,0 @@ -@charset "UTF-8"; -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -@import url("https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400,700|Source+Sans+Pro:300,400,700"); -html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; } - -body { - margin: 0; } - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; } - -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; } - -audio:not([controls]) { - display: none; - height: 0; } - -[hidden], -template { - display: none; } - -a { - background-color: transparent; } - -a:active, -a:hover { - outline: 0; } - -abbr[title] { - border-bottom: 1px dotted; } - -b, -strong { - font-weight: bold; } - -dfn { - font-style: italic; } - -h1 { - font-size: 2em; - margin: 0.67em 0; } - -mark { - background: #ff0; - color: #000; } - -small { - font-size: 80%; } - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sup { - top: -0.5em; } - -sub { - bottom: -0.25em; } - -img { - border: 0; } - -svg:not(:root) { - overflow: hidden; } - -figure { - margin: 1em 40px; } - -hr { - box-sizing: content-box; - height: 0; } - -pre { - overflow: auto; } - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; } - -button, -input, -optgroup, -select, -textarea { - color: inherit; - font: inherit; - margin: 0; } - -button { - overflow: visible; } - -button, -select { - text-transform: none; } - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; } - -button[disabled], -html input[disabled] { - cursor: default; } - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; } - -input { - line-height: normal; } - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - padding: 0; } - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; } - -input[type="search"] { - -webkit-appearance: textfield; - box-sizing: content-box; } - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; } - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; } - -legend { - border: 0; - padding: 0; } - -textarea { - overflow: auto; } - -optgroup { - font-weight: bold; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print { - *, - *:before, - *:after { - background: transparent !important; - color: #000 !important; - box-shadow: none !important; - text-shadow: none !important; } - - a, - a:visited { - text-decoration: underline; } - - a[href]:after { - content: " (" attr(href) ")"; } - - abbr[title]:after { - content: " (" attr(title) ")"; } - - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; } - - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; } - - thead { - display: table-header-group; } - - tr, - img { - page-break-inside: avoid; } - - img { - max-width: 100% !important; } - - p, - h2, - h3 { - orphans: 3; - widows: 3; } - - h2, - h3 { - page-break-after: avoid; } - - .navbar { - display: none; } - - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; } - - .label { - border: 1px solid #000; } - - .table { - border-collapse: collapse !important; } - .table td, - .table th { - background-color: #fff !important; } - - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; } } -@font-face { - font-family: 'Glyphicons Halflings'; - src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot"); - src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; } - -.glyphicon-asterisk:before { - content: "\002a"; } - -.glyphicon-plus:before { - content: "\002b"; } - -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; } - -.glyphicon-minus:before { - content: "\2212"; } - -.glyphicon-cloud:before { - content: "\2601"; } - -.glyphicon-envelope:before { - content: "\2709"; } - -.glyphicon-pencil:before { - content: "\270f"; } - -.glyphicon-glass:before { - content: "\e001"; } - -.glyphicon-music:before { - content: "\e002"; } - -.glyphicon-search:before { - content: "\e003"; } - -.glyphicon-heart:before { - content: "\e005"; } - -.glyphicon-star:before { - content: "\e006"; } - -.glyphicon-star-empty:before { - content: "\e007"; } - -.glyphicon-user:before { - content: "\e008"; } - -.glyphicon-film:before { - content: "\e009"; } - -.glyphicon-th-large:before { - content: "\e010"; } - -.glyphicon-th:before { - content: "\e011"; } - -.glyphicon-th-list:before { - content: "\e012"; } - -.glyphicon-ok:before { - content: "\e013"; } - -.glyphicon-remove:before { - content: "\e014"; } - -.glyphicon-zoom-in:before { - content: "\e015"; } - -.glyphicon-zoom-out:before { - content: "\e016"; } - -.glyphicon-off:before { - content: "\e017"; } - -.glyphicon-signal:before { - content: "\e018"; } - -.glyphicon-cog:before { - content: "\e019"; } - -.glyphicon-trash:before { - content: "\e020"; } - -.glyphicon-home:before { - content: "\e021"; } - -.glyphicon-file:before { - content: "\e022"; } - -.glyphicon-time:before { - content: "\e023"; } - -.glyphicon-road:before { - content: "\e024"; } - -.glyphicon-download-alt:before { - content: "\e025"; } - -.glyphicon-download:before { - content: "\e026"; } - -.glyphicon-upload:before { - content: "\e027"; } - -.glyphicon-inbox:before { - content: "\e028"; } - -.glyphicon-play-circle:before { - content: "\e029"; } - -.glyphicon-repeat:before { - content: "\e030"; } - -.glyphicon-refresh:before { - content: "\e031"; } - -.glyphicon-list-alt:before { - content: "\e032"; } - -.glyphicon-lock:before { - content: "\e033"; } - -.glyphicon-flag:before { - content: "\e034"; } - -.glyphicon-headphones:before { - content: "\e035"; } - -.glyphicon-volume-off:before { - content: "\e036"; } - -.glyphicon-volume-down:before { - content: "\e037"; } - -.glyphicon-volume-up:before { - content: "\e038"; } - -.glyphicon-qrcode:before { - content: "\e039"; } - -.glyphicon-barcode:before { - content: "\e040"; } - -.glyphicon-tag:before { - content: "\e041"; } - -.glyphicon-tags:before { - content: "\e042"; } - -.glyphicon-book:before { - content: "\e043"; } - -.glyphicon-bookmark:before { - content: "\e044"; } - -.glyphicon-print:before { - content: "\e045"; } - -.glyphicon-camera:before { - content: "\e046"; } - -.glyphicon-font:before { - content: "\e047"; } - -.glyphicon-bold:before { - content: "\e048"; } - -.glyphicon-italic:before { - content: "\e049"; } - -.glyphicon-text-height:before { - content: "\e050"; } - -.glyphicon-text-width:before { - content: "\e051"; } - -.glyphicon-align-left:before { - content: "\e052"; } - -.glyphicon-align-center:before { - content: "\e053"; } - -.glyphicon-align-right:before { - content: "\e054"; } - -.glyphicon-align-justify:before { - content: "\e055"; } - -.glyphicon-list:before { - content: "\e056"; } - -.glyphicon-indent-left:before { - content: "\e057"; } - -.glyphicon-indent-right:before { - content: "\e058"; } - -.glyphicon-facetime-video:before { - content: "\e059"; } - -.glyphicon-picture:before { - content: "\e060"; } - -.glyphicon-map-marker:before { - content: "\e062"; } - -.glyphicon-adjust:before { - content: "\e063"; } - -.glyphicon-tint:before { - content: "\e064"; } - -.glyphicon-edit:before { - content: "\e065"; } - -.glyphicon-share:before { - content: "\e066"; } - -.glyphicon-check:before { - content: "\e067"; } - -.glyphicon-move:before { - content: "\e068"; } - -.glyphicon-step-backward:before { - content: "\e069"; } - -.glyphicon-fast-backward:before { - content: "\e070"; } - -.glyphicon-backward:before { - content: "\e071"; } - -.glyphicon-play:before { - content: "\e072"; } - -.glyphicon-pause:before { - content: "\e073"; } - -.glyphicon-stop:before { - content: "\e074"; } - -.glyphicon-forward:before { - content: "\e075"; } - -.glyphicon-fast-forward:before { - content: "\e076"; } - -.glyphicon-step-forward:before { - content: "\e077"; } - -.glyphicon-eject:before { - content: "\e078"; } - -.glyphicon-chevron-left:before { - content: "\e079"; } - -.glyphicon-chevron-right:before { - content: "\e080"; } - -.glyphicon-plus-sign:before { - content: "\e081"; } - -.glyphicon-minus-sign:before { - content: "\e082"; } - -.glyphicon-remove-sign:before { - content: "\e083"; } - -.glyphicon-ok-sign:before { - content: "\e084"; } - -.glyphicon-question-sign:before { - content: "\e085"; } - -.glyphicon-info-sign:before { - content: "\e086"; } - -.glyphicon-screenshot:before { - content: "\e087"; } - -.glyphicon-remove-circle:before { - content: "\e088"; } - -.glyphicon-ok-circle:before { - content: "\e089"; } - -.glyphicon-ban-circle:before { - content: "\e090"; } - -.glyphicon-arrow-left:before { - content: "\e091"; } - -.glyphicon-arrow-right:before { - content: "\e092"; } - -.glyphicon-arrow-up:before { - content: "\e093"; } - -.glyphicon-arrow-down:before { - content: "\e094"; } - -.glyphicon-share-alt:before { - content: "\e095"; } - -.glyphicon-resize-full:before { - content: "\e096"; } - -.glyphicon-resize-small:before { - content: "\e097"; } - -.glyphicon-exclamation-sign:before { - content: "\e101"; } - -.glyphicon-gift:before { - content: "\e102"; } - -.glyphicon-leaf:before { - content: "\e103"; } - -.glyphicon-fire:before { - content: "\e104"; } - -.glyphicon-eye-open:before { - content: "\e105"; } - -.glyphicon-eye-close:before { - content: "\e106"; } - -.glyphicon-warning-sign:before { - content: "\e107"; } - -.glyphicon-plane:before { - content: "\e108"; } - -.glyphicon-calendar:before { - content: "\e109"; } - -.glyphicon-random:before { - content: "\e110"; } - -.glyphicon-comment:before { - content: "\e111"; } - -.glyphicon-magnet:before { - content: "\e112"; } - -.glyphicon-chevron-up:before { - content: "\e113"; } - -.glyphicon-chevron-down:before { - content: "\e114"; } - -.glyphicon-retweet:before { - content: "\e115"; } - -.glyphicon-shopping-cart:before { - content: "\e116"; } - -.glyphicon-folder-close:before { - content: "\e117"; } - -.glyphicon-folder-open:before { - content: "\e118"; } - -.glyphicon-resize-vertical:before { - content: "\e119"; } - -.glyphicon-resize-horizontal:before { - content: "\e120"; } - -.glyphicon-hdd:before { - content: "\e121"; } - -.glyphicon-bullhorn:before { - content: "\e122"; } - -.glyphicon-bell:before { - content: "\e123"; } - -.glyphicon-certificate:before { - content: "\e124"; } - -.glyphicon-thumbs-up:before { - content: "\e125"; } - -.glyphicon-thumbs-down:before { - content: "\e126"; } - -.glyphicon-hand-right:before { - content: "\e127"; } - -.glyphicon-hand-left:before { - content: "\e128"; } - -.glyphicon-hand-up:before { - content: "\e129"; } - -.glyphicon-hand-down:before { - content: "\e130"; } - -.glyphicon-circle-arrow-right:before { - content: "\e131"; } - -.glyphicon-circle-arrow-left:before { - content: "\e132"; } - -.glyphicon-circle-arrow-up:before { - content: "\e133"; } - -.glyphicon-circle-arrow-down:before { - content: "\e134"; } - -.glyphicon-globe:before { - content: "\e135"; } - -.glyphicon-wrench:before { - content: "\e136"; } - -.glyphicon-tasks:before { - content: "\e137"; } - -.glyphicon-filter:before { - content: "\e138"; } - -.glyphicon-briefcase:before { - content: "\e139"; } - -.glyphicon-fullscreen:before { - content: "\e140"; } - -.glyphicon-dashboard:before { - content: "\e141"; } - -.glyphicon-paperclip:before { - content: "\e142"; } - -.glyphicon-heart-empty:before { - content: "\e143"; } - -.glyphicon-link:before { - content: "\e144"; } - -.glyphicon-phone:before { - content: "\e145"; } - -.glyphicon-pushpin:before { - content: "\e146"; } - -.glyphicon-usd:before { - content: "\e148"; } - -.glyphicon-gbp:before { - content: "\e149"; } - -.glyphicon-sort:before { - content: "\e150"; } - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; } - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; } - -.glyphicon-sort-by-order:before { - content: "\e153"; } - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; } - -.glyphicon-sort-by-attributes:before { - content: "\e155"; } - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; } - -.glyphicon-unchecked:before { - content: "\e157"; } - -.glyphicon-expand:before { - content: "\e158"; } - -.glyphicon-collapse-down:before { - content: "\e159"; } - -.glyphicon-collapse-up:before { - content: "\e160"; } - -.glyphicon-log-in:before { - content: "\e161"; } - -.glyphicon-flash:before { - content: "\e162"; } - -.glyphicon-log-out:before { - content: "\e163"; } - -.glyphicon-new-window:before { - content: "\e164"; } - -.glyphicon-record:before { - content: "\e165"; } - -.glyphicon-save:before { - content: "\e166"; } - -.glyphicon-open:before { - content: "\e167"; } - -.glyphicon-saved:before { - content: "\e168"; } - -.glyphicon-import:before { - content: "\e169"; } - -.glyphicon-export:before { - content: "\e170"; } - -.glyphicon-send:before { - content: "\e171"; } - -.glyphicon-floppy-disk:before { - content: "\e172"; } - -.glyphicon-floppy-saved:before { - content: "\e173"; } - -.glyphicon-floppy-remove:before { - content: "\e174"; } - -.glyphicon-floppy-save:before { - content: "\e175"; } - -.glyphicon-floppy-open:before { - content: "\e176"; } - -.glyphicon-credit-card:before { - content: "\e177"; } - -.glyphicon-transfer:before { - content: "\e178"; } - -.glyphicon-cutlery:before { - content: "\e179"; } - -.glyphicon-header:before { - content: "\e180"; } - -.glyphicon-compressed:before { - content: "\e181"; } - -.glyphicon-earphone:before { - content: "\e182"; } - -.glyphicon-phone-alt:before { - content: "\e183"; } - -.glyphicon-tower:before { - content: "\e184"; } - -.glyphicon-stats:before { - content: "\e185"; } - -.glyphicon-sd-video:before { - content: "\e186"; } - -.glyphicon-hd-video:before { - content: "\e187"; } - -.glyphicon-subtitles:before { - content: "\e188"; } - -.glyphicon-sound-stereo:before { - content: "\e189"; } - -.glyphicon-sound-dolby:before { - content: "\e190"; } - -.glyphicon-sound-5-1:before { - content: "\e191"; } - -.glyphicon-sound-6-1:before { - content: "\e192"; } - -.glyphicon-sound-7-1:before { - content: "\e193"; } - -.glyphicon-copyright-mark:before { - content: "\e194"; } - -.glyphicon-registration-mark:before { - content: "\e195"; } - -.glyphicon-cloud-download:before { - content: "\e197"; } - -.glyphicon-cloud-upload:before { - content: "\e198"; } - -.glyphicon-tree-conifer:before { - content: "\e199"; } - -.glyphicon-tree-deciduous:before { - content: "\e200"; } - -.glyphicon-cd:before { - content: "\e201"; } - -.glyphicon-save-file:before { - content: "\e202"; } - -.glyphicon-open-file:before { - content: "\e203"; } - -.glyphicon-level-up:before { - content: "\e204"; } - -.glyphicon-copy:before { - content: "\e205"; } - -.glyphicon-paste:before { - content: "\e206"; } - -.glyphicon-alert:before { - content: "\e209"; } - -.glyphicon-equalizer:before { - content: "\e210"; } - -.glyphicon-king:before { - content: "\e211"; } - -.glyphicon-queen:before { - content: "\e212"; } - -.glyphicon-pawn:before { - content: "\e213"; } - -.glyphicon-bishop:before { - content: "\e214"; } - -.glyphicon-knight:before { - content: "\e215"; } - -.glyphicon-baby-formula:before { - content: "\e216"; } - -.glyphicon-tent:before { - content: "\26fa"; } - -.glyphicon-blackboard:before { - content: "\e218"; } - -.glyphicon-bed:before { - content: "\e219"; } - -.glyphicon-apple:before { - content: "\f8ff"; } - -.glyphicon-erase:before { - content: "\e221"; } - -.glyphicon-hourglass:before { - content: "\231b"; } - -.glyphicon-lamp:before { - content: "\e223"; } - -.glyphicon-duplicate:before { - content: "\e224"; } - -.glyphicon-piggy-bank:before { - content: "\e225"; } - -.glyphicon-scissors:before { - content: "\e226"; } - -.glyphicon-bitcoin:before { - content: "\e227"; } - -.glyphicon-btc:before { - content: "\e227"; } - -.glyphicon-xbt:before { - content: "\e227"; } - -.glyphicon-yen:before { - content: "\00a5"; } - -.glyphicon-jpy:before { - content: "\00a5"; } - -.glyphicon-ruble:before { - content: "\20bd"; } - -.glyphicon-rub:before { - content: "\20bd"; } - -.glyphicon-scale:before { - content: "\e230"; } - -.glyphicon-ice-lolly:before { - content: "\e231"; } - -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; } - -.glyphicon-education:before { - content: "\e233"; } - -.glyphicon-option-horizontal:before { - content: "\e234"; } - -.glyphicon-option-vertical:before { - content: "\e235"; } - -.glyphicon-menu-hamburger:before { - content: "\e236"; } - -.glyphicon-modal-window:before { - content: "\e237"; } - -.glyphicon-oil:before { - content: "\e238"; } - -.glyphicon-grain:before { - content: "\e239"; } - -.glyphicon-sunglasses:before { - content: "\e240"; } - -.glyphicon-text-size:before { - content: "\e241"; } - -.glyphicon-text-color:before { - content: "\e242"; } - -.glyphicon-text-background:before { - content: "\e243"; } - -.glyphicon-object-align-top:before { - content: "\e244"; } - -.glyphicon-object-align-bottom:before { - content: "\e245"; } - -.glyphicon-object-align-horizontal:before { - content: "\e246"; } - -.glyphicon-object-align-left:before { - content: "\e247"; } - -.glyphicon-object-align-vertical:before { - content: "\e248"; } - -.glyphicon-object-align-right:before { - content: "\e249"; } - -.glyphicon-triangle-right:before { - content: "\e250"; } - -.glyphicon-triangle-left:before { - content: "\e251"; } - -.glyphicon-triangle-bottom:before { - content: "\e252"; } - -.glyphicon-triangle-top:before { - content: "\e253"; } - -.glyphicon-console:before { - content: "\e254"; } - -.glyphicon-superscript:before { - content: "\e255"; } - -.glyphicon-subscript:before { - content: "\e256"; } - -.glyphicon-menu-left:before { - content: "\e257"; } - -.glyphicon-menu-right:before { - content: "\e258"; } - -.glyphicon-menu-down:before { - content: "\e259"; } - -.glyphicon-menu-up:before { - content: "\e260"; } - -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; } - -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; } - -html { - font-size: 10px; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } - -body { - font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 15px; - line-height: 1.846; - color: #444; - background-color: #fff; } - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; } - -a { - color: #5a9ddb; - text-decoration: none; } - a:hover, a:focus { - color: #2a77bf; - text-decoration: underline; } - a:focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; } - -figure { - margin: 0; } - -img { - vertical-align: middle; } - -.img-responsive { - display: block; - max-width: 100%; - height: auto; } - -.img-rounded { - border-radius: 3px; } - -.img-thumbnail { - padding: 4px; - line-height: 1.846; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 3px; - -webkit-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - display: inline-block; - max-width: 100%; - height: auto; } - -.img-circle { - border-radius: 50%; } - -hr { - margin-top: 27px; - margin-bottom: 27px; - border: 0; - border-top: 1px solid #eeeeee; } - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; } - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; } - -[role="button"] { - cursor: pointer; } - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - font-family: inherit; - font-weight: 300; - line-height: 1.1; - color: #444; } - h1 small, - h1 .small, h2 small, - h2 .small, h3 small, - h3 .small, h4 small, - h4 .small, h5 small, - h5 .small, h6 small, - h6 .small, - .h1 small, - .h1 .small, .h2 small, - .h2 .small, .h3 small, - .h3 .small, .h4 small, - .h4 .small, .h5 small, - .h5 .small, .h6 small, - .h6 .small { - font-weight: normal; - line-height: 1; - color: #bbb; } - -h1, .h1, -h2, .h2, -h3, .h3 { - margin-top: 27px; - margin-bottom: 13.5px; } - h1 small, - h1 .small, .h1 small, - .h1 .small, - h2 small, - h2 .small, .h2 small, - .h2 .small, - h3 small, - h3 .small, .h3 small, - .h3 .small { - font-size: 65%; } - -h4, .h4, -h5, .h5, -h6, .h6 { - margin-top: 13.5px; - margin-bottom: 13.5px; } - h4 small, - h4 .small, .h4 small, - .h4 .small, - h5 small, - h5 .small, .h5 small, - .h5 .small, - h6 small, - h6 .small, .h6 small, - .h6 .small { - font-size: 75%; } - -h1, .h1 { - font-size: 48px; } - -h2, .h2 { - font-size: 40px; } - -h3, .h3 { - font-size: 32px; } - -h4, .h4 { - font-size: 24px; } - -h5, .h5 { - font-size: 20px; } - -h6, .h6 { - font-size: 14px; } - -p { - margin: 0 0 13.5px; } - -.lead { - margin-bottom: 27px; - font-size: 17px; - font-weight: 300; - line-height: 1.4; } - @media (min-width: 768px) { - .lead { - font-size: 22.5px; } } - -small, -.small { - font-size: 86%; } - -mark, -.mark { - background-color: #ffe0b2; - padding: .2em; } - -.text-left { - text-align: left; } - -.text-right { - text-align: right; } - -.text-center { - text-align: center; } - -.text-justify { - text-align: justify; } - -.text-nowrap { - white-space: nowrap; } - -.text-lowercase { - text-transform: lowercase; } - -.text-uppercase, .initialism { - text-transform: uppercase; } - -.text-capitalize { - text-transform: capitalize; } - -.text-muted { - color: #bbb; } - -.text-primary { - color: #5a9ddb; } - -a.text-primary:hover, -a.text-primary:focus { - color: #3084d2; } - -.text-success { - color: #4CAF50; } - -a.text-success:hover, -a.text-success:focus { - color: #3d8b40; } - -.text-info { - color: #9C27B0; } - -a.text-info:hover, -a.text-info:focus { - color: #771e86; } - -.text-warning { - color: #ff9800; } - -a.text-warning:hover, -a.text-warning:focus { - color: #cc7a00; } - -.text-danger { - color: #e51c23; } - -a.text-danger:hover, -a.text-danger:focus { - color: #b9151b; } - -.bg-primary { - color: #fff; } - -.bg-primary { - background-color: #5a9ddb; } - -a.bg-primary:hover, -a.bg-primary:focus { - background-color: #3084d2; } - -.bg-success { - background-color: #dff0d8; } - -a.bg-success:hover, -a.bg-success:focus { - background-color: #c1e2b3; } - -.bg-info { - background-color: #e1bee7; } - -a.bg-info:hover, -a.bg-info:focus { - background-color: #d099d9; } - -.bg-warning { - background-color: #ffe0b2; } - -a.bg-warning:hover, -a.bg-warning:focus { - background-color: #ffcb7f; } - -.bg-danger { - background-color: #f9bdbb; } - -a.bg-danger:hover, -a.bg-danger:focus { - background-color: #f5908c; } - -.page-header { - padding-bottom: 12.5px; - margin: 54px 0 27px; - border-bottom: 1px solid #eeeeee; } - -ul, -ol { - margin-top: 0; - margin-bottom: 13.5px; } - ul ul, - ul ol, - ol ul, - ol ol { - margin-bottom: 0; } - -.list-unstyled { - padding-left: 0; - list-style: none; } - -.list-inline { - padding-left: 0; - list-style: none; - margin-left: -5px; } - .list-inline > li { - display: inline-block; - padding-left: 5px; - padding-right: 5px; } - -dl { - margin-top: 0; - margin-bottom: 27px; } - -dt, -dd { - line-height: 1.846; } - -dt { - font-weight: bold; } - -dd { - margin-left: 0; } - -.dl-horizontal dd:before, .dl-horizontal dd:after { - content: " "; - display: table; } -.dl-horizontal dd:after { - clear: both; } -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - clear: left; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .dl-horizontal dd { - margin-left: 180px; } } - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #bbb; } - -.initialism { - font-size: 90%; } - -blockquote { - padding: 13.5px 27px; - margin: 0 0 27px; - font-size: 18.75px; - border-left: 5px solid #eeeeee; } - blockquote p:last-child, - blockquote ul:last-child, - blockquote ol:last-child { - margin-bottom: 0; } - blockquote footer, - blockquote small, - blockquote .small { - display: block; - font-size: 80%; - line-height: 1.846; - color: #bbb; } - blockquote footer:before, - blockquote small:before, - blockquote .small:before { - content: '\2014 \00A0'; } - -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; - text-align: right; } - .blockquote-reverse footer:before, - .blockquote-reverse small:before, - .blockquote-reverse .small:before, - blockquote.pull-right footer:before, - blockquote.pull-right small:before, - blockquote.pull-right .small:before { - content: ''; } - .blockquote-reverse footer:after, - .blockquote-reverse small:after, - .blockquote-reverse .small:after, - blockquote.pull-right footer:after, - blockquote.pull-right small:after, - blockquote.pull-right .small:after { - content: '\00A0 \2014'; } - -address { - margin-bottom: 27px; - font-style: normal; - line-height: 1.846; } - -code, -kbd, -pre, -samp { - font-family: "Source Code Pro", Menlo, Monaco, Consolas, "Courier New", monospace; } - -code { - padding: 2px 4px; - font-size: 90%; - color: #444; - background-color: #f2f2f2; - border-radius: 3px; } - -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } - kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - box-shadow: none; } - -pre { - display: block; - padding: 13px; - margin: 0 0 13.5px; - font-size: 14px; - line-height: 1.846; - word-break: break-all; - word-wrap: break-word; - color: #212121; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 3px; } - pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; } - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; } - -.container { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; } - .container:before, .container:after { - content: " "; - display: table; } - .container:after { - clear: both; } - @media (min-width: 768px) { - .container { - width: 750px; } } - @media (min-width: 992px) { - .container { - width: 970px; } } - @media (min-width: 1200px) { - .container { - width: 1170px; } } - -.container-fluid { - margin-right: auto; - margin-left: auto; - padding-left: 15px; - padding-right: 15px; } - .container-fluid:before, .container-fluid:after { - content: " "; - display: table; } - .container-fluid:after { - clear: both; } - -.row { - margin-left: -15px; - margin-right: -15px; } - .row:before, .row:after { - content: " "; - display: table; } - .row:after { - clear: both; } - -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-left: 15px; - padding-right: 15px; } - -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; } - -.col-xs-1 { - width: 8.3333333333%; } - -.col-xs-2 { - width: 16.6666666667%; } - -.col-xs-3 { - width: 25%; } - -.col-xs-4 { - width: 33.3333333333%; } - -.col-xs-5 { - width: 41.6666666667%; } - -.col-xs-6 { - width: 50%; } - -.col-xs-7 { - width: 58.3333333333%; } - -.col-xs-8 { - width: 66.6666666667%; } - -.col-xs-9 { - width: 75%; } - -.col-xs-10 { - width: 83.3333333333%; } - -.col-xs-11 { - width: 91.6666666667%; } - -.col-xs-12 { - width: 100%; } - -.col-xs-pull-0 { - right: auto; } - -.col-xs-pull-1 { - right: 8.3333333333%; } - -.col-xs-pull-2 { - right: 16.6666666667%; } - -.col-xs-pull-3 { - right: 25%; } - -.col-xs-pull-4 { - right: 33.3333333333%; } - -.col-xs-pull-5 { - right: 41.6666666667%; } - -.col-xs-pull-6 { - right: 50%; } - -.col-xs-pull-7 { - right: 58.3333333333%; } - -.col-xs-pull-8 { - right: 66.6666666667%; } - -.col-xs-pull-9 { - right: 75%; } - -.col-xs-pull-10 { - right: 83.3333333333%; } - -.col-xs-pull-11 { - right: 91.6666666667%; } - -.col-xs-pull-12 { - right: 100%; } - -.col-xs-push-0 { - left: auto; } - -.col-xs-push-1 { - left: 8.3333333333%; } - -.col-xs-push-2 { - left: 16.6666666667%; } - -.col-xs-push-3 { - left: 25%; } - -.col-xs-push-4 { - left: 33.3333333333%; } - -.col-xs-push-5 { - left: 41.6666666667%; } - -.col-xs-push-6 { - left: 50%; } - -.col-xs-push-7 { - left: 58.3333333333%; } - -.col-xs-push-8 { - left: 66.6666666667%; } - -.col-xs-push-9 { - left: 75%; } - -.col-xs-push-10 { - left: 83.3333333333%; } - -.col-xs-push-11 { - left: 91.6666666667%; } - -.col-xs-push-12 { - left: 100%; } - -.col-xs-offset-0 { - margin-left: 0%; } - -.col-xs-offset-1 { - margin-left: 8.3333333333%; } - -.col-xs-offset-2 { - margin-left: 16.6666666667%; } - -.col-xs-offset-3 { - margin-left: 25%; } - -.col-xs-offset-4 { - margin-left: 33.3333333333%; } - -.col-xs-offset-5 { - margin-left: 41.6666666667%; } - -.col-xs-offset-6 { - margin-left: 50%; } - -.col-xs-offset-7 { - margin-left: 58.3333333333%; } - -.col-xs-offset-8 { - margin-left: 66.6666666667%; } - -.col-xs-offset-9 { - margin-left: 75%; } - -.col-xs-offset-10 { - margin-left: 83.3333333333%; } - -.col-xs-offset-11 { - margin-left: 91.6666666667%; } - -.col-xs-offset-12 { - margin-left: 100%; } - -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; } - - .col-sm-1 { - width: 8.3333333333%; } - - .col-sm-2 { - width: 16.6666666667%; } - - .col-sm-3 { - width: 25%; } - - .col-sm-4 { - width: 33.3333333333%; } - - .col-sm-5 { - width: 41.6666666667%; } - - .col-sm-6 { - width: 50%; } - - .col-sm-7 { - width: 58.3333333333%; } - - .col-sm-8 { - width: 66.6666666667%; } - - .col-sm-9 { - width: 75%; } - - .col-sm-10 { - width: 83.3333333333%; } - - .col-sm-11 { - width: 91.6666666667%; } - - .col-sm-12 { - width: 100%; } - - .col-sm-pull-0 { - right: auto; } - - .col-sm-pull-1 { - right: 8.3333333333%; } - - .col-sm-pull-2 { - right: 16.6666666667%; } - - .col-sm-pull-3 { - right: 25%; } - - .col-sm-pull-4 { - right: 33.3333333333%; } - - .col-sm-pull-5 { - right: 41.6666666667%; } - - .col-sm-pull-6 { - right: 50%; } - - .col-sm-pull-7 { - right: 58.3333333333%; } - - .col-sm-pull-8 { - right: 66.6666666667%; } - - .col-sm-pull-9 { - right: 75%; } - - .col-sm-pull-10 { - right: 83.3333333333%; } - - .col-sm-pull-11 { - right: 91.6666666667%; } - - .col-sm-pull-12 { - right: 100%; } - - .col-sm-push-0 { - left: auto; } - - .col-sm-push-1 { - left: 8.3333333333%; } - - .col-sm-push-2 { - left: 16.6666666667%; } - - .col-sm-push-3 { - left: 25%; } - - .col-sm-push-4 { - left: 33.3333333333%; } - - .col-sm-push-5 { - left: 41.6666666667%; } - - .col-sm-push-6 { - left: 50%; } - - .col-sm-push-7 { - left: 58.3333333333%; } - - .col-sm-push-8 { - left: 66.6666666667%; } - - .col-sm-push-9 { - left: 75%; } - - .col-sm-push-10 { - left: 83.3333333333%; } - - .col-sm-push-11 { - left: 91.6666666667%; } - - .col-sm-push-12 { - left: 100%; } - - .col-sm-offset-0 { - margin-left: 0%; } - - .col-sm-offset-1 { - margin-left: 8.3333333333%; } - - .col-sm-offset-2 { - margin-left: 16.6666666667%; } - - .col-sm-offset-3 { - margin-left: 25%; } - - .col-sm-offset-4 { - margin-left: 33.3333333333%; } - - .col-sm-offset-5 { - margin-left: 41.6666666667%; } - - .col-sm-offset-6 { - margin-left: 50%; } - - .col-sm-offset-7 { - margin-left: 58.3333333333%; } - - .col-sm-offset-8 { - margin-left: 66.6666666667%; } - - .col-sm-offset-9 { - margin-left: 75%; } - - .col-sm-offset-10 { - margin-left: 83.3333333333%; } - - .col-sm-offset-11 { - margin-left: 91.6666666667%; } - - .col-sm-offset-12 { - margin-left: 100%; } } -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; } - - .col-md-1 { - width: 8.3333333333%; } - - .col-md-2 { - width: 16.6666666667%; } - - .col-md-3 { - width: 25%; } - - .col-md-4 { - width: 33.3333333333%; } - - .col-md-5 { - width: 41.6666666667%; } - - .col-md-6 { - width: 50%; } - - .col-md-7 { - width: 58.3333333333%; } - - .col-md-8 { - width: 66.6666666667%; } - - .col-md-9 { - width: 75%; } - - .col-md-10 { - width: 83.3333333333%; } - - .col-md-11 { - width: 91.6666666667%; } - - .col-md-12 { - width: 100%; } - - .col-md-pull-0 { - right: auto; } - - .col-md-pull-1 { - right: 8.3333333333%; } - - .col-md-pull-2 { - right: 16.6666666667%; } - - .col-md-pull-3 { - right: 25%; } - - .col-md-pull-4 { - right: 33.3333333333%; } - - .col-md-pull-5 { - right: 41.6666666667%; } - - .col-md-pull-6 { - right: 50%; } - - .col-md-pull-7 { - right: 58.3333333333%; } - - .col-md-pull-8 { - right: 66.6666666667%; } - - .col-md-pull-9 { - right: 75%; } - - .col-md-pull-10 { - right: 83.3333333333%; } - - .col-md-pull-11 { - right: 91.6666666667%; } - - .col-md-pull-12 { - right: 100%; } - - .col-md-push-0 { - left: auto; } - - .col-md-push-1 { - left: 8.3333333333%; } - - .col-md-push-2 { - left: 16.6666666667%; } - - .col-md-push-3 { - left: 25%; } - - .col-md-push-4 { - left: 33.3333333333%; } - - .col-md-push-5 { - left: 41.6666666667%; } - - .col-md-push-6 { - left: 50%; } - - .col-md-push-7 { - left: 58.3333333333%; } - - .col-md-push-8 { - left: 66.6666666667%; } - - .col-md-push-9 { - left: 75%; } - - .col-md-push-10 { - left: 83.3333333333%; } - - .col-md-push-11 { - left: 91.6666666667%; } - - .col-md-push-12 { - left: 100%; } - - .col-md-offset-0 { - margin-left: 0%; } - - .col-md-offset-1 { - margin-left: 8.3333333333%; } - - .col-md-offset-2 { - margin-left: 16.6666666667%; } - - .col-md-offset-3 { - margin-left: 25%; } - - .col-md-offset-4 { - margin-left: 33.3333333333%; } - - .col-md-offset-5 { - margin-left: 41.6666666667%; } - - .col-md-offset-6 { - margin-left: 50%; } - - .col-md-offset-7 { - margin-left: 58.3333333333%; } - - .col-md-offset-8 { - margin-left: 66.6666666667%; } - - .col-md-offset-9 { - margin-left: 75%; } - - .col-md-offset-10 { - margin-left: 83.3333333333%; } - - .col-md-offset-11 { - margin-left: 91.6666666667%; } - - .col-md-offset-12 { - margin-left: 100%; } } -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; } - - .col-lg-1 { - width: 8.3333333333%; } - - .col-lg-2 { - width: 16.6666666667%; } - - .col-lg-3 { - width: 25%; } - - .col-lg-4 { - width: 33.3333333333%; } - - .col-lg-5 { - width: 41.6666666667%; } - - .col-lg-6 { - width: 50%; } - - .col-lg-7 { - width: 58.3333333333%; } - - .col-lg-8 { - width: 66.6666666667%; } - - .col-lg-9 { - width: 75%; } - - .col-lg-10 { - width: 83.3333333333%; } - - .col-lg-11 { - width: 91.6666666667%; } - - .col-lg-12 { - width: 100%; } - - .col-lg-pull-0 { - right: auto; } - - .col-lg-pull-1 { - right: 8.3333333333%; } - - .col-lg-pull-2 { - right: 16.6666666667%; } - - .col-lg-pull-3 { - right: 25%; } - - .col-lg-pull-4 { - right: 33.3333333333%; } - - .col-lg-pull-5 { - right: 41.6666666667%; } - - .col-lg-pull-6 { - right: 50%; } - - .col-lg-pull-7 { - right: 58.3333333333%; } - - .col-lg-pull-8 { - right: 66.6666666667%; } - - .col-lg-pull-9 { - right: 75%; } - - .col-lg-pull-10 { - right: 83.3333333333%; } - - .col-lg-pull-11 { - right: 91.6666666667%; } - - .col-lg-pull-12 { - right: 100%; } - - .col-lg-push-0 { - left: auto; } - - .col-lg-push-1 { - left: 8.3333333333%; } - - .col-lg-push-2 { - left: 16.6666666667%; } - - .col-lg-push-3 { - left: 25%; } - - .col-lg-push-4 { - left: 33.3333333333%; } - - .col-lg-push-5 { - left: 41.6666666667%; } - - .col-lg-push-6 { - left: 50%; } - - .col-lg-push-7 { - left: 58.3333333333%; } - - .col-lg-push-8 { - left: 66.6666666667%; } - - .col-lg-push-9 { - left: 75%; } - - .col-lg-push-10 { - left: 83.3333333333%; } - - .col-lg-push-11 { - left: 91.6666666667%; } - - .col-lg-push-12 { - left: 100%; } - - .col-lg-offset-0 { - margin-left: 0%; } - - .col-lg-offset-1 { - margin-left: 8.3333333333%; } - - .col-lg-offset-2 { - margin-left: 16.6666666667%; } - - .col-lg-offset-3 { - margin-left: 25%; } - - .col-lg-offset-4 { - margin-left: 33.3333333333%; } - - .col-lg-offset-5 { - margin-left: 41.6666666667%; } - - .col-lg-offset-6 { - margin-left: 50%; } - - .col-lg-offset-7 { - margin-left: 58.3333333333%; } - - .col-lg-offset-8 { - margin-left: 66.6666666667%; } - - .col-lg-offset-9 { - margin-left: 75%; } - - .col-lg-offset-10 { - margin-left: 83.3333333333%; } - - .col-lg-offset-11 { - margin-left: 91.6666666667%; } - - .col-lg-offset-12 { - margin-left: 100%; } } -table { - background-color: transparent; } - -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #bbb; - text-align: left; } - -th { - text-align: left; } - -.table { - width: 100%; - max-width: 100%; - margin-bottom: 27px; } - .table > thead > tr > th, - .table > thead > tr > td, - .table > tbody > tr > th, - .table > tbody > tr > td, - .table > tfoot > tr > th, - .table > tfoot > tr > td { - padding: 8px; - line-height: 1.846; - vertical-align: top; - border-top: 1px solid #ddd; } - .table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; } - .table > caption + thead > tr:first-child > th, - .table > caption + thead > tr:first-child > td, - .table > colgroup + thead > tr:first-child > th, - .table > colgroup + thead > tr:first-child > td, - .table > thead:first-child > tr:first-child > th, - .table > thead:first-child > tr:first-child > td { - border-top: 0; } - .table > tbody + tbody { - border-top: 2px solid #ddd; } - .table .table { - background-color: #fff; } - -.table-condensed > thead > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > th, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > th, -.table-condensed > tfoot > tr > td { - padding: 5px; } - -.table-bordered { - border: 1px solid #ddd; } - .table-bordered > thead > tr > th, - .table-bordered > thead > tr > td, - .table-bordered > tbody > tr > th, - .table-bordered > tbody > tr > td, - .table-bordered > tfoot > tr > th, - .table-bordered > tfoot > tr > td { - border: 1px solid #ddd; } - .table-bordered > thead > tr > th, - .table-bordered > thead > tr > td { - border-bottom-width: 2px; } - -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; } - -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; } - -table col[class*="col-"] { - position: static; - float: none; - display: table-column; } - -table td[class*="col-"], -table th[class*="col-"] { - position: static; - float: none; - display: table-cell; } - -.table > thead > tr > td.active, -.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, -.table > tbody > tr > td.active, -.table > tbody > tr > th.active, -.table > tbody > tr.active > td, -.table > tbody > tr.active > th, -.table > tfoot > tr > td.active, -.table > tfoot > tr > th.active, -.table > tfoot > tr.active > td, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; } - -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; } - -.table > thead > tr > td.success, -.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, -.table > tbody > tr > td.success, -.table > tbody > tr > th.success, -.table > tbody > tr.success > td, -.table > tbody > tr.success > th, -.table > tfoot > tr > td.success, -.table > tfoot > tr > th.success, -.table > tfoot > tr.success > td, -.table > tfoot > tr.success > th { - background-color: #dff0d8; } - -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; } - -.table > thead > tr > td.info, -.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, -.table > tbody > tr > td.info, -.table > tbody > tr > th.info, -.table > tbody > tr.info > td, -.table > tbody > tr.info > th, -.table > tfoot > tr > td.info, -.table > tfoot > tr > th.info, -.table > tfoot > tr.info > td, -.table > tfoot > tr.info > th { - background-color: #e1bee7; } - -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { - background-color: #d8abe0; } - -.table > thead > tr > td.warning, -.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, -.table > tbody > tr > td.warning, -.table > tbody > tr > th.warning, -.table > tbody > tr.warning > td, -.table > tbody > tr.warning > th, -.table > tfoot > tr > td.warning, -.table > tfoot > tr > th.warning, -.table > tfoot > tr.warning > td, -.table > tfoot > tr.warning > th { - background-color: #ffe0b2; } - -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { - background-color: #ffd699; } - -.table > thead > tr > td.danger, -.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, -.table > tbody > tr > td.danger, -.table > tbody > tr > th.danger, -.table > tbody > tr.danger > td, -.table > tbody > tr.danger > th, -.table > tfoot > tr > td.danger, -.table > tfoot > tr > th.danger, -.table > tfoot > tr.danger > td, -.table > tfoot > tr.danger > th { - background-color: #f9bdbb; } - -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { - background-color: #f7a6a4; } - -.table-responsive { - overflow-x: auto; - min-height: 0.01%; } - @media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 20.25px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; } - .table-responsive > .table { - margin-bottom: 0; } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; } - .table-responsive > .table-bordered { - border: 0; } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; } } - -fieldset { - padding: 0; - margin: 0; - border: 0; - min-width: 0; } - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 27px; - font-size: 22.5px; - line-height: inherit; - color: #212121; - border: 0; - border-bottom: 1px solid #e5e5e5; } - -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; } - -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; } - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; } - -input[type="file"] { - display: block; } - -input[type="range"] { - display: block; - width: 100%; } - -select[multiple], -select[size] { - height: auto; } - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; } - -output { - display: block; - padding-top: 7px; - font-size: 15px; - line-height: 1.846; - color: #666; } - -.form-control { - display: block; - width: 100%; - height: 41px; - padding: 6px 16px; - font-size: 15px; - line-height: 1.846; - color: #666; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } - .form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } - .form-control::-moz-placeholder { - color: #bbb; - opacity: 1; } - .form-control:-ms-input-placeholder { - color: #bbb; } - .form-control::-webkit-input-placeholder { - color: #bbb; } - .form-control::-ms-expand { - border: 0; - background-color: transparent; } - .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { - background-color: transparent; - opacity: 1; } - .form-control[disabled], fieldset[disabled] .form-control { - cursor: not-allowed; } - -textarea.form-control { - height: auto; } - -input[type="search"] { - -webkit-appearance: none; } - -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 41px; } - input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control, - .input-group-sm > input[type="date"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="date"].btn, .input-group-sm input[type="date"], - input[type="time"].input-sm, - .input-group-sm > input[type="time"].form-control, - .input-group-sm > input[type="time"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="time"].btn, - .input-group-sm input[type="time"], - input[type="datetime-local"].input-sm, - .input-group-sm > input[type="datetime-local"].form-control, - .input-group-sm > input[type="datetime-local"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="datetime-local"].btn, - .input-group-sm input[type="datetime-local"], - input[type="month"].input-sm, - .input-group-sm > input[type="month"].form-control, - .input-group-sm > input[type="month"].input-group-addon, - .input-group-sm > .input-group-btn > input[type="month"].btn, - .input-group-sm input[type="month"] { - line-height: 31px; } - input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control, - .input-group-lg > input[type="date"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="date"].btn, .input-group-lg input[type="date"], input[type="time"].input-lg, .input-group-lg > input[type="time"].form-control, - .input-group-lg > input[type="time"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="time"].btn, .input-group-lg input[type="time"], input[type="datetime-local"].input-lg, .input-group-lg > input[type="datetime-local"].form-control, - .input-group-lg > input[type="datetime-local"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="datetime-local"].btn, .input-group-lg input[type="datetime-local"], input[type="month"].input-lg, .input-group-lg > input[type="month"].form-control, - .input-group-lg > input[type="month"].input-group-addon, - .input-group-lg > .input-group-btn > input[type="month"].btn, .input-group-lg input[type="month"] { - line-height: 48px; } } -.form-group { - margin-bottom: 15px; } - -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; } - .radio label, - .checkbox label { - min-height: 27px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; } - -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-left: -20px; - margin-top: 4px \9; } - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; } - -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - vertical-align: middle; - font-weight: normal; - cursor: pointer; } - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; } - -input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"], -input[type="checkbox"][disabled], -input[type="checkbox"].disabled, -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; } - -.radio-inline.disabled, fieldset[disabled] .radio-inline, -.checkbox-inline.disabled, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; } - -.radio.disabled label, fieldset[disabled] .radio label, -.checkbox.disabled label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; } - -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; - min-height: 42px; } - .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, - .input-group-lg > .form-control-static.input-group-addon, - .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, - .input-group-sm > .form-control-static.input-group-addon, - .input-group-sm > .input-group-btn > .form-control-static.btn { - padding-left: 0; - padding-right: 0; } - -.input-sm, .input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 31px; - padding: 5px 10px; - font-size: 13px; - line-height: 1.5; - border-radius: 3px; } - -select.input-sm, .input-group-sm > select.form-control, -.input-group-sm > select.input-group-addon, -.input-group-sm > .input-group-btn > select.btn { - height: 31px; - line-height: 31px; } - -textarea.input-sm, .input-group-sm > textarea.form-control, -.input-group-sm > textarea.input-group-addon, -.input-group-sm > .input-group-btn > textarea.btn, -select[multiple].input-sm, -.input-group-sm > select[multiple].form-control, -.input-group-sm > select[multiple].input-group-addon, -.input-group-sm > .input-group-btn > select[multiple].btn { - height: auto; } - -.form-group-sm .form-control { - height: 31px; - padding: 5px 10px; - font-size: 13px; - line-height: 1.5; - border-radius: 3px; } -.form-group-sm select.form-control { - height: 31px; - line-height: 31px; } -.form-group-sm textarea.form-control, -.form-group-sm select[multiple].form-control { - height: auto; } -.form-group-sm .form-control-static { - height: 31px; - min-height: 40px; - padding: 6px 10px; - font-size: 13px; - line-height: 1.5; } - -.input-lg, .input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 48px; - padding: 10px 16px; - font-size: 19px; - line-height: 1.3333333; - border-radius: 3px; } - -select.input-lg, .input-group-lg > select.form-control, -.input-group-lg > select.input-group-addon, -.input-group-lg > .input-group-btn > select.btn { - height: 48px; - line-height: 48px; } - -textarea.input-lg, .input-group-lg > textarea.form-control, -.input-group-lg > textarea.input-group-addon, -.input-group-lg > .input-group-btn > textarea.btn, -select[multiple].input-lg, -.input-group-lg > select[multiple].form-control, -.input-group-lg > select[multiple].input-group-addon, -.input-group-lg > .input-group-btn > select[multiple].btn { - height: auto; } - -.form-group-lg .form-control { - height: 48px; - padding: 10px 16px; - font-size: 19px; - line-height: 1.3333333; - border-radius: 3px; } -.form-group-lg select.form-control { - height: 48px; - line-height: 48px; } -.form-group-lg textarea.form-control, -.form-group-lg select[multiple].form-control { - height: auto; } -.form-group-lg .form-control-static { - height: 48px; - min-height: 46px; - padding: 11px 16px; - font-size: 19px; - line-height: 1.3333333; } - -.has-feedback { - position: relative; } - .has-feedback .form-control { - padding-right: 51.25px; } - -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 41px; - height: 41px; - line-height: 41px; - text-align: center; - pointer-events: none; } - -.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, -.input-group-lg > .input-group-addon + .form-control-feedback, -.input-group-lg > .input-group-btn > .btn + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: 48px; - height: 48px; - line-height: 48px; } - -.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, -.input-group-sm > .input-group-addon + .form-control-feedback, -.input-group-sm > .input-group-btn > .btn + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: 31px; - height: 31px; - line-height: 31px; } - -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { - color: #4CAF50; } -.has-success .form-control { - border-color: #4CAF50; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } - .has-success .form-control:focus { - border-color: #3d8b40; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #92cf94; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #92cf94; } -.has-success .input-group-addon { - color: #4CAF50; - border-color: #4CAF50; - background-color: #dff0d8; } -.has-success .form-control-feedback { - color: #4CAF50; } - -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { - color: #ff9800; } -.has-warning .form-control { - border-color: #ff9800; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } - .has-warning .form-control:focus { - border-color: #cc7a00; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffc166; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffc166; } -.has-warning .input-group-addon { - color: #ff9800; - border-color: #ff9800; - background-color: #ffe0b2; } -.has-warning .form-control-feedback { - color: #ff9800; } - -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { - color: #e51c23; } -.has-error .form-control { - border-color: #e51c23; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } - .has-error .form-control:focus { - border-color: #b9151b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ef787c; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ef787c; } -.has-error .input-group-addon { - color: #e51c23; - border-color: #e51c23; - background-color: #f9bdbb; } -.has-error .form-control-feedback { - color: #e51c23; } - -.has-feedback label ~ .form-control-feedback { - top: 32px; } -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; } - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #848484; } - -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; } - .form-inline .form-control-static { - display: inline-block; } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; } - .form-inline .input-group > .form-control { - width: 100%; } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; } - .form-inline .has-feedback .form-control-feedback { - top: 0; } } - -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - margin-top: 0; - margin-bottom: 0; - padding-top: 7px; } -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 34px; } -.form-horizontal .form-group { - margin-left: -15px; - margin-right: -15px; } - .form-horizontal .form-group:before, .form-horizontal .form-group:after { - content: " "; - display: table; } - .form-horizontal .form-group:after { - clear: both; } -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - margin-bottom: 0; - padding-top: 7px; } } -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; } -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 11px; - font-size: 19px; } } -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - font-size: 13px; } } - -.btn { - display: inline-block; - margin-bottom: 0; - font-weight: normal; - text-align: center; - vertical-align: middle; - touch-action: manipulation; - cursor: pointer; - background-image: none; - border: 1px solid transparent; - white-space: nowrap; - padding: 6px 16px; - font-size: 15px; - line-height: 1.846; - border-radius: 3px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; } - .btn:hover, .btn:focus, .btn.focus { - color: #444; - text-decoration: none; } - .btn:active, .btn.active { - outline: 0; - background-image: none; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } - .btn.disabled, .btn[disabled], fieldset[disabled] .btn { - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; } - -a.btn.disabled, fieldset[disabled] a.btn { - pointer-events: none; } - -.btn-default { - color: #444; - background-color: #fff; - border-color: transparent; } - .btn-default:focus, .btn-default.focus { - color: #444; - background-color: #e6e6e6; - border-color: rgba(0, 0, 0, 0); } - .btn-default:hover { - color: #444; - background-color: #e6e6e6; - border-color: rgba(0, 0, 0, 0); } - .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { - color: #444; - background-color: #e6e6e6; - border-color: rgba(0, 0, 0, 0); } - .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus, .open > .btn-default.dropdown-toggle:hover, .open > .btn-default.dropdown-toggle:focus, .open > .btn-default.dropdown-toggle.focus { - color: #444; - background-color: #d4d4d4; - border-color: rgba(0, 0, 0, 0); } - .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { - background-image: none; } - .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default.focus { - background-color: #fff; - border-color: transparent; } - .btn-default .badge { - color: #fff; - background-color: #444; } - -.btn-primary { - color: #fff; - background-color: #5a9ddb; - border-color: transparent; } - .btn-primary:focus, .btn-primary.focus { - color: #fff; - background-color: #3084d2; - border-color: rgba(0, 0, 0, 0); } - .btn-primary:hover { - color: #fff; - background-color: #3084d2; - border-color: rgba(0, 0, 0, 0); } - .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #3084d2; - border-color: rgba(0, 0, 0, 0); } - .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus, .open > .btn-primary.dropdown-toggle:hover, .open > .btn-primary.dropdown-toggle:focus, .open > .btn-primary.dropdown-toggle.focus { - color: #fff; - background-color: #2872b6; - border-color: rgba(0, 0, 0, 0); } - .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { - background-image: none; } - .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary.focus { - background-color: #5a9ddb; - border-color: transparent; } - .btn-primary .badge { - color: #5a9ddb; - background-color: #fff; } - -.btn-success { - color: #fff; - background-color: #4CAF50; - border-color: transparent; } - .btn-success:focus, .btn-success.focus { - color: #fff; - background-color: #3d8b40; - border-color: rgba(0, 0, 0, 0); } - .btn-success:hover { - color: #fff; - background-color: #3d8b40; - border-color: rgba(0, 0, 0, 0); } - .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { - color: #fff; - background-color: #3d8b40; - border-color: rgba(0, 0, 0, 0); } - .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus, .open > .btn-success.dropdown-toggle:hover, .open > .btn-success.dropdown-toggle:focus, .open > .btn-success.dropdown-toggle.focus { - color: #fff; - background-color: #327334; - border-color: rgba(0, 0, 0, 0); } - .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { - background-image: none; } - .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success.focus { - background-color: #4CAF50; - border-color: transparent; } - .btn-success .badge { - color: #4CAF50; - background-color: #fff; } - -.btn-info { - color: #fff; - background-color: #9C27B0; - border-color: transparent; } - .btn-info:focus, .btn-info.focus { - color: #fff; - background-color: #771e86; - border-color: rgba(0, 0, 0, 0); } - .btn-info:hover { - color: #fff; - background-color: #771e86; - border-color: rgba(0, 0, 0, 0); } - .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { - color: #fff; - background-color: #771e86; - border-color: rgba(0, 0, 0, 0); } - .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus, .open > .btn-info.dropdown-toggle:hover, .open > .btn-info.dropdown-toggle:focus, .open > .btn-info.dropdown-toggle.focus { - color: #fff; - background-color: #5d1769; - border-color: rgba(0, 0, 0, 0); } - .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { - background-image: none; } - .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info.focus { - background-color: #9C27B0; - border-color: transparent; } - .btn-info .badge { - color: #9C27B0; - background-color: #fff; } - -.btn-warning { - color: #fff; - background-color: #ff9800; - border-color: transparent; } - .btn-warning:focus, .btn-warning.focus { - color: #fff; - background-color: #cc7a00; - border-color: rgba(0, 0, 0, 0); } - .btn-warning:hover { - color: #fff; - background-color: #cc7a00; - border-color: rgba(0, 0, 0, 0); } - .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { - color: #fff; - background-color: #cc7a00; - border-color: rgba(0, 0, 0, 0); } - .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus, .open > .btn-warning.dropdown-toggle:hover, .open > .btn-warning.dropdown-toggle:focus, .open > .btn-warning.dropdown-toggle.focus { - color: #fff; - background-color: #a86400; - border-color: rgba(0, 0, 0, 0); } - .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { - background-image: none; } - .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning.focus { - background-color: #ff9800; - border-color: transparent; } - .btn-warning .badge { - color: #ff9800; - background-color: #fff; } - -.btn-danger { - color: #fff; - background-color: #e51c23; - border-color: transparent; } - .btn-danger:focus, .btn-danger.focus { - color: #fff; - background-color: #b9151b; - border-color: rgba(0, 0, 0, 0); } - .btn-danger:hover { - color: #fff; - background-color: #b9151b; - border-color: rgba(0, 0, 0, 0); } - .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #b9151b; - border-color: rgba(0, 0, 0, 0); } - .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus, .open > .btn-danger.dropdown-toggle:hover, .open > .btn-danger.dropdown-toggle:focus, .open > .btn-danger.dropdown-toggle.focus { - color: #fff; - background-color: #991216; - border-color: rgba(0, 0, 0, 0); } - .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { - background-image: none; } - .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger.focus { - background-color: #e51c23; - border-color: transparent; } - .btn-danger .badge { - color: #e51c23; - background-color: #fff; } - -.btn-link { - color: #5a9ddb; - font-weight: normal; - border-radius: 0; } - .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; } - .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { - border-color: transparent; } - .btn-link:hover, .btn-link:focus { - color: #2a77bf; - text-decoration: underline; - background-color: transparent; } - .btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { - color: #bbb; - text-decoration: none; } - -.btn-lg, .btn-group-lg > .btn { - padding: 10px 16px; - font-size: 19px; - line-height: 1.3333333; - border-radius: 3px; } - -.btn-sm, .btn-group-sm > .btn { - padding: 5px 10px; - font-size: 13px; - line-height: 1.5; - border-radius: 3px; } - -.btn-xs, .btn-group-xs > .btn { - padding: 1px 5px; - font-size: 13px; - line-height: 1.5; - border-radius: 3px; } - -.btn-block { - display: block; - width: 100%; } - -.btn-block + .btn-block { - margin-top: 5px; } - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; } - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; } - .fade.in { - opacity: 1; } - -.collapse { - display: none; } - .collapse.in { - display: block; } - -tr.collapse.in { - display: table-row; } - -tbody.collapse.in { - display: table-row-group; } - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-property: height, visibility; - transition-property: height, visibility; - -webkit-transition-duration: 0.35s; - transition-duration: 0.35s; - -webkit-transition-timing-function: ease; - transition-timing-function: ease; } - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; } - -.dropup, -.dropdown { - position: relative; } - -.dropdown-toggle:focus { - outline: 0; } - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - font-size: 15px; - text-align: left; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 3px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; } - .dropdown-menu.pull-right { - right: 0; - left: auto; } - .dropdown-menu .divider { - height: 1px; - margin: 12.5px 0; - overflow: hidden; - background-color: #e5e5e5; } - .dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.846; - color: #444; - white-space: nowrap; } - -.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - text-decoration: none; - color: #141414; - background-color: #eeeeee; } - -.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - outline: 0; - background-color: #5a9ddb; } - -.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - color: #bbb; } -.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - cursor: not-allowed; } - -.open > .dropdown-menu { - display: block; } -.open > a { - outline: 0; } - -.dropdown-menu-right { - left: auto; - right: 0; } - -.dropdown-menu-left { - left: 0; - right: auto; } - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 13px; - line-height: 1.846; - color: #bbb; - white-space: nowrap; } - -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: 990; } - -.pull-right > .dropdown-menu { - right: 0; - left: auto; } - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px dashed; - border-bottom: 4px solid \9; - content: ""; } -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; } - -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; } - .navbar-right .dropdown-menu-left { - left: 0; - right: auto; } } -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; } - .btn-group > .btn, - .btn-group-vertical > .btn { - position: relative; - float: left; } - .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, - .btn-group-vertical > .btn:hover, - .btn-group-vertical > .btn:focus, - .btn-group-vertical > .btn:active, - .btn-group-vertical > .btn.active { - z-index: 2; } - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; } - -.btn-toolbar { - margin-left: -5px; } - .btn-toolbar:before, .btn-toolbar:after { - content: " "; - display: table; } - .btn-toolbar:after { - clear: both; } - .btn-toolbar .btn, - .btn-toolbar .btn-group, - .btn-toolbar .input-group { - float: left; } - .btn-toolbar > .btn, - .btn-toolbar > .btn-group, - .btn-toolbar > .input-group { - margin-left: 5px; } - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; } - -.btn-group > .btn:first-child { - margin-left: 0; } - .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - -.btn-group > .btn-group { - float: left; } - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; } - -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; } - -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; } - -.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; } - -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } - .btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; } - -.btn .caret { - margin-left: 0; } - -.btn-lg .caret, .btn-group-lg > .btn .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; } - -.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret { - border-width: 0 5px 5px; } - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; } -.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { - content: " "; - display: table; } -.btn-group-vertical > .btn-group:after { - clear: both; } -.btn-group-vertical > .btn-group > .btn { - float: none; } -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; } - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; } -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 3px; - border-top-left-radius: 3px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-right-radius: 0; - border-top-left-radius: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; } - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; } - -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } - -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; } - -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; } - .btn-group-justified > .btn, - .btn-group-justified > .btn-group { - float: none; - display: table-cell; - width: 1%; } - .btn-group-justified > .btn-group .btn { - width: 100%; } - .btn-group-justified > .btn-group .dropdown-menu { - left: auto; } - -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; } - -.input-group { - position: relative; - display: table; - border-collapse: separate; } - .input-group[class*="col-"] { - float: none; - padding-left: 0; - padding-right: 0; } - .input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; } - .input-group .form-control:focus { - z-index: 3; } - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; } - .input-group-addon:not(:first-child):not(:last-child), - .input-group-btn:not(:first-child):not(:last-child), - .input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; } - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; } - -.input-group-addon { - padding: 6px 16px; - font-size: 15px; - font-weight: normal; - line-height: 1; - color: #666; - text-align: center; - background-color: transparent; - border: 1px solid transparent; - border-radius: 3px; } - .input-group-addon.input-sm, - .input-group-sm > .input-group-addon, - .input-group-sm > .input-group-btn > .input-group-addon.btn { - padding: 5px 10px; - font-size: 13px; - border-radius: 3px; } - .input-group-addon.input-lg, - .input-group-lg > .input-group-addon, - .input-group-lg > .input-group-btn > .input-group-addon.btn { - padding: 10px 16px; - font-size: 19px; - border-radius: 3px; } - .input-group-addon input[type="radio"], - .input-group-addon input[type="checkbox"] { - margin-top: 0; } - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.input-group-addon:first-child { - border-right: 0; } - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - -.input-group-addon:last-child { - border-left: 0; } - -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; } - .input-group-btn > .btn { - position: relative; } - .input-group-btn > .btn + .btn { - margin-left: -1px; } - .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { - z-index: 2; } - .input-group-btn:first-child > .btn, - .input-group-btn:first-child > .btn-group { - margin-right: -1px; } - .input-group-btn:last-child > .btn, - .input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; } - -.nav { - margin-bottom: 0; - padding-left: 0; - list-style: none; } - .nav:before, .nav:after { - content: " "; - display: table; } - .nav:after { - clear: both; } - .nav > li { - position: relative; - display: block; } - .nav > li > a { - position: relative; - display: block; - padding: 10px 15px; } - .nav > li > a:hover, .nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; } - .nav > li.disabled > a { - color: #bbb; } - .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { - color: #bbb; - text-decoration: none; - background-color: transparent; - cursor: not-allowed; } - .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { - background-color: #eeeeee; - border-color: #5a9ddb; } - .nav .nav-divider { - height: 1px; - margin: 12.5px 0; - overflow: hidden; - background-color: #e5e5e5; } - .nav > li > a > img { - max-width: none; } - -.nav-tabs { - border-bottom: 1px solid transparent; } - .nav-tabs > li { - float: left; - margin-bottom: -1px; } - .nav-tabs > li > a { - margin-right: 2px; - line-height: 1.846; - border: 1px solid transparent; - border-radius: 3px 3px 0 0; } - .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee transparent; } - .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { - color: #666; - background-color: transparent; - border: 1px solid transparent; - border-bottom-color: transparent; - cursor: default; } - -.nav-pills > li { - float: left; } - .nav-pills > li > a { - border-radius: 3px; } - .nav-pills > li + li { - margin-left: 2px; } - .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #fff; - background-color: #5a9ddb; } - -.nav-stacked > li { - float: none; } - .nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; } - -.nav-justified, .nav-tabs.nav-justified { - width: 100%; } - .nav-justified > li, .nav-tabs.nav-justified > li { - float: none; } - .nav-justified > li > a, .nav-tabs.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; } - .nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; } - @media (min-width: 768px) { - .nav-justified > li, .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; } - .nav-justified > li > a, .nav-tabs.nav-justified > li > a { - margin-bottom: 0; } } - -.nav-tabs-justified, .nav-tabs.nav-justified { - border-bottom: 0; } - .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 3px; } - .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus, - .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid transparent; } - @media (min-width: 768px) { - .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid transparent; - border-radius: 3px 3px 0 0; } - .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; } } - -.tab-content > .tab-pane { - display: none; } -.tab-content > .active { - display: block; } - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; } - -.navbar { - position: relative; - min-height: 110px; - margin-bottom: 27px; - border: 1px solid transparent; } - .navbar:before, .navbar:after { - content: " "; - display: table; } - .navbar:after { - clear: both; } - @media (min-width: 768px) { - .navbar { - border-radius: 3px; } } - -.navbar-header:before, .navbar-header:after { - content: " "; - display: table; } -.navbar-header:after { - clear: both; } -@media (min-width: 768px) { - .navbar-header { - float: left; } } - -.navbar-collapse { - overflow-x: visible; - padding-right: 15px; - padding-left: 15px; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; } - .navbar-collapse:before, .navbar-collapse:after { - content: " "; - display: table; } - .navbar-collapse:after { - clear: both; } - .navbar-collapse.in { - overflow-y: auto; } - @media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; } - .navbar-collapse.in { - overflow-y: visible; } - .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { - padding-left: 0; - padding-right: 0; } } - -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; } - @media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; } } - -.container > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-header, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; } - @media (min-width: 768px) { - .container > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-header, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; } } - -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; } - @media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; } } - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; } - @media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; } } - -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; } - -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; } - -.navbar-brand { - float: left; - padding: 41.5px 15px; - font-size: 19px; - line-height: 27px; - height: 110px; } - .navbar-brand:hover, .navbar-brand:focus { - text-decoration: none; } - .navbar-brand > img { - display: block; } - @media (min-width: 768px) { - .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { - margin-left: -15px; } } - -.navbar-toggle { - position: relative; - float: right; - margin-right: 15px; - padding: 9px 10px; - margin-top: 38px; - margin-bottom: 38px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 3px; } - .navbar-toggle:focus { - outline: 0; } - .navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; } - .navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; } - @media (min-width: 768px) { - .navbar-toggle { - display: none; } } - -.navbar-nav { - margin: 20.75px -15px; } - .navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 27px; } - @media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 27px; } - .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; } } - @media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; } - .navbar-nav > li { - float: left; } - .navbar-nav > li > a { - padding-top: 41.5px; - padding-bottom: 41.5px; } } - -.navbar-form { - margin-left: -15px; - margin-right: -15px; - padding: 10px 15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - margin-top: 34.5px; - margin-bottom: 34.5px; } - @media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; } - .navbar-form .form-control-static { - display: inline-block; } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; } - .navbar-form .input-group > .form-control { - width: 100%; } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; } - .navbar-form .has-feedback .form-control-feedback { - top: 0; } } - @media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; } - .navbar-form .form-group:last-child { - margin-bottom: 0; } } - @media (min-width: 768px) { - .navbar-form { - width: auto; - border: 0; - margin-left: 0; - margin-right: 0; - padding-top: 0; - padding-bottom: 0; - -webkit-box-shadow: none; - box-shadow: none; } } - -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; } - -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-right-radius: 3px; - border-top-left-radius: 3px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } - -.navbar-btn { - margin-top: 34.5px; - margin-bottom: 34.5px; } - .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { - margin-top: 39.5px; - margin-bottom: 39.5px; } - .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { - margin-top: 44px; - margin-bottom: 44px; } - -.navbar-text { - margin-top: 41.5px; - margin-bottom: 41.5px; } - @media (min-width: 768px) { - .navbar-text { - float: left; - margin-left: 15px; - margin-right: 15px; } } - -@media (min-width: 768px) { - .navbar-left { - float: left !important; } - - .navbar-right { - float: right !important; - margin-right: -15px; } - .navbar-right ~ .navbar-right { - margin-right: 0; } } -.navbar-default { - background-color: #fff; - border-color: transparent; } - .navbar-default .navbar-brand { - color: #444; } - .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { - color: #222; - background-color: transparent; } - .navbar-default .navbar-text { - color: #bbb; } - .navbar-default .navbar-nav > li > a { - color: #444; } - .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #222; - background-color: transparent; } - .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #212121; - background-color: #fcfcfc; } - .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; } - .navbar-default .navbar-toggle { - border-color: transparent; } - .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: transparent; } - .navbar-default .navbar-toggle .icon-bar { - background-color: rgba(0, 0, 0, 0.5); } - .navbar-default .navbar-collapse, - .navbar-default .navbar-form { - border-color: transparent; } - .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { - background-color: #fcfcfc; - color: #212121; } - @media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #444; } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #222; - background-color: transparent; } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #212121; - background-color: #fcfcfc; } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; } } - .navbar-default .navbar-link { - color: #444; } - .navbar-default .navbar-link:hover { - color: #222; } - .navbar-default .btn-link { - color: #444; } - .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #222; } - .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; } - -.navbar-inverse { - background-color: #5a9ddb; - border-color: transparent; } - .navbar-inverse .navbar-brand { - color: #d8e8f6; } - .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; } - .navbar-inverse .navbar-text { - color: #bbb; } - .navbar-inverse .navbar-nav > li > a { - color: #d8e8f6; } - .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; } - .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #3084d2; } - .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; } - .navbar-inverse .navbar-toggle { - border-color: transparent; } - .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: transparent; } - .navbar-inverse .navbar-toggle .icon-bar { - background-color: rgba(0, 0, 0, 0.5); } - .navbar-inverse .navbar-collapse, - .navbar-inverse .navbar-form { - border-color: #3d8cd5; } - .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { - background-color: #3084d2; - color: #fff; } - @media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: transparent; } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: transparent; } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #d8e8f6; } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #3084d2; } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; } } - .navbar-inverse .navbar-link { - color: #d8e8f6; } - .navbar-inverse .navbar-link:hover { - color: #fff; } - .navbar-inverse .btn-link { - color: #d8e8f6; } - .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: #fff; } - .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; } - -.breadcrumb { - padding: 8px 15px; - margin-bottom: 27px; - list-style: none; - background-color: #f5f5f5; - border-radius: 3px; } - .breadcrumb > li { - display: inline-block; } - .breadcrumb > li + li:before { - content: "/ "; - padding: 0 5px; - color: #ccc; } - .breadcrumb > .active { - color: #bbb; } - -.pagination { - display: inline-block; - padding-left: 0; - margin: 27px 0; - border-radius: 3px; } - .pagination > li { - display: inline; } - .pagination > li > a, - .pagination > li > span { - position: relative; - float: left; - padding: 6px 16px; - line-height: 1.846; - text-decoration: none; - color: #5a9ddb; - background-color: #fff; - border: 1px solid #ddd; - margin-left: -1px; } - .pagination > li:first-child > a, - .pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } - .pagination > li:last-child > a, - .pagination > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - .pagination > li > a:hover, .pagination > li > a:focus, - .pagination > li > span:hover, - .pagination > li > span:focus { - z-index: 2; - color: #2a77bf; - background-color: #eeeeee; - border-color: #ddd; } - .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, - .pagination > .active > span, - .pagination > .active > span:hover, - .pagination > .active > span:focus { - z-index: 3; - color: #fff; - background-color: #5a9ddb; - border-color: #5a9ddb; - cursor: default; } - .pagination > .disabled > span, - .pagination > .disabled > span:hover, - .pagination > .disabled > span:focus, - .pagination > .disabled > a, - .pagination > .disabled > a:hover, - .pagination > .disabled > a:focus { - color: #bbb; - background-color: #fff; - border-color: #ddd; - cursor: not-allowed; } - -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 19px; - line-height: 1.3333333; } -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 13px; - line-height: 1.5; } -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - -.pager { - padding-left: 0; - margin: 27px 0; - list-style: none; - text-align: center; } - .pager:before, .pager:after { - content: " "; - display: table; } - .pager:after { - clear: both; } - .pager li { - display: inline; } - .pager li > a, - .pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; } - .pager li > a:hover, - .pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; } - .pager .next > a, - .pager .next > span { - float: right; } - .pager .previous > a, - .pager .previous > span { - float: left; } - .pager .disabled > a, - .pager .disabled > a:hover, - .pager .disabled > a:focus, - .pager .disabled > span { - color: #bbb; - background-color: #fff; - cursor: not-allowed; } - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; } - .label:empty { - display: none; } - .btn .label { - position: relative; - top: -1px; } - -a.label:hover, a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; } - -.label-default { - background-color: #bbb; } - .label-default[href]:hover, .label-default[href]:focus { - background-color: #a2a2a2; } - -.label-primary { - background-color: #5a9ddb; } - .label-primary[href]:hover, .label-primary[href]:focus { - background-color: #3084d2; } - -.label-success { - background-color: #4CAF50; } - .label-success[href]:hover, .label-success[href]:focus { - background-color: #3d8b40; } - -.label-info { - background-color: #9C27B0; } - .label-info[href]:hover, .label-info[href]:focus { - background-color: #771e86; } - -.label-warning { - background-color: #ff9800; } - .label-warning[href]:hover, .label-warning[href]:focus { - background-color: #cc7a00; } - -.label-danger { - background-color: #e51c23; } - .label-danger[href]:hover, .label-danger[href]:focus { - background-color: #b9151b; } - -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 13px; - font-weight: normal; - color: #fff; - line-height: 1; - vertical-align: middle; - white-space: nowrap; - text-align: center; - background-color: #bbb; - border-radius: 10px; } - .badge:empty { - display: none; } - .btn .badge { - position: relative; - top: -1px; } - .btn-xs .badge, .btn-group-xs > .btn .badge, .btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; } - .list-group-item.active > .badge, .nav-pills > .active > a > .badge { - color: #5a9ddb; - background-color: #fff; } - .list-group-item > .badge { - float: right; } - .list-group-item > .badge + .badge { - margin-right: 5px; } - .nav-pills > li > a > .badge { - margin-left: 3px; } - -a.badge:hover, a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; } - -.jumbotron { - padding-top: 30px; - padding-bottom: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #f5f5f5; } - .jumbotron h1, - .jumbotron .h1 { - color: #444; } - .jumbotron p { - margin-bottom: 15px; - font-size: 23px; - font-weight: 200; } - .jumbotron > hr { - border-top-color: gainsboro; } - .container .jumbotron, .container-fluid .jumbotron { - border-radius: 3px; - padding-left: 15px; - padding-right: 15px; } - .jumbotron .container { - max-width: 100%; } - @media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; } - .container .jumbotron, .container-fluid .jumbotron { - padding-left: 60px; - padding-right: 60px; } - .jumbotron h1, - .jumbotron .h1 { - font-size: 68px; } } - -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 27px; - line-height: 1.846; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 3px; - -webkit-transition: border 0.2s ease-in-out; - -o-transition: border 0.2s ease-in-out; - transition: border 0.2s ease-in-out; } - .thumbnail > img, - .thumbnail a > img { - display: block; - max-width: 100%; - height: auto; - margin-left: auto; - margin-right: auto; } - .thumbnail .caption { - padding: 9px; - color: #444; } - -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #5a9ddb; } - -.alert { - padding: 15px; - margin-bottom: 27px; - border: 1px solid transparent; - border-radius: 3px; } - .alert h4 { - margin-top: 0; - color: inherit; } - .alert .alert-link { - font-weight: bold; } - .alert > p, - .alert > ul { - margin-bottom: 0; } - .alert > p + p { - margin-top: 5px; } - -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; } - .alert-dismissable .close, - .alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; } - -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #4CAF50; } - .alert-success hr { - border-top-color: #c9e2b3; } - .alert-success .alert-link { - color: #3d8b40; } - -.alert-info { - background-color: #e1bee7; - border-color: #cba4dd; - color: #9C27B0; } - .alert-info hr { - border-top-color: #c191d6; } - .alert-info .alert-link { - color: #771e86; } - -.alert-warning { - background-color: #ffe0b2; - border-color: #ffc599; - color: #ff9800; } - .alert-warning hr { - border-top-color: #ffb67f; } - .alert-warning .alert-link { - color: #cc7a00; } - -.alert-danger { - background-color: #f9bdbb; - border-color: #f7a4af; - color: #e51c23; } - .alert-danger hr { - border-top-color: #f58c9a; } - .alert-danger .alert-link { - color: #b9151b; } - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; } - to { - background-position: 0 0; } } -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; } - to { - background-position: 0 0; } } -.progress { - overflow: hidden; - height: 27px; - margin-bottom: 27px; - background-color: #f5f5f5; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } - -.progress-bar { - float: left; - width: 0%; - height: 100%; - font-size: 13px; - line-height: 27px; - color: #fff; - text-align: center; - background-color: #5a9ddb; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; } - -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; } - -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; } - -.progress-bar-success { - background-color: #4CAF50; } - .progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } - -.progress-bar-info { - background-color: #9C27B0; } - .progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } - -.progress-bar-warning { - background-color: #ff9800; } - .progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } - -.progress-bar-danger { - background-color: #e51c23; } - .progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } - -.media { - margin-top: 15px; } - .media:first-child { - margin-top: 0; } - -.media, -.media-body { - zoom: 1; - overflow: hidden; } - -.media-body { - width: 10000px; } - -.media-object { - display: block; } - .media-object.img-thumbnail { - max-width: none; } - -.media-right, -.media > .pull-right { - padding-left: 10px; } - -.media-left, -.media > .pull-left { - padding-right: 10px; } - -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; } - -.media-middle { - vertical-align: middle; } - -.media-bottom { - vertical-align: bottom; } - -.media-heading { - margin-top: 0; - margin-bottom: 5px; } - -.media-list { - padding-left: 0; - list-style: none; } - -.list-group { - margin-bottom: 20px; - padding-left: 0; } - -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; } - .list-group-item:first-child { - border-top-right-radius: 3px; - border-top-left-radius: 3px; } - .list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; } - -a.list-group-item, -button.list-group-item { - color: #555; } - a.list-group-item .list-group-item-heading, - button.list-group-item .list-group-item-heading { - color: #333; } - a.list-group-item:hover, a.list-group-item:focus, - button.list-group-item:hover, - button.list-group-item:focus { - text-decoration: none; - color: #555; - background-color: #f5f5f5; } - -button.list-group-item { - width: 100%; - text-align: left; } - -.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { - background-color: #eeeeee; - color: #bbb; - cursor: not-allowed; } - .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { - color: inherit; } - .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { - color: #bbb; } -.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #5a9ddb; - border-color: #5a9ddb; } - .list-group-item.active .list-group-item-heading, - .list-group-item.active .list-group-item-heading > small, - .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, - .list-group-item.active:hover .list-group-item-heading > small, - .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, - .list-group-item.active:focus .list-group-item-heading > small, - .list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; } - .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { - color: white; } - -.list-group-item-success { - color: #4CAF50; - background-color: #dff0d8; } - -a.list-group-item-success, -button.list-group-item-success { - color: #4CAF50; } - a.list-group-item-success .list-group-item-heading, - button.list-group-item-success .list-group-item-heading { - color: inherit; } - a.list-group-item-success:hover, a.list-group-item-success:focus, - button.list-group-item-success:hover, - button.list-group-item-success:focus { - color: #4CAF50; - background-color: #d0e9c6; } - a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus, - button.list-group-item-success.active, - button.list-group-item-success.active:hover, - button.list-group-item-success.active:focus { - color: #fff; - background-color: #4CAF50; - border-color: #4CAF50; } - -.list-group-item-info { - color: #9C27B0; - background-color: #e1bee7; } - -a.list-group-item-info, -button.list-group-item-info { - color: #9C27B0; } - a.list-group-item-info .list-group-item-heading, - button.list-group-item-info .list-group-item-heading { - color: inherit; } - a.list-group-item-info:hover, a.list-group-item-info:focus, - button.list-group-item-info:hover, - button.list-group-item-info:focus { - color: #9C27B0; - background-color: #d8abe0; } - a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus, - button.list-group-item-info.active, - button.list-group-item-info.active:hover, - button.list-group-item-info.active:focus { - color: #fff; - background-color: #9C27B0; - border-color: #9C27B0; } - -.list-group-item-warning { - color: #ff9800; - background-color: #ffe0b2; } - -a.list-group-item-warning, -button.list-group-item-warning { - color: #ff9800; } - a.list-group-item-warning .list-group-item-heading, - button.list-group-item-warning .list-group-item-heading { - color: inherit; } - a.list-group-item-warning:hover, a.list-group-item-warning:focus, - button.list-group-item-warning:hover, - button.list-group-item-warning:focus { - color: #ff9800; - background-color: #ffd699; } - a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, - button.list-group-item-warning.active, - button.list-group-item-warning.active:hover, - button.list-group-item-warning.active:focus { - color: #fff; - background-color: #ff9800; - border-color: #ff9800; } - -.list-group-item-danger { - color: #e51c23; - background-color: #f9bdbb; } - -a.list-group-item-danger, -button.list-group-item-danger { - color: #e51c23; } - a.list-group-item-danger .list-group-item-heading, - button.list-group-item-danger .list-group-item-heading { - color: inherit; } - a.list-group-item-danger:hover, a.list-group-item-danger:focus, - button.list-group-item-danger:hover, - button.list-group-item-danger:focus { - color: #e51c23; - background-color: #f7a6a4; } - a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, - button.list-group-item-danger.active, - button.list-group-item-danger.active:hover, - button.list-group-item-danger.active:focus { - color: #fff; - background-color: #e51c23; - border-color: #e51c23; } - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; } - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; } - -.panel { - margin-bottom: 27px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } - -.panel-body { - padding: 15px; } - .panel-body:before, .panel-body:after { - content: " "; - display: table; } - .panel-body:after { - clear: both; } - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 2px; - border-top-left-radius: 2px; } - .panel-heading > .dropdown .dropdown-toggle { - color: inherit; } - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 17px; - color: inherit; } - .panel-title > a, - .panel-title > small, - .panel-title > .small, - .panel-title > small > a, - .panel-title > .small > a { - color: inherit; } - -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 2px; } - -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; } - .panel > .list-group .list-group-item, - .panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; } - .panel > .list-group:first-child .list-group-item:first-child, - .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-right-radius: 2px; - border-top-left-radius: 2px; } - .panel > .list-group:last-child .list-group-item:last-child, - .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 2px; - border-bottom-left-radius: 2px; } -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; } - -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; } - -.list-group + .panel-footer { - border-top-width: 0; } - -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; } - .panel > .table caption, - .panel > .table-responsive > .table caption, - .panel > .panel-collapse > .table caption { - padding-left: 15px; - padding-right: 15px; } -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-right-radius: 2px; - border-top-left-radius: 2px; } - .panel > .table:first-child > thead:first-child > tr:first-child, - .panel > .table:first-child > tbody:first-child > tr:first-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 2px; - border-top-right-radius: 2px; } - .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, - .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, - .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, - .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 2px; } - .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, - .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, - .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, - .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, - .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, - .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 2px; } -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 2px; - border-bottom-left-radius: 2px; } - .panel > .table:last-child > tbody:last-child > tr:last-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; } - .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, - .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 2px; } - .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, - .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, - .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, - .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, - .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 2px; } -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; } -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; } -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; } - .panel > .table-bordered > thead > tr > th:first-child, - .panel > .table-bordered > thead > tr > td:first-child, - .panel > .table-bordered > tbody > tr > th:first-child, - .panel > .table-bordered > tbody > tr > td:first-child, - .panel > .table-bordered > tfoot > tr > th:first-child, - .panel > .table-bordered > tfoot > tr > td:first-child, - .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, - .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, - .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, - .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, - .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; } - .panel > .table-bordered > thead > tr > th:last-child, - .panel > .table-bordered > thead > tr > td:last-child, - .panel > .table-bordered > tbody > tr > th:last-child, - .panel > .table-bordered > tbody > tr > td:last-child, - .panel > .table-bordered > tfoot > tr > th:last-child, - .panel > .table-bordered > tfoot > tr > td:last-child, - .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, - .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, - .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, - .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, - .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; } - .panel > .table-bordered > thead > tr:first-child > td, - .panel > .table-bordered > thead > tr:first-child > th, - .panel > .table-bordered > tbody > tr:first-child > td, - .panel > .table-bordered > tbody > tr:first-child > th, - .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, - .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, - .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, - .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; } - .panel > .table-bordered > tbody > tr:last-child > td, - .panel > .table-bordered > tbody > tr:last-child > th, - .panel > .table-bordered > tfoot > tr:last-child > td, - .panel > .table-bordered > tfoot > tr:last-child > th, - .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, - .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, - .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, - .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; } -.panel > .table-responsive { - border: 0; - margin-bottom: 0; } - -.panel-group { - margin-bottom: 27px; } - .panel-group .panel { - margin-bottom: 0; - border-radius: 3px; } - .panel-group .panel + .panel { - margin-top: 5px; } - .panel-group .panel-heading { - border-bottom: 0; } - .panel-group .panel-heading + .panel-collapse > .panel-body, - .panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; } - .panel-group .panel-footer { - border-top: 0; } - .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; } - -.panel-default { - border-color: #ddd; } - .panel-default > .panel-heading { - color: #212121; - background-color: #f5f5f5; - border-color: #ddd; } - .panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; } - .panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #212121; } - .panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; } - -.panel-primary { - border-color: #5a9ddb; } - .panel-primary > .panel-heading { - color: #fff; - background-color: #5a9ddb; - border-color: #5a9ddb; } - .panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #5a9ddb; } - .panel-primary > .panel-heading .badge { - color: #5a9ddb; - background-color: #fff; } - .panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #5a9ddb; } - -.panel-success { - border-color: #d6e9c6; } - .panel-success > .panel-heading { - color: #fff; - background-color: #4CAF50; - border-color: #d6e9c6; } - .panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; } - .panel-success > .panel-heading .badge { - color: #4CAF50; - background-color: #fff; } - .panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; } - -.panel-info { - border-color: #cba4dd; } - .panel-info > .panel-heading { - color: #fff; - background-color: #9C27B0; - border-color: #cba4dd; } - .panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #cba4dd; } - .panel-info > .panel-heading .badge { - color: #9C27B0; - background-color: #fff; } - .panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #cba4dd; } - -.panel-warning { - border-color: #ffc599; } - .panel-warning > .panel-heading { - color: #fff; - background-color: #ff9800; - border-color: #ffc599; } - .panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ffc599; } - .panel-warning > .panel-heading .badge { - color: #ff9800; - background-color: #fff; } - .panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ffc599; } - -.panel-danger { - border-color: #f7a4af; } - .panel-danger > .panel-heading { - color: #fff; - background-color: #e51c23; - border-color: #f7a4af; } - .panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #f7a4af; } - .panel-danger > .panel-heading .badge { - color: #e51c23; - background-color: #fff; } - .panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #f7a4af; } - -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; } - .embed-responsive .embed-responsive-item, - .embed-responsive iframe, - .embed-responsive embed, - .embed-responsive object, - .embed-responsive video { - position: absolute; - top: 0; - left: 0; - bottom: 0; - height: 100%; - width: 100%; - border: 0; } - -.embed-responsive-16by9 { - padding-bottom: 56.25%; } - -.embed-responsive-4by3 { - padding-bottom: 75%; } - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } - .well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); } - -.well-lg { - padding: 24px; - border-radius: 3px; } - -.well-sm { - padding: 9px; - border-radius: 3px; } - -.close { - float: right; - font-size: 22.5px; - font-weight: normal; - line-height: 1; - color: #000; - text-shadow: none; - opacity: 0.2; - filter: alpha(opacity=20); } - .close:hover, .close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); } - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; } - -.modal-open { - overflow: hidden; } - -.modal { - display: none; - overflow: hidden; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - -webkit-overflow-scrolling: touch; - outline: 0; } - .modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -moz-transition: -moz-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; } - .modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); } - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; } - -.modal-dialog { - position: relative; - width: auto; - margin: 10px; } - -.modal-content { - position: relative; - background-color: #fff; - border: 1px solid #999; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; - outline: 0; } - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; } - .modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); } - .modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); } - -.modal-header { - padding: 15px; - border-bottom: 1px solid transparent; } - .modal-header:before, .modal-header:after { - content: " "; - display: table; } - .modal-header:after { - clear: both; } - -.modal-header .close { - margin-top: -2px; } - -.modal-title { - margin: 0; - line-height: 1.846; } - -.modal-body { - position: relative; - padding: 15px; } - -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid transparent; } - .modal-footer:before, .modal-footer:after { - content: " "; - display: table; } - .modal-footer:after { - clear: both; } - .modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; } - .modal-footer .btn-group .btn + .btn { - margin-left: -1px; } - .modal-footer .btn-block + .btn-block { - margin-left: 0; } - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; } - -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; } - - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } - - .modal-sm { - width: 300px; } } -@media (min-width: 992px) { - .modal-lg { - width: 900px; } } -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-style: normal; - font-weight: normal; - letter-spacing: normal; - line-break: auto; - line-height: 1.846; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - font-size: 13px; - opacity: 0; - filter: alpha(opacity=0); } - .tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); } - .tooltip.top { - margin-top: -3px; - padding: 5px 0; } - .tooltip.right { - margin-left: 3px; - padding: 0 5px; } - .tooltip.bottom { - margin-top: 3px; - padding: 5px 0; } - .tooltip.left { - margin-left: -3px; - padding: 0 5px; } - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #727272; - border-radius: 3px; } - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; } - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #727272; } -.tooltip.top-left .tooltip-arrow { - bottom: 0; - right: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #727272; } -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #727272; } -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #727272; } -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #727272; } -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #727272; } -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #727272; } -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #727272; } - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-style: normal; - font-weight: normal; - letter-spacing: normal; - line-break: auto; - line-height: 1.846; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - white-space: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - font-size: 15px; - background-color: #fff; - background-clip: padding-box; - border: 1px solid transparent; - border: 1px solid transparent; - border-radius: 3px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } - .popover.top { - margin-top: -10px; } - .popover.right { - margin-left: 10px; } - .popover.bottom { - margin-top: 10px; } - .popover.left { - margin-left: -10px; } - -.popover-title { - margin: 0; - padding: 8px 14px; - font-size: 15px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 2px 2px 0 0; } - -.popover-content { - padding: 9px 14px; } - -.popover > .arrow, .popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; } - -.popover > .arrow { - border-width: 11px; } - -.popover > .arrow:after { - border-width: 10px; - content: ""; } - -.popover.top > .arrow { - left: 50%; - margin-left: -11px; - border-bottom-width: 0; - border-top-color: rgba(0, 0, 0, 0); - border-top-color: fadein(transparent, 12%); - bottom: -11px; } - .popover.top > .arrow:after { - content: " "; - bottom: 1px; - margin-left: -10px; - border-bottom-width: 0; - border-top-color: #fff; } -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-left-width: 0; - border-right-color: rgba(0, 0, 0, 0); - border-right-color: fadein(transparent, 12%); } - .popover.right > .arrow:after { - content: " "; - left: 1px; - bottom: -10px; - border-left-width: 0; - border-right-color: #fff; } -.popover.bottom > .arrow { - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: rgba(0, 0, 0, 0); - border-bottom-color: fadein(transparent, 12%); - top: -11px; } - .popover.bottom > .arrow:after { - content: " "; - top: 1px; - margin-left: -10px; - border-top-width: 0; - border-bottom-color: #fff; } -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: rgba(0, 0, 0, 0); - border-left-color: fadein(transparent, 12%); } - .popover.left > .arrow:after { - content: " "; - right: 1px; - border-right-width: 0; - border-left-color: #fff; - bottom: -10px; } - -.carousel { - position: relative; } - -.carousel-inner { - position: relative; - overflow: hidden; - width: 100%; } - .carousel-inner > .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; } - .carousel-inner > .item > img, - .carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; - line-height: 1; } - @media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - -webkit-transition: -webkit-transform 0.6s ease-in-out; - -moz-transition: -moz-transform 0.6s ease-in-out; - -o-transition: -o-transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out; - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - -moz-perspective: 1000px; - perspective: 1000px; } - .carousel-inner > .item.next, .carousel-inner > .item.active.right { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - left: 0; } - .carousel-inner > .item.prev, .carousel-inner > .item.active.left { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - left: 0; } - .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - left: 0; } } - .carousel-inner > .active, - .carousel-inner > .next, - .carousel-inner > .prev { - display: block; } - .carousel-inner > .active { - left: 0; } - .carousel-inner > .next, - .carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; } - .carousel-inner > .next { - left: 100%; } - .carousel-inner > .prev { - left: -100%; } - .carousel-inner > .next.left, - .carousel-inner > .prev.right { - left: 0; } - .carousel-inner > .active.left { - left: -100%; } - .carousel-inner > .active.right { - left: 100%; } - -.carousel-control { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 15%; - opacity: 0.5; - filter: alpha(opacity=50); - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); - background-color: rgba(0, 0, 0, 0); } - .carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } - .carousel-control.right { - left: auto; - right: 0; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } - .carousel-control:hover, .carousel-control:focus { - outline: 0; - color: #fff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); } - .carousel-control .icon-prev, - .carousel-control .icon-next, - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - margin-top: -10px; - z-index: 5; - display: inline-block; } - .carousel-control .icon-prev, - .carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; } - .carousel-control .icon-next, - .carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; } - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 20px; - height: 20px; - line-height: 1; - font-family: serif; } - .carousel-control .icon-prev:before { - content: '\2039'; } - .carousel-control .icon-next:before { - content: '\203a'; } - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - margin-left: -30%; - padding-left: 0; - list-style: none; - text-align: center; } - .carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - border: 1px solid #fff; - border-radius: 10px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); } - .carousel-indicators .active { - margin: 0; - width: 12px; - height: 12px; - background-color: #fff; } - -.carousel-caption { - position: absolute; - left: 15%; - right: 15%; - bottom: 20px; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } - .carousel-caption .btn { - text-shadow: none; } - -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -10px; - font-size: 30px; } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -10px; } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -10px; } - - .carousel-caption { - left: 20%; - right: 20%; - padding-bottom: 30px; } - - .carousel-indicators { - bottom: 20px; } } -.clearfix:before, .clearfix:after { - content: " "; - display: table; } -.clearfix:after { - clear: both; } - -.center-block { - display: block; - margin-left: auto; - margin-right: auto; } - -.pull-right { - float: right !important; } - -.pull-left { - float: left !important; } - -.hide { - display: none !important; } - -.show { - display: block !important; } - -.invisible { - visibility: hidden; } - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; } - -.hidden { - display: none !important; } - -.affix { - position: fixed; } - -@-ms-viewport { - width: device-width; } -.visible-xs { - display: none !important; } - -.visible-sm { - display: none !important; } - -.visible-md { - display: none !important; } - -.visible-lg { - display: none !important; } - -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; } - -@media (max-width: 767px) { - .visible-xs { - display: block !important; } - - table.visible-xs { - display: table !important; } - - tr.visible-xs { - display: table-row !important; } - - th.visible-xs, - td.visible-xs { - display: table-cell !important; } } -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; } } - -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; } } - -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; } - - table.visible-sm { - display: table !important; } - - tr.visible-sm { - display: table-row !important; } - - th.visible-sm, - td.visible-sm { - display: table-cell !important; } } -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; } } - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; } - - table.visible-md { - display: table !important; } - - tr.visible-md { - display: table-row !important; } - - th.visible-md, - td.visible-md { - display: table-cell !important; } } -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; } } - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; } } - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; } } - -@media (min-width: 1200px) { - .visible-lg { - display: block !important; } - - table.visible-lg { - display: table !important; } - - tr.visible-lg { - display: table-row !important; } - - th.visible-lg, - td.visible-lg { - display: table-cell !important; } } -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; } } - -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; } } - -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; } } - -@media (max-width: 767px) { - .hidden-xs { - display: none !important; } } -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; } } -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; } } -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; } } -.visible-print { - display: none !important; } - -@media print { - .visible-print { - display: block !important; } - - table.visible-print { - display: table !important; } - - tr.visible-print { - display: table-row !important; } - - th.visible-print, - td.visible-print { - display: table-cell !important; } } -.visible-print-block { - display: none !important; } - @media print { - .visible-print-block { - display: block !important; } } - -.visible-print-inline { - display: none !important; } - @media print { - .visible-print-inline { - display: inline !important; } } - -.visible-print-inline-block { - display: none !important; } - @media print { - .visible-print-inline-block { - display: inline-block !important; } } - -@media print { - .hidden-print { - display: none !important; } } -/*! - * tidyverse theme - * Copyright 2016 RStudio, Inc. - */ -.navbar { - border: none; - -webkit-box-shadow: 0 3px 15px 0px rgba(0, 0, 0, 0.1); - box-shadow: 0 3px 15px 0px rgba(0, 0, 0, 0.1); - min-height: 50px; - padding: 5px 0; } - .navbar-brand { - font-family: "Source Code Pro", Menlo, Monaco, Consolas, "Courier New", monospace; - font-weight: normal; - font-size: 32px; - padding: 0 0 0 54px; - height: 50px; - line-height: 50px; - background-image: url(../logo.png); - background-size: 32px auto; - background-repeat: no-repeat; - background-position: 15px center; } - .navbar-nav li a { - padding-top: 10px; - padding-bottom: 0; - line-height: inherit; } - .navbar-inverse .navbar-form input[type=text], - .navbar-inverse .navbar-form input[type=password] { - color: #fff; - -webkit-box-shadow: inset 0 -1px 0 #d8e8f6; - box-shadow: inset 0 -1px 0 #d8e8f6; } - .navbar-inverse .navbar-form input[type=text]::-moz-placeholder, - .navbar-inverse .navbar-form input[type=password]::-moz-placeholder { - color: #d8e8f6; - opacity: 1; } - .navbar-inverse .navbar-form input[type=text]:-ms-input-placeholder, - .navbar-inverse .navbar-form input[type=password]:-ms-input-placeholder { - color: #d8e8f6; } - .navbar-inverse .navbar-form input[type=text]::-webkit-input-placeholder, - .navbar-inverse .navbar-form input[type=password]::-webkit-input-placeholder { - color: #d8e8f6; } - .navbar-inverse .navbar-form input[type=text]:focus, - .navbar-inverse .navbar-form input[type=password]:focus { - -webkit-box-shadow: inset 0 -2px 0 #fff; - box-shadow: inset 0 -2px 0 #fff; } - -.btn-default:focus { - background-color: #fff; } -.btn-default:hover, .btn-default:active:hover { - background-color: #f0f0f0; } -.btn-default:active { - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); } - -.btn-primary:focus { - background-color: #5a9ddb; } -.btn-primary:hover, .btn-primary:active:hover { - background-color: #418ed6; } -.btn-primary:active { - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); } - -.btn-success:focus { - background-color: #4CAF50; } -.btn-success:hover, .btn-success:active:hover { - background-color: #439a46; } -.btn-success:active { - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); } - -.btn-info:focus { - background-color: #9C27B0; } -.btn-info:hover, .btn-info:active:hover { - background-color: #862197; } -.btn-info:active { - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); } - -.btn-warning:focus { - background-color: #ff9800; } -.btn-warning:hover, .btn-warning:active:hover { - background-color: #e08600; } -.btn-warning:active { - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); } - -.btn-danger:focus { - background-color: #e51c23; } -.btn-danger:hover, .btn-danger:active:hover { - background-color: #cb171e; } -.btn-danger:active { - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); } - -.btn-link:focus { - background-color: #fff; } -.btn-link:hover, .btn-link:active:hover { - background-color: #f0f0f0; } -.btn-link:active { - -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); - box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); } - -.btn { - text-transform: uppercase; - border: none; - -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4); - box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4); - -webkit-transition: all 0.4s; - -o-transition: all 0.4s; - transition: all 0.4s; - position: relative; } - .btn:after { - content: ""; - display: block; - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - background-image: -webkit-radial-gradient(circle, #000 10%, transparent 10.01%); - background-image: radial-gradient(circle, #000 10%, transparent 10.01%); - background-repeat: no-repeat; - background-size: 1000% 1000%; - background-position: 50%; - opacity: 0; - pointer-events: none; - transition: background .5s, opacity 1s; } - .btn:active:after { - background-size: 0% 0%; - opacity: .2; - transition: 0s; } - .btn-link { - border-radius: 3px; - -webkit-box-shadow: none; - box-shadow: none; - color: #444; } - .btn-link:hover, .btn-link:focus { - -webkit-box-shadow: none; - box-shadow: none; - color: #444; - text-decoration: none; } - .btn-default.disabled { - background-color: rgba(0, 0, 0, 0.1); - color: rgba(0, 0, 0, 0.4); - opacity: 1; } - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: 0; } -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: 0; } - -body { - -webkit-font-smoothing: antialiased; - letter-spacing: .1px; } - -p { - margin: 0 0 1em; } - -input, -button { - -webkit-font-smoothing: antialiased; - letter-spacing: .1px; } - -a { - -webkit-transition: all 0.25s; - -o-transition: all 0.25s; - transition: all 0.25s; } - -.table-hover > tbody > tr, -.table-hover > tbody > tr > th, -.table-hover > tbody > tr > td { - -webkit-transition: all 0.2s; - -o-transition: all 0.2s; - transition: all 0.2s; } - -label { - font-weight: normal; } - -textarea, -textarea.form-control, -input.form-control, -input[type=text], -input[type=password], -input[type=email], -input[type=number], -[type=text].form-control, -[type=password].form-control, -[type=email].form-control, -[type=tel].form-control, -[contenteditable].form-control { - padding: 0; - border: none; - border-radius: 0; - -webkit-appearance: none; - -webkit-box-shadow: inset 0 -1px 0 #ddd; - box-shadow: inset 0 -1px 0 #ddd; - font-size: 16px; } - textarea:focus, - textarea.form-control:focus, - input.form-control:focus, - input[type=text]:focus, - input[type=password]:focus, - input[type=email]:focus, - input[type=number]:focus, - [type=text].form-control:focus, - [type=password].form-control:focus, - [type=email].form-control:focus, - [type=tel].form-control:focus, - [contenteditable].form-control:focus { - -webkit-box-shadow: inset 0 -2px 0 #5a9ddb; - box-shadow: inset 0 -2px 0 #5a9ddb; } - textarea[disabled], textarea[readonly], - textarea.form-control[disabled], - textarea.form-control[readonly], - input.form-control[disabled], - input.form-control[readonly], - input[type=text][disabled], - input[type=text][readonly], - input[type=password][disabled], - input[type=password][readonly], - input[type=email][disabled], - input[type=email][readonly], - input[type=number][disabled], - input[type=number][readonly], - [type=text].form-control[disabled], - [type=text].form-control[readonly], - [type=password].form-control[disabled], - [type=password].form-control[readonly], - [type=email].form-control[disabled], - [type=email].form-control[readonly], - [type=tel].form-control[disabled], - [type=tel].form-control[readonly], - [contenteditable].form-control[disabled], - [contenteditable].form-control[readonly] { - -webkit-box-shadow: none; - box-shadow: none; - border-bottom: 1px dotted #ddd; } - textarea.input-sm, .input-group-sm > textarea.form-control, - .input-group-sm > textarea.input-group-addon, - .input-group-sm > .input-group-btn > textarea.btn, - textarea.form-control.input-sm, - .input-group-sm > textarea.form-control, - .input-group-sm > .input-group-btn > textarea.form-control.btn, - input.form-control.input-sm, - .input-group-sm > input.form-control, - .input-group-sm > .input-group-btn > input.form-control.btn, - input[type=text].input-sm, - .input-group-sm > input[type=text].form-control, - .input-group-sm > input[type=text].input-group-addon, - .input-group-sm > .input-group-btn > input[type=text].btn, - input[type=password].input-sm, - .input-group-sm > input[type=password].form-control, - .input-group-sm > input[type=password].input-group-addon, - .input-group-sm > .input-group-btn > input[type=password].btn, - input[type=email].input-sm, - .input-group-sm > input[type=email].form-control, - .input-group-sm > input[type=email].input-group-addon, - .input-group-sm > .input-group-btn > input[type=email].btn, - input[type=number].input-sm, - .input-group-sm > input[type=number].form-control, - .input-group-sm > input[type=number].input-group-addon, - .input-group-sm > .input-group-btn > input[type=number].btn, - [type=text].form-control.input-sm, - .input-group-sm > [type=text].form-control, - .input-group-sm > .input-group-btn > [type=text].form-control.btn, - [type=password].form-control.input-sm, - .input-group-sm > [type=password].form-control, - .input-group-sm > .input-group-btn > [type=password].form-control.btn, - [type=email].form-control.input-sm, - .input-group-sm > [type=email].form-control, - .input-group-sm > .input-group-btn > [type=email].form-control.btn, - [type=tel].form-control.input-sm, - .input-group-sm > [type=tel].form-control, - .input-group-sm > .input-group-btn > [type=tel].form-control.btn, - [contenteditable].form-control.input-sm, - .input-group-sm > [contenteditable].form-control, - .input-group-sm > .input-group-btn > [contenteditable].form-control.btn { - font-size: 13px; } - textarea.input-lg, .input-group-lg > textarea.form-control, - .input-group-lg > textarea.input-group-addon, - .input-group-lg > .input-group-btn > textarea.btn, - textarea.form-control.input-lg, - .input-group-lg > textarea.form-control, - .input-group-lg > .input-group-btn > textarea.form-control.btn, - input.form-control.input-lg, - .input-group-lg > input.form-control, - .input-group-lg > .input-group-btn > input.form-control.btn, - input[type=text].input-lg, - .input-group-lg > input[type=text].form-control, - .input-group-lg > input[type=text].input-group-addon, - .input-group-lg > .input-group-btn > input[type=text].btn, - input[type=password].input-lg, - .input-group-lg > input[type=password].form-control, - .input-group-lg > input[type=password].input-group-addon, - .input-group-lg > .input-group-btn > input[type=password].btn, - input[type=email].input-lg, - .input-group-lg > input[type=email].form-control, - .input-group-lg > input[type=email].input-group-addon, - .input-group-lg > .input-group-btn > input[type=email].btn, - input[type=number].input-lg, - .input-group-lg > input[type=number].form-control, - .input-group-lg > input[type=number].input-group-addon, - .input-group-lg > .input-group-btn > input[type=number].btn, - [type=text].form-control.input-lg, - .input-group-lg > [type=text].form-control, - .input-group-lg > .input-group-btn > [type=text].form-control.btn, - [type=password].form-control.input-lg, - .input-group-lg > [type=password].form-control, - .input-group-lg > .input-group-btn > [type=password].form-control.btn, - [type=email].form-control.input-lg, - .input-group-lg > [type=email].form-control, - .input-group-lg > .input-group-btn > [type=email].form-control.btn, - [type=tel].form-control.input-lg, - .input-group-lg > [type=tel].form-control, - .input-group-lg > .input-group-btn > [type=tel].form-control.btn, - [contenteditable].form-control.input-lg, - .input-group-lg > [contenteditable].form-control, - .input-group-lg > .input-group-btn > [contenteditable].form-control.btn { - font-size: 19px; } - -select, -select.form-control { - border: 0; - border-radius: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding-left: 0; - padding-right: 0\9; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); - background-size: 13px; - background-repeat: no-repeat; - background-position: right center; - -webkit-box-shadow: inset 0 -1px 0 #ddd; - box-shadow: inset 0 -1px 0 #ddd; - font-size: 16px; - line-height: 1.5; } - select::-ms-expand, - select.form-control::-ms-expand { - display: none; } - select.input-sm, .input-group-sm > select.form-control, - .input-group-sm > select.input-group-addon, - .input-group-sm > .input-group-btn > select.btn, - select.form-control.input-sm, - .input-group-sm > select.form-control, - .input-group-sm > .input-group-btn > select.form-control.btn { - font-size: 13px; } - select.input-lg, .input-group-lg > select.form-control, - .input-group-lg > select.input-group-addon, - .input-group-lg > .input-group-btn > select.btn, - select.form-control.input-lg, - .input-group-lg > select.form-control, - .input-group-lg > .input-group-btn > select.form-control.btn { - font-size: 19px; } - select:focus, - select.form-control:focus { - -webkit-box-shadow: inset 0 -2px 0 #5a9ddb; - box-shadow: inset 0 -2px 0 #5a9ddb; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); } - select[multiple], - select.form-control[multiple] { - background: none; } - -.radio label, -.radio-inline label, -.checkbox label, -.checkbox-inline label { - padding-left: 25px; } -.radio input[type="radio"], -.radio input[type="checkbox"], -.radio-inline input[type="radio"], -.radio-inline input[type="checkbox"], -.checkbox input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="radio"], -.checkbox-inline input[type="checkbox"] { - margin-left: -25px; } - -input[type="radio"], -.radio input[type="radio"], -.radio-inline input[type="radio"] { - position: relative; - margin-top: 6px; - margin-right: 4px; - vertical-align: top; - border: none; - background-color: transparent; - -webkit-appearance: none; - appearance: none; - cursor: pointer; } - input[type="radio"]:focus, - .radio input[type="radio"]:focus, - .radio-inline input[type="radio"]:focus { - outline: none; } - input[type="radio"]:before, input[type="radio"]:after, - .radio input[type="radio"]:before, - .radio input[type="radio"]:after, - .radio-inline input[type="radio"]:before, - .radio-inline input[type="radio"]:after { - content: ""; - display: block; - width: 18px; - height: 18px; - border-radius: 50%; - -webkit-transition: 240ms; - -o-transition: 240ms; - transition: 240ms; } - input[type="radio"]:before, - .radio input[type="radio"]:before, - .radio-inline input[type="radio"]:before { - position: absolute; - left: 0; - top: -3px; - background-color: #5a9ddb; - -webkit-transform: scale(0); - -ms-transform: scale(0); - -o-transform: scale(0); - transform: scale(0); } - input[type="radio"]:after, - .radio input[type="radio"]:after, - .radio-inline input[type="radio"]:after { - position: relative; - top: -3px; - border: 2px solid #666; } - input[type="radio"]:checked:before, - .radio input[type="radio"]:checked:before, - .radio-inline input[type="radio"]:checked:before { - -webkit-transform: scale(0.5); - -ms-transform: scale(0.5); - -o-transform: scale(0.5); - transform: scale(0.5); } - input[type="radio"]:disabled:checked:before, - .radio input[type="radio"]:disabled:checked:before, - .radio-inline input[type="radio"]:disabled:checked:before { - background-color: #bbb; } - input[type="radio"]:checked:after, - .radio input[type="radio"]:checked:after, - .radio-inline input[type="radio"]:checked:after { - border-color: #5a9ddb; } - input[type="radio"]:disabled:after, input[type="radio"]:disabled:checked:after, - .radio input[type="radio"]:disabled:after, - .radio input[type="radio"]:disabled:checked:after, - .radio-inline input[type="radio"]:disabled:after, - .radio-inline input[type="radio"]:disabled:checked:after { - border-color: #bbb; } - -input[type="checkbox"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: relative; - border: none; - margin-bottom: -4px; - -webkit-appearance: none; - appearance: none; - cursor: pointer; } - input[type="checkbox"]:focus, - .checkbox input[type="checkbox"]:focus, - .checkbox-inline input[type="checkbox"]:focus { - outline: none; } - input[type="checkbox"]:focus:after, - .checkbox input[type="checkbox"]:focus:after, - .checkbox-inline input[type="checkbox"]:focus:after { - border-color: #5a9ddb; } - input[type="checkbox"]:after, - .checkbox input[type="checkbox"]:after, - .checkbox-inline input[type="checkbox"]:after { - content: ""; - display: block; - width: 18px; - height: 18px; - margin-top: -2px; - margin-right: 5px; - border: 2px solid #666; - border-radius: 2px; - -webkit-transition: 240ms; - -o-transition: 240ms; - transition: 240ms; } - input[type="checkbox"]:checked:before, - .checkbox input[type="checkbox"]:checked:before, - .checkbox-inline input[type="checkbox"]:checked:before { - content: ""; - position: absolute; - top: 0; - left: 6px; - display: table; - width: 6px; - height: 12px; - border: 2px solid #fff; - border-top-width: 0; - border-left-width: 0; - -webkit-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); } - input[type="checkbox"]:checked:after, - .checkbox input[type="checkbox"]:checked:after, - .checkbox-inline input[type="checkbox"]:checked:after { - background-color: #5a9ddb; - border-color: #5a9ddb; } - input[type="checkbox"]:disabled:after, - .checkbox input[type="checkbox"]:disabled:after, - .checkbox-inline input[type="checkbox"]:disabled:after { - border-color: #bbb; } - input[type="checkbox"]:disabled:checked:after, - .checkbox input[type="checkbox"]:disabled:checked:after, - .checkbox-inline input[type="checkbox"]:disabled:checked:after { - background-color: #bbb; - border-color: transparent; } - -.has-warning input:not([type=checkbox]), -.has-warning .form-control, -.has-warning input.form-control[readonly], -.has-warning input[type=text][readonly], -.has-warning [type=text].form-control[readonly], -.has-warning input:not([type=checkbox]):focus, -.has-warning .form-control:focus { - border-bottom: none; - -webkit-box-shadow: inset 0 -2px 0 #ff9800; - box-shadow: inset 0 -2px 0 #ff9800; } - -.has-error input:not([type=checkbox]), -.has-error .form-control, -.has-error input.form-control[readonly], -.has-error input[type=text][readonly], -.has-error [type=text].form-control[readonly], -.has-error input:not([type=checkbox]):focus, -.has-error .form-control:focus { - border-bottom: none; - -webkit-box-shadow: inset 0 -2px 0 #e51c23; - box-shadow: inset 0 -2px 0 #e51c23; } - -.has-success input:not([type=checkbox]), -.has-success .form-control, -.has-success input.form-control[readonly], -.has-success input[type=text][readonly], -.has-success [type=text].form-control[readonly], -.has-success input:not([type=checkbox]):focus, -.has-success .form-control:focus { - border-bottom: none; - -webkit-box-shadow: inset 0 -2px 0 #4CAF50; - box-shadow: inset 0 -2px 0 #4CAF50; } - -.has-warning .input-group-addon, .has-error .input-group-addon, .has-success .input-group-addon { - color: #666; - border-color: transparent; - background-color: transparent; } - -.form-group-lg select, -.form-group-lg select.form-control { - line-height: 1.5; } - -.nav-tabs > li > a, -.nav-tabs > li > a:focus { - margin-right: 0; - background-color: transparent; - border: none; - color: #444; - -webkit-box-shadow: inset 0 -1px 0 #ddd; - box-shadow: inset 0 -1px 0 #ddd; - -webkit-transition: all 0.2s; - -o-transition: all 0.2s; - transition: all 0.2s; } - .nav-tabs > li > a:hover, - .nav-tabs > li > a:focus:hover { - background-color: transparent; - -webkit-box-shadow: inset 0 -2px 0 #5a9ddb; - box-shadow: inset 0 -2px 0 #5a9ddb; - color: #5a9ddb; } -.nav-tabs > li.active > a, .nav-tabs > li.active > a:focus { - border: none; - -webkit-box-shadow: inset 0 -2px 0 #5a9ddb; - box-shadow: inset 0 -2px 0 #5a9ddb; - color: #5a9ddb; } - .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus:hover { - border: none; - color: #5a9ddb; } -.nav-tabs > li.disabled > a { - -webkit-box-shadow: inset 0 -1px 0 #ddd; - box-shadow: inset 0 -1px 0 #ddd; } -.nav-tabs.nav-justified > li > a, .nav-tabs.nav-justified > li > a:hover, .nav-tabs.nav-justified > li > a:focus, .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border: none; } -.nav-tabs .dropdown-menu { - margin-top: 0; } - -.dropdown-menu { - margin-top: 0; - border: none; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); } - -.alert { - border: none; - color: #fff; } - .alert-success { - background-color: #4CAF50; } - .alert-info { - background-color: #9C27B0; } - .alert-warning { - background-color: #ff9800; } - .alert-danger { - background-color: #e51c23; } - .alert a:not(.close):not(.btn), - .alert .alert-link { - color: #fff; - font-weight: bold; } - .alert .close { - color: #fff; } - -.badge { - padding: 4px 6px 4px; } - -.progress { - position: relative; - z-index: 1; - height: 6px; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; } - .progress-bar { - -webkit-box-shadow: none; - box-shadow: none; } - .progress-bar:last-child { - border-radius: 0 3px 3px 0; } - .progress-bar:last-child:before { - display: block; - content: ""; - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - z-index: -1; - background-color: #edf4fb; } - .progress-bar-success:last-child.progress-bar:before { - background-color: #c7e7c8; } - .progress-bar-info:last-child.progress-bar:before { - background-color: #edc9f3; } - .progress-bar-warning:last-child.progress-bar:before { - background-color: #ffe0b3; } - .progress-bar-danger:last-child.progress-bar:before { - background-color: #f28e92; } - -.close { - font-size: 34px; - font-weight: 300; - line-height: 24px; - opacity: 0.6; - -webkit-transition: all 0.2s; - -o-transition: all 0.2s; - transition: all 0.2s; } - .close:hover { - opacity: 1; } - -.list-group-item { - padding: 15px; } -.list-group-item-text { - color: #bbb; } - -.well { - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; } - -.panel { - border: none; - border-radius: 2px; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); } - .panel-heading { - border-bottom: none; } - .panel-footer { - border-top: none; } - -.popover { - border: none; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); } - -.carousel-caption h1, .carousel-caption h2, .carousel-caption h3, .carousel-caption h4, .carousel-caption h5, .carousel-caption h6 { - color: inherit; } - -/*# sourceMappingURL=tidyverse.css.map */ diff --git a/revdep/library.noindex/eurostat/new/lubridate/pkgdown/assets/tidyverse.css.map b/revdep/library.noindex/eurostat/new/lubridate/pkgdown/assets/tidyverse.css.map deleted file mode 100644 index eed2eee6..00000000 --- a/revdep/library.noindex/eurostat/new/lubridate/pkgdown/assets/tidyverse.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": "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", -"sources": ["../../../../../tmp/tidytemplate/scss/_bootstrap.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_normalize.scss","../../../../../tmp/tidytemplate/scss/_bootswatch.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_print.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_glyphicons.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_scaffolding.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_vendor-prefixes.scss","../../../../../tmp/tidytemplate/scss/_variables.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_tab-focus.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_image.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_type.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_text-emphasis.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_background-variant.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_clearfix.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_text-overflow.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_code.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_grid.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_grid.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_grid-framework.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_tables.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_table-row.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_forms.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_forms.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_buttons.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_buttons.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_opacity.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_component-animations.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_dropdowns.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_nav-divider.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_reset-filter.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_button-groups.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_border-radius.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_input-groups.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_navs.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_navbar.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_nav-vertical-align.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_breadcrumbs.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_pagination.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_pagination.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_pager.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_labels.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_labels.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_badges.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_jumbotron.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_thumbnails.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_alerts.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_alerts.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_progress-bars.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_gradients.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_progress-bar.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_media.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_list-group.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_list-group.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_panels.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_panels.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_responsive-embed.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_wells.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_close.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_modals.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_tooltip.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_reset-text.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_popovers.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_carousel.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_utilities.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_center-block.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_hide-text.scss","../../../../../tmp/tidytemplate/scss/bootstrap/_responsive-utilities.scss","../../../../../tmp/tidytemplate/scss/bootstrap/mixins/_responsive-visibility.scss"], -"names": [], -"file": "tidyverse.css" -} diff --git a/revdep/library.noindex/eurostat/new/readr/DESCRIPTION b/revdep/library.noindex/eurostat/new/readr/DESCRIPTION deleted file mode 100644 index 6cec526b..00000000 --- a/revdep/library.noindex/eurostat/new/readr/DESCRIPTION +++ /dev/null @@ -1,54 +0,0 @@ -Package: readr -Title: Read Rectangular Text Data -Version: 2.1.4 -Authors@R: c( - person("Hadley", "Wickham", , "hadley@posit.co", role = "aut"), - person("Jim", "Hester", role = "aut"), - person("Romain", "Francois", role = "ctb"), - person("Jennifer", "Bryan", , "jenny@posit.co", role = c("aut", "cre"), - comment = c(ORCID = "0000-0002-6983-2759")), - person("Shelby", "Bearrows", role = "ctb"), - person("Posit, PBC", role = c("cph", "fnd")), - person("https://github.com/mandreyel/", role = "cph", - comment = "mio library"), - person("Jukka", "Jylänki", role = c("ctb", "cph"), - comment = "grisu3 implementation"), - person("Mikkel", "Jørgensen", role = c("ctb", "cph"), - comment = "grisu3 implementation") - ) -Description: The goal of 'readr' is to provide a fast and friendly way to - read rectangular data (like 'csv', 'tsv', and 'fwf'). It is designed - to flexibly parse many types of data found in the wild, while still - cleanly failing when data unexpectedly changes. -License: MIT + file LICENSE -URL: https://readr.tidyverse.org, https://github.com/tidyverse/readr -BugReports: https://github.com/tidyverse/readr/issues -Depends: R (>= 3.5) -Imports: cli (>= 3.2.0), clipr, crayon, hms (>= 0.4.1), lifecycle (>= - 0.2.0), methods, R6, rlang, tibble, utils, vroom (>= 1.6.0) -Suggests: covr, curl, datasets, knitr, rmarkdown, spelling, stringi, - testthat (>= 3.1.2), tzdb (>= 0.1.1), waldo, withr, xml2 -LinkingTo: cpp11, tzdb (>= 0.1.1) -VignetteBuilder: knitr -Config/Needs/website: tidyverse, tidyverse/tidytemplate -Config/testthat/edition: 3 -Config/testthat/parallel: false -Encoding: UTF-8 -Language: en-US -RoxygenNote: 7.2.3 -NeedsCompilation: yes -Packaged: 2023-02-10 00:05:55 UTC; jenny -Author: Hadley Wickham [aut], - Jim Hester [aut], - Romain Francois [ctb], - Jennifer Bryan [aut, cre] (), - Shelby Bearrows [ctb], - Posit, PBC [cph, fnd], - https://github.com/mandreyel/ [cph] (mio library), - Jukka Jylänki [ctb, cph] (grisu3 implementation), - Mikkel Jørgensen [ctb, cph] (grisu3 implementation) -Maintainer: Jennifer Bryan -Repository: CRAN -Date/Publication: 2023-02-10 09:20:02 UTC -Built: R 4.2.0; aarch64-apple-darwin20; 2023-02-10 11:14:04 UTC; unix -Archs: readr.so.dSYM diff --git a/revdep/library.noindex/eurostat/new/readr/INDEX b/revdep/library.noindex/eurostat/new/readr/INDEX deleted file mode 100644 index 9e87af07..00000000 --- a/revdep/library.noindex/eurostat/new/readr/INDEX +++ /dev/null @@ -1,44 +0,0 @@ -clipboard Returns values from the clipboard -col_skip Skip a column -cols Create column specification -cols_condense Examine the column specifications for a data - frame -count_fields Count the number of fields in each line of a - file -date_names Create or retrieve date names -edition_get Retrieve the currently active edition -format_delim Convert a data frame to a delimited string -guess_encoding Guess encoding of file -locale Create locales -melt_delim Return melted data for each token in a - delimited file (including csv & tsv) -melt_fwf Return melted data for each token in a fixed - width file -melt_table Return melted data for each token in a - whitespace-separated file -parse_datetime Parse date/times -parse_factor Parse factors -parse_guess Parse using the "best" type -parse_logical Parse logicals, integers, and reals -parse_number Parse numbers, flexibly -problems Retrieve parsing problems -read_builtin Read built-in object from package -read_delim Read a delimited file (including CSV and TSV) - into a tibble -read_file Read/write a complete file -read_fwf Read a fixed width file into a tibble -read_lines Read/write lines to/from a file -read_log Read common/combined log file into a tibble -read_rds Read/write RDS files. -read_table Read whitespace-separated columns into a tibble -readr_example Get path to readr example -readr_threads Determine how many threads readr should use - when processing -should_read_lazy Determine whether to read a file lazily -should_show_types Determine whether column types should be shown -show_progress Determine whether progress bars should be shown -spec_delim Generate a column specification -type_convert Re-convert character columns in existing data - frame -with_edition Temporarily change the active readr edition -write_delim Write a data frame to a delimited file diff --git a/revdep/library.noindex/eurostat/new/readr/LICENSE b/revdep/library.noindex/eurostat/new/readr/LICENSE deleted file mode 100644 index 2a58ff1a..00000000 --- a/revdep/library.noindex/eurostat/new/readr/LICENSE +++ /dev/null @@ -1,2 +0,0 @@ -YEAR: 2023 -COPYRIGHT HOLDER: readr authors diff --git a/revdep/library.noindex/eurostat/new/readr/NAMESPACE b/revdep/library.noindex/eurostat/new/readr/NAMESPACE deleted file mode 100644 index b35038f1..00000000 --- a/revdep/library.noindex/eurostat/new/readr/NAMESPACE +++ /dev/null @@ -1,154 +0,0 @@ -# Generated by roxygen2: do not edit by hand - -S3method("[",spec_tbl_df) -S3method(as.character,col_spec) -S3method(as.col_spec,"NULL") -S3method(as.col_spec,character) -S3method(as.col_spec,col_spec) -S3method(as.col_spec,data.frame) -S3method(as.col_spec,default) -S3method(as.col_spec,list) -S3method(as.data.frame,spec_tbl_df) -S3method(as_tibble,spec_tbl_df) -S3method(format,col_spec) -S3method(output_column,POSIXt) -S3method(output_column,default) -S3method(output_column,double) -S3method(print,col_spec) -S3method(print,collector) -S3method(print,date_names) -S3method(print,locale) -S3method(str,col_spec) -S3method(type_to_col,Date) -S3method(type_to_col,POSIXct) -S3method(type_to_col,default) -S3method(type_to_col,double) -S3method(type_to_col,factor) -S3method(type_to_col,hms) -S3method(type_to_col,integer) -S3method(type_to_col,logical) -export(AccumulateCallback) -export(ChunkCallback) -export(DataFrameCallback) -export(ListCallback) -export(SideEffectChunkCallback) -export(as.col_spec) -export(clipboard) -export(col_character) -export(col_date) -export(col_datetime) -export(col_double) -export(col_factor) -export(col_guess) -export(col_integer) -export(col_logical) -export(col_number) -export(col_skip) -export(col_time) -export(cols) -export(cols_condense) -export(cols_only) -export(count_fields) -export(datasource) -export(date_names) -export(date_names_lang) -export(date_names_langs) -export(default_locale) -export(edition_get) -export(format_csv) -export(format_csv2) -export(format_delim) -export(format_tsv) -export(fwf_cols) -export(fwf_empty) -export(fwf_positions) -export(fwf_widths) -export(guess_encoding) -export(guess_parser) -export(local_edition) -export(locale) -export(melt_csv) -export(melt_csv2) -export(melt_csv2_chunked) -export(melt_csv_chunked) -export(melt_delim) -export(melt_delim_chunked) -export(melt_fwf) -export(melt_table) -export(melt_table2) -export(melt_tsv) -export(melt_tsv_chunked) -export(output_column) -export(parse_character) -export(parse_date) -export(parse_datetime) -export(parse_double) -export(parse_factor) -export(parse_guess) -export(parse_integer) -export(parse_logical) -export(parse_number) -export(parse_time) -export(parse_vector) -export(problems) -export(read_builtin) -export(read_csv) -export(read_csv2) -export(read_csv2_chunked) -export(read_csv_chunked) -export(read_delim) -export(read_delim_chunked) -export(read_file) -export(read_file_raw) -export(read_fwf) -export(read_lines) -export(read_lines_chunked) -export(read_lines_raw) -export(read_lines_raw_chunked) -export(read_log) -export(read_rds) -export(read_table) -export(read_table2) -export(read_tsv) -export(read_tsv_chunked) -export(readr_example) -export(readr_threads) -export(should_read_lazy) -export(should_show_types) -export(show_progress) -export(spec) -export(spec_csv) -export(spec_csv2) -export(spec_delim) -export(spec_table) -export(spec_tsv) -export(stop_for_problems) -export(tokenize) -export(tokenizer_csv) -export(tokenizer_delim) -export(tokenizer_fwf) -export(tokenizer_line) -export(tokenizer_log) -export(tokenizer_tsv) -export(tokenizer_ws) -export(type_convert) -export(with_edition) -export(write_csv) -export(write_csv2) -export(write_delim) -export(write_excel_csv) -export(write_excel_csv2) -export(write_file) -export(write_lines) -export(write_rds) -export(write_tsv) -importFrom(R6,R6Class) -importFrom(hms,hms) -importFrom(lifecycle,deprecate_soft) -importFrom(lifecycle,deprecate_warn) -importFrom(lifecycle,deprecated) -importFrom(lifecycle,is_present) -importFrom(methods,setOldClass) -importFrom(tibble,as_tibble) -importFrom(tibble,tibble) -useDynLib(readr, .registration = TRUE) diff --git a/revdep/library.noindex/eurostat/new/readr/NEWS.md b/revdep/library.noindex/eurostat/new/readr/NEWS.md deleted file mode 100644 index 25017f6f..00000000 --- a/revdep/library.noindex/eurostat/new/readr/NEWS.md +++ /dev/null @@ -1,913 +0,0 @@ -# readr 2.1.4 - -* No user-facing changes. Patch release with internal changes requested by CRAN. - -# readr 2.1.3 - -* Help files below `man/` have been re-generated, so that they give rise to valid HTML5. (This is the impetus for this release, to keep the package safely on CRAN.) - -* `mini-gapminder-africa.csv` and friends are new example datasets accessible via `readr_example()`, which have been added to illustrate reading multiple files at once, into a single data frame. - -# readr 2.1.2 - -* `read_table()`, `read_log()`, and `read_delim_chunked()` (and friends) gain the `show_col_types` argument found elsewhere. All `read_*()` functions now respect the `show_col_types` argument or option, even when using the first edition parsing engine (#1331). - -* `show_progress()` uses `rlang::is_interactive()` instead of `base::interactive()` (#1356). - -* `read_builtin()` does more argument checking, so that we catch obviously malformed input before passing along to `utils::data()` (#1361). - -* `chickens.csv` and `whitespace-sample.txt` are new example datasets accessible via `readr_example()` (#1354). - -# readr 2.1.1 - -* Jenny Bryan is now the maintainer. - -* Fix buffer overflow when trying to parse an integer from a field that is over 64 characters long (#1326) - -# readr 2.1.0 - -* All readr functions again read eagerly by default. Unfortunately many users - experienced frustration from the drawbacks of lazy reading, in particular - locking files on Windows, so it was decided to disable lazy reading default. - However `options(readr.read_lazy = TRUE)` can be used to set the default to by lazy if desired. -* New `readr.read_lazy` global option to control if readr reads files lazily or not (#1266) - -# readr 2.0.2 - -* minor test tweak for compatibility with testthat 3.1.0 (#@lionel-, #1304) - -* `write_rds()` gains a `text=` argument, to control using a text based object representation, like the `ascii=` argument in `saveRDS()` (#1270) - -# readr 2.0.1 - -* `options(readr.show_col_types = FALSE)` now works as intended (#1250) - -* `read_delim_chunked()` now again correctly respects the `chunk_size` parameter (#1248) - -* `type_convert()` gains a `guess_integer` argument, passed to `guess_parser()` (@jmbarbone, #1264) - -* `read_tsv()` now correctly passes the `quote` and `na` arguments to `vroom::vroom()` (#1254, #1255) - -* Avoid spurious byte compilation errors due to the programmatically generated `spec_*()` functions. - -# readr 2.0.0 - -## second edition changes - -readr 2.0.0 is a major release of readr and introduces a new second edition parsing and writing engine implemented via the [vroom](https://vroom.r-lib.org/) package. - -This engine takes advantage of lazy reading, multi-threading and performance characteristics of modern SSD drives to significantly improve the performance of reading and writing compared to the first edition engine. - -We will continue to support the first edition for a number of releases, but eventually this support will be first deprecated and then removed. - -You can use the `with_edition()` or `local_edition()` functions to temporarily change the edition of readr for a section of code. - -e.g. - -- `with_edition(1, read_csv("my_file.csv"))` will read `my_file.csv` with the first edition of readr. - -- `readr::local_edition(1)` placed at the top of your function or script will use the first edition for the rest of the function or script. - - -### Lazy reading - -Edition two uses lazy reading by default. -When you first call a `read_*()` function the delimiters and newlines throughout the entire file are found, but the data is not actually read until it is used in your program. -This can provide substantial speed improvements for reading character data. -It is particularly useful during interactive exploration of only a subset of a full dataset. - -However this also means that problematic values are not necessarily seen -immediately, only when they are actually read. -Because of this a warning will be issued the first time a problem is encountered, -which may happen after initial reading. - -Run `problems()` on your dataset to read the entire dataset and return all of the problems found. -Run `problems(lazy = TRUE)` if you only want to retrieve the problems found so far. - -Deleting files after reading is also impacted by laziness. -On Windows open files cannot be deleted as long as a process has the file open. -Because readr keeps a file open when reading lazily this means you cannot read, then immediately delete the file. -readr will in most cases close the file once it has been completely read. -However, if you know you want to be able to delete the file after reading it is best to pass `lazy = FALSE` when reading the file. - -### Reading multiple files at once - -Edition two has built-in support for reading sets of files with the -same columns into one output table in a single command. -Just pass the filenames to be read in the same vector to the reading function. - -First we generate some files to read by splitting the nycflights dataset by -airline. - -```{r} -library(nycflights13) -purrr::iwalk( - split(flights, flights$carrier), - ~ { .x$carrier[[1]]; vroom::vroom_write(.x, glue::glue("flights_{.y}.tsv"), delim = "\t") } -) -``` - -Then we can efficiently read them into one tibble by passing the filenames -directly to readr. - -```{r} -files <- fs::dir_ls(glob = "flights*tsv") -files -readr::read_tsv(files) -``` - -If the filenames contain data, such as the date when the sample was collected, -use `id` argument to include the paths as a column in the data. -You will likely have to post-process the paths to keep only the relevant portion for your use case. - -### Delimiter guessing - -Edition two supports automatic guessing of delimiters. -Because of this you can now use `read_delim()` without specifying a `delim` argument in many cases. - -```{r} -x <- read_delim(readr_example("mtcars.csv")) -``` - -### Literal data - -In edition one the reading functions treated any input with a newline in it or vectors of length > 1 as literal data. -In edition two vectors of length > 1 are now assumed to correspond to multiple files. -Because of this we now have a more explicit way to represent literal data, by putting `I()` around the input. - -```{r} -readr::read_csv(I("a,b\n1,2")) -``` - -### License changes - -We are systematically re-licensing tidyverse and r-lib packages to use the MIT license, to make our package licenses as clear and permissive as possible. - -To this end the readr and vroom packages are now released under the MIT license. - -### Deprecated or superseded functions and features - -* `melt_csv()`, `melt_delim()`, `melt_tsv()` and `melt_fwf()` have been superseded by functions in the same name in the meltr package. - The versions in readr have been deprecated. - These functions rely on the first edition parsing code and would be challenging to update to the new parser. - When the first edition parsing code is eventually removed from readr they will be removed. - -* `read_table2()` has been renamed to `read_table()`, as most users expect `read_table()` to work like `utils::read.table()`. - If you want the previous strict behavior of the `read_table()` you can use `read_fwf()` with `fwf_empty()` directly (#717). - -* Normalizing newlines in files with just carriage returns `\r` is no longer supported. - The last major OS to use only CR as the newline was 'classic' Mac OS, which had its final release in 2001. - -### Other second edition changes - -* `read_*_chunked()` functions now include their specification as an attribute (#1143) - -* All `read_*()` functions gain a `col_select` argument to more easily choose which columns to select. - -* All `read_*()` functions gain a `id` argument to optionally store the file paths when reading multiple files. - -* All `read_*()` functions gain a `name_repair` argument to control how column names are repaired. - -* All `read_*()` and `write_*()` functions gain a `num_threads` argument to control the number of processing threads they use (#1201) - -* All `write_*()` and `format_*()` functions gain `quote` and `escape` arguments, to explicitly control how fields are quoted and how double quotes are escaped. (#653, #759, #844, #993, #1018, #1083) - -* All `write_*()` functions gain a `progress` argument and display a progress bar when writing (#791). - -* write_excel_csv() now defaults to `quote = "all"` (#759) - -* write_tsv() now defaults to `quote = "none"` (#993) - -* `read_table()` now handles skipped lines with unpaired quotes properly (#1180) - -## Additional features and fixes - -* The BH package is no longer a dependency. - The boost C++ headers in BH have thousands of files, so can take a long time to extract and compiling them takes a great deal of memory, which made readr difficult to compile on systems with limited memory (#1147). - -* readr now uses the tzdb package when parsing date-times (@DavisVaughan, r-lib/vroom#273) - -* Chunked readers now support files with more than `INT_MAX` (~ 2 Billion) number of lines (#1177) - -* Memory no longer inadvertently leaks when reading memory from R connections (#1161) - -* Invalid date formats no longer can potentially crash R (#1151) - -* `col_factor()` now throws a more informative error message if given non-character levels (#1140) - -* `problems()` now takes `.Last.value` as its default argument. - This lets you run `problems()` without an argument to see the problems in the previously read dataset. - -* `read_delim()` fails when sample of parsing problems contains non-ASCII characters (@hidekoji, #1136) - -* `read_log()` gains a `trim_ws` argument (#738) - -* `read_rds()` and `write_rds()` gain a `refhook` argument, to pass functions that handle references objects (#1206) - -* `read_rds()` can now read .Rds files from URLs (#1186) - -* `read_*()` functions gain a `show_col_types` argument, if set to `FALSE` this turns off showing the column types unconditionally. - -* `type_convert()` now throws a warning if the input has no character columns (#1020) - -* `write_csv()` now errors if given a matrix column (#1171) - -* `write_csv()` now again is able to write data with duplicated column names (#1169) - -* `write_file()` now forces its argument before opening the output file (#1158) - -# readr 1.4.0 - -## Breaking changes - -* `write_*()` functions first argument is now `file` instead of `path`, for consistency with the `read_*()` functions. - `path` has been deprecated and will be removed in a future version of readr (#1110, @brianrice2) - -* `write_*()` functions now output any NaN values in the same way as NA values, controlled by the `na=` argument. (#1082). - -## New features - -* It is now possible to generate a column specification from any tibble (or data.frame) with `as.col_spec()` and convert any column specification to a short representation with `as.character()` - - s <- as.col_spec(iris) - s - #> cols( - #> Sepal.Length = col_double(), - #> Sepal.Width = col_double(), - #> Petal.Length = col_double(), - #> Petal.Width = col_double(), - #> Species = col_factor(levels = c("setosa", "versicolor", "virginica"), ordered = FALSE, include_na = FALSE) - #> ) - as.character(s) - #> [1] "ddddf" - -* The cli package is now used for all messages. - -* The runtime performance for tables with an extreme number of columns is greatly improved (#825) - -* Compressed files are now detected by magic numbers rather than by the file extension (#1125) - -* A memory leak when reading files is now fixed (#1092) - -* `write_*()` functions gain a `eol =` argument to control the end of line character used (#857). - This allows writing of CSV files with Windows newlines (CRLF) if desired. - -* The Rcpp dependency has been removed in favor of cpp11. - -* The build system has been greatly simplified so should work on more systems. - -## Additional features and fixes - -* The full problem field is now displayed in the problems tibble, as intended (#444). - -* New `%h` placeholder for parsing unrestricted hours (<0 and >23) to support parsing durations (#549, @krlmlr). - -* `as.character.col_spec()` now handles logical columns as well (#1127) - -* `fwf_positions(end)` no longer has a default argument and must be specified (#996) - -* `guess_parser()` gains a `na` argument and removes NA values before guessing (#1041). - -* `parse_guess()` now passes the `na` argument to `guess_parser()` - -* `read_*` functions now close properly all connections, including on errors like HTTP errors when reading from a url (@cderv, #1050). - -* `read_delimited()` no longer mistakenly stats literal filenames (#1063) - -* `read_lines()` now ignores quotations when skipping lines (#991). - -* `read_lines(skip_empty_rows = TRUE)` no longer crashes if a file ends with an empty line (#968) - -* `write_*()` functions now invisibly return the input data frame unchanged, rather than a version with factors and dates converted to strings. (@jesse-ross, #975). - -* `write_csv2()` now formats decimal numbers more consistently with `utils::write.csv2()` (#1087) - -* `write_csv2()` and `format_csv2()` no longer pad number columns with whitespaces (@keesdeschepper, #1046). - -* `write_excel_csv()` no longer outputs a byte order mark when appending to a file (#1075). - -* Uses of `tibble::data_frame` updated to `tibble::tibble` ([tidyverse/dplyr#4069](https://github.com/tidyverse/dplyr/issues/4069), @thays42, #1124, @brianrice2) - -* `read_delimited()` now returns an empty `tibble::data_frame()` rather than signaling an error when given a connection with an empty file (@pralitp, #963). - -* More helpful error when trying to write out data frames with list columns (@ellessenne, #938) - -* `type_convert()` removes a 'spec' attribute, because the current columns likely have modified data types. The 'spec' attribute is set by functions like `read_delim()` (@jimhester, @wibeasley, #1032). - -* `write_rds()` now can specify the Rds version to use. The default value is 2 as it's compatible to R versions prior to 3.5.0 (@shrektan, #1001). - -* Fixes for issues related to variable initialization in C++ code (@michaelquinn32, ##1133). - -# readr 1.3.1 - -* Column specifications are now coloured when printed. This makes it easy to - see at a glance when a column is input as a different type then the rest. - Colouring can be disabled by setting `options(crayon.enabled = FALSE)`. - -* `as.col_spec()` can now use named character vectors, which makes - `read_csv("file.csv", col_types = c(xyz = "c"))` equivalent to - `read_csv("file.csv", col_types = cols(xyz = col_character())` - -* Fix skipping when single quotes are embedded in double quoted strings, and - single quotes in skipped or commented lines (#944, #945). - -* Fix for compilation using custom architectures on macOS (#919) - -* Fix for valgrind errors (#941) - -# readr 1.3.0 - -## Breaking Changes - -### Blank line skipping - -readr's blank line skipping has been modified to be more consistent and to -avoid edge cases that affected the behavior in 1.2.0. The skip parameter now -behaves more similar to how it worked previous to readr 1.2.0, but in addition -the parameter `skip_blank_rows` can be used to control if fully blank lines are -skipped. (#923) - -### tibble data frame subclass - -readr 1.3.0 returns results with a `spec_tbl_df` subclass. This differs from a -regular tibble only that the `spec` attribute (which holds the column -specification) is lost as soon as the object is subset (and a normal `tbl_df` -object is returned). - -Historically `tbl_df`'s lost their attributes once they were subset. However -recent versions of tibble retain the attributes when subetting, so the -`spec_tbl_df` subclass is needed to ensure the previous behavior. - -This should only break compatibility if you are explicitly checking the class -of the returned object. A way to get backwards compatible behavior is to -call subset with no arguments on your object, e.g. `x[]`. - -## Bugfixes - -* `hms` objects with NA values are now written without whitespace padding (#930). -* `read_*()` functions now return `spec_tbl_df` objects, which differ from - regular `tbl_df` objects only in that the `spec` attribute is removed (and - they are demoted to regular `tbl_df` objects) as soon as they are subset - (#934). -* `write_csv2()` now properly respects the `na` argument (#928) -* Fixes compilation with multiple architectures on linux (#922). -* Fixes compilation with R < 3.3.0 - -# readr 1.2.1 - -This release skips the clipboard tests on CRAN servers - -# readr 1.2.0 - -## Breaking Changes - -### Integer column guessing - -readr functions no longer guess columns are of type integer, instead these -columns are guessed as numeric. Because R uses 32 bit integers and 64 bit -doubles all integers can be stored in doubles, guaranteeing no loss of -information. This change was made to remove errors when numeric columns were -incorrectly guessed as integers. If you know a certain column is an integer and -would like to read them as such you can do so by specifying the column type -explicitly with the `col_types` argument. - -### Blank line skipping - -readr now always skips blank lines automatically when parsing, which may change -the number of lines you need to pass to the `skip` parameter. For instance if -your file had a one blank line then two more lines you want to skip previously -you would pass `skip = 3`, now you only need to pass `skip = 2`. - -## New features - -### Melt functions - -There is now a family of `melt_*()` functions in readr. These functions store -data in 'long' or 'melted' form, where each row corresponds to a single -value in the dataset. This form is useful when your data is ragged and not -rectangular. - -``` r -data <-"a,b,c -1,2 -w,x,y,z" - -readr::melt_csv(data) -#> # A tibble: 9 x 4 -#> row col data_type value -#> -#> 1 1 1 character a -#> 2 1 2 character b -#> 3 1 3 character c -#> 4 2 1 integer 1 -#> 5 2 2 integer 2 -#> 6 3 1 character w -#> 7 3 2 character x -#> 8 3 3 character y -#> 9 3 4 character z -``` - -Thanks to Duncan Garmonsway (@nacnudus) for great work on the idea an -implementation of the `melt_*()` functions! - -### Connection improvements - -readr 1.2.0 changes how R connections are parsed by readr. -In previous versions of readr the connections were read into an in-memory raw vector, then passed to the readr functions. -This made reading connections from small to medium datasets fast, but also meant that the dataset had to fit into memory at least twice (once for the raw data, once for the parsed data). -It also meant that reading could not begin until the full vector was read through the connection. - -Now we instead write the connection to a temporary file (in the R temporary directory), than parse that temporary file. -This means connections may take a little longer to be read, but also means they will no longer need to fit into memory. -It also allows the use of the chunked readers to process the data in parts. - -Future improvements to readr would allow it to parse data from connections in a streaming fashion, which would avoid many of the drawbacks of either method. - -### Additional new features - -* `melt_*()` functions added for reading ragged data (#760, @nacnudus). -* `AccumulateCallback` R6 class added to provide an example of accumulating values in a single result (#689, @blakeboswell). -* `read_fwf()` can now accept overlapping field specifications (#692, @gergness) -* `type_convert()` now allows character column specifications and also silently - skips non-character columns (#369, #699) -* The `parse_*()` functions and `read_fwf()` gain a `trim_ws` argument to - control whether the fields should be trimmed before parsing (#636, #735). -* `parse_number()` now parses numbers in scientific notation using `e` and `E` - (#684, @sambrady3). -* Add `write_excel_csv2()` function to allow writing csv files with comma as a - decimal separator and semicolon as a column separator (#753, @olgamie). -* `read_*()` files now support reading from the clipboard by using `clipboard()` (#656). -* `write_file()` gains a `sep` argument, to specify the line separator (#665). -* Allow files to be read via FTP over SSH by recognising `sftp` as a URL protocol (#707, @jdeboer). -* `parse_date*() accepts `%a` for local day of week (#763, @tigertoes). -* Added function `read_lines_raw_chunked()` (#710, @gergness) -* `write_csv2()` added to complement `write_excel_csv2()` and allow writing csv file readable by `read_csv2()` - (#870, @cderv). -* `as.col_spec()` is now exported (#517). -* `write*()` functions gain a `quote_escape` argument to control how quotes are escaped in the output (#854). -* `read*()` functions now have a more informative error when trying to read a remote bz2 file (#891). -* `spec_table2()` function added to correspond to `read_table2()` (#778, @mawds). -* `parse_factor()` now has `levels = NULL` by default (#862, @mikmart). -* `"f"` can now be used as a shortcode for `col_factor()` in `cols()` and the - `col_types` argument to `read_delim()` and friends (#810, @mikmart). -* Functions now read connections to a temporary file rather than to an in-memory object (#610, #76). - -## Bug Fixes - -* `standardise_path()` now uses a case-insensitive comparison for the file extensions (#794). -* `parse_guess()` now guesses logical types when given (lowercase) 'true' and 'false' inputs (#818). -* `read_*()` now do not print a progress bar when running inside a RStudio notebook chunk (#793) -* `read_table2()` now skips comments anywhere in the file (#908). -* `parse_factor()` now handles the case of empty strings separately, so you can - have a factor level that is an empty string (#864). -* `read_delim()` now correctly reads quoted headers with embedded newlines (#784). -* `fwf_positions()` now always returns `col_names` as a character (#797). -* `format_*()` now explicitly marks it's output encoding as UTF-8 (#697). -* `read_delim()` now ignores whitespace between the delimiter and quoted fields (#668). -* `read_table2()` now properly ignores blank lines at the end of a file like - `read_table()` and `read_delim()` (#657). -* `read_delim()`, `read_table()` and `read_table()` now skip blank lines at the - start of a file (#680, #747). -* `guess_parser()` now guesses a logical type for columns which are all - missing. This is useful when binding multiple files together where some files - have missing columns. (#662). -* Column guessing will now never guess an integer type. This avoids issues - where double columns are incorrectly guessed as integers if they have only - integer values in the first 1000 (#645, #652). -* `read_*()` now converts string `file`s to UTF-8 before parsing, which is convenient for non-UTF-8 platforms - in most cases (#730, @yutannihilation). -* `write_csv()` writes integers up to 10^15 without scientific notation (#765, @zeehio) -* `read_*()` no longer throws a "length of NULL cannot be changed" warning when - trying to resize a skipped column (#750, #833). -* `read_*()` now handles non-ASCII paths properly with R >=3.5.0 on Windows (#838, @yutannihilation). -* `read*()`'s `trim_ws` parameter now trims both spaces and tabs (#767) - -# readr 1.1.1 - -* Point release for test compatibility with tibble v1.3.1. -* Fixed undefined behavior in localtime.c when using `locale(tz = "")` after - loading a timezone due to incomplete reinitialization of the global locale. - -# readr 1.1.0 - -## New features - -### Parser improvements -* `parse_factor()` gains a `include_na` argument, to include `NA` in the factor levels (#541). -* `parse_factor()` will now can accept `levels = NULL`, which allows one to generate factor levels based on the data (like stringsAsFactors = TRUE) (#497). -* `parse_numeric()` now returns the full string if it contains no numbers (#548). -* `parse_time()` now correctly handles 12 AM/PM (#579). -* `problems()` now returns the file path in additional to the location of the error in the file (#581). -* `read_csv2()` gives a message if it updates the default locale (#443, @krlmlr). -* `read_delim()` now signals an error if given an empty delimiter (#557). -* `write_*()` functions witting whole number doubles are no longer written with a trailing `.0` (#526). - -### Whitespace / fixed width improvements - -* `fwf_cols()` allows for specifying the `col_positions` argument of - `read_fwf()` with named arguments of either column positions or widths - (#616, @jrnold). -* `fwf_empty()` gains an `n` argument to control how many lines are read for whitespace to determine column structure (#518, @Yeedle). -* `read_fwf()` gives error message if specifications have overlapping columns (#534, @gergness) -* `read_table()` can now handle `pipe()` connections (#552). -* `read_table()` can now handle files with many lines of leading comments (#563). -* `read_table2()` which allows any number of whitespace characters as delimiters, a more exact replacement for `utils::read.table()` (#608). - -## Writing to connections -* `write_*()` functions now support writing to binary connections. In addition output filenames with `.gz`, `.bz2` or `.xz` will automatically open the appropriate connection and to write the compressed file. (#348) -* `write_lines()` now accepts a list of raw vectors (#542). - -## Miscellaneous features -* `col_euro_double()`, `parse_euro_double()`, `col_numeric()`, and `parse_numeric()` have been removed. -* `guess_encoding()` returns a tibble, and works better with lists of raw vectors (as returned by `read_lines_raw()`). -* `ListCallback` R6 Class to provide a more flexible return type for callback functions (#568, @mmuurr) -* `tibble::as.tibble()` now used to construct tibbles (#538). -* `read_csv`, `read_csv2`, and `read_tsv` gain a `quote` argument, (#631, @noamross) - -## Bugfixes -* `parse_factor()` now converts data to UTF-8 based on the supplied locale (#615). -* `read_*()` functions with the `guess_max` argument now throw errors on inappropriate inputs (#588). -* `read_*_chunked()` functions now properly end the stream if `FALSE` is returned from the callback. -* `read_delim()` and `read_fwf()` when columns are skipped using `col_types` now report the correct column name (#573, @cb4ds). -* `spec()` declarations that are long now print properly (#597). -* `read_table()` does not print `spec` when `col_types` is not `NULL` (#630, @jrnold). -* `guess_encoding()` now returns a tibble for all ASCII input as well (#641). - -# readr 1.0.0 - -## Column guessing - -The process by which readr guesses the types of columns has received a substantial overhaul to make it easier to fix problems when the initial guesses aren't correct, and to make it easier to generate reproducible code. Now column specifications are printing by default when you read from a file: - -```R -challenge <- read_csv(readr_example("challenge.csv")) -#> Parsed with column specification: -#> cols( -#> x = col_integer(), -#> y = col_character() -#> ) -``` - -And you can extract those values after the fact with `spec()`: - -```R -spec(challenge) -#> cols( -#> x = col_integer(), -#> y = col_character() -#> ) -``` - -This makes it easier to quickly identify parsing problems and fix them (#314). If the column specification is long, the new `cols_condense()` is used to condense the spec by identifying the most common type and setting it as the default. This is particularly useful when only a handful of columns have a different type (#466). - -You can also generating an initial specification without parsing the file using `spec_csv()`, `spec_tsv()`, etc. - -Once you have figured out the correct column types for a file, it's often useful to make the parsing strict. You can do this either by copying and pasting the printed output, or for very long specs, saving the spec to disk with `write_rds()`. In production scripts, combine this with `stop_for_problems()` (#465): if the input data changes form, you'll fail fast with an error. - -You can now also adjust the number of rows that readr uses to guess the column types with `guess_max`: - -```R -challenge <- read_csv(readr_example("challenge.csv"), guess_max = 1500) -#> Parsed with column specification: -#> cols( -#> x = col_double(), -#> y = col_date(format = "") -#> ) -``` - -You can now access the guessing algorithm from R. `guess_parser()` will tell you which parser readr will select for a character vector (#377). We've made a number of fixes to the guessing algorithm: - -* New example `extdata/challenge.csv` which is carefully created to cause - problems with the default column type guessing heuristics. - -* Blank lines and lines with only comments are now skipped automatically - without warning (#381, #321). - -* Single '-' or '.' are now parsed as characters, not numbers (#297). - -* Numbers followed by a single trailing character are parsed as character, - not numbers (#316). - -* We now guess at times using the `time_format` specified in the `locale()`. - -We have made a number of improvements to the reification of the `col_types`, `col_names` and the actual data: - -* If `col_types` is too long, it is subsetted correctly (#372, @jennybc). - -* If `col_names` is too short, the added names are numbered correctly - (#374, @jennybc). - -* Missing column name names are now given a default name (`X2`, `X7` etc) (#318). - Duplicated column names are now deduplicated. Both changes generate a warning; - to suppress it supply an explicit `col_names` (setting `skip = 1` if there's - an existing ill-formed header). - -* `col_types()` accepts a named list as input (#401). - -## Column parsing - -The date time parsers recognise three new format strings: - -* `%I` for 12 hour time format (#340). - -* `%AD` and `%AT` are "automatic" date and time parsers. They are both slightly - less flexible than previous defaults. The automatic date parser requires a - four digit year, and only accepts `-` and `/` as separators (#442). The - flexible time parser now requires colons between hours and minutes and - optional seconds (#424). - -`%y` and `%Y` are now strict and require 2 or 4 characters respectively. - -Date and time parsing functions received a number of small enhancements: - -* `parse_time()` returns `hms` objects rather than a custom `time` class (#409). - It now correctly parses missing values (#398). - -* `parse_date()` returns a numeric vector (instead of an integer vector) (#357). - -* `parse_date()`, `parse_time()` and `parse_datetime()` gain an `na` - argument to match all other parsers (#413). - -* If the format argument is omitted `parse_date()` or `parse_time()`, - date and time formats specified in the locale will be used. These now - default to `%AD` and `%AT` respectively. - -* You can now parse partial dates with `parse_date()` and - `parse_datetime()`, e.g. `parse_date("2001", "%Y")` returns `2001-01-01`. - -`parse_number()` is slightly more flexible - it now parses numbers up to the first ill-formed character. For example `parse_number("-3-")` and `parse_number("...3...")` now return -3 and 3 respectively. We also fixed a major bug where parsing negative numbers yielded positive values (#308). - -`parse_logical()` now accepts `0`, `1` as well as lowercase `t`, `f`, `true`, `false`. - -## New readers and writers - -* `read_file_raw()` reads a complete file into a single raw vector (#451). - -* `read_*()` functions gain a `quoted_na` argument to control whether missing - values within quotes are treated as missing values or as strings (#295). - -* `write_excel_csv()` can be used to write a csv file with a UTF-8 BOM at the - start, which forces Excel to read it as UTF-8 encoded (#375). - -* `write_lines()` writes a character vector to a file (#302). - -* `write_file()` to write a single character or raw vector - to a file (#474). - -* Experimental support for chunked reading a writing (`read_*_chunked()`) - functions. The API is unstable and subject to change in the future (#427). - -## Minor features and bug fixes - -* Printing double values now uses an - [implementation](https://github.com/juj/MathGeoLib/blob/master/src/Math/grisu3.c) - of the [grisu3 algorithm](http://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf) - which speeds up writing of large numeric data frames by ~10X. (#432) '.0' is - appended to whole number doubles, to ensure they will be read as doubles as - well. (#483) - -* readr imports tibble so that you get consistent `tbl_df` behaviour - (#317, #385). - -* New example `extdata/challenge.csv` which is carefully created to cause - problems with the default column type guessing heuristics. - -* `default_locale()` now sets the default locale in `readr.default_locale` - rather than regenerating it for each call. (#416). - -* `locale()` now automatically sets decimal mark if you set the grouping - mark. It throws an error if you accidentally set decimal and grouping marks - to the same character (#450). - -* All `read_*()` can read into long vectors, substantially increasing the - number of rows you can read (#309). - -* All `read_*()` functions return empty objects rather than signaling an error - when run on an empty file (#356, #441). - -* `read_delim()` gains a `trim_ws` argument (#312, noamross) - -* `read_fwf()` received a number of improvements: - - * `read_fwf()` now can now reliably read only a partial set of columns - (#322, #353, #469) - - * `fwf_widths()` accepts negative column widths for compatibility with the - `widths` argument in `read.fwf()` (#380, @leeper). - - * You can now read fixed width files with ragged final columns, by setting - the final end position in `fwf_positions()` or final width in `fwf_widths()` - to `NA` (#353, @ghaarsma). `fwf_empty()` does this automatically. - - * `read_fwf()` and `fwf_empty()` can now skip commented lines by setting a - `comment` argument (#334). - -* `read_lines()` ignores embedded null's in strings (#338) and gains a `na` - argument (#479). - -* `readr_example()` makes it easy to access example files bundled with readr. - -* `type_convert()` now accepts only `NULL` or a `cols` specification for - `col_types` (#369). - -* `write_delim()` and `write_csv()` now invisibly return the input data frame - (as documented, #363). - -* Doubles are parsed with `boost::spirit::qi::long_double` to work around a bug - in the spirit library when parsing large numbers (#412). - -* Fix bug when detecting column types for single row files without headers - (#333). - -# readr 0.2.2 - -* Fix bug when checking empty values for missingness (caused valgrind issue - and random crashes). - -# readr 0.2.1 - -* Fixes so that readr works on Solaris. - -# readr 0.2.0 - -## Internationalisation - -readr now has a strategy for dealing with settings that vary from place to place: locales. The default locale is still US centric (because R itself is), but you can now easily override the default timezone, decimal separator, grouping mark, day & month names, date format, and encoding. This has lead to a number of changes: - -* `read_csv()`, `read_tsv()`, `read_fwf()`, `read_table()`, - `read_lines()`, `read_file()`, `type_convert()`, `parse_vector()` - all gain a `locale` argument. - -* `locale()` controls all the input settings that vary from place-to-place. - -* `col_euro_double()` and `parse_euro_double()` have been deprecated. - Use the `decimal_mark` parameter to `locale()` instead. - -* The default encoding is now UTF-8. To load files that are not - in UTF-8, set the `encoding` parameter of the `locale()` (#40). - New `guess_encoding()` function uses stringi to help you figure out the - encoding of a file. - -* `parse_datetime()` and `parse_date()` with `%B` and `%b` use the - month names (full and abbreviate) defined in the locale (#242). - They also inherit the tz from the locale, rather than using an - explicit `tz` parameter. - -See `vignette("locales")` for more details. - -## File parsing improvements - -* `cols()` lets you pick the default column type for columns not otherwise - explicitly named (#148). You can refer to parsers either with their full - name (e.g. `col_character()`) or their one letter abbreviation (e.g. `c`). - -* `cols_only()` allows you to load only named columns. You can also choose to - override the default column type in `cols()` (#72). - -* `read_fwf()` is now much more careful with new lines. If a line is too short, - you'll get a warning instead of a silent mistake (#166, #254). Additionally, - the last column can now be ragged: the width of the last field is silently - extended until it hits the next line break (#146). This appears to be a - common feature of "fixed" width files in the wild. - -* In `read_csv()`, `read_tsv()`, `read_delim()` etc: - - * `comment` argument allows you to ignore comments (#68). - - * `trim_ws` argument controls whether leading and trailing whitespace is - removed. It defaults to `TRUE` (#137). - - * Specifying the wrong number of column names, or having rows with an - unexpected number of columns, generates a warning, rather than an error - (#189). - - * Multiple NA values can be specified by passing a character vector to - `na` (#125). The default has been changed to `na = c("", "NA")`. Specifying - `na = ""` now works as expected with character columns (#114). - -## Column parsing improvements - -Readr gains `vignette("column-types")` which describes how the defaults work and how to override them (#122). - -* `parse_character()` gains better support for embedded nulls: any characters - after the first null are dropped with a warning (#202). - -* `parse_integer()` and `parse_double()` no longer silently ignore trailing - letters after the number (#221). - -* New `parse_time()` and `col_time()` allows you to parse times (hours, minutes, - seconds) into number of seconds since midnight. If the format is omitted, it - uses a flexible parser that looks for hours, then optional colon, then - minutes, then optional colon, then optional seconds, then optional am/pm - (#249). - -* `parse_date()` and `parse_datetime()`: - - * `parse_datetime()` no longer incorrectly reads partial dates (e.g. 19, - 1900, 1900-01) (#136). These triggered common false positives and after - re-reading the ISO8601 spec, I believe they actually refer to periods of - time, and should not be translated in to a specific instant (#228). - - * Compound formats "%D", "%F", "%R", "%X", "%T", "%x" are now parsed - correctly, instead of using the ISO8601 parser (#178, @kmillar). - - * "%." now requires a non-digit. New "%+" skips one or more non-digits. - - * You can now use `%p` to refer to AM/PM (and am/pm) (#126). - - * `%b` and `%B` formats (month and abbreviated month name) ignore case - when matching (#219). - - * Local (non-UTC) times with and without daylight savings are now parsed - correctly (#120, @andres-s). - -* `parse_number()` is a somewhat flexible numeric parser designed to read - currencies and percentages. It only reads the first number from a string - (using the grouping mark defined by the locale). - -* `parse_numeric()` has been deprecated because the name is confusing - - it's a flexible number parser, not a parser of "numerics", as R collectively - calls doubles and integers. Use `parse_number()` instead. - -As well as improvements to the parser, I've also made a number of tweaks to the heuristics that readr uses to guess column types: - -* New `parse_guess()` and `col_guess()` to explicitly guess column type. - -* Bumped up row inspection for column typing guessing from 100 to 1000. - -* The heuristics for guessing `col_integer()` and `col_double()` are stricter. - Numbers with leading zeros now default to being parsed as text, rather than - as integers/doubles (#266). - -* A column is guessed as `col_number()` only if it parses as a regular number - when you ignoring the grouping marks. - -## Minor improvements and bug fixes - -* Now use R's platform independent `iconv` wrapper, thanks to BDR (#149). - -* Pathological zero row inputs (due to empty input, `skip` or `n_max`) now - return zero row data frames (#119). - -* When guessing field types, and there's no information to go on, use - character instead of logical (#124, #128). - -* Concise `col_types` specification now understands `?` (guess) and - `-` (skip) (#188). - -* `count_fields()` starts counting from 1, not 0 (#200). - -* `format_csv()` and `format_delim()` make it easy to render a csv or - delimited file into a string. - -* `fwf_empty()` now works correctly when `col_names` supplied (#186, #222). - -* `parse_*()` gains a `na` argument that allows you to specify which values - should be converted to missing. - -* `problems()` now reports column names rather than column numbers (#143). - Whenever there is a problem, the first five problems are printing out - in a warning message, so you can more easily see what's wrong. - -* `read_*()` throws a warning instead of an error is `col_types` - specifies a non-existent column (#145, @alyst). - -* `read_*()` can read from a remote gz compressed file (#163). - -* `read_delim()` defaults to `escape_backslash = FALSE` and - `escape_double = TRUE` for consistency. `n_max` also affects the number - of rows read to guess the column types (#224). - -* `read_lines()` gains a progress bar. It now also correctly checks for - interrupts every 500,000 lines so you can interrupt long running jobs. - It also correctly estimates the number of lines in the file, considerably - speeding up the reading of large files (60s -> 15s for a 1.5 Gb file). - -* `read_lines_raw()` allows you to read a file into a list of raw vectors, - one element for each line. - -* `type_convert()` gains `NA` and `trim_ws` arguments, and removes missing - values before determining column types. - -* `write_csv()`, `write_delim()`, and `write_rds()` all invisibly return their - input so you can use them in a pipe (#290). - -* `write_delim()` generalises `write_csv()` to write any delimited format (#135). - `write_tsv()` is a helpful wrapper for tab separated files. - - * Quotes are only used when they're needed (#116): when the string contains - a quote, the delimiter, a new line or NA. - - * Double vectors are saved using same amount of precision as - `as.character()` (#117). - - * New `na` argument that specifies how missing values should be written - (#187) - - * POSIXt vectors are saved in a ISO8601 compatible format (#134). - - * No longer fails silently if it can't open the target for - writing (#193, #172). - -* `write_rds()` and `read_rds()` wrap around `readRDS()` and `saveRDS()`, - defaulting to no compression (#140, @nicolasCoutin). diff --git a/revdep/library.noindex/eurostat/new/readr/R/readr b/revdep/library.noindex/eurostat/new/readr/R/readr deleted file mode 100644 index 66861563..00000000 --- a/revdep/library.noindex/eurostat/new/readr/R/readr +++ /dev/null @@ -1,27 +0,0 @@ -# File share/R/nspackloader.R -# Part of the R package, https://www.R-project.org -# -# Copyright (C) 1995-2012 The R Core Team -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# A copy of the GNU General Public License is available at -# https://www.r-project.org/Licenses/ - -local({ - info <- loadingNamespaceInfo() - pkg <- info$pkgname - ns <- .getNamespace(as.name(pkg)) - if (is.null(ns)) - stop("cannot find namespace environment for ", pkg, domain = NA); - dbbase <- file.path(info$libname, pkg, "R", pkg) - lazyLoad(dbbase, ns, filter = function(n) n != ".__NAMESPACE__.") -}) diff --git a/revdep/library.noindex/eurostat/new/readr/R/readr.rdb b/revdep/library.noindex/eurostat/new/readr/R/readr.rdb deleted file mode 100644 index 9ee552d8..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/R/readr.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/R/readr.rdx b/revdep/library.noindex/eurostat/new/readr/R/readr.rdx deleted file mode 100644 index 17f7ba21..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/R/readr.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/R/sysdata.rdb b/revdep/library.noindex/eurostat/new/readr/R/sysdata.rdb deleted file mode 100644 index 144b6be7..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/R/sysdata.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/R/sysdata.rdx b/revdep/library.noindex/eurostat/new/readr/R/sysdata.rdx deleted file mode 100644 index 70845d1f..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/R/sysdata.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/WORDLIST b/revdep/library.noindex/eurostat/new/readr/WORDLIST deleted file mode 100644 index 751bda6b..00000000 --- a/revdep/library.noindex/eurostat/new/readr/WORDLIST +++ /dev/null @@ -1,97 +0,0 @@ -Acknowledgements -Allaire -BCP -BDR -BH -BOM -Bugfixes -CMD -Cheatsheet -Cheng -Codecov -Colouring -Eddelbuettel -Florian -Garmonsway -Gb -Internationalisation -JJ -Loitsch -Māori -NaN -ORCID -PLDI -POSIXt -Preprocess -Rcpp -Rds -SSD -TSV -Timezones -Tokenize -Tokenizers -YMD -automata -behaviour -bz -bzip -centric -cli -coloured -cpp -csv -datetime -datetimes -deduplicated -delim -dplyr -durations -funder -fwf -generalises -github -grisu -gz -gzip -https -linux -localtime -lzma -macOS -mandreyel -meltr -mio -noamross -null's -nycflights -parsers -pkgdown -pre -programmatically -purrr -readr's -recognise -recognised -recognises -recognising -reinitialization -serialise -shortcode -specialisations -stringi -stringsAsFactors -subetting -testthat -tibble -tibbles -tidyverse -timezones -tokenization -tokenize -tokenizer -tsv -tz -tzdb -valgrind -vroom -xz diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/challenge.csv b/revdep/library.noindex/eurostat/new/readr/extdata/challenge.csv deleted file mode 100644 index d977e08b..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/challenge.csv +++ /dev/null @@ -1,2001 +0,0 @@ -x,y -404,NA -4172,NA -3004,NA -787,NA -37,NA -2332,NA -2489,NA -1449,NA -3665,NA -3863,NA -4374,NA -875,NA -172,NA -1602,NA -2012,NA -979,NA -2018,NA -319,NA -1944,NA -4878,NA -1450,NA -3392,NA -3677,NA -980,NA -4903,NA -3708,NA -258,NA -2652,NA -3480,NA -3443,NA -157,NA -1128,NA -1505,NA -3183,NA -2396,NA -2161,NA -3533,NA -4743,NA -902,NA -1085,NA -3401,NA -2495,NA -3209,NA -3302,NA -481,NA -3829,NA -3849,NA -4954,NA -4853,NA -1946,NA -2306,NA -1577,NA -874,NA -2658,NA -2469,NA -3897,NA -1021,NA -3567,NA -327,NA -1772,NA -4126,NA -1370,NA -2851,NA -1679,NA -2982,NA -958,NA -4739,NA -2713,NA -2724,NA -1393,NA -2234,NA -1858,NA -141,NA -2330,NA -1951,NA -101,NA -1885,NA -2800,NA -4286,NA -1925,NA -2640,NA -3004,NA -1307,NA -1451,NA -2401,NA -4601,NA -2004,NA -1066,NA -3359,NA -294,NA -4986,NA -746,NA -2593,NA -4231,NA -3592,NA -1207,NA -2736,NA -4175,NA -140,NA -2347,NA -4029,NA -4071,NA -2020,NA -1093,NA -2092,NA -3345,NA -2539,NA -3302,NA -2559,NA -4178,NA -3544,NA -4372,NA -58,NA -4442,NA -4982,NA -2501,NA -1795,NA -3875,NA -2923,NA -3170,NA -4294,NA -2835,NA -1265,NA -4595,NA -4337,NA -1243,NA -2015,NA -3849,NA -598,NA -974,NA -823,NA -3317,NA -4283,NA -4633,NA -2762,NA -2886,NA -3438,NA -1224,NA -224,NA -4550,NA -354,NA -4985,NA -3060,NA -863,NA -4548,NA -188,NA -2968,NA -1185,NA -4532,NA -4095,NA -3500,NA -1101,NA -3640,NA -1086,NA -2282,NA -1664,NA -2842,NA -1262,NA -2321,NA -4589,NA -4865,NA -4096,NA -4515,NA -2907,NA -3866,NA -4976,NA -3555,NA -1075,NA -1459,NA -3609,NA -4334,NA -1193,NA -23,NA -4718,NA -2191,NA -3754,NA -3340,NA -2040,NA -1757,NA -3691,NA -3322,NA -427,NA -4281,NA -385,NA -4265,NA -532,NA -2425,NA -1237,NA -3433,NA -819,NA -4765,NA -1610,NA -1808,NA -4439,NA -4141,NA -504,NA -4531,NA -3864,NA -1917,NA -4999,NA -1747,NA -4737,NA -1081,NA -161,NA -727,NA -4272,NA -1066,NA -1052,NA -198,NA -4724,NA -1225,NA -3906,NA -1442,NA -4377,NA -1479,NA -4918,NA -2950,NA -3796,NA -4181,NA -3815,NA -2087,NA -691,NA -405,NA -3280,NA -3011,NA -3285,NA -1647,NA -4898,NA -3576,NA -4364,NA -4917,NA -1093,NA -3323,NA -1948,NA -231,NA -3085,NA -2993,NA -2035,NA -4292,NA -2589,NA -4897,NA -86,NA -3368,NA -1857,NA -4591,NA -3390,NA -3326,NA -3781,NA -2715,NA -1197,NA -2545,NA -2087,NA -3635,NA -3189,NA -1983,NA -4798,NA -1494,NA -252,NA -2881,NA -1090,NA -630,NA -4691,NA -4007,NA -3791,NA -2663,NA -2735,NA -480,NA -1942,NA -862,NA -3454,NA -3377,NA -4732,NA -982,NA -4844,NA -1936,NA -3252,NA -4073,NA -355,NA -2635,NA -3818,NA -2177,NA -2763,NA -1021,NA -156,NA -4849,NA -894,NA -3892,NA -4429,NA -4183,NA -3027,NA -4535,NA -180,NA -658,NA -471,NA -3483,NA -2029,NA -329,NA -633,NA -4687,NA -1082,NA -3331,NA -1020,NA -2743,NA -4138,NA -638,NA -1306,NA -1443,NA -74,NA -4269,NA -2071,NA -3756,NA -3596,NA -2577,NA -4875,NA -1804,NA -852,NA -3916,NA -155,NA -3948,NA -834,NA -144,NA -3930,NA -4127,NA -4827,NA -1894,NA -872,NA -3019,NA -4028,NA -184,NA -3665,NA -1077,NA -81,NA -644,NA -3431,NA -3210,NA -1637,NA -1938,NA -3538,NA -3489,NA -4629,NA -2296,NA -2980,NA -826,NA -2835,NA -4491,NA -2973,NA -4159,NA -2968,NA -3895,NA -1989,NA -4250,NA -3710,NA -1589,NA -559,NA -506,NA -4001,NA -1900,NA -264,NA -4933,NA -3021,NA -744,NA -2694,NA -629,NA -4816,NA -235,NA -808,NA -4683,NA -4854,NA -3552,NA -4426,NA -4885,NA -175,NA -2194,NA -3223,NA -4975,NA -1574,NA -4280,NA -2702,NA -4368,NA -2578,NA -4348,NA -4283,NA -1729,NA -1,NA -1026,NA -4727,NA -1407,NA -4405,NA -4806,NA -21,NA -2765,NA -1097,NA -3234,NA -3639,NA -4363,NA -1910,NA -4464,NA -4220,NA -3649,NA -193,NA -1670,NA -3747,NA -4566,NA -1022,NA -2359,NA -1926,NA -1964,NA -1092,NA -37,NA -1819,NA -2631,NA -4221,NA -680,NA -1883,NA -1317,NA -2490,NA -98,NA -436,NA -4980,NA -4711,NA -622,NA -576,NA -1834,NA -2356,NA -3921,NA -2452,NA -510,NA -4718,NA -3531,NA -2512,NA -2650,NA -1293,NA -3559,NA -4843,NA -3306,NA -3982,NA -367,NA -4424,NA -4134,NA -3629,NA -1837,NA -2618,NA -2350,NA -493,NA -2581,NA -2249,NA -2748,NA -3248,NA -796,NA -1469,NA -4457,NA -2941,NA -3167,NA -1298,NA -1592,NA -1697,NA -3804,NA -55,NA -316,NA -1320,NA -2970,NA -1488,NA -474,NA -3807,NA -3863,NA -2010,NA -296,NA -3752,NA -2642,NA -1380,NA -1307,NA -2720,NA -996,NA -3226,NA -3752,NA -1355,NA -4379,NA -4259,NA -230,NA -1906,NA -917,NA -4609,NA -4531,NA -965,NA -4322,NA -67,NA -4429,NA -1958,NA -381,NA -3234,NA -4584,NA -4173,NA -2507,NA -3011,NA -2345,NA -4432,NA -3353,NA -1969,NA -2757,NA -1213,NA -1017,NA -342,NA -1537,NA -4966,NA -582,NA -3578,NA -1131,NA -667,NA -4637,NA -4471,NA -1019,NA -1285,NA -3071,NA -2208,NA -1578,NA -507,NA -1364,NA -3269,NA -4640,NA -134,NA -2798,NA -4271,NA -380,NA -1030,NA -2480,NA -1310,NA -2080,NA -2196,NA -912,NA -392,NA -89,NA -3641,NA -4855,NA -2677,NA -833,NA -291,NA -2296,NA -3114,NA -2975,NA -3716,NA -2622,NA -2485,NA -74,NA -4790,NA -2266,NA -4908,NA -2724,NA -1801,NA -2516,NA -374,NA -4849,NA -3243,NA -4923,NA -2681,NA -3806,NA -2822,NA -3893,NA -3196,NA -1895,NA -1798,NA -4222,NA -2284,NA -896,NA -4832,NA -3568,NA -125,NA -3133,NA -4140,NA -3216,NA -3543,NA -4354,NA -1410,NA -867,NA -549,NA -2932,NA -4254,NA -4608,NA -3379,NA -1753,NA -44,NA -2155,NA -3625,NA -2062,NA -2755,NA -782,NA -216,NA -3424,NA -2573,NA -4729,NA -4216,NA -325,NA -3811,NA -392,NA -668,NA -4049,NA -2797,NA -3669,NA -1749,NA -4914,NA -2045,NA -1805,NA -3263,NA -718,NA -3404,NA -4297,NA -4194,NA -4407,NA -1189,NA -2894,NA -4490,NA -1723,NA -3805,NA -3656,NA -4263,NA -4880,NA -566,NA -4852,NA -3241,NA -281,NA -2366,NA -1474,NA -3052,NA -606,NA -3148,NA -3560,NA -3061,NA -173,NA -3330,NA -3265,NA -2260,NA -2585,NA -3384,NA -4405,NA -3657,NA -1994,NA -2153,NA -728,NA -2256,NA -2894,NA -353,NA -3712,NA -2747,NA -3173,NA -684,NA -4652,NA -3256,NA -2644,NA -1126,NA -4917,NA -546,NA -350,NA -3889,NA -3292,NA -1297,NA -4592,NA -744,NA -3204,NA -1007,NA -3719,NA -4239,NA -4269,NA -4018,NA -120,NA -3977,NA -4433,NA -3001,NA -2164,NA -4602,NA -3081,NA -2179,NA -4487,NA -3846,NA -641,NA -2694,NA -646,NA -2555,NA -2719,NA -1209,NA -4016,NA -4740,NA -2037,NA -2574,NA -4908,NA -1771,NA -2280,NA -1101,NA -410,NA -1847,NA -634,NA -3700,NA -4780,NA -3344,NA -2341,NA -2691,NA -1655,NA -3144,NA -2263,NA -4441,NA -3922,NA -691,NA -1407,NA -3535,NA -2211,NA -3389,NA -3504,NA -343,NA -4793,NA -1223,NA -4632,NA -2514,NA -4678,NA -2194,NA -1753,NA -2383,NA -4831,NA -1486,NA -1454,NA -4299,NA -967,NA -4046,NA -1828,NA -1264,NA -4281,NA -651,NA -3960,NA -1780,NA -4822,NA -594,NA -2291,NA -2619,NA -4186,NA -168,NA -217,NA -3961,NA -1014,NA -344,NA -4323,NA -386,NA -2156,NA -4869,NA -2855,NA -3773,NA -1213,NA -3136,NA -843,NA -2224,NA -824,NA -592,NA -1838,NA -4733,NA -4378,NA -1301,NA -3287,NA -610,NA -1595,NA -3116,NA -2235,NA -3542,NA -4451,NA -522,NA -3153,NA -4208,NA -1822,NA -3115,NA -2304,NA -818,NA -2570,NA -717,NA -3252,NA -777,NA -2542,NA -430,NA -2516,NA -193,NA -4121,NA -1430,NA -1234,NA -1990,NA -3161,NA -4743,NA -1701,NA -3137,NA -4125,NA -726,NA -4836,NA -431,NA -1203,NA -3195,NA -2517,NA -1253,NA -4896,NA -3283,NA -450,NA -3153,NA -4384,NA -4652,NA -2098,NA -2478,NA -1764,NA -1244,NA -4794,NA -1800,NA -995,NA -3632,NA -841,NA -1133,NA -4228,NA -1730,NA -337,NA -136,NA -591,NA -69,NA -3679,NA -4620,NA -4911,NA -2027,NA -1349,NA -2442,NA -256,NA -13,NA -2480,NA -1219,NA -1279,NA -2762,NA -1258,NA -3143,NA -1581,NA -4623,NA -4533,NA -460,NA -3689,NA -2849,NA -3483,NA -3504,NA -200,NA -2158,NA -4072,NA -2833,NA -2942,NA -4402,NA -3597,NA -4683,NA -2148,NA -1431,NA -3854,NA -3083,NA -797,NA -2008,NA -9,NA -2090,NA -3820,NA -3973,NA -1213,NA -3796,NA -146,NA -2187,NA -2653,NA -2150,NA -4047,NA -4613,NA -3376,NA -470,NA -988,NA -2378,NA -3572,NA -2691,NA -4377,NA -1468,NA -1124,NA -3455,NA -1562,NA -2417,NA -609,NA -3451,NA -1579,NA -4081,NA -2730,NA -4737,NA -193,NA -3239,NA -399,NA -2165,NA -3805,NA -1469,NA -537,NA -365,NA -1782,NA -2858,NA -3390,NA -3454,NA -1868,NA -490,NA -496,NA -3875,NA -758,NA -1974,NA -4675,NA -3698,NA -3179,NA -1692,NA -4813,NA -559,NA -3253,NA -4918,NA -896,NA -690,NA -283,NA -2732,NA -2333,NA -4482,NA -93,NA -4255,NA -2508,NA -831,NA -1806,NA -3261,NA -4371,NA -3642,NA -2063,NA -797,NA -4229,NA -4422,NA -1980,NA -191,NA -4757,NA -3919,NA -1098,NA -1655,NA -889,NA -1813,NA -1958,NA -4520,NA -1383,NA -697,NA -2257,NA -552,NA -4405,NA -2670,NA -3697,NA -3598,NA -1323,NA -3370,NA -1049,NA -3453,NA -974,NA -3911,NA -76,NA -4671,NA -423,NA -171,NA -1555,NA -3924,NA -1403,NA -827,NA -2168,NA -4071,NA -3433,NA -3887,NA -457,NA -3714,NA -1984,NA -1481,NA -3715,NA -2333,NA -3866,NA -111,NA -4076,NA -1520,NA -4659,NA -2703,NA -1275,NA -2388,NA -3523,NA -38,NA -3863,NA -1329,NA -4856,NA -953,NA -99,NA -3062,NA -2629,NA -3173,NA -1978,NA -875,NA -1637,NA -3074,NA -396,NA -2596,NA -1532,NA -3357,NA -1969,NA -3740,NA -695,NA -1887,NA -3207,NA -4971,NA -1843,NA -1687,NA -4569,NA -4548,NA -0.23837975086644292,2015-01-16 -0.41167997173033655,2018-05-18 -0.7460716762579978,2015-09-05 -0.723450553836301,2012-11-28 -0.614524137461558,2020-01-13 -0.473980569280684,2016-04-17 -0.5784610391128808,2011-05-14 -0.2415937229525298,2020-07-18 -0.11437866208143532,2011-04-30 -0.2983446326106787,2010-05-11 -0.48411949491128325,2014-11-02 -0.5674063181504607,2014-06-23 -0.7539531090296805,2017-05-31 -0.5454252359922975,2017-11-18 -0.759677961235866,2013-04-20 -0.21296746260486543,2010-12-11 -0.8392650238238275,2022-10-10 -0.40669705532491207,2010-11-11 -0.8737398001831025,2015-03-22 -0.8821565378457308,2013-12-25 -0.10768936760723591,2011-02-27 -0.5745443711057305,2015-12-14 -0.996033379342407,2021-02-10 -0.8505534324795008,2012-11-28 -0.4376550551969558,2020-04-04 -0.32642992469482124,2021-04-08 -0.3359688585624099,2022-03-13 -0.23927381564863026,2010-03-28 -0.42137112445198,2023-01-04 -0.5121368307154626,2012-04-02 -0.1854463662020862,2015-11-09 -0.3264005221426487,2017-01-13 -0.8170736429747194,2011-02-25 -0.7487379980739206,2019-04-04 -0.5317418694030493,2022-04-01 -0.9615713683888316,2016-05-04 -0.10404637176543474,2010-06-02 -0.7371236665640026,2017-03-08 -0.847479980904609,2014-11-17 -0.6437387536279857,2011-07-08 -0.23245719773694873,2010-03-26 -0.9162295656278729,2015-11-20 -0.4245975555386394,2018-08-28 -0.19294350570999086,2017-09-17 -0.7015503356233239,2010-10-17 -0.9925807097461075,2023-08-21 -0.7089125071652234,2015-10-13 -0.5174851573538035,2017-09-09 -0.7087320478167385,2021-03-24 -0.3751404786016792,2016-03-01 -0.2547737658023834,2021-10-09 -0.9964129347354174,2020-05-17 -0.5228953601326793,2022-09-10 -0.7158094178885221,2011-02-13 -0.0024924282915890217,2010-09-04 -0.2929687723517418,2014-09-23 -0.1808160012587905,2010-01-16 -0.4075938919559121,2019-04-15 -0.21699588908813894,2018-04-11 -0.07134267035871744,2011-08-20 -0.2533115807455033,2021-08-08 -0.6524795212317258,2022-07-27 -0.7344441062305123,2013-06-29 -0.8175131441093981,2013-09-28 -0.30599033809266984,2014-10-16 -0.8852475683670491,2020-06-03 -0.6065588523633778,2015-07-15 -0.8810191683005542,2012-10-24 -0.6799206326249987,2018-01-16 -0.1429436623584479,2018-03-12 -0.7654655806254596,2010-12-14 -0.6269666294101626,2020-11-30 -0.7303384605329484,2020-06-26 -0.4237044109031558,2021-05-31 -0.26833077566698194,2010-02-14 -0.7690480363089591,2018-03-20 -0.587346678134054,2016-06-28 -0.8985677554737777,2015-05-10 -0.8703245387878269,2014-05-17 -0.39930623723194003,2010-11-04 -0.9651191120501608,2015-05-03 -0.49599104514345527,2020-10-09 -0.46659751585684717,2019-10-28 -0.10774453124031425,2011-02-08 -0.9142980496399105,2015-09-25 -0.14380344981327653,2010-12-23 -0.26518719107843935,2018-02-13 -0.14846304850652814,2019-01-31 -0.41424868325702846,2017-06-14 -0.10894967359490693,2020-09-16 -0.24707794794812799,2018-04-30 -0.5906431097537279,2011-03-23 -0.32826729747466743,2022-11-26 -0.7329705220181495,2022-05-31 -0.7279052240774035,2019-10-16 -0.5457234212663025,2018-10-09 -0.7337463176809251,2016-07-10 -0.9333583756815642,2010-05-17 -0.24339259508997202,2016-01-13 -0.282959054922685,2015-01-17 -0.2166259593795985,2018-04-14 -0.12004142836667597,2021-07-23 -0.17026365920901299,2019-08-09 -0.521528884768486,2018-11-05 -0.9634940281976014,2013-11-07 -0.8878725194372237,2020-03-21 -0.6364465965889394,2021-04-28 -0.32938025146722794,2019-08-24 -0.6022224121261388,2013-04-15 -0.7721615340560675,2016-06-14 -0.2101352927275002,2011-05-22 -0.5843083660583943,2020-01-13 -0.5420758109539747,2020-07-09 -0.09239664277993143,2023-02-06 -0.3693408251274377,2014-08-14 -0.9524294231086969,2013-10-20 -0.9496892413590103,2015-06-21 -0.44977682176977396,2013-04-15 -0.25981824356131256,2014-11-16 -0.018906170036643744,2014-04-12 -0.7214050476904958,2022-02-24 -0.9528096492867917,2012-12-04 -0.44022330385632813,2014-06-30 -0.5040123793296516,2019-01-16 -0.04355699848383665,2021-12-12 -0.9224744557868689,2019-03-08 -0.9237895561382174,2017-11-18 -0.60564771364443,2013-07-14 -0.004081981023773551,2011-03-07 -0.656856436515227,2021-07-19 -0.1509289499372244,2011-05-02 -0.1991606669034809,2016-04-16 -0.23963832925073802,2010-03-24 -0.6615739674307406,2018-07-28 -0.2417888215277344,2016-04-28 -0.07154973852448165,2014-09-22 -0.7046719279605895,2020-05-10 -0.3153969100676477,2011-01-25 -0.37587519478984177,2014-05-08 -0.8150977415498346,2012-07-01 -0.2005599664989859,2023-02-28 -0.30193018657155335,2020-11-25 -0.08772024232894182,2023-05-27 -0.1833201281260699,2011-04-21 -0.20680187526158988,2019-02-11 -0.8549594988580793,2021-09-28 -0.262909896671772,2013-11-29 -0.9453342743217945,2017-07-05 -0.7927354699932039,2012-10-08 -0.8315818924456835,2022-11-27 -0.618977224919945,2018-12-19 -0.44373362860642374,2022-12-03 -0.9646256130654365,2010-12-18 -0.16219870373606682,2010-12-27 -0.1856537905987352,2014-09-29 -0.6131014195270836,2021-06-09 -0.48148447810672224,2016-02-20 -0.3961378976237029,2021-11-17 -0.31875640782527626,2010-04-25 -0.8383750088978559,2023-08-19 -0.2992035255301744,2012-03-10 -0.6160618360154331,2010-07-12 -0.4621038355398923,2019-01-28 -0.939205955946818,2010-01-05 -0.006291386438533664,2016-07-03 -0.3494274849072099,2018-07-01 -0.5662713926285505,2016-05-30 -0.5289570635650307,2015-11-26 -0.6370153992902488,2016-09-02 -0.35079587949439883,2020-03-12 -0.9241711974609643,2013-03-27 -0.4740412225946784,2016-10-19 -0.7781341173686087,2011-10-24 -0.7987365354783833,2019-02-01 -0.878499910235405,2012-12-25 -0.9098438550718129,2020-02-29 -0.4455377559643239,2010-07-09 -0.28955932846292853,2018-12-04 -0.3033107363153249,2014-07-31 -0.9190243480261415,2013-01-11 -0.9357123947702348,2010-04-17 -0.6716483265627176,2021-01-05 -0.37126996577717364,2023-08-27 -0.5671314361970872,2014-12-16 -0.4785984419286251,2022-10-20 -0.5677487845532596,2019-01-04 -0.2865388400387019,2017-01-12 -0.759599128505215,2017-11-03 -0.22846577316522598,2020-07-20 -0.42650539334863424,2010-06-02 -0.45658472809009254,2011-05-26 -0.709906758973375,2014-03-05 -0.28745697857812047,2015-12-17 -0.7730602626688778,2015-12-28 -0.5745622855611145,2013-09-16 -0.02179576293565333,2022-02-27 -0.7730264803394675,2022-04-02 -0.05912893358618021,2017-01-29 -0.02764830063097179,2018-03-15 -0.7408465940970927,2018-12-18 -0.5933208465576172,2010-08-10 -0.6866767185274512,2022-05-06 -0.7353102252818644,2012-09-08 -0.46110520721413195,2021-01-18 -0.661999277304858,2016-01-22 -9.579434990882874e-4,2020-01-05 -0.9759655296802521,2015-02-08 -0.22016345639713109,2010-12-13 -0.30632783845067024,2015-11-29 -0.731566637288779,2017-08-03 -0.13350622565485537,2011-06-27 -0.0998360610101372,2022-05-10 -0.171385153895244,2010-05-24 -0.6171815898269415,2011-05-09 -0.6832633081357926,2016-05-01 -0.7905740689020604,2012-04-02 -0.21324812644161284,2017-01-09 -0.7920108856633306,2022-11-30 -0.5926344085019082,2019-04-13 -0.6062636019196361,2015-10-09 -0.11076854448765516,2022-07-20 -0.19560863845981658,2017-10-25 -0.007070775609463453,2014-08-21 -0.940870595164597,2021-04-29 -0.06820935127325356,2020-04-19 -0.13692918047308922,2013-03-20 -0.332817024551332,2014-08-25 -0.4896882916800678,2014-09-27 -0.17295454000122845,2014-02-20 -0.06493924162350595,2018-07-18 -0.45166698982939124,2013-05-20 -0.3794023538939655,2011-04-26 -0.9092983675654978,2012-07-29 -0.029946457827463746,2010-06-26 -0.19479636382311583,2017-02-12 -0.6794793712906539,2012-06-16 -0.7474663024768233,2017-11-09 -0.6495377144310623,2018-08-10 -0.07758067711256444,2013-09-19 -0.599653656128794,2017-12-03 -0.8790108121465892,2013-03-08 -0.7320371561218053,2011-09-25 -0.08005308615975082,2023-08-25 -0.8327498119324446,2016-06-30 -0.8647056978661567,2011-03-29 -0.712964971549809,2013-04-07 -0.757407110882923,2013-07-20 -0.12243391619995236,2010-05-10 -0.1936978818848729,2012-05-28 -0.31417828937992454,2018-06-28 -0.13753298204392195,2013-01-10 -0.8478028802201152,2010-11-25 -0.4852219868917018,2018-10-31 -0.47024272638373077,2014-04-13 -0.7910453744698316,2018-10-01 -0.31298327283002436,2023-05-03 -0.3087645126506686,2012-03-24 -0.34515533596277237,2017-04-30 -0.8284433148801327,2018-01-05 -0.2739954984281212,2014-05-14 -0.430836085928604,2016-05-30 -0.4168978400994092,2018-10-03 -0.13431219942867756,2011-01-24 -0.6863413986284286,2023-08-05 -0.17207811656408012,2021-11-10 -0.9234934435226023,2020-12-15 -0.6137435929849744,2021-10-08 -0.31562944664619863,2020-12-10 -0.8097330906894058,2014-07-09 -0.9023741011042148,2015-11-19 -0.1252977994736284,2012-12-28 -0.5655571934767067,2015-01-14 -0.12764110649004579,2010-06-23 -0.6275976162869483,2023-04-15 -0.07532395399175584,2011-10-16 -0.2854513239581138,2016-03-21 -0.31060242909006774,2021-09-18 -0.14672756171785295,2011-12-11 -0.7997705133166164,2010-12-16 -0.1719960793852806,2017-10-16 -0.7856838123407215,2010-10-30 -0.4700357641559094,2019-12-12 -0.4329577290918678,2020-09-13 -0.5745328599587083,2017-05-17 -0.7299699452705681,2021-09-27 -0.8941871484275907,2014-12-31 -0.2203063692431897,2015-11-07 -0.2915964382700622,2018-10-26 -0.8128987492527813,2022-11-17 -0.043602329678833485,2010-11-07 -0.5052716645877808,2015-09-10 -0.24165588174946606,2010-01-27 -0.5891424184665084,2021-04-13 -0.9711405686102808,2019-03-19 -0.23272100347094238,2019-01-11 -0.8674180153757334,2014-06-13 -0.1107617428060621,2011-05-18 -0.8014917799737304,2016-07-08 -0.6579244541935623,2012-12-21 -0.652054297272116,2013-10-21 -0.2263226448558271,2010-02-28 -0.8539796313270926,2018-03-15 -0.435607039835304,2016-02-28 -0.28928173682652414,2017-07-23 -0.6375846704468131,2022-09-07 -0.2645394585561007,2017-12-26 -0.38626837776973844,2011-01-09 -0.6191939699929208,2011-06-02 -0.5416780826635659,2022-09-20 -0.4848310004454106,2013-06-22 -0.7642949193250388,2013-02-18 -0.9610269367694855,2014-07-02 -0.2705845332238823,2015-03-19 -0.7306002208497375,2013-10-21 -0.13416554615832865,2018-08-28 -0.04839822766371071,2014-03-08 -0.7036070702597499,2013-09-21 -0.14721379429101944,2015-02-19 -0.769155333051458,2015-04-04 -0.17635010997764766,2021-04-26 -0.11075899936258793,2016-02-12 -0.9383424082770944,2019-09-09 -0.8464711401611567,2020-11-07 -0.5711435815319419,2021-02-15 -0.6790934063028544,2015-05-18 -0.08932224358431995,2013-11-12 -0.7853741250000894,2023-06-25 -0.22695744805969298,2013-07-10 -0.44817846501246095,2021-10-23 -0.16122763720341027,2019-11-16 -0.1761116897687316,2020-07-24 -0.19822812359780073,2010-10-08 -0.3576113139279187,2011-07-23 -0.1813332038000226,2019-12-15 -0.5611448597628623,2018-08-10 -0.6590830096974969,2020-08-27 -0.6602534090634435,2014-01-24 -0.0024007875472307205,2020-10-14 -0.9934460341464728,2022-05-01 -0.6274892308283597,2016-05-05 -0.014630335848778486,2017-01-02 -0.20517821749672294,2012-05-28 -0.6630766640882939,2014-09-28 -0.4637440303340554,2018-06-23 -0.36034815781749785,2013-05-03 -0.6893663913942873,2022-12-04 -0.258860788308084,2010-12-07 -0.8512050320859998,2021-03-23 -0.4800046910531819,2022-09-04 -0.5372663901653141,2014-05-05 -0.6616398973856121,2014-12-28 -0.3008545101620257,2010-11-11 -0.2635015156120062,2016-08-17 -0.305046129738912,2010-07-24 -0.8749582655727863,2022-03-28 -0.7184372169431299,2017-11-15 -0.40691969403997064,2011-03-23 -0.019359473139047623,2022-02-21 -0.050180358812212944,2013-11-17 -0.7022510319948196,2015-09-28 -0.06637026951648295,2013-04-16 -0.03613236825913191,2010-10-27 -0.020153695717453957,2010-06-09 -0.37278109695762396,2018-10-31 -0.22566540399566293,2015-07-07 -0.4919181000441313,2019-04-10 -0.4466451567132026,2015-01-19 -0.6902048990596086,2012-08-29 -0.8427399797365069,2015-07-02 -0.37583366711623967,2020-04-06 -0.9848896882031113,2019-04-10 -0.9524263297207654,2013-10-15 -0.989898509113118,2014-06-03 -0.4431283543817699,2016-02-11 -0.1537638516165316,2017-03-03 -0.9447273225523531,2016-08-05 -0.5194664136506617,2013-02-19 -0.45563460420817137,2018-09-24 -0.22009019972756505,2010-03-19 -0.139182384358719,2022-12-23 -0.216157881077379,2015-08-03 -0.4056786729488522,2012-12-04 -0.23373459139838815,2021-01-29 -0.025066359667107463,2015-08-08 -0.7523419591598213,2012-04-06 -0.7320725433528423,2011-01-09 -0.40910677472129464,2014-03-02 -0.6308578054886311,2014-02-10 -0.0654449830763042,2012-06-09 -0.14869215176440775,2022-04-15 -0.279701764928177,2010-12-05 -0.8506568092852831,2013-03-31 -0.021540780318900943,2015-12-12 -0.2528298799879849,2017-08-22 -0.6567115010693669,2022-12-01 -0.7891494096256793,2021-05-22 -0.7088456475175917,2021-07-27 -0.06459299195557833,2013-06-05 -0.511311343871057,2011-09-22 -0.20092834974639118,2021-11-28 -0.8141155925113708,2012-06-27 -0.6537800759542733,2023-08-08 -0.35325198201462626,2023-09-06 -0.5965948959346861,2023-02-18 -0.7277043734211475,2011-12-15 -0.9955685392487794,2010-11-12 -0.49805527180433273,2013-04-25 -0.23029476939700544,2022-08-15 -0.30125431274063885,2015-10-09 -0.7204666768666357,2014-09-26 -0.2614054181613028,2020-07-25 -0.1076963481027633,2019-06-03 -0.2624227120541036,2016-07-28 -0.18670618324540555,2020-06-17 -0.5424416796304286,2022-05-26 -0.06551847420632839,2010-07-05 -0.8803851366974413,2017-04-26 -0.2792125369887799,2022-02-19 -0.6727036715019494,2013-08-15 -0.060130874160677195,2010-10-19 -0.9884855502750725,2020-03-08 -0.28227543109096587,2021-11-05 -0.5541123666334897,2016-12-14 -0.8900840044952929,2023-02-13 -0.02280205488204956,2020-05-13 -0.6776884538121521,2016-03-20 -0.33705979655496776,2023-05-22 -0.14119609468616545,2016-06-13 -0.3525639877188951,2016-07-15 -0.4014448565430939,2018-06-22 -0.8889143522828817,2018-02-23 -0.31261418759822845,2017-08-24 -0.06165470811538398,2016-09-23 -0.6794862640090287,2022-10-15 -0.3781625689007342,2012-10-13 -0.5883703480940312,2017-04-03 -0.4919785351958126,2022-08-05 -0.28577694413252175,2019-01-01 -0.008419594960287213,2013-03-19 -0.5507742969784886,2017-07-26 -0.8132309077773243,2022-06-09 -0.6435745854396373,2020-10-10 -0.06906200293451548,2012-11-09 -0.7287162716966122,2018-10-09 -0.6721111985389143,2023-03-13 -0.8198009913321584,2020-06-12 -0.9146215580403805,2020-04-28 -0.6899706807453185,2017-07-02 -0.49197780271060765,2017-05-03 -0.6469286507926881,2013-03-16 -0.45651495666243136,2018-08-04 -0.12544662156142294,2015-05-05 -0.6043649739585817,2017-03-28 -0.8268267358653247,2013-11-16 -0.6193782512564212,2018-02-09 -0.8410537105519325,2019-07-27 -0.42724660760723054,2023-05-16 -0.7692867037840188,2011-06-25 -0.712140791118145,2012-05-04 -0.0633672084659338,2013-02-15 -0.4260052361059934,2013-12-13 -0.08827764308080077,2022-12-02 -0.20831681927666068,2018-03-25 -0.22826087311841547,2014-12-11 -0.05044214380905032,2015-10-10 -0.5618212523404509,2010-11-23 -0.6942461444996297,2019-02-13 -0.22794265439733863,2022-10-21 -0.9603136049117893,2017-03-27 -0.4928371913265437,2020-12-18 -0.7232086854055524,2010-11-08 -0.49136308254674077,2018-08-31 -0.8453550811391324,2019-03-31 -0.025109663605690002,2019-06-20 -0.5484002430457622,2021-01-29 -0.9554548165760934,2021-02-03 -0.14050186681561172,2011-05-02 -0.7102736248634756,2012-10-14 -0.12640188890509307,2011-12-04 -0.8356562776025385,2019-02-18 -0.2981795039959252,2011-10-05 -0.381328749936074,2011-06-13 -0.24784933566115797,2016-12-21 -0.3449816491920501,2020-04-22 -0.41978342621587217,2016-09-24 -0.6591099870856851,2012-11-27 -0.9539570489432663,2015-05-07 -0.4698936538770795,2018-12-25 -0.15062109171412885,2016-09-18 -0.9025228463578969,2016-09-11 -0.4380257027223706,2020-11-21 -0.8067555839661509,2011-04-22 -0.48149546841159463,2013-02-07 -0.25803821301087737,2013-04-14 -0.17013581050559878,2019-08-23 -0.1606106914114207,2010-12-23 -0.66139040957205,2010-10-18 -0.46855212026275694,2016-05-22 -0.5453928408678621,2012-03-21 -0.725098253460601,2017-03-01 -0.5254825404845178,2023-05-15 -0.618936445331201,2011-01-30 -0.1789609114639461,2010-06-11 -0.7677212303970009,2015-08-10 -0.8162949671968818,2012-06-27 -0.19458237988874316,2020-03-18 -0.21251409477554262,2010-05-09 -0.24883011914789677,2012-04-04 -0.7480038029607385,2012-11-25 -0.40724376146681607,2013-05-02 -0.5616738076787442,2010-06-04 -0.7505097503308207,2011-05-16 -0.5511977674905211,2013-02-07 -0.473349581239745,2011-04-24 -0.06262986944057047,2013-10-19 -0.0939460473600775,2010-11-26 -0.5801826189272106,2013-02-20 -0.38567587174475193,2017-11-19 -0.2365208996925503,2020-05-09 -0.5195376325864345,2022-12-20 -0.6412099292501807,2016-07-10 -0.829900240059942,2015-10-24 -0.9190941501874477,2010-06-06 -0.9294001522939652,2016-08-21 -0.6453137448988855,2011-05-23 -0.783117612125352,2019-10-06 -0.05871596094220877,2010-07-07 -0.35836152103729546,2020-02-18 -0.479386042105034,2014-03-09 -0.7230917664710432,2018-06-27 -0.6964026989880949,2010-07-27 -0.870710554998368,2014-09-25 -0.708805855596438,2017-01-25 -0.3548054692801088,2018-10-31 -0.8072527183685452,2016-03-03 -0.35278886649757624,2021-05-23 -0.7531260862015188,2013-09-13 -0.9081510829273611,2020-06-04 -0.4353852095082402,2017-09-21 -0.22024713945575058,2011-09-24 -0.03718220675364137,2013-06-24 -0.6980540752410889,2012-03-27 -0.14983401424251497,2015-01-20 -0.5424376127775759,2012-06-12 -0.7967723628971726,2020-01-16 -0.7196246690582484,2016-06-26 -0.7281896565109491,2021-08-12 -0.04781616129912436,2011-04-14 -0.45137571380473673,2011-10-05 -0.794269957812503,2013-10-29 -0.8246223253663629,2021-03-27 -0.20905156270600855,2015-05-28 -0.16820653341710567,2022-02-26 -0.9802742237225175,2018-02-20 -0.600670009618625,2013-05-17 -0.15167629974894226,2015-02-23 -0.29273867909796536,2011-11-17 -0.4480606229044497,2011-05-10 -0.8239078253973275,2018-10-18 -0.9694043302442878,2021-03-12 -0.29540916392579675,2012-02-24 -0.23268974153324962,2017-01-04 -0.3254810383077711,2019-09-24 -0.10037211910821497,2014-12-24 -0.3302253605797887,2019-02-27 -0.19259870192036033,2019-11-13 -0.26887363637797534,2017-06-03 -0.8835293431766331,2015-05-22 -0.6706231615971774,2015-06-24 -0.07432106742635369,2013-10-07 -0.6853092038072646,2012-04-03 -0.6008155907038599,2021-11-15 -0.7061404753476381,2018-12-12 -0.4681660116184503,2015-05-16 -0.01098793395794928,2021-07-27 -0.7832956942729652,2022-02-13 -0.6218532985076308,2020-01-30 -0.8660587386693805,2018-10-23 -0.919852337334305,2014-04-23 -0.3253989245276898,2013-02-12 -0.9157620661426336,2010-11-15 -0.08054490759968758,2011-01-29 -0.8555176814552397,2020-01-06 -0.30502897896803916,2012-05-30 -0.7363630407489836,2022-03-12 -0.940962569322437,2022-08-28 -0.8610232374630868,2017-09-14 -0.3641701233573258,2022-09-04 -0.9125234829261899,2022-08-07 -0.752922203624621,2012-02-01 -0.6414824086241424,2018-12-17 -0.7954503307119012,2018-05-07 -0.9849717258475721,2018-08-07 -0.6223692377097905,2014-09-25 -0.5553264871705323,2010-12-29 -0.9610665023792535,2018-03-21 -0.9156397173646837,2012-11-27 -0.6032756008207798,2011-06-04 -0.311554106650874,2019-04-29 -0.5551521240267903,2016-03-22 -0.9375977437011898,2011-09-19 -0.36503715231083333,2022-07-30 -0.33863229816779494,2015-05-20 -0.7696835622191429,2010-12-17 -0.301342302467674,2019-04-06 -0.6296409552451223,2016-05-21 -0.8024997254833579,2016-10-03 -0.5422355639748275,2019-09-10 -0.6309975676704198,2014-01-11 -0.18978887028060853,2012-10-27 -0.20345269003883004,2021-01-31 -0.9283512588590384,2019-08-10 -0.41344345500692725,2020-07-21 -0.13096988503821194,2015-08-18 -0.061163004487752914,2015-12-14 -0.8860738726798445,2017-09-16 -0.5922085058409721,2013-02-06 -0.7224121852777898,2010-07-19 -0.5123929986730218,2011-06-11 -0.29606865253299475,2014-10-14 -0.6397780675906688,2012-01-22 -0.8825434281025082,2020-08-10 -0.9461507303640246,2016-09-08 -0.709416676312685,2020-02-03 -0.9236205760389566,2015-05-14 -0.016221591737121344,2018-10-01 -0.17147828871384263,2019-05-26 -0.21398976421914995,2021-01-18 -0.8451151894405484,2021-03-27 -0.24332171166315675,2018-04-24 -0.5150503544136882,2012-03-23 -0.8631874904967844,2020-02-02 -0.040558676002547145,2010-12-07 -0.4600282253231853,2020-09-25 -0.16600484843365848,2020-11-13 -0.9153843396343291,2011-02-14 -0.4094238232355565,2021-07-25 -0.6405321785714477,2016-03-05 -0.16481841239146888,2021-09-10 -0.18098014616407454,2023-01-09 -0.996452712919563,2016-06-16 -0.6451109414920211,2013-10-23 -0.9180984173435718,2021-05-11 -0.7950654453597963,2020-06-26 -0.9130970847327262,2014-10-20 -0.3905595827382058,2012-01-11 -0.3574004932306707,2014-08-19 -0.6143616286572069,2023-01-08 -0.1924407461192459,2014-05-16 -0.07183849718421698,2011-11-15 -0.3062329371459782,2010-08-17 -0.17457634513266385,2014-02-24 -0.8877611239440739,2012-05-12 -0.4978482248261571,2015-05-29 -0.693908091634512,2015-01-04 -0.874216026859358,2020-02-01 -0.01808677427470684,2018-10-07 -0.3819870548322797,2015-11-26 -0.5135930245742202,2017-02-10 -0.04722265945747495,2014-10-05 -0.8030951099935919,2021-12-03 -0.6340869336854666,2015-01-20 -0.7713282140903175,2014-02-04 -0.5017637426499277,2018-04-18 -0.7112887632101774,2019-05-16 -0.09189838543534279,2019-08-08 -0.10590877430513501,2022-08-16 -0.22491388185881078,2020-04-28 -0.4176635534968227,2016-05-30 -0.3440130678936839,2020-12-01 -0.6642059565056115,2014-10-01 -0.44336367142386734,2019-04-05 -0.30618356238119304,2019-08-04 -0.26934600668027997,2018-03-07 -0.27042659488506615,2012-12-02 -0.0976896530482918,2018-08-12 -0.9920599514152855,2018-03-05 -0.1045265388675034,2018-06-14 -0.43448846065439284,2012-12-26 -0.684687570668757,2014-04-01 -0.329821523046121,2019-12-01 -0.39954269072040915,2016-02-12 -0.6991565418429673,2021-11-11 -0.2425231086090207,2016-11-23 -0.027535082073882222,2012-05-15 -0.07009002240374684,2020-11-12 -0.023703276878222823,2020-05-19 -0.20660110423341393,2012-07-12 -0.6988863211590797,2014-08-06 -0.9813835630193353,2013-03-17 -0.7816515797749162,2011-09-26 -0.6054745719302446,2019-03-02 -0.20836171018891037,2018-02-10 -0.7636784943751991,2012-10-04 -0.8187859968747944,2015-10-27 -0.7611123095266521,2012-11-22 -0.8286271207034588,2010-08-30 -0.008509289706125855,2016-06-28 -0.08882123627699912,2023-04-25 -0.91988012520596385,2011-04-07 -0.6383964512497187,2012-11-01 -0.4169857541564852,2013-05-04 -0.7020355253480375,2018-11-22 -0.16102612484246492,2013-07-26 -0.3779098354279995,2014-06-06 -0.9751168165821582,2019-01-21 -0.4035551785491407,2013-04-01 -0.723759297747165,2021-05-05 -0.38518987968564034,2019-02-15 -0.38908845093101263,2017-05-29 -0.12964176665991545,2011-08-30 -0.2847507023252547,2013-12-29 -0.13074389309622347,2022-06-02 -0.4740489721298218,2012-06-11 -0.9800091898068786,2022-07-08 -0.16834043501876295,2017-12-26 -0.18153826682828367,2015-07-02 -0.8789390495512635,2017-06-27 -0.6766599684488028,2014-08-06 -0.5074436131399125,2022-06-22 -0.4814086586702615,2021-10-30 -0.9683199205901474,2011-06-18 -0.24795010755769908,2020-04-03 -0.13281461247242987,2017-12-24 -0.06826614774763584,2017-01-06 -0.40022375574335456,2014-01-08 -0.34733960195444524,2023-07-28 -0.08134637214243412,2022-07-29 -0.04008660069666803,2023-08-17 -0.26790826581418514,2021-09-06 -0.4845776897855103,2022-02-24 -0.6038457204122096,2016-04-07 -0.2126810213085264,2011-06-13 -0.08015722362324595,2013-10-31 -0.17985428147949278,2018-12-23 -0.7949596226681024,2015-02-25 -0.5292033553123474,2021-04-19 -0.4661243304144591,2019-05-10 -0.8921737256459892,2014-05-12 -0.7419538695830852,2011-11-06 -0.7637358212377876,2022-12-01 -0.8440997828729451,2018-03-08 -0.7052174902055413,2019-12-05 -0.9484422185923904,2014-04-20 -0.14429178135469556,2019-04-22 -0.8038033130578697,2013-09-01 -0.2943441355600953,2013-02-16 -0.38137339940294623,2015-10-28 -0.23724128119647503,2021-05-20 -0.34614214673638344,2012-06-30 -0.42900022584944963,2017-09-05 -0.5998602632898837,2018-09-17 -0.565516313072294,2013-01-10 -0.4661923705134541,2019-02-25 -0.23348797275684774,2022-07-29 -0.740812616655603,2011-04-18 -0.29534474899992347,2021-03-29 -0.08237326238304377,2014-10-04 -0.27436478761956096,2021-07-29 -0.9310599053278565,2021-01-23 -0.8814145622309297,2019-08-20 -0.4742308217100799,2011-11-21 -0.5750370132736862,2012-03-20 -0.21033262298442423,2013-10-07 -0.5982999296393245,2022-01-31 -0.02650217106565833,2021-02-16 -0.8523679610807449,2014-02-21 -0.5338073449674994,2011-02-25 -0.09864674136042595,2015-06-13 -0.6973787155002356,2010-09-05 -0.6462127384729683,2015-02-02 -0.9212825754657388,2013-12-09 -0.28879159269854426,2017-04-01 -0.65436782524921,2010-03-17 -0.6188365686684847,2015-07-05 -0.644347591791302,2011-12-24 -0.5879467707127333,2011-03-01 -0.9590033662971109,2021-08-27 -0.16798287397250533,2016-08-17 -0.24776496808044612,2021-09-24 -0.5207485517021269,2019-01-31 -0.13296581688337028,2020-05-10 -0.8159506213851273,2017-12-10 -0.30784280761145055,2017-08-09 -0.3464580220170319,2010-08-14 -0.32439053687267005,2015-10-04 -0.8299951327499002,2020-02-17 -0.16978011513128877,2017-01-12 -0.27819421770982444,2012-03-11 -0.3639769915025681,2018-10-17 -0.06989352311939001,2021-05-26 -0.5890974695794284,2017-07-12 -0.08413626649416983,2010-09-03 -0.2758814513217658,2013-11-30 -0.0892041027545929,2021-09-30 -0.9139310284517705,2017-08-14 -0.23067126562818885,2016-04-02 -0.9596100023481995,2018-09-28 -0.31913768011145294,2023-04-20 -0.43079651868902147,2020-06-18 -0.9163004402071238,2011-10-02 -0.8421652615070343,2022-01-12 -0.9530339573975652,2015-05-05 -0.3136253524571657,2012-08-28 -0.8803836130537093,2012-07-18 -0.29948478611186147,2021-10-23 -0.4408169274684042,2017-08-04 -0.44570411927998066,2019-03-12 -0.42943084822036326,2013-02-09 -0.8614283904898912,2010-01-27 -0.7890478519257158,2019-07-23 -0.3662304144818336,2023-07-17 -0.33877988043241203,2015-10-21 -0.9619562041480094,2017-03-21 -0.8873374862596393,2017-01-02 -0.4318412118591368,2018-11-03 -0.8925788707565516,2018-10-07 -0.1908249231055379,2017-07-06 -0.753541242564097,2016-09-09 -0.18671885086223483,2019-11-10 -0.4893101565539837,2021-12-21 -0.1323064104653895,2021-10-13 -0.6215600143186748,2018-11-04 -0.3441609856672585,2020-06-19 -0.5986538652796298,2018-08-01 -0.5948208479676396,2017-04-27 -0.08747628959827125,2012-10-14 -0.7449057816993445,2022-07-29 -0.7255401618313044,2022-07-30 -0.802798884222284,2015-04-04 -0.5034499294124544,2015-10-23 -0.26467121997848153,2014-03-05 -0.5361411133781075,2018-04-26 -0.2134377434849739,2018-10-31 -0.2555720009841025,2011-12-01 -0.3432095227763057,2023-09-05 -0.3149803134147078,2010-02-20 -0.903441054513678,2012-09-27 -0.5070839948020875,2013-12-28 -0.8868092112243176,2013-01-28 -0.19502249849028885,2016-06-14 -0.9889192474074662,2018-01-26 -0.9127213363535702,2021-08-17 -0.7590857506729662,2020-11-15 -0.8878286243416369,2018-01-05 -0.2729664109647274,2019-03-11 -0.9270147723145783,2014-04-03 -0.8476126017048955,2012-12-01 -0.4657681928947568,2022-10-19 -0.6940696041565388,2014-01-04 -0.26842982484959066,2013-11-07 -0.19049296411685646,2019-09-04 -0.41361317480914295,2023-01-19 -0.23820438305847347,2010-08-31 -0.09241898846812546,2012-03-04 -0.2726121188607067,2019-08-02 -0.009083196753636003,2022-03-06 -0.629982847487554,2022-06-09 -0.07927433913573623,2021-10-07 -0.3504166591446847,2022-12-17 -0.6004056162200868,2013-09-14 -0.9690369053278118,2017-03-29 -0.6163354294840246,2019-07-03 -0.5224107033573091,2013-04-09 -0.5226436799857765,2019-04-11 -0.00876278686337173,2012-08-17 -0.4591184495948255,2022-10-01 -0.4761861457955092,2015-03-13 -0.974526327336207,2021-02-08 -0.6641715527512133,2010-07-26 -0.8101816652342677,2014-01-19 -0.9218756454065442,2021-08-26 -0.09567142208106816,2022-05-02 -0.9353634966537356,2023-07-12 -0.5359931767452508,2019-11-19 -0.8296154425479472,2023-02-19 -0.8165666493587196,2011-04-23 -0.30543361068703234,2017-06-16 -0.7086418280377984,2018-07-20 -0.17579243425279856,2020-09-14 -0.19219414866529405,2022-02-06 -0.18565151165239513,2022-05-09 -0.4843596222344786,2021-03-21 -0.7586447366047651,2015-04-13 -0.3020715794991702,2012-12-15 -0.38378978963010013,2019-08-14 -0.18092394573614,2014-08-31 -0.6372511743102223,2017-02-25 -0.5597414104267955,2019-05-10 -0.8500275288242847,2023-06-13 -0.6701601550448686,2017-11-09 -0.6118010880891234,2020-09-14 -0.9065461044665426,2011-04-10 -0.3120599687099457,2016-12-10 -0.5973760541528463,2022-01-16 -0.6979898712597787,2021-03-17 -0.8268592851236463,2018-02-06 -0.9671381479129195,2017-02-22 -0.36611850443296134,2019-05-22 -0.8452709591947496,2023-02-05 -0.391217652708292,2014-01-22 -0.6951273591257632,2020-03-19 -0.6493835819419473,2022-07-17 -0.023566172923892736,2013-09-16 -0.926038958132267,2011-04-28 -0.9850510796532035,2016-04-15 -0.9585321145132184,2020-02-05 -0.26632869709283113,2013-01-09 -0.6759593775495887,2021-07-09 -0.8263764544390142,2011-06-13 -0.7603731814306229,2015-01-14 -0.3346221512183547,2019-10-18 -0.9804811442736536,2016-05-18 -0.9473683452233672,2013-09-15 -0.509538036538288,2010-08-04 -0.3867357175331563,2018-12-18 -0.5971393240615726,2012-06-02 -0.13570102746598423,2021-02-28 -0.6072117269504815,2020-11-05 -0.6190444205421954,2016-11-16 -0.1604869430884719,2019-08-06 -0.22741486108861864,2012-09-16 -0.4889993858523667,2021-07-24 -0.26625592773780227,2022-03-23 -0.986886880826205,2020-11-30 -0.6590274758636951,2018-10-18 -0.5617879598867148,2019-01-19 -0.6039721027482301,2013-01-01 -0.19239175505936146,2013-06-26 -0.3716695522889495,2014-09-30 -0.12009952031075954,2019-09-14 -0.3957092612981796,2010-01-04 -0.03923126310110092,2014-01-15 -0.6294073443859816,2012-06-19 -0.5232696952298284,2015-12-01 -0.3931053976994008,2022-04-14 -0.8778933002613485,2013-01-14 -0.2882499238476157,2017-05-17 -0.6321781876031309,2013-09-23 -0.313025128794834,2010-11-25 -0.14582274248823524,2023-01-05 -0.8205009659286588,2017-03-13 -0.7456198027357459,2020-12-14 -0.6778734670951962,2010-03-23 -0.20513771777041256,2018-08-29 -0.9919730878900737,2018-09-19 -0.6689565279521048,2014-09-11 -0.7538818956818432,2022-12-29 -0.6451980541460216,2021-03-04 -0.10516616073437035,2023-05-21 -0.04980481299571693,2022-02-03 -0.5507950552273542,2018-01-16 -0.027205367805436254,2016-08-03 -0.18725806567817926,2013-01-15 -0.6483364240266383,2020-09-27 -0.8247189852409065,2011-10-22 -0.9155435566790402,2022-01-10 -0.8255569902248681,2021-08-03 -0.7955550437327474,2015-05-20 -0.6881147245876491,2021-02-07 -0.3386629270389676,2015-03-01 -0.46830290742218494,2010-09-07 -0.8369869156740606,2015-04-22 -0.7704877557698637,2018-02-24 -0.5956799318082631,2012-11-21 -0.5965282435063273,2010-03-27 -0.17414100118912756,2016-05-01 -0.47566762403585017,2017-06-19 -0.9339482507202774,2016-06-11 -0.05953748035244644,2018-03-30 -0.14324546162970364,2020-06-10 -0.42678032303228974,2013-11-08 -0.5644535899627954,2017-07-12 -0.18729942245408893,2016-08-12 -0.6027495227754116,2022-05-12 -0.7348782932385802,2020-08-11 -0.06834881310351193,2011-10-26 -0.7829179642722011,2015-12-09 -0.921492709312588,2012-09-27 -0.04428216675296426,2013-02-04 -0.7131148546468467,2010-11-29 -0.9038860204163939,2013-10-16 -0.7395815039053559,2015-04-26 -0.1721756304614246,2011-04-12 -0.18658997677266598,2017-01-30 -0.38248836481943727,2014-06-08 -0.45361327519640326,2016-10-19 -0.4551314772106707,2023-09-01 -0.17310278164222836,2010-01-09 -0.3054172566626221,2020-01-11 -0.867752101039514,2016-12-16 -0.2602322499733418,2010-01-03 -0.6808707599993795,2016-04-23 -0.8535765560809523,2016-08-10 -0.805274312151596,2019-11-21 -0.1635163405444473,2018-03-29 -0.47193897631950676,2014-08-04 -0.7183186465408653,2015-08-16 -0.26987858884967864,2020-02-04 -0.608237189007923,2019-01-06 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/chickens.csv b/revdep/library.noindex/eurostat/new/readr/extdata/chickens.csv deleted file mode 100644 index d83fa338..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/chickens.csv +++ /dev/null @@ -1,6 +0,0 @@ -chicken,sex,eggs_laid,motto -Foghorn Leghorn,rooster,0,"That's a joke, ah say, that's a joke, son." -Chicken Little,hen,3,"The sky is falling!" -Ginger,hen,12,"Listen. We'll either die free chickens or we die trying." -Camilla the Chicken,hen,7,"Bawk, buck, ba-gawk." -Ernie The Giant Chicken,rooster,0,"Put Captain Solo in the cargo hold." diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/epa78.txt b/revdep/library.noindex/eurostat/new/readr/extdata/epa78.txt deleted file mode 100644 index b0a4a127..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/epa78.txt +++ /dev/null @@ -1,20 +0,0 @@ -ALFA ROMEO ALFA ROMEO 78010003 -ALFETTA 03 81 8 74 7 89 9 ALFETTA 78010053 -SPIDER 2000 01 SPIDER 2000 78010103 -AMC AMC 78020002 -GREMLIN 03 79 9 79 9 GREMLIN 78020053 -PACER 04 89 11 89 11 PACER 78020103 -PACER WAGON 07 90 26 91 26 PACER WAGON 78020153 -CONCORD 04 88 12 90 11 90 11 83 16 CONCORD 78020203 -CONCORD WAGON 07 91 30 91 30 CONCORD WAGON 78020253 -MATADOR COUPE 05 97 14 97 14 MATADOR COUPE 78020303 -MATADOR SEDAN 06 110 20 110 20 MATADOR SEDAN 78020353 -MATADOR WAGON 09 112 50 112 50 MATADOR WAGON 78020403 -ASTON MARTIN ASTON MARTIN 78040002 -ASTON MARTIN ASTON MARTIN 78040053 -AUDI AUDI 78050002 -FOX 03 84 11 84 11 84 11 FOX 78050053 -FOX WAGON 07 83 40 83 40 FOX WAGON 78050103 -5000 04 90 15 90 15 5000 78050153 -AVANTI AVANTI 78065002 -AVANTI II 02 75 8 75 8 AVANTI II 78065053 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/example.log b/revdep/library.noindex/eurostat/new/readr/extdata/example.log deleted file mode 100644 index 5578171a..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/example.log +++ /dev/null @@ -1,2 +0,0 @@ -172.21.13.45 - Microsoft\JohnDoe [08/Apr/2001:17:39:04 -0800] "GET /scripts/iisadmin/ism.dll?http/serv HTTP/1.0" 200 3401 -127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/fwf-sample.txt b/revdep/library.noindex/eurostat/new/readr/extdata/fwf-sample.txt deleted file mode 100644 index 90da063f..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/fwf-sample.txt +++ /dev/null @@ -1,3 +0,0 @@ -John Smith WA 418-Y11-4111 -Mary Hartford CA 319-Z19-4341 -Evan Nolan IL 219-532-c301 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/massey-rating.txt b/revdep/library.noindex/eurostat/new/readr/extdata/massey-rating.txt deleted file mode 100644 index 0f700d23..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/massey-rating.txt +++ /dev/null @@ -1,11 +0,0 @@ -UCC PAY LAZ KPK RT COF BIH DII ENG ACU Rank Team Conf - 1 1 1 1 1 1 1 1 1 1 1 Ohio St B10 - 2 2 2 2 2 2 2 2 4 2 2 Oregon P12 - 3 4 3 4 3 4 3 4 2 3 3 Alabama SEC - 4 3 4 3 4 3 5 3 3 4 4 TCU B12 - 6 6 6 5 5 7 6 5 6 11 5 Michigan St B10 - 7 7 7 6 7 6 11 8 7 8 6 Georgia SEC - 5 5 5 7 6 8 4 6 5 5 7 Florida St ACC - 8 8 9 9 10 5 7 7 10 7 8 Baylor B12 - 9 11 8 13 11 11 12 9 14 9 9 Georgia Tech ACC - 13 10 13 11 8 9 10 11 9 10 10 Mississippi SEC diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-africa.csv b/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-africa.csv deleted file mode 100644 index 314edc69..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-africa.csv +++ /dev/null @@ -1,7 +0,0 @@ -country,year,lifeExp,pop,gdpPercap -Algeria,1952,43.077,9279525,2449.008185 -Angola,1952,30.015,4232095,3520.610273 -Benin,1952,38.223,1738315,1062.7522 -Botswana,1952,47.622,442308,851.2411407 -Burkina Faso,1952,31.975,4469979,543.2552413 -Burundi,1952,39.031,2445618,339.2964587 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-americas.csv b/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-americas.csv deleted file mode 100644 index 6786f629..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-americas.csv +++ /dev/null @@ -1,7 +0,0 @@ -country,year,lifeExp,pop,gdpPercap -Argentina,1952,62.485,17876956,5911.315053 -Bolivia,1952,40.414,2883315,2677.326347 -Brazil,1952,50.917,56602560,2108.944355 -Canada,1952,68.75,14785584,11367.16112 -Chile,1952,54.745,6377619,3939.978789 -Colombia,1952,50.643,12350771,2144.115096 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-asia.csv b/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-asia.csv deleted file mode 100644 index 85a850a7..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-asia.csv +++ /dev/null @@ -1,7 +0,0 @@ -country,year,lifeExp,pop,gdpPercap -Afghanistan,1952,28.801,8425333,779.4453145 -Bahrain,1952,50.939,120447,9867.084765 -Bangladesh,1952,37.484,46886859,684.2441716 -Cambodia,1952,39.417,4693836,368.4692856 -China,1952,44,556263527,400.448611 -"Hong Kong, China",1952,60.96,2125900,3054.421209 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-europe.csv b/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-europe.csv deleted file mode 100644 index c629db69..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-europe.csv +++ /dev/null @@ -1,7 +0,0 @@ -country,year,lifeExp,pop,gdpPercap -Albania,1952,55.23,1282697,1601.056136 -Austria,1952,66.8,6927772,6137.076492 -Belgium,1952,68,8730405,8343.105127 -Bosnia and Herzegovina,1952,53.82,2791000,973.5331948 -Bulgaria,1952,59.6,7274900,2444.286648 -Croatia,1952,61.21,3882229,3119.23652 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-oceania.csv b/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-oceania.csv deleted file mode 100644 index 44758b04..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/mini-gapminder-oceania.csv +++ /dev/null @@ -1,3 +0,0 @@ -country,year,lifeExp,pop,gdpPercap -Australia,1952,69.12,8691212,10039.59564 -New Zealand,1952,69.39,1994794,10556.57566 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv b/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv deleted file mode 100644 index 2abcf283..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv +++ /dev/null @@ -1,33 +0,0 @@ -"mpg","cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb" -21,6,160,110,3.9,2.62,16.46,0,1,4,4 -21,6,160,110,3.9,2.875,17.02,0,1,4,4 -22.8,4,108,93,3.85,2.32,18.61,1,1,4,1 -21.4,6,258,110,3.08,3.215,19.44,1,0,3,1 -18.7,8,360,175,3.15,3.44,17.02,0,0,3,2 -18.1,6,225,105,2.76,3.46,20.22,1,0,3,1 -14.3,8,360,245,3.21,3.57,15.84,0,0,3,4 -24.4,4,146.7,62,3.69,3.19,20,1,0,4,2 -22.8,4,140.8,95,3.92,3.15,22.9,1,0,4,2 -19.2,6,167.6,123,3.92,3.44,18.3,1,0,4,4 -17.8,6,167.6,123,3.92,3.44,18.9,1,0,4,4 -16.4,8,275.8,180,3.07,4.07,17.4,0,0,3,3 -17.3,8,275.8,180,3.07,3.73,17.6,0,0,3,3 -15.2,8,275.8,180,3.07,3.78,18,0,0,3,3 -10.4,8,472,205,2.93,5.25,17.98,0,0,3,4 -10.4,8,460,215,3,5.424,17.82,0,0,3,4 -14.7,8,440,230,3.23,5.345,17.42,0,0,3,4 -32.4,4,78.7,66,4.08,2.2,19.47,1,1,4,1 -30.4,4,75.7,52,4.93,1.615,18.52,1,1,4,2 -33.9,4,71.1,65,4.22,1.835,19.9,1,1,4,1 -21.5,4,120.1,97,3.7,2.465,20.01,1,0,3,1 -15.5,8,318,150,2.76,3.52,16.87,0,0,3,2 -15.2,8,304,150,3.15,3.435,17.3,0,0,3,2 -13.3,8,350,245,3.73,3.84,15.41,0,0,3,4 -19.2,8,400,175,3.08,3.845,17.05,0,0,3,2 -27.3,4,79,66,4.08,1.935,18.9,1,1,4,1 -26,4,120.3,91,4.43,2.14,16.7,0,1,5,2 -30.4,4,95.1,113,3.77,1.513,16.9,1,1,5,2 -15.8,8,351,264,4.22,3.17,14.5,0,1,5,4 -19.7,6,145,175,3.62,2.77,15.5,0,1,5,6 -15,8,301,335,3.54,3.57,14.6,0,1,5,8 -21.4,4,121,109,4.11,2.78,18.6,1,1,4,2 diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv.bz2 b/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv.bz2 deleted file mode 100644 index 8dd8afa1..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv.bz2 and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv.zip b/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv.zip deleted file mode 100644 index f8b71903..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/extdata/mtcars.csv.zip and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/extdata/whitespace-sample.txt b/revdep/library.noindex/eurostat/new/readr/extdata/whitespace-sample.txt deleted file mode 100644 index 11aa9c40..00000000 --- a/revdep/library.noindex/eurostat/new/readr/extdata/whitespace-sample.txt +++ /dev/null @@ -1,4 +0,0 @@ -first last state phone -John Smith WA 418-Y11-4111 -Mary Hartford CA 319-Z19-4341 -Evan Nolan IL 219-532-c301 diff --git a/revdep/library.noindex/eurostat/new/readr/help/AnIndex b/revdep/library.noindex/eurostat/new/readr/help/AnIndex deleted file mode 100644 index 6800c8e2..00000000 --- a/revdep/library.noindex/eurostat/new/readr/help/AnIndex +++ /dev/null @@ -1,119 +0,0 @@ -readr-package readr-package -AccumulateCallback callback -as.col_spec as.col_spec -callback callback -ChunkCallback callback -clipboard clipboard -cols cols -cols_condense spec -cols_only cols -col_character parse_atomic -col_date parse_datetime -col_datetime parse_datetime -col_double parse_atomic -col_factor parse_factor -col_guess parse_guess -col_integer parse_atomic -col_logical parse_atomic -col_number parse_number -col_skip col_skip -col_time parse_datetime -count_fields count_fields -DataFrameCallback callback -datasource datasource -date_names date_names -date_names_lang date_names -date_names_langs date_names -default_locale locale -edition_get edition_get -format_csv format_delim -format_csv2 format_delim -format_delim format_delim -format_tsv format_delim -fwf_cols read_fwf -fwf_empty read_fwf -fwf_positions read_fwf -fwf_widths read_fwf -guess_encoding encoding -guess_parser parse_guess -ListCallback callback -locale locale -local_edition with_edition -melt_csv melt_delim -melt_csv2 melt_delim -melt_csv2_chunked melt_delim_chunked -melt_csv_chunked melt_delim_chunked -melt_delim melt_delim -melt_delim_chunked melt_delim_chunked -melt_fwf melt_fwf -melt_table melt_table -melt_table2 melt_table -melt_tsv melt_delim -melt_tsv_chunked melt_delim_chunked -output_column output_column -parse_character parse_atomic -parse_date parse_datetime -parse_datetime parse_datetime -parse_double parse_atomic -parse_factor parse_factor -parse_guess parse_guess -parse_integer parse_atomic -parse_logical parse_atomic -parse_number parse_number -parse_time parse_datetime -parse_vector parse_vector -problems problems -readr readr-package -readr_example readr_example -readr_threads readr_threads -read_builtin read_builtin -read_csv read_delim -read_csv2 read_delim -read_csv2_chunked read_delim_chunked -read_csv_chunked read_delim_chunked -read_delim read_delim -read_delim_chunked read_delim_chunked -read_file read_file -read_file_raw read_file -read_fwf read_fwf -read_lines read_lines -read_lines_chunked read_lines_chunked -read_lines_raw read_lines -read_lines_raw_chunked read_lines_chunked -read_log read_log -read_rds read_rds -read_table read_table -read_table2 read_table2 -read_tsv read_delim -read_tsv_chunked read_delim_chunked -should_read_lazy should_read_lazy -should_show_types should_show_types -show_progress show_progress -SideEffectChunkCallback callback -spec spec -spec_csv spec_delim -spec_csv2 spec_delim -spec_delim spec_delim -spec_table spec_delim -spec_tsv spec_delim -stop_for_problems problems -tokenize tokenize -Tokenizers Tokenizers -tokenizer_csv Tokenizers -tokenizer_delim Tokenizers -tokenizer_fwf Tokenizers -tokenizer_line Tokenizers -tokenizer_log Tokenizers -tokenizer_tsv Tokenizers -tokenizer_ws Tokenizers -type_convert type_convert -with_edition with_edition -write_csv write_delim -write_csv2 write_delim -write_delim write_delim -write_excel_csv write_delim -write_excel_csv2 write_delim -write_file read_file -write_lines read_lines -write_rds read_rds -write_tsv write_delim diff --git a/revdep/library.noindex/eurostat/new/readr/help/aliases.rds b/revdep/library.noindex/eurostat/new/readr/help/aliases.rds deleted file mode 100644 index 0ed7655b..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/help/aliases.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/help/figures/lifecycle-deprecated.svg b/revdep/library.noindex/eurostat/new/readr/help/figures/lifecycle-deprecated.svg deleted file mode 100644 index 4baaee01..00000000 --- a/revdep/library.noindex/eurostat/new/readr/help/figures/lifecycle-deprecated.svg +++ /dev/null @@ -1 +0,0 @@ -lifecyclelifecycledeprecateddeprecated \ No newline at end of file diff --git a/revdep/library.noindex/eurostat/new/readr/help/figures/lifecycle-superseded.svg b/revdep/library.noindex/eurostat/new/readr/help/figures/lifecycle-superseded.svg deleted file mode 100644 index 75f24f55..00000000 --- a/revdep/library.noindex/eurostat/new/readr/help/figures/lifecycle-superseded.svg +++ /dev/null @@ -1 +0,0 @@ - lifecyclelifecyclesupersededsuperseded \ No newline at end of file diff --git a/revdep/library.noindex/eurostat/new/readr/help/figures/logo.png b/revdep/library.noindex/eurostat/new/readr/help/figures/logo.png deleted file mode 100644 index 8fa616e0..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/help/figures/logo.png and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/help/paths.rds b/revdep/library.noindex/eurostat/new/readr/help/paths.rds deleted file mode 100644 index a0ee6c93..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/help/paths.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/help/readr.rdb b/revdep/library.noindex/eurostat/new/readr/help/readr.rdb deleted file mode 100644 index f674a653..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/help/readr.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/help/readr.rdx b/revdep/library.noindex/eurostat/new/readr/help/readr.rdx deleted file mode 100644 index 159bd562..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/help/readr.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/html/00Index.html b/revdep/library.noindex/eurostat/new/readr/html/00Index.html deleted file mode 100644 index 9cbb220e..00000000 --- a/revdep/library.noindex/eurostat/new/readr/html/00Index.html +++ /dev/null @@ -1,200 +0,0 @@ - - -R: Read Rectangular Text Data - - - -
-

Read Rectangular Text Data - -

-
-
-[Up] -[Top] -

Documentation for package ‘readr’ version 2.1.4

- - - -

Help Pages

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
clipboardReturns values from the clipboard
colsCreate column specification
cols_condenseExamine the column specifications for a data frame
cols_onlyCreate column specification
col_characterParse logicals, integers, and reals
col_dateParse date/times
col_datetimeParse date/times
col_doubleParse logicals, integers, and reals
col_factorParse factors
col_guessParse using the "best" type
col_integerParse logicals, integers, and reals
col_logicalParse logicals, integers, and reals
col_numberParse numbers, flexibly
col_skipSkip a column
col_timeParse date/times
count_fieldsCount the number of fields in each line of a file
date_namesCreate or retrieve date names
date_names_langCreate or retrieve date names
date_names_langsCreate or retrieve date names
default_localeCreate locales
edition_getRetrieve the currently active edition
format_csvConvert a data frame to a delimited string
format_csv2Convert a data frame to a delimited string
format_delimConvert a data frame to a delimited string
format_tsvConvert a data frame to a delimited string
fwf_colsRead a fixed width file into a tibble
fwf_emptyRead a fixed width file into a tibble
fwf_positionsRead a fixed width file into a tibble
fwf_widthsRead a fixed width file into a tibble
guess_encodingGuess encoding of file
guess_parserParse using the "best" type
localeCreate locales
local_editionTemporarily change the active readr edition
melt_csvReturn melted data for each token in a delimited file (including csv & tsv)
melt_csv2Return melted data for each token in a delimited file (including csv & tsv)
melt_delimReturn melted data for each token in a delimited file (including csv & tsv)
melt_fwfReturn melted data for each token in a fixed width file
melt_tableReturn melted data for each token in a whitespace-separated file
melt_table2Return melted data for each token in a whitespace-separated file
melt_tsvReturn melted data for each token in a delimited file (including csv & tsv)
parse_characterParse logicals, integers, and reals
parse_dateParse date/times
parse_datetimeParse date/times
parse_doubleParse logicals, integers, and reals
parse_factorParse factors
parse_guessParse using the "best" type
parse_integerParse logicals, integers, and reals
parse_logicalParse logicals, integers, and reals
parse_numberParse numbers, flexibly
parse_timeParse date/times
problemsRetrieve parsing problems
readr_exampleGet path to readr example
readr_threadsDetermine how many threads readr should use when processing
read_builtinRead built-in object from package
read_csvRead a delimited file (including CSV and TSV) into a tibble
read_csv2Read a delimited file (including CSV and TSV) into a tibble
read_delimRead a delimited file (including CSV and TSV) into a tibble
read_fileRead/write a complete file
read_file_rawRead/write a complete file
read_fwfRead a fixed width file into a tibble
read_linesRead/write lines to/from a file
read_lines_rawRead/write lines to/from a file
read_logRead common/combined log file into a tibble
read_rdsRead/write RDS files.
read_tableRead whitespace-separated columns into a tibble
read_tsvRead a delimited file (including CSV and TSV) into a tibble
should_read_lazyDetermine whether to read a file lazily
should_show_typesDetermine whether column types should be shown
show_progressDetermine whether progress bars should be shown
specExamine the column specifications for a data frame
spec_csvGenerate a column specification
spec_csv2Generate a column specification
spec_delimGenerate a column specification
spec_tableGenerate a column specification
spec_tsvGenerate a column specification
stop_for_problemsRetrieve parsing problems
type_convertRe-convert character columns in existing data frame
with_editionTemporarily change the active readr edition
write_csvWrite a data frame to a delimited file
write_csv2Write a data frame to a delimited file
write_delimWrite a data frame to a delimited file
write_excel_csvWrite a data frame to a delimited file
write_excel_csv2Write a data frame to a delimited file
write_fileRead/write a complete file
write_linesRead/write lines to/from a file
write_rdsRead/write RDS files.
write_tsvWrite a data frame to a delimited file
-
diff --git a/revdep/library.noindex/eurostat/new/readr/html/R.css b/revdep/library.noindex/eurostat/new/readr/html/R.css deleted file mode 100644 index 2ef6cd60..00000000 --- a/revdep/library.noindex/eurostat/new/readr/html/R.css +++ /dev/null @@ -1,120 +0,0 @@ -@media screen { - .container { - padding-right: 10px; - padding-left: 10px; - margin-right: auto; - margin-left: auto; - max-width: 900px; - } -} - -.rimage img { /* from knitr - for examples and demos */ - width: 96%; - margin-left: 2%; -} - -.katex { font-size: 1.1em; } - -code { - color: inherit; - background: inherit; -} - -body { - line-height: 1.4; - background: white; - color: black; -} - -a:link { - background: white; - color: blue; -} - -a:visited { - background: white; - color: rgb(50%, 0%, 50%); -} - -h1 { - background: white; - color: rgb(55%, 55%, 55%); - font-family: monospace; - font-size: 1.4em; /* x-large; */ - text-align: center; -} - -h2 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: 1.2em; /* large; */ - text-align: center; -} - -h3 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: 1.2em; /* large; */ -} - -h4 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; - font-size: 1.2em; /* large; */ -} - -h5 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; -} - -h6 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; -} - -img.toplogo { - width: 4em; - vertical-align: middle; -} - -img.arrow { - width: 30px; - height: 30px; - border: 0; -} - -span.acronym { - font-size: small; -} - -span.env { - font-family: monospace; -} - -span.file { - font-family: monospace; -} - -span.option{ - font-family: monospace; -} - -span.pkg { - font-weight: bold; -} - -span.samp{ - font-family: monospace; -} - -div.vignettes a:hover { - background: rgb(85%, 85%, 85%); -} diff --git a/revdep/library.noindex/eurostat/new/readr/libs/readr.so b/revdep/library.noindex/eurostat/new/readr/libs/readr.so deleted file mode 100755 index a6556d24..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/libs/readr.so and /dev/null differ diff --git a/revdep/library.noindex/eurostat/new/readr/libs/readr.so.dSYM/Contents/Info.plist b/revdep/library.noindex/eurostat/new/readr/libs/readr.so.dSYM/Contents/Info.plist deleted file mode 100644 index 40796958..00000000 --- a/revdep/library.noindex/eurostat/new/readr/libs/readr.so.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.readr.so - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/revdep/library.noindex/eurostat/new/readr/libs/readr.so.dSYM/Contents/Resources/DWARF/readr.so b/revdep/library.noindex/eurostat/new/readr/libs/readr.so.dSYM/Contents/Resources/DWARF/readr.so deleted file mode 100644 index a4effc67..00000000 Binary files a/revdep/library.noindex/eurostat/new/readr/libs/readr.so.dSYM/Contents/Resources/DWARF/readr.so and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/CITATION b/revdep/library.noindex/eurostat/old/eurostat/CITATION deleted file mode 100755 index c0edebb6..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/CITATION +++ /dev/null @@ -1,28 +0,0 @@ -citHeader("Kindly cite the eurostat R package as follows:") - -note <- sprintf("Version %s", meta$Version) - -bibentry("Article", - title = "Retrieval and Analysis of Eurostat Open Data with the eurostat Package", - author = c( - person("Leo", "Lahti"), - person("Janne", "Huovari"), - person("Markus", "Kainu"), - person("Przemyslaw", "Biecek") - ), - journal = "The R Journal", - volume = 9, - number = 1, - pages = "385--392", - year = "2017", - doi = "10.32614/RJ-2017-019", - url = "https://doi.org/10.32614/RJ-2017-019", - textVersion = - paste("(C) Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek.", - "Retrieval and analysis of Eurostat open data with the eurostat package. R Journal 9(1):385-392, 2017.", - "doi: 10.32614/RJ-2017-019", - "Package URL: http://ropengov.github.io/eurostat", - "Article URL: https://journal.r-project.org/archive/2017/RJ-2017-019/index.html", - sep = " " - ) -) diff --git a/revdep/library.noindex/eurostat/old/eurostat/DESCRIPTION b/revdep/library.noindex/eurostat/old/eurostat/DESCRIPTION deleted file mode 100644 index 7fdc8dee..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/DESCRIPTION +++ /dev/null @@ -1,91 +0,0 @@ -Type: Package -Package: eurostat -Title: Tools for Eurostat Open Data -Version: 3.7.10 -Date: 2022-02-08 -Authors@R: c( - person(given = "Leo", - family = "Lahti", - role = c("aut", "cre"), - email = "leo.lahti@iki.fi", - comment = c(ORCID = "0000-0001-5537-637X")), - person(given = "Janne", - family = "Huovari", - role = "aut"), - person(given = "Markus", - family = "Kainu", - role = "aut"), - person(given = "Przemyslaw", - family = "Biecek", - role = "aut"), - person(given = "Daniel", - family = "Antal", - role = "ctb"), - person(given = "Diego", - family = "Hernangomez", - role = "ctb", - comment = c(ORCID = "0000-0001-8457-4658")), - person(given = "Joona", - family = "Lehtomaki", - role = "ctb"), - person(given = "Francois", - family = "Briatte", - role = "ctb"), - person(given = "Reto", - family = "Stauffer", - role = "ctb"), - person(given = "Paul", - family = "Rougieux", - role = "ctb"), - person(given = "Anna", - family = "Vasylytsya", - role = "ctb"), - person(given = "Oliver", - family = "Reiter", - role = "ctb"), - person(given = "Pyry", - family = "Kantanen", - role = "ctb", - comment = c(ORCID = "0000-0003-2853-2765")) - ) -Description: Tools to download data from the Eurostat database - together with search and manipulation - utilities. -License: BSD_2_clause + file LICENSE -URL: https://ropengov.github.io/eurostat/, - https://github.com/rOpenGov/eurostat -BugReports: https://github.com/rOpenGov/eurostat/issues -Depends: methods, R (>= 3.1.0) -Imports: broom, classInt, countrycode, curl, dplyr, httr, jsonlite, - lubridate, rappdirs, readr, RefManageR, regions, stringi, - stringr, tibble, tidyr -Suggests: RColorBrewer, knitr, rmarkdown, sf, sp, testthat (>= 3.0.0), - remotes -VignetteBuilder: knitr -Config/testthat/edition: 3 -Config/testthat/parallel: false -Encoding: UTF-8 -LazyData: true -MailingList: rOpenGov -NeedsCompilation: no -Repository: CRAN -RoxygenNote: 7.1.2 -X-schema.org-isPartOf: http://ropengov.org/ -X-schema.org-keywords: ropengov -Packaged: 2022-02-09 10:21:58 UTC; xxx -Author: Leo Lahti [aut, cre] (), - Janne Huovari [aut], - Markus Kainu [aut], - Przemyslaw Biecek [aut], - Daniel Antal [ctb], - Diego Hernangomez [ctb] (), - Joona Lehtomaki [ctb], - Francois Briatte [ctb], - Reto Stauffer [ctb], - Paul Rougieux [ctb], - Anna Vasylytsya [ctb], - Oliver Reiter [ctb], - Pyry Kantanen [ctb] () -Maintainer: Leo Lahti -Date/Publication: 2022-02-09 11:30:02 UTC -Built: R 4.2.0; ; 2022-03-23 00:03:49 UTC; unix diff --git a/revdep/library.noindex/eurostat/old/eurostat/INDEX b/revdep/library.noindex/eurostat/old/eurostat/INDEX deleted file mode 100644 index 21980a88..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/INDEX +++ /dev/null @@ -1,29 +0,0 @@ -check_access_to_data Check access to ec.europe.eu -clean_eurostat_cache Clean Eurostat Cache -cut_to_classes Cuts the Values Column into Classes and - Polishes the Labels -dic_order Order of Variable Levels from Eurostat - Dictionary. -eu_countries Countries and Country Codes -eurostat-package R Tools for Eurostat open data -eurostat_geodata_60_2016 - Geospatial data of Europe from Gisco in 1:60 - million scale from year 2016 -eurotime2date Date Conversion from Eurostat Time Format -eurotime2num Conversion of Eurostat Time Format to Numeric -get_bibentry Create A Data Bibliography -get_eurostat Read Eurostat Data -get_eurostat_dic Download Eurostat Dictionary -get_eurostat_geospatial - Download Geospatial Data from GISCO -get_eurostat_json Get Data from Eurostat API in JSON -get_eurostat_raw Download Data from Eurostat Database -get_eurostat_toc Download Table of Contents of Eurostat Data - Sets -harmonize_country_code - Harmonize Country Code -label_eurostat Get Eurostat Codes -search_eurostat Grep Datasets Titles from Eurostat -set_eurostat_cache_dir - Set Eurostat Cache -tgs00026 Auxiliary Data diff --git a/revdep/library.noindex/eurostat/old/eurostat/LICENSE b/revdep/library.noindex/eurostat/old/eurostat/LICENSE deleted file mode 100644 index 1de69c39..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/LICENSE +++ /dev/null @@ -1,2 +0,0 @@ -YEAR: 2014-2022 -COPYRIGHT HOLDER: Leo Lahti, Janne Huovari, Markus Kainu, Przemyslaw Biecek \ No newline at end of file diff --git a/revdep/library.noindex/eurostat/old/eurostat/NAMESPACE b/revdep/library.noindex/eurostat/old/eurostat/NAMESPACE deleted file mode 100644 index 1ae074af..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/NAMESPACE +++ /dev/null @@ -1,63 +0,0 @@ -# Generated by roxygen2: do not edit by hand - -export(add_nuts_level) -export(check_access_to_data) -export(clean_eurostat_cache) -export(cut_to_classes) -export(dic_order) -export(eurotime2date) -export(eurotime2num) -export(get_bibentry) -export(get_eurostat) -export(get_eurostat_dic) -export(get_eurostat_geospatial) -export(get_eurostat_json) -export(get_eurostat_toc) -export(grepEurostatTOC) -export(harmonize_country_code) -export(harmonize_geo_code) -export(label_eurostat) -export(label_eurostat_tables) -export(label_eurostat_vars) -export(recode_nuts) -export(recode_to_nuts_2013) -export(recode_to_nuts_2016) -export(search_eurostat) -export(set_eurostat_cache_dir) -export(validate_geo_code) -export(validate_nuts_regions) -import(dplyr) -import(httr) -import(tidyr) -importFrom(RefManageR,BibEntry) -importFrom(RefManageR,toBiblatex) -importFrom(broom,tidy) -importFrom(classInt,classIntervals) -importFrom(countrycode,countrycode) -importFrom(curl,curl_download) -importFrom(dplyr,case_when) -importFrom(dplyr,coalesce) -importFrom(dplyr,filter) -importFrom(dplyr,mutate) -importFrom(httr,content) -importFrom(httr,http_error) -importFrom(jsonlite,fromJSON) -importFrom(lubridate,day) -importFrom(lubridate,dmy) -importFrom(lubridate,month) -importFrom(lubridate,year) -importFrom(lubridate,ymd) -importFrom(methods,as) -importFrom(readr,col_character) -importFrom(readr,cols) -importFrom(readr,read_tsv) -importFrom(regions,recode_nuts) -importFrom(regions,validate_geo_code) -importFrom(regions,validate_nuts_regions) -importFrom(stringi,stri_extract_first_regex) -importFrom(stringr,str_replace_all) -importFrom(tibble,as_tibble) -importFrom(tibble,is_tibble) -importFrom(utils,data) -importFrom(utils,download.file) -importFrom(utils,toBibtex) diff --git a/revdep/library.noindex/eurostat/old/eurostat/R/eurostat b/revdep/library.noindex/eurostat/old/eurostat/R/eurostat deleted file mode 100644 index 66861563..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/R/eurostat +++ /dev/null @@ -1,27 +0,0 @@ -# File share/R/nspackloader.R -# Part of the R package, https://www.R-project.org -# -# Copyright (C) 1995-2012 The R Core Team -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# A copy of the GNU General Public License is available at -# https://www.r-project.org/Licenses/ - -local({ - info <- loadingNamespaceInfo() - pkg <- info$pkgname - ns <- .getNamespace(as.name(pkg)) - if (is.null(ns)) - stop("cannot find namespace environment for ", pkg, domain = NA); - dbbase <- file.path(info$libname, pkg, "R", pkg) - lazyLoad(dbbase, ns, filter = function(n) n != ".__NAMESPACE__.") -}) diff --git a/revdep/library.noindex/eurostat/old/eurostat/R/eurostat.rdb b/revdep/library.noindex/eurostat/old/eurostat/R/eurostat.rdb deleted file mode 100644 index b781d98e..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/R/eurostat.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/R/eurostat.rdx b/revdep/library.noindex/eurostat/old/eurostat/R/eurostat.rdx deleted file mode 100644 index 2f3e2c91..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/R/eurostat.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/WORDLIST b/revdep/library.noindex/eurostat/old/eurostat/WORDLIST deleted file mode 100644 index 4db0c91c..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/WORDLIST +++ /dev/null @@ -1,130 +0,0 @@ -Acknowledgements -Analytics -Biblatex -Bibtex -CNTRY -Categorises -Choropleth -DOI -Dol -EEA -EFTA -EL -EPSG -ETRS -EuroGeographics -Eurostat's -Eurozone -FID -FTE -GISCO -GeoJSON -Geospatial -Gisco -Github -Gitter -Hernangómez -JSON -Kenett -LAEA -LEVL -LazyLoad -Lehtomäki -RCV -RJ -RStudio -Recode -Recoding -Renviron -SDMX -Shmueli -SpatialPolygonDataFrame -TOC -WGS -Wietse -avia -bclust -behaviour -bibentry -codecov -codename -comext -comformity -comparativity -countrycode -countycodes -de -dieghernan -dir -dpih -eXchange -ec -efta -eg -enps -eu -europa -europe -eurozone -facto -fi -geo -geospatial -ggplot -giscoR -github -gmail -googlegroups -hclust -headtails -hostname -http -https -huovari -hv -iki -io -janne -jenks -json -kable -kainu -kapsi -kilometres -kmeans -labelled -lahti -lastTimePeriod -leo -lifecycle -markus -markuskainu -mln -num -paoa -paoc -paocc -persreg -pkm -pre -preprocessed -psmod -pstra -ptt -rOG -rOpenGov -rds -reaggregate -recode -recoding -relabelled -restatapi -rjsdmx -ropengov -rsdmx -sd -sinceTimePeriod -spplot -tibble -tmap -tran diff --git a/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rdb b/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rdb deleted file mode 100644 index c6f9d596..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rds b/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rds deleted file mode 100644 index e02375b9..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rdx b/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rdx deleted file mode 100644 index e14de017..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/data/Rdata.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/help/AnIndex b/revdep/library.noindex/eurostat/old/eurostat/help/AnIndex deleted file mode 100644 index 9b6d818a..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/help/AnIndex +++ /dev/null @@ -1,39 +0,0 @@ -eurostat-package eurostat-package -add_nuts_level add_nuts_level -check_access_to_data check_access_to_data -clean_eurostat_cache clean_eurostat_cache -convert_time_col convert_time_col -cut_to_classes cut_to_classes -dic_order dic_order -ea_countries eu_countries -efta_countries eu_countries -eurostat eurostat-package -eurostat_geodata_60_2016 eurostat_geodata_60_2016 -eurotime2date eurotime2date -eurotime2num eurotime2num -eu_candidate_countries eu_countries -eu_countries eu_countries -get_bibentry get_bibentry -get_eurostat get_eurostat -get_eurostat_dic get_eurostat_dic -get_eurostat_geospatial get_eurostat_geospatial -get_eurostat_json get_eurostat_json -get_eurostat_raw get_eurostat_raw -get_eurostat_toc get_eurostat_toc -grepEurostatTOC search_eurostat -harmonize_country_code harmonize_country_code -harmonize_geo_code harmonize_geo_code -label_eurostat label_eurostat -label_eurostat_tables label_eurostat -label_eurostat_vars label_eurostat -recode_nuts reexports -recode_to_nuts_2013 recode_to_nuts_2013 -recode_to_nuts_2016 recode_to_nuts_2016 -reexports reexports -search_eurostat search_eurostat -set_eurostat_cache_dir set_eurostat_cache_dir -set_eurostat_toc set_eurostat_toc -tgs00026 tgs00026 -tidy_eurostat tidy_eurostat -validate_geo_code reexports -validate_nuts_regions reexports diff --git a/revdep/library.noindex/eurostat/old/eurostat/help/aliases.rds b/revdep/library.noindex/eurostat/old/eurostat/help/aliases.rds deleted file mode 100644 index 7ebcb5d5..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/help/aliases.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/help/eurostat.rdb b/revdep/library.noindex/eurostat/old/eurostat/help/eurostat.rdb deleted file mode 100644 index e44d3d69..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/help/eurostat.rdb and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/help/eurostat.rdx b/revdep/library.noindex/eurostat/old/eurostat/help/eurostat.rdx deleted file mode 100644 index d9ef5260..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/help/eurostat.rdx and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/help/figures/logo.png b/revdep/library.noindex/eurostat/old/eurostat/help/figures/logo.png deleted file mode 100644 index 4b554470..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/help/figures/logo.png and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/help/paths.rds b/revdep/library.noindex/eurostat/old/eurostat/help/paths.rds deleted file mode 100644 index cad451a6..00000000 Binary files a/revdep/library.noindex/eurostat/old/eurostat/help/paths.rds and /dev/null differ diff --git a/revdep/library.noindex/eurostat/old/eurostat/html/00Index.html b/revdep/library.noindex/eurostat/old/eurostat/html/00Index.html deleted file mode 100644 index 214c8a7d..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/html/00Index.html +++ /dev/null @@ -1,82 +0,0 @@ - - -R: Tools for Eurostat Open Data - - - -
-

Tools for Eurostat Open Data - -

-
-
-[Up] -[Top] -

Documentation for package ‘eurostat’ version 3.7.10

- - - -

Help Pages

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
eurostat-packageR Tools for Eurostat open data
check_access_to_dataCheck access to ec.europe.eu
clean_eurostat_cacheClean Eurostat Cache
cut_to_classesCuts the Values Column into Classes and Polishes the Labels
dic_orderOrder of Variable Levels from Eurostat Dictionary.
ea_countriesCountries and Country Codes
efta_countriesCountries and Country Codes
eurostatR Tools for Eurostat open data
eurostat_geodata_60_2016Geospatial data of Europe from Gisco in 1:60 million scale from year 2016
eurotime2dateDate Conversion from Eurostat Time Format
eurotime2numConversion of Eurostat Time Format to Numeric
eu_candidate_countriesCountries and Country Codes
eu_countriesCountries and Country Codes
get_bibentryCreate A Data Bibliography
get_eurostatRead Eurostat Data
get_eurostat_dicDownload Eurostat Dictionary
get_eurostat_geospatialDownload Geospatial Data from GISCO
get_eurostat_jsonGet Data from Eurostat API in JSON
get_eurostat_rawDownload Data from Eurostat Database
get_eurostat_tocDownload Table of Contents of Eurostat Data Sets
grepEurostatTOCGrep Datasets Titles from Eurostat
harmonize_country_codeHarmonize Country Code
label_eurostatGet Eurostat Codes
label_eurostat_tablesGet Eurostat Codes
label_eurostat_varsGet Eurostat Codes
search_eurostatGrep Datasets Titles from Eurostat
set_eurostat_cache_dirSet Eurostat Cache
tgs00026Auxiliary Data
-
diff --git a/revdep/library.noindex/eurostat/old/eurostat/html/R.css b/revdep/library.noindex/eurostat/old/eurostat/html/R.css deleted file mode 100644 index f10f5ea6..00000000 --- a/revdep/library.noindex/eurostat/old/eurostat/html/R.css +++ /dev/null @@ -1,97 +0,0 @@ -body { - background: white; - color: black; -} - -a:link { - background: white; - color: blue; -} - -a:visited { - background: white; - color: rgb(50%, 0%, 50%); -} - -h1 { - background: white; - color: rgb(55%, 55%, 55%); - font-family: monospace; - font-size: x-large; - text-align: center; -} - -h2 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: large; - text-align: center; -} - -h3 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: large; -} - -h4 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; - font-size: large; -} - -h5 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; -} - -h6 { - background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; -} - -img.toplogo { - width: 4em; - vertical-align: middle; -} - -img.arrow { - width: 30px; - height: 30px; - border: 0; -} - -span.acronym { - font-size: small; -} - -span.env { - font-family: monospace; -} - -span.file { - font-family: monospace; -} - -span.option{ - font-family: monospace; -} - -span.pkg { - font-weight: bold; -} - -span.samp{ - font-family: monospace; -} - -div.vignettes a:hover { - background: rgb(85%, 85%, 85%); -} diff --git a/tests/testthat/_snaps/03_get_eurostat_geospatial.md b/tests/testthat/_snaps/03_get_eurostat_geospatial.md new file mode 100644 index 00000000..93616591 --- /dev/null +++ b/tests/testthat/_snaps/03_get_eurostat_geospatial.md @@ -0,0 +1,22 @@ +# get_eurostat_geospatial cache_dir + + Code + a <- get_eurostat_geospatial(nuts_id = "LU", nuts_level = 0) + Message + Extracting data using giscoR package, please report issues on https://github.com/rOpenGov/giscoR/issues + +--- + + Code + a <- get_eurostat_geospatial(nuts_id = "LU", nuts_level = 0, cache_dir = another_temp) + Message + Extracting data using giscoR package, please report issues on https://github.com/rOpenGov/giscoR/issues + +--- + + Code + a <- get_eurostat_geospatial(nuts_id = "LU", nuts_level = 0) + Message + Extracting data using giscoR package, please report issues on https://github.com/rOpenGov/giscoR/issues + Cache management as per giscoR. see 'giscoR::gisco_get_nuts()' + diff --git a/tests/testthat/test_00_cache.R b/tests/testthat/test_00_cache.R index c0ef10d0..c5bbc23c 100755 --- a/tests/testthat/test_00_cache.R +++ b/tests/testthat/test_00_cache.R @@ -31,6 +31,20 @@ test_that("Cache works", { expect_true(inherits(k, "data.frame")) }) +test_that("Dataset is filtered from cached bulk file", { + skip_on_cran() + skip_if_offline() + + t_dir <- file.path(tempdir(), "reurostat") + k2 <- get_eurostat("nama_10_lp_ulc", + cache_dir = t_dir, + filters = list()) + expect_message(get_eurostat("nama_10_lp_ulc", + cache_dir = t_dir, + filters = list(geo = "AT")), "and filtering it") + +}) + test_that("Set cache", { old <- eur_helper_detect_cache_dir() new <- file.path(tempdir(), "eurostat", "testthat", "new") diff --git a/tests/testthat/test_01_bibliography.R b/tests/testthat/test_01_bibliography.R index d760f8ff..32374ba3 100755 --- a/tests/testthat/test_01_bibliography.R +++ b/tests/testthat/test_01_bibliography.R @@ -12,9 +12,44 @@ test_that("Bibentry gives correct results", { )), "Bibtex" ) + + expect_equal( + class( + suppressWarnings( + get_bibentry( + code = c("sts_inpr_a"), + lang = "fr", + format = "Bibtex" + ))), + "Bibtex" + ) + expect_error( get_bibentry(code = 123456) ) + + expect_error( + get_bibentry( + code = c("sts_inpr_a"), + lang = "fr", + keywords = "production" + ) + ) + + # None of the codes not found + expect_warning( + get_bibentry( + code = "sts_inpr_b" + ) + ) + + # Some of the codes not found + expect_warning( + get_bibentry( + code = c("sts_inpr_b", "sts_inpr_a") + ) + ) + expect_warning( get_bibentry( code = c("sts_inpr_a", "nama_10_gdp"), @@ -25,4 +60,6 @@ test_that("Bibentry gives correct results", { format = "character" ) ) + + }) diff --git a/tests/testthat/test_03_get_eurostat_geospatial.R b/tests/testthat/test_03_get_eurostat_geospatial.R index 622d2267..7ea873d3 100755 --- a/tests/testthat/test_03_get_eurostat_geospatial.R +++ b/tests/testthat/test_03_get_eurostat_geospatial.R @@ -1,9 +1,10 @@ -test_that("get_eurostat_geospatial wrong input arguments for output_format = \"sf\"", { +test_that("get_eurostat_geospatial errors", { + skip_if_not_installed(pkg = "giscoR") skip_if_not_installed(pkg = "sf") - skip_if_not_installed(pkg = "sp") - library(sf) skip_on_cran() skip_if_offline() + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + # Testing argument 'output_class' expect_error(get_eurostat_geospatial(output_class = 0)) expect_error(get_eurostat_geospatial(output_class = "foo")) @@ -22,137 +23,618 @@ test_that("get_eurostat_geospatial wrong input arguments for output_format = \"s expect_error(get_eurostat_geospatial(year = c(2003, 2006))) # Testing argment cache - expect_error(get_eurostat_geospatial(cache = as.logical(NA))) - expect_error(get_eurostat_geospatial(cache = "TRUE")) - expect_error(get_eurostat_geospatial(cache = c(TRUE, FALSE))) - - # Testing argment update_cache - expect_error(get_eurostat_geospatial(update_cache = as.logical(NA))) - expect_error(get_eurostat_geospatial(update_cache = "TRUE")) - expect_error(get_eurostat_geospatial(update_cache = c(TRUE, FALSE))) - - # Testing argment cache_dir - expect_error(get_eurostat_geospatial(cache_dir = 1234)) - expect_error(get_eurostat_geospatial(cache_dir = c("here", "and/there"))) + expect_error(get_eurostat_geospatial(cache = as.logical(NA), year = 2021)) + expect_error(get_eurostat_geospatial(cache = c(TRUE, FALSE), year = 2021)) # Testing argument CRS expect_error(get_eurostat_geospatial(crs = "north polar stereographic")) expect_error(get_eurostat_geospatial(crs = c(4326, 3035))) - # Testing argument make_valid - expect_error(get_eurostat_geospatial(make_valid = as.logical(NA))) - expect_error(get_eurostat_geospatial(make_valid = "TRUE")) - expect_error(get_eurostat_geospatial(make_valid = c(TRUE, FALSE))) - # Invalid combinations expect_error(get_eurostat_geospatial(resolution = 60, year = 2003)) }) +test_that("get_eurostat_geospatial messages", { + skip_if_not_installed(pkg = "giscoR") + skip_if_not_installed(pkg = "sf") + skip_on_cran() + skip_if_offline() + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + + + # Deprecations + expect_message( + get_eurostat_geospatial(make_valid = TRUE), + "'make_valid' argument has been deprecated" + ) + + expect_message( + spdf <- get_eurostat_geospatial(output_class = "spdf"), + "'spdf' output deprecated. Switching to sf output" + ) + expect_s3_class(spdf, "sf") + + # Info about source of data + expect_message(get_eurostat_geospatial(), "from eurostat") + expect_message(get_eurostat_geospatial(nuts_id = "BE"), "giscoR package") +}) + + +test_that("get_eurostat_geospatial nuts levels", { + skip_if_not_installed(pkg = "sf") + # From internal data with default args + expect_message(all <- get_eurostat_geospatial(nuts_level = "all"), "eurostat") + expect_message(n0 <- get_eurostat_geospatial(nuts_level = "0"), "eurostat") + expect_message(n1 <- get_eurostat_geospatial(nuts_level = "1"), "eurostat") + expect_message(n2 <- get_eurostat_geospatial(nuts_level = "2"), "eurostat") + expect_message(n3 <- get_eurostat_geospatial(nuts_level = "3"), "eurostat") + + expect_gt(nrow(all), nrow(n3)) + expect_gt(nrow(n3), nrow(n2)) + expect_gt(nrow(n2), nrow(n1)) + expect_gt(nrow(n1), nrow(n0)) + + expect_s3_class(all, "sf") + expect_s3_class(n3, "sf") + expect_s3_class(n2, "sf") + expect_s3_class(n1, "sf") + + skip_if_not_installed(pkg = "giscoR") + skip_on_cran() + skip_if_offline() + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + + + # From internal data with default args + expect_message(gall <- get_eurostat_geospatial( + nuts_level = "all", + crs = 3035 + ), "giscoR") + expect_message(gn0 <- get_eurostat_geospatial( + nuts_level = "0", + crs = 3035 + ), "giscoR") + expect_message(gn1 <- get_eurostat_geospatial( + nuts_level = "1", + crs = 3035 + ), "giscoR") + expect_message(gn2 <- get_eurostat_geospatial( + nuts_level = "2", + crs = 3035 + ), "giscoR") + expect_message(gn3 <- get_eurostat_geospatial( + nuts_level = "3", + crs = 3035 + ), "giscoR") + + expect_gt(nrow(gall), nrow(gn3)) + expect_gt(nrow(gn3), nrow(gn2)) + expect_gt(nrow(gn2), nrow(gn1)) + expect_gt(nrow(gn1), nrow(gn0)) + expect_true("geo" %in% names(gall)) + + expect_s3_class(gall, "sf") + expect_s3_class(gn3, "sf") + expect_s3_class(gn2, "sf") + expect_s3_class(gn1, "sf") +}) + +test_that("get_eurostat_geospatial df", { + skip_if_not_installed(pkg = "sf") + # From internal data with default args + expect_message( + all <- get_eurostat_geospatial( + nuts_level = "all", + output_class = "df" + ), + "eurostat" + ) + expect_message(n0 <- get_eurostat_geospatial( + nuts_level = "0", + output_class = "df" + ), "eurostat") + expect_message(n1 <- get_eurostat_geospatial( + nuts_level = "1", + output_class = "df" + ), "eurostat") + expect_message(n2 <- get_eurostat_geospatial( + nuts_level = "2", + output_class = "df" + ), "eurostat") + expect_message(n3 <- get_eurostat_geospatial( + nuts_level = "3", + output_class = "df" + ), "eurostat") + + expect_gt(nrow(all), nrow(n3)) + expect_gt(nrow(n3), nrow(n2)) + expect_gt(nrow(n2), nrow(n1)) + expect_gt(nrow(n1), nrow(n0)) + + expect_s3_class(all, "data.frame") + expect_s3_class(n3, "data.frame") + expect_s3_class(n2, "data.frame") + expect_s3_class(n1, "data.frame") + + skip_if_not_installed(pkg = "giscoR") + skip_on_cran() + skip_if_offline() + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + + + # From giscoR data + expect_message(gall <- get_eurostat_geospatial( + nuts_level = "all", + output_class = "df", + verbose = TRUE + ), "giscoR") + expect_message(gn0 <- get_eurostat_geospatial( + nuts_level = "0", + crs = 3035, + verbose = TRUE + ), "giscoR") + expect_message(gn1 <- get_eurostat_geospatial( + nuts_level = "1", + crs = 3035, + verbose = TRUE + ), "giscoR") + expect_message(gn2 <- get_eurostat_geospatial( + nuts_level = "2", + crs = 3035, + verbose = TRUE + ), "giscoR") + expect_message(gn3 <- get_eurostat_geospatial( + nuts_level = "3", + crs = 3035, + verbose = TRUE + ), "giscoR") + + expect_gt(nrow(gall), nrow(gn3)) + expect_gt(nrow(gn3), nrow(gn2)) + expect_gt(nrow(gn2), nrow(gn1)) + expect_gt(nrow(gn1), nrow(gn0)) + expect_true("geo" %in% names(gall)) + + expect_s3_class(gall, "data.frame") + expect_s3_class(gn3, "data.frame") + expect_s3_class(gn2, "data.frame") + expect_s3_class(gn1, "data.frame") +}) + + +test_that("get_eurostat_geospatial cache_dir", { + skip_if_not_installed(pkg = "sf") + skip_if_not_installed(pkg = "giscoR") + skip_on_cran() + skip_if_offline() + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + + # Get initial cache dir + init_cache <- eur_helper_detect_cache_dir() + + # Now mocking as if the user set a specific cache dir + test_cache_dir <- file.path(tempdir(), "eurostat_set_by_user") + suppressMessages(set_eurostat_cache_dir(test_cache_dir)) + + # Check change + new_cache <- eur_helper_detect_cache_dir() + expect_false(identical(init_cache, new_cache)) + + # Check now the messages with snapshot testing + # This would show nothing regarding cache + expect_snapshot(a <- get_eurostat_geospatial( + nuts_id = "LU", + nuts_level = 0 + )) + + # If set by the user no messages on caching + another_temp <- tempdir() + expect_snapshot(a <- get_eurostat_geospatial( + nuts_id = "LU", + nuts_level = 0, + cache_dir = another_temp + )) + + # But if using the default unset cache dir from eurostat, expect a message + # stating that giscoR is managing it + + # Now mocking as if the user set a specific cache dir + default_temp <- file.path(tempdir(), "eurostat") + suppressMessages(set_eurostat_cache_dir(default_temp)) + + # Check change + new_cache <- eur_helper_detect_cache_dir() + expect_false(identical(init_cache, new_cache)) + expect_true(identical(default_temp, new_cache)) + + expect_snapshot(a <- get_eurostat_geospatial( + nuts_id = "LU", + nuts_level = 0 + )) + + + # Finally, restore cache dir set by the user (if any) + suppressMessages(set_eurostat_cache_dir(init_cache)) + expect_identical(init_cache, eur_helper_detect_cache_dir()) +}) + + +test_that("giscoR returns NULL", { + skip_if_not_installed(pkg = "sf") + skip_if_not_installed(pkg = "giscoR") + skip_on_cran() + skip_if_offline() + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + skip_if(packageVersion("giscoR") < "0.3.5", "Use latest giscoR release") + + options(giscoR_test_offline = TRUE) + expect_message( + n <- get_eurostat_geospatial( + country = "AT", nuts_level = "0", + update_cache = TRUE + ), + "not reachable" + ) + expect_null(n) + options(giscoR_test_offline = FALSE) +}) + + +test_that("Check column names", { + skip_if_not_installed(pkg = "sf") + + # See https://github.com/rOpenGov/eurostat/issues/240 + col_order <- c( + "id", "LEVL_CODE", "NUTS_ID", "CNTR_CODE", "NAME_LATN", + "NUTS_NAME", "MOUNT_TYPE", "URBN_TYPE", "COAST_TYPE", + "FID", "geo", "geometry" + ) + + + cached <- get_eurostat_geospatial() + expect_s3_class(cached, "sf") + expect_identical(names(cached), col_order) + + # df + cached_df <- get_eurostat_geospatial(output_class = "df") + expect_s3_class(cached_df, "data.frame") + expect_identical(names(cached_df), col_order[-length(col_order)]) +}) + -# Tests explicitly for output_class = "sf"; first unnamed argument -test_that("get_eurostat_geospatial warnings for output_format = \"sf\"", { +test_that("Check column names POLYGONS from GISCO", { skip_if_not_installed(pkg = "sf") - skip_if_not_installed(pkg = "sp") + skip_if_not_installed(pkg = "giscoR") skip_on_cran() skip_if_offline() - # skip_on_ci() - - # Custom function expecting that: - # we have a warning, then a message, and the final object is of class "sf" - expect_ismw <- function(x, cls = "sf") { - expect_message(expect_warning(x)) - - x2 <- suppressMessages( - suppressWarnings(x) - ) - - expect_s3_class( - x, - cls - ) - } - - # Testing nuts_level first, such that we can stick to one nuts_level later on ... - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 0.0)) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 0L)) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = "0.0")) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = "1")) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = "2")) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = "3")) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = "all")) - - # Testing year second, same reason, stick with one year for later tests - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, year = 2013.0)) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, year = 2013L)) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, year = "2013")) - - # Testing resolution - expect_ismw(get_eurostat_geospatial("sf", resolution = 1, nuts_level = 3, year = 2013)) - expect_ismw(get_eurostat_geospatial("sf", resolution = "01", nuts_level = 3, year = 2013)) - expect_ismw(get_eurostat_geospatial("sf", resolution = "1", nuts_level = 3, year = 2013)) - - # Testing cache - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, cache = TRUE)) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, cache = FALSE)) - - # Testing update_cache - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, cache = TRUE, update_cache = TRUE)) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, cache = TRUE, update_cache = FALSE)) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, cache = FALSE, update_cache = TRUE)) - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, cache = FALSE, update_cache = FALSE)) - - # Testing crs - require("sf") - expect_ismw(x <- get_eurostat_geospatial("sf", nuts_level = 1, crs = 4326)) - expect_identical(format(st_crs(x)), format(st_crs(4326))) - expect_ismw(x <- get_eurostat_geospatial("sf", nuts_level = 1, crs = 3035)) - expect_identical(format(st_crs(x)), format(st_crs(3035))) - expect_ismw(x <- get_eurostat_geospatial("sf", nuts_level = 1, crs = 3857)) - expect_identical(format(st_crs(x)), format(st_crs(3857))) - - # Testing make_valid which should be depricated somewhen sooner or later - # Unfortunately testthat does not get rid of 'hidden' warning messages when - # options(warn) is set to < 0. - expect_ismw(get_eurostat_geospatial("sf", nuts_level = 1, make_valid = FALSE)) - expect_s3_class(get_eurostat_geospatial("sf", nuts_level = 1, make_valid = TRUE), "sf") + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + skip_if(packageVersion("giscoR") < "0.3.5", "Use latest giscoR release") + + col_order <- c( + "id", "LEVL_CODE", "NUTS_ID", "CNTR_CODE", "NAME_LATN", + "NUTS_NAME", "MOUNT_TYPE", "URBN_TYPE", "COAST_TYPE", + "FID", "geo", "geometry" + ) + + # Polygons 2003 + poly <- get_eurostat_geospatial(nuts_level = 0, resolution = 20, year = 2003) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 20, year = 2003 + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + # Polygons 2006 + poly <- get_eurostat_geospatial(nuts_level = 0, resolution = 60, year = 2006) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2006 + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + + # Polygons 2010 + poly <- get_eurostat_geospatial(nuts_level = 0, resolution = 60, year = 2010) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2010 + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + # Polygons 2013 + poly <- get_eurostat_geospatial(nuts_level = 0, resolution = 60, year = 2013) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2013 + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + # Polygons 2016 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2016, + update_cache = TRUE + ) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2016, + update_cache = TRUE + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + # Polygons 2021 + poly <- get_eurostat_geospatial(nuts_level = 0, resolution = 60, year = 2021) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2021 + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) }) -# Tests explicitly for output_class = "sf"; first unnamed argument -test_that("get_eurostat_geospatial tests to cover internals", { +test_that("Check column names LABELS from GISCO", { skip_if_not_installed(pkg = "sf") - skip_if_not_installed(pkg = "sp") + skip_if_not_installed(pkg = "giscoR") skip_on_cran() skip_if_offline() + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + skip_if(packageVersion("giscoR") < "0.3.5", "Use latest giscoR release") + + col_order <- c( + "id", "LEVL_CODE", "NUTS_ID", "CNTR_CODE", "NAME_LATN", + "NUTS_NAME", "MOUNT_TYPE", "URBN_TYPE", "COAST_TYPE", + "FID", "geo", "geometry" + ) + + # Labels 2003 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 20, year = 2003, + spatialtype = "LB" + ) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 20, year = 2003, + spatialtype = "LB" + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + # Labels 2006 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2006, + spatialtype = "LB" + ) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2006, + spatialtype = "LB" + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + + # Labels 2010 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2010, + spatialtype = "LB" + ) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2010, + spatialtype = "LB" + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + # Labels 2013 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2013, + spatialtype = "LB" + ) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2013, + spatialtype = "LB" + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + # Labels 2016 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2016, + update_cache = TRUE, spatialtype = "LB" + ) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2016, + update_cache = TRUE, + spatialtype = "LB" + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) + + # Labels 2021 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2021, + spatialtype = "LB" + ) + expect_s3_class(poly, "sf") + expect_identical(names(poly), col_order) + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2021, + spatialtype = "LB" + ) + + expect_s3_class(poly_df, "data.frame") + expect_identical(names(poly_df), col_order[-length(col_order)]) +}) + + +test_that("Check column names BORDERS from GISCO", { + skip_if_not_installed(pkg = "sf") + skip_if_not_installed(pkg = "giscoR") + skip_on_cran() + skip_if_offline() + skip_if(!giscoR::gisco_check_access(), "No access to GISCO") + skip_if(packageVersion("giscoR") < "0.3.5", "Use latest giscoR release") + + # BORDERS 2003 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 20, year = 2003, + spatialtype = "BN" + ) + expect_s3_class(poly, "sf") + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 20, year = 2003, + spatialtype = "BN" + ) + + expect_s3_class(poly_df, "data.frame") + + # BORDERS 2006 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2006, + spatialtype = "BN" + ) + expect_s3_class(poly, "sf") + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2006, + spatialtype = "BN" + ) + + expect_s3_class(poly_df, "data.frame") + + + # BORDERS 2010 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2010, + spatialtype = "BN" + ) + expect_s3_class(poly, "sf") + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2010, + spatialtype = "BN" + ) + + expect_s3_class(poly_df, "data.frame") + + # BORDERS 2013 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2013, + spatialtype = "BN" + ) + expect_s3_class(poly, "sf") + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2013, + spatialtype = "BN" + ) + + expect_s3_class(poly_df, "data.frame") + + # BORDERS 2016 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2016, + update_cache = TRUE, spatialtype = "BN" + ) + expect_s3_class(poly, "sf") + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2016, + update_cache = TRUE, + spatialtype = "BN" + ) + + expect_s3_class(poly_df, "data.frame") + + # BORDERS 2021 + poly <- get_eurostat_geospatial( + nuts_level = 0, resolution = 60, year = 2021, + spatialtype = "BN" + ) + expect_s3_class(poly, "sf") + + # df + poly_df <- get_eurostat_geospatial( + output_class = "df", nuts_level = 0, + resolution = 60, year = 2021, + spatialtype = "BN" + ) - # Custom function expecting that: - # we have a warning, then a message, and the final object is of class "sf" - expect_ismw <- function(x, cls = "sf") { - expect_message(expect_warning(x)) - - x1 <- suppressMessages( - suppressWarnings(x) - ) - if (typeof(x1) == "S3") expect_s3_class(x1, cls) - if (typeof(x1) == "S4") expect_s4_class(x1, cls) - } - # Special case where resolution == 60 && year == 2016 && crs == 4326. - # Testing for correct return object class. - expect_s3_class(get_eurostat_geospatial("sf", resolution = 60, year = 2016, crs = 4326, make_valid = TRUE), "sf") - expect_ismw(get_eurostat_geospatial("df", resolution = 60, year = 2016, crs = 4326, make_valid = TRUE), cls = "data.frame") - expect_ismw(get_eurostat_geospatial("spdf", resolution = 60, year = 2016, crs = 4326, make_valid = TRUE), cls = "SpatialPolygonsDataFrame") - - # General case (not resolution == 60 && year == 2016 && crs == 4326. - # Testing for correct return object class. - expect_s3_class(get_eurostat_geospatial("sf", resolution = 20, year = 2013, make_valid = TRUE), "sf") - expect_ismw(get_eurostat_geospatial("df", resolution = 20, year = 2013, make_valid = TRUE), cls = "data.frame") - expect_ismw(get_eurostat_geospatial("spdf", resolution = 20, year = 2013, make_valid = TRUE), cls = "SpatialPolygonsDataFrame") - - # Setting cache to false; everything else default - expect_ismw(get_eurostat_geospatial("sf", cache = FALSE)) - expect_s3_class(get_eurostat_geospatial("sf", resolution = 20, year = 2013, make_valid = TRUE, update_cache = TRUE), "sf") - expect_ismw(get_eurostat_geospatial("df", resolution = 20, year = 2013, make_valid = TRUE, update_cache = TRUE), cls = "data.frame") - expect_ismw(get_eurostat_geospatial("spdf", resolution = 20, year = 2013, make_valid = TRUE, update_cache = TRUE), cls = "SpatialPolygonsDataFrame") - - # sleep for a while to let the API rest - Sys.sleep(5) + expect_s3_class(poly_df, "data.frame") }) diff --git a/tests/testthat/test_04_get.R b/tests/testthat/test_04_get.R index f7c1ad2d..dc525b7d 100755 --- a/tests/testthat/test_04_get.R +++ b/tests/testthat/test_04_get.R @@ -1,20 +1,10 @@ -test_that("get_eurostat (bulk download) includes time and value", { - skip_on_cran() - skip_if_offline() - expect_true(all(c("time", "values") %in% - names(get_eurostat("road_eqr_trams", - select_time = "Y", - stringsAsFactors = TRUE)))) -}) - test_that("get_eurostat (dissemination API) includes TIME_PERIOD and value", { skip_on_cran() skip_if_offline() expect_true(all(c("TIME_PERIOD", "values") %in% names(get_eurostat(id = "road_eqr_trams", stringsAsFactors = TRUE, - select_time = "A", - legacy_bulk_download = FALSE)))) + select_time = "A")))) }) test_that("get_eurostat (dissemination API) includes TIME_PERIOD and value", { @@ -23,45 +13,23 @@ test_that("get_eurostat (dissemination API) includes TIME_PERIOD and value", { expect_true(all(c("TIME_PERIOD", "values") %in% names(get_eurostat(id = "road_eqr_trams", stringsAsFactors = TRUE, - select_time = "Y", - legacy_bulk_download = FALSE)))) + select_time = "Y")))) # sleep for a while to let the API rest Sys.sleep(5) }) -test_that("get_eurostat (bulk download) produces an error with multiple select_time", { - skip_on_cran() - skip_if_offline() - expect_error(get_eurostat(id = "avia_gonc", - select_time = c("A", "M", "Q"), - time_format = "date_last", - legacy_bulk_download = TRUE)) -}) - test_that("get_eurostat (dissemination API) produces a message with multiple select_time", { skip_on_cran() skip_if_offline() expect_message(get_eurostat(id = "avia_gonc", - select_time = c("A", "M", "Q"), - legacy_bulk_download = FALSE)) + select_time = c("A", "M", "Q"))) }) test_that("get_eurostat (dissemination API) produces an error with imaginary select_time parameters", { skip_on_cran() skip_if_offline() expect_error(get_eurostat(id = "avia_gonc", - select_time = c("X", "Y", "Z"), - legacy_bulk_download = FALSE)) -}) - -test_that("get_eurostat (bulk download) works correctly with multi-frequency", { - skip_on_cran() - skip_if_offline() - expect_error(get_eurostat("avia_gonc", cache = FALSE)) - expect_match(as.character(unique(get_eurostat("avia_gonc", - select_time = "Y", - cache = FALSE - )$time)), "-01-01") + select_time = c("X", "Y", "Z"))) # sleep for a while to let the API rest Sys.sleep(5) }) @@ -71,24 +39,22 @@ test_that("get_eurostat (dissemination API) works correctly with multi-frequency skip_if_offline() expect_message(get_eurostat("avia_gonc", cache = FALSE, - time_format = "date_last", - legacy_bulk_download = FALSE) + time_format = "date_last") ) expect_match(as.character(unique(get_eurostat("avia_gonc", select_time = NULL, - cache = FALSE, - legacy_bulk_download = FALSE)$TIME_PERIOD)), + cache = FALSE)$TIME_PERIOD)), "-01-01") }) test_that("get_eurostat return right classes", { skip_on_cran() skip_if_offline() - expect_true(all(c("character", "numeric") %in% + expect_true(all(c("character", "numeric", "Date") %in% sapply(get_eurostat("road_eqr_trams"), class))) - expect_true(all(c("character", "numeric") %in% + expect_true(all(c("character", "numeric", "Date") %in% sapply( - get_eurostat("road_eqr_trams"), + get_eurostat("road_eqr_trams", keepFlags = TRUE), class ))) }) @@ -96,29 +62,20 @@ test_that("get_eurostat return right classes", { test_that("bi-annual data contains freq S", { skip_on_cran() skip_if_offline() - expect_true("S" %in% get_eurostat("earn_mw_cur", - legacy_bulk_download = FALSE)$freq) -}) - -test_that("eurostat2num (bulk download) works correctly", { - skip_on_cran() - skip_if_offline() - expect_true(is.numeric(get_eurostat("earn_mw_cur", - time_format = "num", - legacy_bulk_download = TRUE)$time) - ) + expect_true("S" %in% get_eurostat("earn_mw_cur")$freq) # sleep for a while to let the API rest Sys.sleep(5) }) + test_that("eurostat2num2 (dissemination API) works correctly", { skip_on_cran() skip_if_offline() expect_true( is.numeric( get_eurostat(id = "earn_mw_cur", - time_format = "num", - legacy_bulk_download = FALSE)$TIME_PERIOD + time_format = "num", + use.data.table = TRUE)$TIME_PERIOD ) ) }) @@ -129,8 +86,7 @@ test_that("weekly dataset download (dissemination API) works correctly", { expect_match( get_eurostat(id = "lfsi_abs_w", select_time = c("W"), - time_format = "date", - legacy_bulk_download = FALSE)$freq[1], "W") + time_format = "date")$freq[1], "W") }) test_that("get_eurostat get non-normal variable order", { @@ -138,3 +94,36 @@ test_that("get_eurostat get non-normal variable order", { skip_if_offline() expect_gt(nrow(get_eurostat("cens_01rdhh")), 0) }) + +test_that("get_eurostat and eurotime2date work with daily data", { + skip_on_cran() + skip_if_offline() + expect_match(get_eurostat("irt_h_eurcoe_d", + filters = list(lastTimePeriod = 5))$freq[1], "D") +}) + +test_that("get_eurostat and eurotime2num work with daily data", { + skip_on_cran() + skip_if_offline() + # Downloading daily data with time_format = "num" produces a warning + # suppressWarnings is here to suppress that + expect_match(suppressWarnings(get_eurostat("irt_h_eurcoe_d", + filters = list(lastTimePeriod = 5), + time_format = "num"))$freq[1], "D") +}) + +test_that("get_eurostat and eurotime2num work with daily data", { + skip_on_cran() + skip_if_offline() + expect_match(get_eurostat("ei_bsci_m_r2", + filters = list(lastTimePeriod = 5), + time_format = "num")$freq[1], "M") +}) + +test_that("get_eurostat and eurotime2num work with daily data", { + skip_on_cran() + skip_if_offline() + expect_match(get_eurostat("med_ag32", + filters = list(lastTimePeriod = 5), + time_format = "num")$freq[1], "A") +}) diff --git a/tests/testthat/test_05_json.R b/tests/testthat/test_05_json.R index 745f3f92..3e3d75d8 100755 --- a/tests/testthat/test_05_json.R +++ b/tests/testthat/test_05_json.R @@ -11,6 +11,33 @@ test_that("Get json data", { ignore.order = TRUE ) + # Unsupported language code used. Using the default language: "en" + expect_message( + get_eurostat_json("nama_10_gdp", + filters = list( + geo = "FI", + na_item = "B1GQ", + unit = "CLV_I10"), + lang = "FI", + type = "label") + ) + + # Using the default language: "en" + expect_message( + get_eurostat_json("nama_10_gdp", + filters = list( + geo = "FI", + na_item = "B1GQ", + unit = "CLV_I10"), + lang = NULL, + type = "both") + ) + + # Error message + expect_error( + get_eurostat_json("invalid_id") + ) + # sleep for a while to let the API rest Sys.sleep(5) }) diff --git a/tests/testthat/test_06_label.R b/tests/testthat/test_06_label.R index 4362fe49..dead5bcd 100755 --- a/tests/testthat/test_06_label.R +++ b/tests/testthat/test_06_label.R @@ -1,8 +1,8 @@ test_that("Variable names are labeled", { skip_on_cran() skip_if_offline() - expect_equal(label_eurostat_vars("geo"), "Geopolitical entity (reporting)") - expect_equal(label_eurostat_vars("housing", lang = "fr"), "Habitation") + expect_equal(label_eurostat_vars(id = "nama_10_lp_ulc", x = "geo", lang = "en"), "Geopolitical entity (reporting)") + expect_equal(label_eurostat_tables("nama_10_lp_ulc"), "Labour productivity and unit labour costs") expect_true(any(grepl( "_code", @@ -75,3 +75,13 @@ test_that("custom_dic works", { c("Finland", "Germany") ) }) + +test_that("wrong code (for this dataset) produces an error", { + skip_on_cran() + skip_if_offline() + expect_error( + label_eurostat( + get_eurostat("road_eqr_trams"), code = "coef" + ) + ) +}) \ No newline at end of file diff --git a/tests/testthat/test_07_misc.R b/tests/testthat/test_07_misc.R index f91f0731..ff70d6b7 100755 --- a/tests/testthat/test_07_misc.R +++ b/tests/testthat/test_07_misc.R @@ -27,3 +27,32 @@ test_that("Duplicated with fix_duplicated does not give an error", { ) ), "P5", all = TRUE) }) + +test_that("Get eurotime2date error message related to W99 values", { + skip_on_cran() + skip_if_offline() + expect_warning( + get_eurostat( + "demo_r_mweek3", + filters = list( + sex = "F", + age = "TOTAL", + geo = "BG" + ) + ) + ) +}) + +test_that("cut_to_classes works", { + skip_on_cran() + skip_if_offline() + dataset <- get_eurostat( + "nama_10_lp_ulc", + filters = list( + geo = c("AT", "DK", "BG"), + unit = "EUR", + na_item = "D1_SAL_HW")) + dataset <- na.omit(dataset) + + expect_visible(cut_to_classes(dataset$values)) +}) \ No newline at end of file diff --git a/tests/testthat/test_09_search.R b/tests/testthat/test_09_search.R index c4d95bf8..c6427480 100755 --- a/tests/testthat/test_09_search.R +++ b/tests/testthat/test_09_search.R @@ -8,4 +8,25 @@ test_that("search_eurostat finds", { )$code[1], "cens_01rdhh" ) + + expect_equal( + suppressWarnings( + search_eurostat( + "Volkswirtschaftliche Gesamtrechnungen", + type = "folder", + lang = "de" + ))$code[1], + "ei_qna" + ) + + expect_equal( + suppressWarnings( + search_eurostat( + "sts_os_t", + type = "folder", + column = "code", + lang = "fr" + ))$title[1], + "Chiffre d'affaires" + ) }) diff --git a/tests/testthat/test_99_restore_cache.R b/tests/testthat/test_99_restore_cache.R index 7904eecf..4f09c7a8 100644 --- a/tests/testthat/test_99_restore_cache.R +++ b/tests/testthat/test_99_restore_cache.R @@ -7,9 +7,9 @@ test_that("Restore user cache dir after testing", { expect_message(clean_eurostat_cache(config = FALSE)) user_dir <- Sys.getenv("TEST_EUROSTAT_CURRENT_CACHE") - curret_env <- Sys.getenv("EUROSTAT_CACHE_DIR") + current_env <- Sys.getenv("EUROSTAT_CACHE_DIR") - expect_false(curret_env == user_dir) + expect_false(current_env == user_dir) expect_message(expect_message( set_eurostat_cache_dir(user_dir) @@ -19,4 +19,6 @@ test_that("Restore user cache dir after testing", { expect_equal(user_dir, Sys.getenv("EUROSTAT_CACHE_DIR")) cat("Cache restored to ", Sys.getenv("EUROSTAT_CACHE_DIR"), "\n") + + eurostat:::clean_eurostat_toc() }) diff --git a/vignettes/articles/blogposts.Rmd b/vignettes/articles/blogposts.Rmd index bb6eec78..d0e41884 100644 --- a/vignettes/articles/blogposts.Rmd +++ b/vignettes/articles/blogposts.Rmd @@ -1,11 +1,6 @@ --- title: "Blog posts" date: "2022-02-07" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Blog posts} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} diff --git a/vignettes/articles/cheatsheet.Rmd b/vignettes/articles/cheatsheet.Rmd index 71a653a9..bec5871d 100644 --- a/vignettes/articles/cheatsheet.Rmd +++ b/vignettes/articles/cheatsheet.Rmd @@ -1,11 +1,6 @@ --- title: "Cheat sheet: eurostat R package" date: "2022-02-07" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Cheat sheet: eurostat R package} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} diff --git a/vignettes/articles/dimlst_vs_allconceptschemes.Rmd b/vignettes/articles/dimlst_vs_allconceptschemes.Rmd new file mode 100644 index 00000000..ecfa452e --- /dev/null +++ b/vignettes/articles/dimlst_vs_allconceptschemes.Rmd @@ -0,0 +1,353 @@ +--- +title: "Differences between dimlst.dic and ALL_CONCEPTSCHEMES.xml" +date: "`r Sys.Date()`" +editor_options: + chunk_output_type: inline +output: + html_document: + toc: yes +--- + +# Introduction + +As Eurostat is in the process of getting rid of Bulk Download facilities, there are inevitably some changes that affect the `eurostat` package as well. One of those is the removal of old `.dic` objects that have been used in translating Eurostat variable codes into cleartext labels in English, French or German. + +All things must pass. We have removed the old `label_eurostat_vars()` function that simply downloaded `dimlst.dic`, sort of 'master file' of all available codes and their cleartext labels, and used that to label all Eurostat datasets. Now labeling is done by downloading a Concept Scheme file for each individual dataset and using that information to give labels to the dataset in the desired language. + +# Comparison of old and new + +An example of the old English version dimlst.dic file (downloaded 2023-12-18 from [here](https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&dir=dic%2Fen)), 10 first rows: + +```{text} +ACCIDENT Accident +ACCOMMOD Mode of accommodation +ACCOMSIZE Size of accommodation by number of bedplaces +ACCOMUNIT Accommodation unit +ACL00 Classification of activities for time use +ACTIVITY Type of activity +ADMINISTR Administration indicator +AFFORD Affordability +AGE Age class +AGECHILD Age of the child +AGEDEF Age definition +``` + +An example of the new Concept Scheme file for dataset `NAMA_10_GDP` (see instructions for downloading [here](https://wikis.ec.europa.eu/display/EUROSTATHELP/API+SDMX+2.1+-+metadata+query#APISDMX2.1metadataquery-SDMX2.1endpoint-REST-SDMX-ML2.1ConceptScheme)): + +```{xml} + + + Time frequency + + + Zeitliche Frequenz + + + Fréquence (relative au temps) + + + + + + + + + + Unit of measure + + + Maßeinheit + + + Unité de mesure + + + + + + + +``` + +The apparent benefit of XML presentation is that all language versions can be found in the same file. This makes the files a bit larger than old .tsv files but for individual datasets the size is still manageable. + +Concept id's or Ref id's ("unit", "UNIT") can be used to look up further classifications in Codelists. In the old .dic metaphor all definition files were "dictionaries" where `dimlst.dic` was a special case, a dictionary of dictionaries, whereas in the new metaphor there is more of a hierarchy of definitions. For example in the case of units all available English labels can be downloaded in JSON-stat and TSV formats: + +https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/codelist/ESTAT/UNIT?format=TSV&lang=en +https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/codelist/ESTAT/UNIT?format=JSON&lang=en + +However, the new TSV files and the old .dic files are virtually identical: + +```{text} +# unit.dic +TOTAL Total +NR Number +NR_HAB Number per inhabitant +THS Thousand +MIO Million +BN Billion +CT Euro cent +EUR Euro +THS_EUR Thousand euro +MIO_EUR Million euro +BN_EUR Billion euro +[...] +[711 lines] + +# ESTAT_UNIT_22.0_EN.tsv +TOTAL Total +NR Number +NR_HAB Number per inhabitant +THS Thousand +MIO Million +BN Billion +CT Euro cent +EUR Euro +THS_EUR Thousand euro +MIO_EUR Million euro +BN_EUR Billion euro +[...] +[711 lines] +``` + +# Replicating old style dimlst.dic with new xml files + +In some cases it may have been useful to access all labels for all datasets from a single file. In theory this is possible with Concept Schemes as well, by downlaoding all concept schemes at once in the form of "ALL_CONCEPTSCHEMES.xml" file, at 29.7 Mb large. We can parse the xml file to create a list that is similar to the old `dimlst.dic` object to see if there are any functional differences. + +```{r eval=FALSE} +library(xml2) +# file downloaded from https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/conceptscheme/ESTAT/?compressed=true and unpacked +xml_object <- xml2::read_xml("ALL_CONCEPTSCHEMES.xml") +number <- length(xml2::xml_find_all(xml_object, ".//s:Concept")) +dic_df <- data.frame( + code_name = rep(NA, times = number), + full_name = rep(NA, times = number) +) +attributes <- xml2::xml_attrs(xml2::xml_find_all(xml_object, ".//s:Concept")) +contents <- xml2::xml_text(xml2::xml_find_all(xml_object, ".//s:Concept/c:Name[@xml:lang='en']")) +for (i in seq_len(number)) { + dic_df$code_name[i] <- unname(attributes[[i]]["id"]) +} +# This is ok because the length of and is the same +dic_df$full_name <- contents +``` + +We can see that there are more unique codes than labels and that some labels are being used in several different codes: + +```{r eval=FALSE} +length(unique(dic_df$full_name)) +# [1] 586 +length(unique(dic_df$code_name)) +# [1] 592 +``` + +To make the data.frame similar to the one that we would get from reading a tab-separated .dic object: + +```{r eval=FALSE} +# Select unique rows +library(dplyr) + +new_df <- dic_df %>% + distinct() + +# codes toupper +new_df$code_name <- toupper(new_df$code_name) + +new_df_sort <- new_df[order(new_df$code_name),] + +# Remove row numbers +rownames(new_df_sort) <- NULL + +head(new_df_sort) +# code_name full_name +# 1 ACCIDENT Accident +# 2 ACCOMMOD Mode of accommodation +# 3 ACCOMSIZE Size of accommodation by number of bedplaces +# 4 ACCOMUNIT Accommodation unit +# 5 ACL00 Classification of activities for time use +# 6 ACTIVITY Type of activity +``` + +As comparison to the `dimlst.dic` object: + +```{r eval=FALSE} +# downloaded from https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&dir=dic%2Fen +dimlst_dic <- readr::read_tsv("dimlst.dic", + col_names = c("code_name", "full_name"), + col_types = readr::cols(.default = readr::col_character())) + +head(dimlst_dic) +## A tibble: 6 × 2 +# code_name full_name +# +# 1 ACCIDENT Accident +# 2 ACCOMMOD Mode of accommodation +# 3 ACCOMSIZE Size of accommodation by number of bedplaces +# 4 ACCOMUNIT Accommodation unit +# 5 ACL00 Classification of activities for time use +# 6 ACTIVITY Type of activity +``` + +Clearly, the two objects have different types (the former is a data.frame, the latter is a tibble), but that doesn't stop us from noticing that at least the 6 first rows are similar with each other. However, `dimlst.dic` has 623 rows while `new_df` object has 593 rows (obs.). Let's find out what the differences are: + +```{r eval=FALSE} +setdiff(dimlst_dic$code_name, new_df_sort$code_name) +# [1] "AGR_INP" "CALCMETH" "DIMLST" "ECOSYST" "ECOSYST_C" "FARMSIZE" "HLTH_HLE" +# [8] "HOSPCARE" "HOUS_ANI" "INDIC_AGR" "IND_ACCT" "IND_IMPV" "ISSUER" "LEARNING" +# [15] "LEV_INTRF" "MANSTO" "NRG_FLOW" "NRG_TECH" "OBS_STATUS" "OGA_FAM" "OGA_NRH" +# [22] "OGA_RH" "OGA_TYPE" "PEDS" "PERS_INV" "PRD_ACCT" "PRD_AMO" "RAWMATPR" +# [29] "RAWMATSEC" "REVDATE" "SIZE_TUR" "TABLE_DIC" "TIME" "VOT_CAT" "WEEK" +# [36] "YN_CARE" "YN_DIF" "YN_DIS" +# length: 38 items +length(setdiff(dimlst_dic$code_name, new_df_sort$code_name)) +# [1] 38 +setdiff(new_df_sort$code_name, dimlst_dic$code_name) +# [1] "FIELDID" "INDIC_EU" "OBS_FLAG" "OBS_VALUE" "SIZEN_R2" "TARGET" "TARGET_FLAG" +# [8] "TIME_PERIOD" +length(setdiff(new_df_sort$code_name, dimlst_dic$code_name)) +# [1] 8 +``` + +To summarize, the old `dimlst.dic` file has 38 codes that are not found in the `ALL_CONCEPTSCHEMES.xml` file. The new `ALL_CONCEPTSCHEMES.xml` has 8 codes that are not found in the old `dimlst.dic`. + +For more information about the different fields, let's print the codes and their descriptions. Unique to `dimlst_dic` object: + +```{r eval=FALSE} +print(dimlst_dic[which(dimlst_dic$code_name %in% setdiff(dimlst_dic$code_name, new_df_sort$code_name)),], n = 40) +# A tibble: 38 × 2 +# code_name full_name +# +# 1 AGR_INP Agricultural inputs +# 2 CALCMETH Calculation method +# 3 DIMLST null +# 4 ECOSYST Ecosystem typology +# 5 ECOSYST_C Ecosystem typology - converted +# 6 FARMSIZE Size of farm +# 7 HLTH_HLE Health and life expectancy +# 8 HOSPCARE Hospital care +# 9 HOUS_ANI Animal housing +# 10 INDIC_AGR Agricultural indicators +# 11 IND_ACCT Industries and accounting items +# 12 IND_IMPV Industries, imports and valuations +# 13 ISSUER Type of issuer +# 14 LEARNING Learning form +# 15 LEV_INTRF Level of interference +# 16 MANSTO Manure storage +# 17 NRG_FLOW Energy flows +# 18 NRG_TECH Energy technologies +# 19 OBS_STATUS Observation status (Flag) +# 20 OGA_FAM Other gainful activity of the family members +# 21 OGA_NRH Other gainful activity of the holder (not related to the agricultural holding) +# 22 OGA_RH Other gainful activity of the holder (related to the agricultural holding) +# 23 OGA_TYPE Types of other gainful activity (OGA) related to the agricultural holding +# 24 PEDS Potential Environmentally Damaging Subsidies (ESA transfers) +# 25 PERS_INV Persons involved in the accident +# 26 PRD_ACCT Products and accounting items +# 27 PRD_AMO Products, adjustments and market output +# 28 RAWMATPR Primary raw materials +# 29 RAWMATSEC Secondary raw materials +# 30 REVDATE Revision date +# 31 SIZE_TUR Size classes of turnover +# 32 TABLE_DIC null +# 33 TIME Period of time +# 34 VOT_CAT Category of voters +# 35 WEEK Calendar week +# 36 YN_CARE Use of profesional care - Yes/No +# 37 YN_DIF Difficulties - Yes/No +# 38 YN_DIS Disability - Yes/No +``` + +Unique to new_df or new_df_sort: + +```{r eval=FALSE} +new_df_sort[which(new_df_sort$code_name %in% setdiff(new_df_sort$code_name, dimlst_dic$code_name)),] +# code_name full_name +# 152 FIELDID Agricultural product +# 221 INDIC_EU Indicators for EU2020 project +# 364 OBS_FLAG Observation status (Flag) +# 365 OBS_VALUE Observation value +# 464 SIZEN_R2 Enterprise size and Nace Rev. 2 +# 502 TARGET TARGET Observation value +# 503 TARGET_FLAG TARGET Observation status (Flag) +# 510 TIME_PERIOD Time +``` + +Of these, "FIELDID / Agricultural product" seems almost like an input error as there are also "prod_apr / Agricultural product (old codes)" and "agriprod / Agricultural products" on the list. If that were the case, the correct course of action is to of course give feedback to Eurostat. + +# Types of duplicates + +There are also some duplicates in the list created from the XML file. Duplicates exist both in the `code_name` column or in the `full_name` column. + +```{r eval=FALSE} +new_df_sort[duplicated(new_df_sort$code_name),] +# code_name full_name +# 471 SO_EUR Standardoutput in Euros + +new_df_sort[duplicated(new_df_sort$full_name),] +# code_name full_name +# 35 ASYL_APP Applicant type +# 179 HHTYPE Type of household +# 227 INDIC_INN Innovation indicator +# 233 INDIC_NRG Energy indicator +# 237 INDIC_SBS Economical indicator for structural business statistics +# 452 SECTPART Sector (ESA 2010) +# 528 TY Type of expenditure +``` + +The differences can be due to typos (probably ?): + +```{r eval=FALSE} + +new_df_sort[which(new_df_sort$code_name == "SO_EUR"),] +# code_name full_name +# 470 SO_EUR Standard output in Euros +# 471 SO_EUR Standardoutput in Euros + +new_df_sort[which(new_df_sort$full_name == "Type of household"),] +# code_name full_name +# 178 HHTYP Type of household +# 179 HHTYPE Type of household + +new_df_sort[which(new_df_sort$full_name == "Innovation indicator"),] +# code_name full_name +# 226 INDIC_IN Innovation indicator +# 227 INDIC_INN Innovation indicator + +new_df_sort[which(new_df_sort$full_name == "Economical indicator for structural business statistics"),] +# code_name full_name +# 236 INDIC_SB Economical indicator for structural business statistics +# 237 INDIC_SBS Economical indicator for structural business statistics +``` + +...or due to actual differences (?) in the fields, although there could also be some kind of a misunderstanding: + +```{r eval=FALSE} +# Different types of applicants +new_df_sort[which(new_df_sort$full_name == "Applicant type"),] +# code_name full_name +# 24 APPLICANT Applicant type +# 35 ASYL_APP Applicant type + +new_df_sort[which(new_df_sort$full_name == "Energy indicator"),] +# code_name full_name +# 218 INDIC_EN Energy indicator +# 233 INDIC_NRG Energy indicator + +new_df_sort[which(new_df_sort$full_name == "Sector (ESA 2010)"),] +# code_name full_name +# 450 SECTOR10 Sector (ESA 2010) +# 452 SECTPART Sector (ESA 2010) + +new_df_sort[which(new_df_sort$full_name == "Type of expenditure"),] +# code_name full_name +# 144 EXPEN Type of expenditure +# 528 TY Type of expenditure +``` + +# Conclusion + +Changes in methods of delivering metadata affect, naturally, all end users of Eurostat data. With the eurostat package version 4.0.0 we have aimed at retaining the user-facing functionalities and the expected outputs. The interesting world of XML parsing is kept under the hood and should not be of concern for users. + +This document is written mainly as a future reference for ourselves if we might at some point be wondering why something that was possible before is not possible anymore, or for users who have had scripts relying on functions like `label_eurostat_vars()`. + +Feel free to open an issue or a pull request in Github if there are any suggestions or corrections you would like to make. \ No newline at end of file diff --git a/vignettes/articles/eurostat_tutorial.Rmd b/vignettes/articles/eurostat_tutorial.Rmd index fdf29a50..79218a7d 100644 --- a/vignettes/articles/eurostat_tutorial.Rmd +++ b/vignettes/articles/eurostat_tutorial.Rmd @@ -1,17 +1,11 @@ --- title: "Tutorial for the eurostat R package" date: "`r Sys.Date()`" -output: - rmarkdown::html_vignette: - toc: true -vignette: > - %\VignetteIndexEntry{Tutorial for the eurostat R package} - %\VignetteDepends{Cairo} - %\VignetteEncoding{UTF-8} - \usepackage[utf8]{inputenc} - %\VignetteEngine{knitr::rmarkdown} editor_options: chunk_output_type: inline +output: + html_document: + toc: yes --- # R Tools for Eurostat Open Data @@ -22,6 +16,7 @@ This [rOpenGov](http://ropengov.github.io) R package provides tools to access [E # Global options library(knitr) opts_chunk$set(fig.path = "fig/") +options(citation.bibtex.max=999) ``` # Installation @@ -34,17 +29,30 @@ install.packages("eurostat") Development version [(Github)](https://github.com/rOpenGov/eurostat): -```{r install2, eval=FALSE} +```{r install_devel, eval=FALSE} library(remotes) remotes::install_github("ropengov/eurostat") ``` +Alternatively, development versions (more specifically: development versions in the master branch of eurostat GitHub repository) can be installed with the help of R-universe: + +```{r install_runiverse, eval=FALSE} +# Enable this universe +options(repos = c( + ropengov = "https://ropengov.r-universe.dev", + CRAN = "https://cloud.r-project.org" +)) + +install.packages("eurostat") +``` + +The package is loaded with the library function. + ```{r, echo=FALSE} library(eurostat) ``` - -Overall, the eurostat package includes the following functions: +Overall, the eurostat package includes the following user-facing functions: ```{r, echo=FALSE,comment=NA} cat(paste0(library(help = "eurostat")$info[[2]], collapse = "\n")) @@ -57,12 +65,13 @@ evaluate <- curl::has_internet() # Finding data -Function `get_eurostat_toc()` downloads a table of contents of eurostat datasets. The values in column 'code' should be used to download a selected dataset. +First stop for most researchers would be to browse the [Eurostat Data Browser website](https://ec.europa.eu/eurostat/databrowser/explore/all/all_themes) or other thematically arranged sections in the Eurostat website. However, the eurostat R package offers some ways to search for datasets without leaving the R interface. + +Function `get_eurostat_toc()` downloads a table of contents (TOC) of eurostat datasets. ```{r get_eurostat_toc, warning=FALSE, message=FALSE, eval = evaluate} # Load the package library(eurostat) -# library(rvest) # Get Eurostat data listing toc <- get_eurostat_toc() @@ -72,46 +81,61 @@ library(knitr) kable(tail(toc)) ``` -Some of the data sets (e.g. in the 'comext' type) are not accessible -through the standard interface. See the `get_eurostat()` function documentation for more details. +The values in column 'code' are unique identifiers for each dataset that have to be used when downloading specific datasets. In the `get_eurostat()` function the dataset code is put into the first argument of the function, `id`. + +From eurostat version 4.0.0 onwards the returned TOC object has had an additional column, `hierarchy`. It is used to determine which dataset belongs to which folder. This is helpful for example when downloading datasets in a single folder all at once. + +From eurostat version 4.0.0 onwards it is possible to download TOC objects in French and German as well, in addition to English, which remains the default option. This enables new functionalities in other eurostat functions that have used the TOC object internally but retains backwards-compatibility with old code as the `lang` argument is not mandatory and queries without it continue to deliver the English version of the TOC object. + +```{r get_eurostat_toc2, warning=FALSE, message=FALSE, eval = evaluate} +kable(head(get_eurostat_toc(lang = "fr"))) +``` + +With `search_eurostat()` you can search the table of contents for particular patterns, e.g. all datasets related to *passenger transport*. With the `type` argument the user can choose which types of datasets the search should return: datasets, tables, folders or all types (the default). -With `search_eurostat()` you can search the table of contents for particular patterns, e.g. all datasets related to *passenger transport*. The kable function to produces nice markdown output. Note that with the `type` argument of this function you could restrict the search to for instance datasets or tables. +According to [Eurostat database basic terminology](https://ec.europa.eu/eurostat/statistics-explained/index.php?title=Glossary:Eurostat_database_-_basic_terminology) "tables (predefined tables) are used to provide easy access to the main statistical indicators. They are based in general on datasets and are derived from them. They are predefined, non-modifiable and presented as two or three dimensional tables." The more general purpose datasets are, on the other hand, described to be "multi-dimensional tables" that have "up to 8 dimensions" and are used "store the base data, more appropriate for use by statistical and other experts via special applications". ```{r search_eurostat, warning=FALSE, message=FALSE, eval = evaluate} # info about passengers kable(head(search_eurostat("passenger transport"))) ``` -Codes for the dataset can be searched also from the [Eurostat -database](http://ec.europa.eu/eurostat/data/database). The Eurostat -database gives codes in the Data Navigation Tree after every dataset -in parenthesis. +From eurostat version 4.0.0 onwards it possible to perform searches also from dataset codes. This is done by specifying the search column by setting the `column` attribute to `"code"`. Searching for codes can be useful in finding datasets that belong to the same folder or are part of a larger theme that shares similar dataset code patterns, such as "migr" for migration related statistics and "tran" in the case of (multimodal) transport statistics. +```{r search_eurostat2, warning=FALSE, message=FALSE, eval = evaluate} +kable(head(search_eurostat("migr", column = "code"))) +``` + +Another new addition in version 4.0.0 is the option to perform searches from French and German language TOC versions as well by setting the `lang` argument to `"fr"` or `"de"`. Naturally, dataset codes are shared between language versions so French and German language searches should be conducted only on the title column. + +```{r search_eurostat3, warning=FALSE, message=FALSE, eval = evaluate} +kable(head(search_eurostat("flughafen", column = "title", lang = "de"))) +``` + +As mentioned in the beginning, codes for different dataset can be found also from the [Eurostat database](http://ec.europa.eu/eurostat/data/database). The Eurostat database gives codes in the Data Navigation Tree in parenthesis after the full name of the dataset, folder, or table. # Downloading data -The package supports two of the Eurostats download methods: the bulk download -facility and the Web Services' JSON API. The bulk download facility is the -fastest method to download whole datasets. It is also often the only way as -the JSON API has limitation of maximum 50 sub-indicators at a time and -whole datasets usually exceeds that. To download only a small section of the -dataset the JSON API is faster, as it allows to make a data selection -before downloading. +The package supports two of the Eurostats download methods: the SDMX 2.1 REST API and the API Statistics ("JSON API"). The bulk download facility is the fastest method to download whole datasets. To download only a small section of the dataset the JSON API is faster, as it allows to make a data selection before downloading. -A user does not usually have to bother with methods, as both are used via main -function `get_eurostat()`. If only the table id is given, the whole table is -downloaded from the bulk download facility. If also filters are defined -the JSON API is used. +The end user does not usually have to bother where original data is downloaded, as both data sources are accessed via the main download function `get_eurostat()`. If only the table id is given, the whole table is downloaded from the SDMX 2.1 REST API. If any filters are given the JSON API is used instead. However, the `get_eurostat_json()` function used internally is also a user-facing function so that can be used as well. -Here an example of indicator 'Modal split of passenger transport'. This is the percentage share of each mode of transport in total inland transport, expressed in passenger-kilometres (pkm) based on transport by passenger cars, buses and coaches, and trains. All data should be based on movements on national territory, regardless of the nationality of the vehicle. However, the data collection is not harmonized at the EU level. +We will use the dataset 'Modal split of air, sea and inland passenger transport' as an example dataset in this vignette. This is the percentage share of each mode of transport in total inland transport, expressed in passenger-kilometres (pkm) based on transport by passenger cars, buses and coaches, trains, aircraft, and seagoing vessels. All data should be based on movements on national territory, regardless of the nationality of the vehicle. However, the data collection is not harmonized at the EU level. For more detailed information about the dataset, see [Reference Metadata](https://ec.europa.eu/eurostat/cache/metadata/en/tran_hv_ms_esms.htm). Pick and print the id of the data set to download: ```{r get_id, warning=FALSE, message=FALSE, results='asis', eval = evaluate} -# For the original data, see -# http://ec.europa.eu/eurostat/tgm/table.do?tab=table&init=1&plugin=1&language=en&pcode=tsdtr210 -id <- search_eurostat("Modal split of passenger transport", - type = "table" -)$code[1] +# Perform search, the output is a table of search results +search_results <- search_eurostat("Modal split of air, sea and inland passenger transport", + type = "dataset" +) + +# Since our search term was so detailed, we should have only 1 result / 1 row +kable(head(search_results)) + +# Get the id from the table +id <- search_results$code[1] + +# Check the id print(id) ``` @@ -120,15 +144,15 @@ print(id) if (!is.na(id)) evaluate <- TRUE else evaluate <- FALSE ``` - Get the whole corresponding table. As the table is annual data, it is more -convenient to use a numeric time variable than use the default date format: +convenient to use a numeric time variable than use the default date format, where yearly data would be coerced to be on the first day of the year (e.g. 2000-01-01). ```{r get_eurostat, warning=FALSE, message=FALSE, results='asis', eval = evaluate} -dat <- get_eurostat(id, time_format = "num") +dat <- get_eurostat(id, time_format = "num", stringsAsFactors = TRUE) ``` -Investigate the structure of the downloaded data set: +The structure of the downloaded data set can be investigated by using the base R `str()` function: + ```{r str_dat, warning=FALSE, message=FALSE, eval = evaluate} str(dat) ``` @@ -137,31 +161,32 @@ str(dat) kable(head(dat)) ``` -Or you can get only a part of the dataset by defining `filters` argument. It +You can get only a part of the dataset by defining `filters` argument. It should be named list, where names corresponds to variable names (lower case) and values are vectors of codes corresponding desired series (upper case). For -time variable, in addition to a `time`, also a `sinceTimePeriod` -and a `lastTimePeriod` can be used. +time variable, in addition to a `time` or `TIME_PERIOD` , also `sinceTimePeriod`, `untilTimePeriod` and a `lastTimePeriod` can be used. + +More information about filtering can be found in `get_eurostat()` and `get_eurostat_json()` function documentation. ```{r get_eurostat_json, warning=FALSE, message=FALSE, results='asis', eval=evaluate} -dat2 <- get_eurostat(id, filters = list(geo = c("EU28", "FI"), lastTimePeriod = 1), time_format = "num") +dat2 <- get_eurostat(id, filters = list(geo = c("EU27_2020", "FI"), lastTimePeriod = 1), time_format = "num") kable(dat2) ``` ## Replacing codes with labels By default variables are returned as Eurostat codes, but to get human-readable -labels instead, use a `type = "label"` argument. +labels instead, use a `type = "label"` argument in `get_eurostat()`. ```{r json_labels, warning=FALSE, message=FALSE, results='asis', eval = evaluate} -datl2 <- get_eurostat(id, +dat_labeled2 <- get_eurostat(id, filters = list( - geo = c("EU28", "FI"), + geo = c("EU27_2020", "FI"), lastTimePeriod = 1 ), type = "label", time_format = "num" ) -kable(head(datl2)) +kable(head(dat_labeled2)) ``` Eurostat codes in the downloaded data set can be replaced with @@ -169,25 +194,119 @@ human-readable labels from the Eurostat dictionaries with the `label_eurostat()` function. ```{r labels, warning=FALSE, message=FALSE, results='asis', eval = evaluate} -datl <- label_eurostat(dat) -kable(head(datl)) +dat_labeled <- label_eurostat(dat) +kable(head(dat_labeled)) ``` -The `label_eurostat()` allows conversion of individual variable -vectors or variable names as well. +The `label_eurostat_vars()` allows conversion of variable names as well. ```{r name_labels, eval = evaluate} -label_eurostat_vars(names(datl)) +print(label_eurostat_vars(id = "tran_hv_ms_psmod", names(dat_labeled))) ``` -Vehicle information has 3 levels. You can check them now with: +Vehicle information has 5 levels. You can check them now with: ```{r vehicle_levels, eval = evaluate} -levels(datl$vehicle) +levels(dat_labeled$vehicle) ``` +## Downloading data interactively + +New function in the eurostat package version 4.0.0 is the `get_eurostat_interactive()` function that allows users to search and download datasets with the help of interactive menus. If the user already knows which dataset they want to download, the `get_eurostat_interactive()` function can also take a dataset code as a parameter, skipping the search part of the interactive menu. Below we will demonstrate the whole process from search to download to printing a citation for the dataset, utilizing several different eurostat package functions at once. + +```{text} +> get_eurostat_interactive() +Select language +1: English +2: French +3: German + +Selection: 1 +Enter search term for data: aviation +Which dataset would you like to download? + +1: [tran_sf_aviagah] Air accident victims in general aviation, by country of occurrence and country of registration of aircraft - maximum take-off mass above 2250 kg (source: EASA) +2: [tran_sf_aviagal] Air accident victims in general aviation by country of occurrence and country of registration of aircraft - maximum take-off mass under 2250 kg (source: EASA) +3: [avia_ec_enterp] Number of aviation and airport enterprises +4: [avia_ec_emp_ent] Employment in aviation and airport enterprises by sex + + +Selection: 4 +Download the dataset? + +1: Yes +2: No + +Selection: 1 +Would you like to use default download arguments or set them manually? + +1: Default +2: Manually selected + +Selection: 1 +trying URL 'https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/avia_ec_emp_ent?format=TSV&compressed=true' +Content type 'text/tab-separated-values; charset=UTF-8' length 1354 bytes +================================================== +downloaded 1354 bytes + +Table avia_ec_emp_ent cached at /var/folders/f4/h_r3y60n0nn0qm6qx5hnx1s00000gn/T//RtmpDJ1gUA/eurostat/60ee371bcdcc9b130a20514d1e0d574d.rds +Print dataset citation? + +1: Yes +2: No + +Selection: 1 +Print code for downloading dataset? + +1: Yes +2: No + +Selection: 1 +Print dataset fixity checksum? + +1: Yes +2: No + +Selection: 1 +##### DATASET CITATION: + +@Misc{avia-ec-emp-ent-2016-4-20, + title = {Employment in aviation and airport enterprises by sex (avia\_ec\_emp\_ent)}, + url = {https://ec.europa.eu/eurostat/web/products-datasets/product?code=avia_ec_emp_ent}, + language = {english}, + year = {2016}, + author = {{Eurostat}}, + urldate = {2023-12-19}, + type = {Dataset}, + note = {Accessed 2023-12-19, dataset last updated 2016-04-20}, +} + +##### DOWNLOAD PARAMETERS: + +get_eurostat(id = 'avia_ec_emp_ent') + +##### FIXITY CHECKSUM: + +Fixity checksum (md5) for dataset avia_ec_emp_ent: 36975282eaaea50a6e5f0e6cd64ef4d2 + +# A tibble: 450 × 6 + freq enterpr sex geo TIME_PERIOD values + + 1 A AIRP F CY 2006-01-01 192 + 2 A AIRP F CY 2007-01-01 240 + 3 A AIRP F CY 2008-01-01 514 + 4 A AIRP F CY 2009-01-01 3278 + 5 A AIRP F CY 2010-01-01 2587 + 6 A AIRP F CY 2011-01-01 2255 + 7 A AIRP F CY 2012-01-01 2954 + 8 A AIRP F CZ 2001-01-01 0 + 9 A AIRP F CZ 2002-01-01 0 +10 A AIRP F CZ 2003-01-01 0 +# ℹ 440 more rows +# ℹ Use `print(n = ...)` to see more rows +``` # Selecting and modifying data @@ -204,51 +323,48 @@ kable(efta_countries) ## EU data from 2012 in all vehicles: ```{r eu_12, eval = evaluate} -dat_eu12 <- subset(datl, geo == "European Union - 28 countries" & time == 2012) +dat_eu12 <- subset(dat_labeled, geo == "European Union - 27 countries (from 2020)" & TIME_PERIOD == 2012) kable(dat_eu12, row.names = FALSE) ``` -## EU data from 2000 - 2012 with vehicle types as variables: +## EU data from 2008 - 2020 with vehicle types as variables: Reshaping the data is best done with `spread()` in `tidyr`. ```{r eu_vehicles_table, eval = evaluate} library("tidyr") -dat_eu_0012 <- subset(dat, geo == "EU28" & time %in% 2000:2012) +dat_eu_0012 <- subset(dat, geo == "EU27_2020" & TIME_PERIOD %in% c(2008:2020)) dat_eu_0012_wide <- spread(dat_eu_0012, vehicle, values) kable(subset(dat_eu_0012_wide, select = -geo), row.names = FALSE) ``` -## Train passengers for selected EU countries in 2000 - 2012 +## Train passengers for selected EU countries in 2008 - 2020 ```{r trains_table, eval = evaluate} -dat_trains <- subset(datl, geo %in% c("Austria", "Belgium", "Finland", "Sweden") & - time %in% 2000:2012 & +dat_trains <- subset(dat_labeled, geo %in% c("Austria", "Belgium", "Finland", "Sweden") & + TIME_PERIOD %in% c(2008:2020) & vehicle == "Trains") dat_trains_wide <- spread(dat_trains, geo, values) kable(subset(dat_trains_wide, select = -vehicle), row.names = FALSE) ``` +## Other packages -## SDMX - -Eurostat data is available also in the Statistical Data and Metadata eXchange ([SDMX](https://sdmx.org)) [Web Services](https://ec.europa.eu/eurostat/web/sdmx-web-services/about-this-service). Our eurostat R package does not provide custom tools for this but the following generic R packages provide access to eurostat SDMX version: +### Strongly recommended - - [restatapi](https://github.com/eurostat/restatapi) - - [rsdmx](https://CRAN.R-project.org/package=rsdmx) - - [rjsdmx](https://github.com/amattioc/SDMX/wiki) +The `giscoR` ([package homepage](https://ropengov.github.io/giscoR/)) package used to be only suggested but starting from `eurostat` version 4.0.0 it has become a dependency of eurostat and required for using geospatial data functions. In addition to using `get_eurostat_geospatial()` from the `eurostat` package, it is highly recommended to study `giscoR` package functions and vignettes for creating more sophisticated visualisations to support geospatial analyses. -# Further examples +### Packages with similar functionalities -For further examples, see the [package homepage](http://ropengov.github.io/eurostat/articles/index.html). +The [restatapi](https://CRAN.R-project.org/package=restatapi) R package has similar functionalities and some familiar function names for seasoned eurostat R package users. The `restatapi` package focuses more on statistical data and retrieving and returning data in a non-tidy data format. +The [rsdmx](https://CRAN.R-project.org/package=rsdmx) and [rjsdmx](https://CRAN.R-project.org/package=RJSDMX) R packages provide a more generic method to download data from a wide variety of statistical data providers that utilize the Statistical Data and Metadata eXchange ([SDMX](https://sdmx.org)) standards. -# Citations and related work - -### Recommended packages +# Further examples -NOTE: we recommend to check also the `giscoR` package (https://dieghernan.github.io/giscoR/). This is another API package that provides R tools for Eurostat geographic data to support geospatial analysis and visualization. +For further examples, see articles in the [package homepage](http://ropengov.github.io/eurostat/). +# Citations and related work ### Citing the data sources @@ -279,5 +395,5 @@ For contact information, see the [package homepage](http://ropengov.github.io/eu This tutorial was created with ```{r sessioninfo, message=FALSE, warning=FALSE} -sessionInfo() +sessioninfo::session_info() ``` diff --git a/vignettes/articles/mapping.Rmd b/vignettes/articles/mapping.Rmd index d667fc81..48912477 100755 --- a/vignettes/articles/mapping.Rmd +++ b/vignettes/articles/mapping.Rmd @@ -1,38 +1,53 @@ --- title: "Mapping Regional Data, Mapping Metadata Problems" -author: Daniel Antal, CFA +author: Daniel Antal (CFA) date: "`r Sys.Date()`" -output: - rmarkdown::html_vignette: - toc: true -vignette: > - %\VignetteIndexEntry{Mapping Regional Data, Mapping Metadata Problems} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteDepends{Cairo} - %\VignetteEncoding{UTF-8} - \usepackage[utf8]{inputenc} +output: + html_document: + toc: yes +editor_options: + markdown: + wrap: 80 + canonical: true --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, - comment = "#>" + comment = "#>", + tidy = "styler", + dev = "ragg_png", + warning = FALSE, + dpi = 300, + out.width = "100%" ) -here::here() ``` -The [regions](https://regions.dataobservatory.eu/) package offers tools two work with regional statistics. It is an offspring of the [eurostat](https://ropengov.github.io/eurostat/) package of [rOpenGov](https://ropengov.org/), which offers data search, download, manipulation and visualization for Eurostat's [European statistics](https://ec.europa.eu/eurostat). While you can use [regions](https://regions.dataobservatory.eu/) for any European regional statistics, and with a limited functionality, any regional statistics from other parts of the world, this article provides a combined use case for the two packages. - -```{r setup, echo=FALSE, message=FALSE, warning=FALSE} +The [regions](https://regions.dataobservatory.eu/) package offers tools two work +with regional statistics. It is an offspring of the +[eurostat](https://ropengov.github.io/eurostat/) package of +[rOpenGov](https://ropengov.org/), which offers data search, download, +manipulation and visualization for Eurostat's [European +statistics](https://ec.europa.eu/eurostat). While you can use +[regions](https://regions.dataobservatory.eu/) for any European regional +statistics, and with a limited functionality, any regional statistics from other +parts of the world, this article provides a combined use case for the two +packages. + +```{r setup} library(regions) library(eurostat) -library(dplyr, quietly = T) +library(dplyr) ``` -Eurostat's main function for data access is [get_eurostat()](https://ropengov.github.io/eurostat/reference/get_eurostat.html), but in this case we will use the more specific [get_eurostat_json](https://ropengov.github.io/eurostat/reference/get_eurostat_json.html) to avoid downloading unnecessary aspects of this data product. Let us get a long-established regional dataset, the full-time equivalent (FTE) R&D workforce, in both sexes, in all sectors and all professional positions, and limit our data to two years only: +Eurostat's main function for data access is `get_eurostat()`, but in this case +we will use the more specific `get_eurostat_json()` to avoid downloading +unnecessary aspects of this data product. Let us get a long-established regional +dataset, the full-time equivalent (FTE) R&D workforce, in both sexes, in all +sectors and all professional positions, and limit our data to two years only: -```{r rd-workforce-get, eval=FALSE, message=FALSE} -regional_rd_personnel <- eurostat::get_eurostat_json( +```{r rd-workforce-get, eval=FALSE} +regional_rd_personnel <- get_eurostat_json( id = "rd_p_persreg", filters = list( sex = "T", @@ -43,60 +58,64 @@ regional_rd_personnel <- eurostat::get_eurostat_json( ) regional_rd_personnel <- regional_rd_personnel %>% - filter(.data$time %in% c("2009", "2018")) + filter(time %in% c("2009", "2018")) ``` -We have saved this filtered datasets as `regional_rd_personnel` in the [regions](https://regions.dataobservatory.eu/) package. +We have saved this filtered datasets as `regions::regional_rd_personnel` in the +[regions](https://regions.dataobservatory.eu/) package. ```{r rd-presaved} data("regional_rd_personnel") ``` -```{r, include=FALSE} -## make sure that regional_rd_personnel does not remain a promise -regional_rd_personnel <- regional_rd_personnel -``` - - We have quiet a few missing cases: ```{r missing-cases} summary(is.na(regional_rd_personnel$values)) ``` + But this is not the only problem with the dataset. ## Choropleth Map -Let us try to place the data on a `ggplot2` map. +Let us try to place the data on a `ggplot2` map. -```{r, echo=TRUE} +```{r} library(ggplot2) ``` -Let us download a map with [get_eurostat_geospatial](https://ropengov.github.io/eurostat/reference/get_eurostat_geospatial.html). We will use the `NUTS2016`, i.e., `year = 2016`, which is the regional boundary definition set in 2016 and used in the period 2018-2020. This is the most used definition in 2021. +Let us download a map with `get_eurostat_geospatial()`. We will use the +`NUTS2016`, i.e., `year = 2016`, which is the regional boundary definition set +in 2016 and used in the period 2018-2020. This is the most used definition in +2021. + +```{r get-map} +# Need to load sf for using dplyr methods with sf objects +library(sf) -```{r get-map, eval=TRUE} -map_nuts_2 <- eurostat::get_eurostat_geospatial( - resolution = "60", - nuts_level = "2", +map_nuts_2 <- get_eurostat_geospatial( + resolution = "60", nuts_level = "2", year = 2016 ) ``` -You should always join your data with the geometric information of the regions starting from left with the map: +You should always join your data with the geometric information of the regions +starting from left with the map: -```{r, eval=TRUE} +```{r} indicator_with_map <- map_nuts_2 %>% left_join(regional_rd_personnel, by = "geo") ``` -Huge parts of Europe are not covered, but the missing values are not randomly missing. France went under a regional reform; Turkey and Albania did not provide this data earlier. Ireland has no regional statistics available. +Huge parts of Europe are not covered, but the missing values are not randomly +missing. France went under a regional reform; Turkey and Albania did not provide +this data earlier. Ireland has no regional statistics available. -```{r, eval=TRUE, out.width='80%', fig.align='center'} +```{r choro1} indicator_with_map %>% ggplot() + geom_sf(aes(fill = values), - color = "dim grey", size = .1 + color = "dim grey", linewidth = .1 ) + scale_fill_gradient(low = "#FAE000", high = "#00843A") + facet_wrap(facets = "time") + @@ -109,42 +128,49 @@ indicator_with_map %>% ) + theme_light() + theme(legend.position = "none") + - coord_sf(xlim = c(-22, 48), ylim = c(34, 70)) -``` -```{r original-map, echo=FALSE, out.width='80%', fig.align='center', eval = FALSE} -knitr::include_graphics( - here::here("vignettes", "fig", "indicator_with_map.png") -) + coord_sf( + xlim = c(2377294, 7453440), + ylim = c(1313597, 5628510), + crs = 3035 + ) ``` ## Missing Values and Seemingly Missing Values -Some of these problems are real missing data problems, but some of them are coding problem. In other words, the data is there, but it is not conforming the boundaries that you have on the `NUTS2016` map. First we need to validate the geographical coding of the dataset. This is the task of [validate_nuts_regions()](https://regions.dataobservatory.eu/reference/validate_nuts_regions.html). +Some of these problems are real missing data problems, but some of them are +coding problem. In other words, the data is there, but it is not conforming the +boundaries that you have on the `NUTS2016` map. First we need to validate the +geographical coding of the dataset. This is the task of +`regions::validate_nuts_regions()`. ```{r} validated_indicator <- regions::validate_nuts_regions(regional_rd_personnel) ``` -If we validate the dataset, we will see many interesting metadata observations. +If we validate the dataset, we will see many interesting metadata observations. ```{r validation-summary, message=FALSE} library(dplyr) validation_summary_2016 <- validated_indicator %>% - group_by(.data$time, .data$typology) %>% + group_by(time, typology) %>% summarize( observations = n(), - values_missing = sum(is.na(.data$values)), - values_present = sum(!is.na(.data$values)), + values_missing = sum(is.na(values)), + values_present = sum(!is.na(values)), valid_present = values_present / observations ) ``` -Even though the dataset is called [R&D personnel and researchers by sector of performance, sex and NUTS 2 regions (rd_p_persreg)](https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=rd_p_persreg&lang=en), in fact, it contains data on country and `NUTS1` levels. And it has data on non-EU countries that in 2009 were not part of the NUTS system. +Even though the dataset is called [R&D personnel and researchers by sector of +performance, sex and NUTS 2 regions +(rd_p_persreg)](https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=rd_p_persreg&lang=en), +in fact, it contains data on country and `NUTS1` levels. And it has data on +non-EU countries that in 2009 were not part of the NUTS system. ```{r} validation_summary_2016 %>% ungroup() %>% - filter(.data$time == "2009") + filter(time == "2009") ``` The situation is not better in 2018: @@ -152,32 +178,40 @@ The situation is not better in 2018: ```{r} validation_summary_2016 %>% ungroup() %>% - filter(.data$time == "2018") + filter(time == "2018") ``` -The dataset is plagued with data that has no place in the `NUTS2016` boundary definition, and therefore on a `NUTS2016` map! +The dataset is plagued with data that has no place in the `NUTS2016` boundary +definition, and therefore on a `NUTS2016` map! What are the non-conforming bits? ```{r non-conforming-geo} validated_indicator %>% - filter(!.data$valid_2016) %>% - select(all_of("geo")) %>% - unlist() %>% - as.character() + filter(!valid_2016) %>% + pull(geo) ``` -* Plenty of French units. France went under a regional administrative reform, and we have data about its past, but not in the current boundaries and coding. -* To a lesser extent, we have the same problem with Poland and the UK. -* We have comparative data from Asia on country level, which ended up in a regional dataset. -* We have Norway, which is a member of the EEA, and from 2021 it is officially part of the NUTS2021 system. They were nice to provide their data consistently for the past. -* We have aggregates like the entire EU or the eurozone. +- Plenty of French units. France went under a regional administrative reform, + and we have data about its past, but not in the current boundaries and + coding. +- To a lesser extent, we have the same problem with Poland and the UK. +- We have comparative data from Asia on country level, which ended up in a + regional dataset. +- We have Norway, which is a member of the EEA, and from 2021 it is officially + part of the NUTS2021 system. They were nice to provide their data + consistently for the past. +- We have aggregates like the entire EU or the eurozone. ## Recoding and Renaming -The question is, can we save some of the French data? If the boundaries of regions changed, then we cannot: somebody must reaggregate the number of researchers who used to work in the newly defined region back then, before the reform. +The question is, can we save some of the French data? If the boundaries of +regions changed, then we cannot: somebody must reaggregate the number of +researchers who used to work in the newly defined region back then, before the +reform. -But in some cases, the regional boundaries did not change, only the name and the code of the region, which is the task performed by [recode_nuts()](https://regions.dataobservatory.eu/reference/recode_nuts.html): +But in some cases, the regional boundaries did not change, only the name and the +code of the region, which is the task performed by `regions::recode_nuts()`: ```{r recoding} recoded_indicator <- regional_rd_personnel %>% @@ -190,14 +224,14 @@ recoded_indicator <- regional_rd_personnel %>% ```{r recode-summary, message=FALSE} recoding_summary <- recoded_indicator %>% mutate(observations = nrow(.data)) %>% - mutate(typology_change = ifelse(grepl("Recoded", .data$typology_change), + mutate(typology_change = ifelse(grepl("Recoded", typology_change), yes = "Recoded", - no = .data$typology_change + no = typology_change )) %>% - group_by(.data$typology_change, .data$time) %>% + group_by(typology_change, time) %>% summarize( - values_missing = sum(is.na(.data$values)), - values_present = sum(!is.na(.data$values)), + values_missing = sum(is.na(values)), + values_present = sum(!is.na(values)), pct = values_present / (values_present + values_missing) ) ``` @@ -207,73 +241,86 @@ Let us take a look at the problems identified by `regions::recode_nuts()`: ```{r} recoding_summary ``` -* We were able to recode quite a few data points to the `NUTS2016` definition for the time of observation 2009 as well as 2018. Sometimes we are recoding rows that have missing values, which does not help that much: we know where the data should be, but it is missing anyway. But particularly for the year 2009 we can save plenty of data by recorded the obsolete coding. -* We identify further problems. We have coding the that was used in various time periods, but there is no clear recoding possibility, because the regions boundaries have changed. To have the history of the data, we would need to recalculate them, say, by adding up the R&D personnel from each settlement in the new regional boundary. +- We were able to recode quite a few data points to the `NUTS2016` definition + for the time of observation 2009 as well as 2018. Sometimes we are recoding + rows that have missing values, which does not help that much: we know where + the data should be, but it is missing anyway. But particularly for the year + 2009 we can save plenty of data by recorded the obsolete coding. + +- We identify further problems. We have coding the that was used in various + time periods, but there is no clear recoding possibility, because the + regions boundaries have changed. To have the history of the data, we would + need to recalculate them, say, by adding up the R&D personnel from each + settlement in the new regional boundary. -The following non-empty cases were present in the dataset, just not with the coding that we used in the 2018-2020 period (i.e., the `NUTS2016` coding.) We are able to save 27 observations just by fixing the regional codes! +The following non-empty cases were present in the dataset, just not with the +coding that we used in the 2018-2020 period (i.e., the `NUTS2016` coding.) We +are able to save 27 observations just by fixing the regional codes! ```{r geocode-changes} recoded_indicator %>% - filter(.data$typology == "nuts_level_2") %>% - filter(!is.na(.data$typology_change)) %>% + filter(typology == "nuts_level_2") %>% + filter(!is.na(typology_change)) %>% filter( # Keep only pairs where we actually save # non-missing observations !is.na(values) ) %>% - distinct(.data$geo, .data$code_2016) %>% + distinct(geo, code_2016) %>% filter( # We filter out cases of countries who # joined the NUTS system later - .data$geo != .data$code_2016 + geo != code_2016 ) ``` -So, let us do the trick: change the `geo` variable to `code_2016`, which is, whenever there is an equivalent `geo` code in the `NUTS2016` definition, the data that you should have. Your original geo variable contains codes that were used, for example, in the `NUTS2010` or `NUTS2013` boundary definitions. + +So, let us do the trick: change the `geo` variable to `code_2016`, which is, +whenever there is an equivalent `geo` code in the `NUTS2016` definition, the +data that you should have. Your original `geo` variable contains codes that were +used, for example, in the `NUTS2010` or `NUTS2013` boundary definitions. ```{r change-to-nuts2016, eval=TRUE} recoded_with_map <- map_nuts_2 %>% left_join( recoded_indicator %>% - mutate(geo = .data$code_2016), + mutate(geo = code_2016), by = "geo" ) ``` Let us make our work visible by creating three observation `type` variables: -* `missing` which is not present in the dataset; -* `before` which were correctly coded before our recoding; -* `after` which became visible after recoding. +- `missing` which is not present in the dataset; +- `before` which were correctly coded before our recoding; +- `after` which became visible after recoding. ```{r} regional_rd_personnel_recoded <- recoded_indicator %>% - mutate(geo = .data$code_2016) %>% - rename(values_2016 = .data$values) %>% - select(-all_of(c("typology", "typology_change", "code_2016"))) %>% + mutate(geo = code_2016) %>% + rename(values_2016 = values) %>% + select(-typology, -typology_change, -code_2016) %>% full_join( regional_rd_personnel, by = c("prof_pos", "sex", "sectperf", "unit", "geo", "time") ) %>% mutate(type = case_when( - is.na(.data$values_2016) & is.na(.data$values) ~ "missing", - is.na(.data$values) ~ "after", + is.na(values_2016) & is.na(values) ~ "missing", + is.na(values) ~ "after", TRUE ~ "before" )) ``` And let's place it now on the map: -```{r, eval=TRUE, out.width='80%', fig.align='center'} +```{r, choro2} map_nuts_2 %>% left_join(regional_rd_personnel_recoded, by = "geo") %>% - filter( - # remove completely missing cases - !is.na(.data$time) - ) %>% + # remove completely missing cases + filter(!is.na(time)) %>% ggplot() + geom_sf(aes(fill = type), - color = "dim grey", size = .1 + color = "dim grey", linewidth = .1 ) + scale_fill_manual(values = c("#FAE000", "#007CBB", "grey70")) + guides(fill = guide_legend(reverse = T, title = NULL)) + @@ -287,20 +334,24 @@ map_nuts_2 %>% ) + theme_light() + theme(legend.position = c(.93, .7)) + - coord_sf(xlim = c(-22, 48), ylim = c(34, 70)) -``` -```{r recoded-map, echo=FALSE, out.width='80%', fig.align='center', eval=FALSE} -knitr::include_graphics( - here::here("vignettes", "fig", "recoded_indicator_with_map.png") -) + coord_sf( + xlim = c(2377294, 7453440), + ylim = c(1313597, 5628510), + crs = 3035 + ) ``` ## Conclusion -We did improve our dataset, and this improvement would not have worked with traditional imputation techniques very well. For example, replacing the missing French data with the median value of Europe would have created a huge bias in our dataset. - -This example is a simplification. There are many territorial typologies in use in Europe and globally, but the main takeaway is clear: sub-national boundaries are changing very fast, and you must make sure that you join datasets, or data with a map with the same boundary definitions. +We did improve our dataset, and this improvement would not have worked with +traditional imputation techniques very well. For example, replacing the missing +French data with the median value of Europe would have created a huge bias in +our dataset. +This example is a simplification. There are many territorial typologies in use +in Europe and globally, but the main takeaway is clear: sub-national boundaries +are changing very fast, and you must make sure that you join datasets, or data +with a map with the same boundary definitions. # Citations and related work @@ -308,39 +359,41 @@ This example is a simplification. There are many territorial typologies in use i Eurostat data: cite [Eurostat](https://ec.europa.eu/eurostat/). -Administrative boundaries: cite [EuroGeographics](https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units). +Administrative boundaries: cite +[EuroGeographics](https://ec.europa.eu/eurostat/web/gisco/geodata/reference-data/administrative-units-statistical-units). ### Citing the eurostat R package -For main developers and contributors, see the [package homepage](https://ropengov.github.io/eurostat). +For main developers and contributors, see the [package +homepage](https://ropengov.github.io/eurostat). -This work can be freely used, modified and distributed under the -BSD-2-clause (modified FreeBSD) license: +This work can be freely used, modified and distributed under the BSD-2-clause +(modified FreeBSD) license: -```{r citation-eurostat, message=FALSE, eval=TRUE, echo=TRUE} +```{r citation-eurostat, message=FALSE} citation("eurostat") ``` ### Citing the regions R package -For main developer and contributors, see the [package](https://regions.dataobservatory.eu/). +For main developer and contributors, see the +[package](https://regions.dataobservatory.eu/). -This work can be freely used, modified and distributed under the -GPL-3 license: +This work can be freely used, modified and distributed under the GPL-3 license: -```{r citation-regions, message=FALSE, eval=TRUE, echo=TRUE} +```{r citation-regions, message=FALSE} citation("regions") ``` ### Contact -For contact information, see the [package homepage](https://ropengov.github.io/eurostat). - +For contact information, see the [package +homepage](https://ropengov.github.io/eurostat). # Version info This tutorial was created with -```{r sessioninfo, message=FALSE, warning=FALSE} -sessionInfo() +```{r sessioninfo, message=FALSE} +sessioninfo::session_info() ``` diff --git a/vignettes/articles/maps.Rmd b/vignettes/articles/maps.Rmd index 53a0c0ef..11d6d80f 100644 --- a/vignettes/articles/maps.Rmd +++ b/vignettes/articles/maps.Rmd @@ -1,21 +1,24 @@ --- title: "Map examples for the eurostat R package" date: "`r Sys.Date()`" -output: - rmarkdown::html_vignette: - toc: true -vignette: > - %\VignetteIndexEntry{Map examples for the eurostat R package} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteDepends{Cairo} - %\VignetteEncoding{UTF-8} - \usepackage[utf8]{inputenc} +output: + html_document: + toc: yes +editor_options: + markdown: + wrap: 80 + canonical: true --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, - comment = "#>" + comment = "#>", + tidy = "styler", + dev = "ragg_png", + warning = FALSE, + dpi = 300, + out.width = "100%" ) ``` @@ -25,73 +28,74 @@ library(eurostat) # R Tools for Eurostat Open Data: maps -This [rOpenGov](http://ropengov.github.io) R package provides tools to access [Eurostat database](http://ec.europa.eu/eurostat/data/database), which you can also browse on-line for the data sets and documentation. For contact information and source code, see the [package website](http://ropengov.github.io/eurostat/). +This [rOpenGov](http://ropengov.github.io) R package provides tools to access +[Eurostat database](http://ec.europa.eu/eurostat/data/database), which you can +also browse on-line for the data sets and documentation. For contact information +and source code, see the [package website](http://ropengov.github.io/eurostat/). -See eurostat vignette for installation and basic use. +See the vignette of eurostat (`vignette(package = "eurostat")`) for installation +and basic use. -## Maps +## Maps -NOTE: we recommend to check also the `giscoR` package (https://dieghernan.github.io/giscoR/). This is another API package that provides R tools for Eurostat geographic data to support geospatial analysis and visualization. +> NOTE: we recommend to check also the `giscoR` package +> (). This is another API package that +> provides R tools for Eurostat geographic data to support geospatial analysis +> and visualization. -### Disposable income of private households by NUTS 2 regions at 1:60mln resolution using tmap +### Disposable income of private households by NUTS 2 regions at 1:60mln resolution using tmap -The mapping examples below use [`tmap`](https://github.com/mtennekes/tmap) package. +The mapping examples below use [`tmap`](https://github.com/mtennekes/tmap) +package. - -```{r maps1-1, eval=TRUE, fig.width=8, fig.height=8} +```{r maps1-1} library(dplyr) library(eurostat) library(sf) library(tmap) # Download attribute data from Eurostat -sp_data <- eurostat::get_eurostat("tgs00026", - time_format = "raw" -) %>% +sp_data <- eurostat::get_eurostat("tgs00026", time_format = "raw") %>% # subset to have only a single row per geo - dplyr::filter(time == 2010, nchar(geo) == 4) %>% + filter(TIME_PERIOD == 2016, nchar(geo) == 4) %>% # categorise - dplyr::mutate(income = cut_to_classes(values, n = 5)) + mutate(income = cut_to_classes(values, n = 5)) # Download geospatial data from GISCO -geodata <- get_eurostat_geospatial( - output_class = "sf", - resolution = "60", - nuts_level = 2, - year = 2013 -) +geodata <- get_eurostat_geospatial(nuts_level = 2, year = 2016) # merge with attribute data with geodata -map_data <- inner_join(geodata, sp_data) +map_data <- inner_join(geodata, sp_data, by = "geo") ``` - Construct the map -```{r map1ex, eval=TRUE, warning=FALSE} -# Fix / remove some broken entries for the demo purpose -geodata <- sf::st_make_valid(geodata) -geodata <- geodata[sf::st_is_valid(geodata), ] - +```{r map1ex} # Create and plot the map -map1 <- tmap::tm_shape(geodata) + - tmap::tm_fill("lightgrey") + - tmap::tm_shape(map_data) + - tmap::tm_grid() + - tmap::tm_polygons("income", - title = "Disposable household\nincomes in 2010", +map1 <- tm_shape(geodata, + projection = "EPSG:3035", + xlim = c(2400000, 7800000), + ylim = c(1320000, 5650000) +) + + tm_fill("lightgrey") + + tm_shape(map_data) + + tm_polygons("income", + title = "Disposable household\nincomes in 2016", palette = "Oranges" ) + print(map1) ``` Interactive maps can be generated as well -```{r maps1-2, eval=FALSE, fig.width=8, fig.height=8} +```{r maps1-inter, out.height="420px"} # Interactive tmap_mode("view") map1 +``` +```{r maps1-2} # Set the mode back to normal plotting tmap_mode("plot") print(map1) @@ -99,17 +103,16 @@ print(map1) ### Disposable income of private households by NUTS 2 regions in Poland with labels at 1:1mln resolution using tmap -```{r maps2, fig.width=8, fig.height=8, warning=FALSE} +```{r maps2} library(eurostat) library(dplyr) library(sf) -library(RColorBrewer) # Downloading and manipulating the tabular data -print("Let us focus on year 2014 and NUTS-3 level") +print("Let us focus on year 2016 and NUTS-3 level") euro_sf2 <- get_eurostat("tgs00026", time_format = "raw", - filter = list(time = "2014") + filter = list(time = "2016") ) %>% # Subset to NUTS-3 level dplyr::filter(grepl("PL", geo)) %>% @@ -120,14 +123,13 @@ euro_sf2 <- get_eurostat("tgs00026", ) print("Download geospatial data from GISCO") -geodata <- get_eurostat_geospatial(output_class = "sf", resolution = "60", nuts_level = 2, year = 2013) +geodata <- get_eurostat_geospatial( + resolution = "01", nuts_level = 2, + year = 2016, country = "PL" +) # Merge with attribute data with geodata -map_data <- inner_join(geodata, euro_sf2) - -# Fix / remove some broken entries for the demo purpose -geodata <- sf::st_make_valid(geodata) -geodata <- geodata[sf::st_is_valid(geodata), ] +map_data <- inner_join(geodata, euro_sf2, by = "geo") # plot map library(tmap) @@ -140,74 +142,52 @@ map2 <- tm_shape(geodata) + palette = "Oranges", border.col = "white" ) + tm_text("NUTS_NAME", just = "center") + - tm_scale_bar() + tm_scale_bar() + + tm_layout(legend.outside = TRUE) map2 ``` -### Disposable income of private households by NUTS 2 regions at 1:10mln resolution using spplot +### Disposable income of private households by NUTS 2 regions at 1:10mln resolution using ggplot2 -```{r maps3, fig.width=8, fig.height=8, dev='CairoPNG', eval=FALSE} -library(sp) -library(eurostat) -library(dplyr) -library(RColorBrewer) -dat <- get_eurostat("tgs00026", time_format = "raw") %>% - # subsetting to year 2014 and NUTS-2 level - dplyr::filter(time == 2014, nchar(geo) == 4) %>% - # classifying the values the variable - dplyr::mutate(cat = cut_to_classes(values)) - -# Download geospatial data from GISCO -geodata <- get_eurostat_geospatial(output_class = "spdf", resolution = "10", nuts_level = 2, year = 2013) - -# merge with attribute data with geodata -geodata@data <- left_join(geodata@data, dat) - -# plot map -sp::spplot( - obj = geodata, "cat", main = "Disposable household income", - xlim = c(-22, 34), ylim = c(35, 70), - col.regions = c("dim grey", brewer.pal(n = 5, name = "Oranges")), - col = "white", usePolypath = FALSE -) -``` - -### Disposable income of private households by NUTS 2 regions at 1:60mln resolution using ggplot2 - -Meanwhile the CRAN version of `ggplot2` is lacking support for simple features, you can plot maps with `ggplot2` by downloading geospatial data as `data.frame` with `output_class` argument set as `df`. - -```{r maps4, fig.width=8, fig.height=8, dev='CairoPNG'} -# Disposable income of private households by NUTS 2 regions at 1:60mln res +```{r maps4} +# Disposable income of private households by NUTS 2 regions at 1:1mln res library(eurostat) library(dplyr) library(ggplot2) data_eurostat <- get_eurostat("tgs00026", time_format = "raw") %>% - dplyr::filter(time == 2018, nchar(geo) == 4) %>% + filter(TIME_PERIOD == 2018, nchar(geo) == 4) %>% # classifying the values the variable dplyr::mutate(cat = cut_to_classes(values)) # Download geospatial data from GISCO -data_geo <- get_eurostat_geospatial(resolution = "60", nuts_level = "2", year = 2021) +data_geo <- get_eurostat_geospatial( + resolution = "01", nuts_level = "2", + year = 2016 +) # merge with attribute data with geodata -data <- inner_join(data_geo, data_eurostat) - -## Joining, by = "geo" -ggplot(data = data) + - geom_sf(aes(fill = cat), color = "dim grey", size = 0.1) + - scale_fill_brewer(palette = "Oranges") + +data <- left_join(data_geo, data_eurostat, by = "geo") + +ggplot(data) + + # Base layer + geom_sf(fill = "lightgrey", color = "lightgrey") + + # Choropleth layer + geom_sf(aes(fill = cat), color = "lightgrey", linewidth = 0.1, na.rm = TRUE) + + scale_fill_brewer(palette = "Oranges", na.translate = FALSE) + guides(fill = guide_legend(reverse = TRUE, title = "euro")) + labs( title = "Disposable household income in 2018", - caption = "(C) EuroGeographics for the administrative boundaries - Map produced in R with data from Eurostat-package " + caption = "© EuroGeographics for the administrative boundaries + Map produced in R with data from Eurostat-package http://ropengov.github.io/eurostat" ) + theme_light() + - theme(legend.position = c(.8, .8)) + - coord_sf(xlim = c(-12, 44), ylim = c(35, 70)) + coord_sf( + xlim = c(2377294, 7453440), + ylim = c(1313597, 5628510), + crs = 3035 + ) ``` - # Citations and related work ### Citing the data sources @@ -216,28 +196,27 @@ Eurostat data: cite [Eurostat](http://ec.europa.eu/eurostat/). Administrative boundaries: cite EuroGeographics - ### Citing the eurostat R package -For main developers and contributors, see the [package homepage](http://ropengov.github.io/eurostat). +For main developers and contributors, see the [package +homepage](http://ropengov.github.io/eurostat). -This work can be freely used, modified and distributed under the -BSD-2-clause (modified FreeBSD) license: +This work can be freely used, modified and distributed under the BSD-2-clause +(modified FreeBSD) license: -```{r citation, message=FALSE, eval=TRUE, echo=TRUE} +```{r citation, message=FALSE} citation("eurostat") ``` - ### Contact -For contact information, see the [package homepage](http://ropengov.github.io/eurostat). - +For contact information, see the [package +homepage](http://ropengov.github.io/eurostat). # Version info This tutorial was created with -```{r sessioninfo, message=FALSE, warning=FALSE} -sessionInfo() +```{r sessioninfo, message=FALSE} +sessioninfo::session_info() ``` diff --git a/vignettes/articles/publications.Rmd b/vignettes/articles/publications.Rmd index d9661123..09686a77 100644 --- a/vignettes/articles/publications.Rmd +++ b/vignettes/articles/publications.Rmd @@ -1,11 +1,6 @@ --- title: "Publications using the eurostat R package" date: "2022-02-07" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Publications using the eurostat R package} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} diff --git a/vignettes/fig/indicator_with_map.png b/vignettes/fig/indicator_with_map.png deleted file mode 100755 index e298e7a3..00000000 Binary files a/vignettes/fig/indicator_with_map.png and /dev/null differ diff --git a/vignettes/fig/map1ex-1.png b/vignettes/fig/map1ex-1.png deleted file mode 100755 index 8e3d9539..00000000 Binary files a/vignettes/fig/map1ex-1.png and /dev/null differ diff --git a/vignettes/fig/maps2-1.png b/vignettes/fig/maps2-1.png deleted file mode 100755 index fc35976a..00000000 Binary files a/vignettes/fig/maps2-1.png and /dev/null differ diff --git a/vignettes/fig/maps3-1.png b/vignettes/fig/maps3-1.png deleted file mode 100755 index 520c8bb1..00000000 Binary files a/vignettes/fig/maps3-1.png and /dev/null differ diff --git a/vignettes/fig/maps4-1.png b/vignettes/fig/maps4-1.png deleted file mode 100755 index 4dd54bc1..00000000 Binary files a/vignettes/fig/maps4-1.png and /dev/null differ diff --git a/vignettes/fig/plotGallery-1.pdf b/vignettes/fig/plotGallery-1.pdf deleted file mode 100755 index 6802824f..00000000 Binary files a/vignettes/fig/plotGallery-1.pdf and /dev/null differ diff --git a/vignettes/fig/plotGallery-1.png b/vignettes/fig/plotGallery-1.png deleted file mode 100755 index 6abc4b1f..00000000 Binary files a/vignettes/fig/plotGallery-1.png and /dev/null differ diff --git a/vignettes/fig/recoded_indicator_with_map.png b/vignettes/fig/recoded_indicator_with_map.png deleted file mode 100755 index 51f26b77..00000000 Binary files a/vignettes/fig/recoded_indicator_with_map.png and /dev/null differ diff --git a/vignettes/fig/trains_plot-1.pdf b/vignettes/fig/trains_plot-1.pdf deleted file mode 100755 index 05402f18..00000000 Binary files a/vignettes/fig/trains_plot-1.pdf and /dev/null differ diff --git a/vignettes/fig/trains_plot-1.pdf~c3b4c18a07f67f0984e09499e7e70fb70ab44b94 b/vignettes/fig/trains_plot-1.pdf~c3b4c18a07f67f0984e09499e7e70fb70ab44b94 deleted file mode 100755 index 0876d1c5..00000000 Binary files a/vignettes/fig/trains_plot-1.pdf~c3b4c18a07f67f0984e09499e7e70fb70ab44b94 and /dev/null differ diff --git a/vignettes/fig/trains_plot-1.png b/vignettes/fig/trains_plot-1.png deleted file mode 100755 index a22b5287..00000000 Binary files a/vignettes/fig/trains_plot-1.png and /dev/null differ diff --git a/vignettes/fig/trains_plot-1.png~c3b4c18a07f67f0984e09499e7e70fb70ab44b94 b/vignettes/fig/trains_plot-1.png~c3b4c18a07f67f0984e09499e7e70fb70ab44b94 deleted file mode 100755 index 17860190..00000000 Binary files a/vignettes/fig/trains_plot-1.png~c3b4c18a07f67f0984e09499e7e70fb70ab44b94 and /dev/null differ diff --git a/vignettes/main.R b/vignettes/main.R deleted file mode 100755 index d4e6656b..00000000 --- a/vignettes/main.R +++ /dev/null @@ -1,13 +0,0 @@ -library(knitr) -library(rmarkdown) -render("vignette.Rmd", output_format = "md_document") -# render("vignette.Rmd", output_format = "pdf_document") -render("vignette.Rmd", output_format = "html_document") - -#knit("vignette.Rmd") -#knit("manuscript.Rmd") -#render("manuscript.Rmd", output_format = "html_document") -#render("manuscript.Rmd", output_format = "pdf_document") -#knit2pdf("eurostat.Rnw") -#library(rmarkdown) -#render("vignette.Rmd", output_format = "pdf_document")