From c762b1e32117470a8db5296e07a93fa68889b9f7 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Mon, 12 Feb 2024 14:39:56 +0800 Subject: [PATCH 001/127] Update ROxygen note and COC statement in README --- DESCRIPTION | 2 +- README.md | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9bad24b..aca7e79 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,7 @@ Imports: hoardr, terra, utils -RoxygenNote: 7.2.1 +RoxygenNote: 7.3.1 ByteCompile: TRUE Suggests: ggplot2, diff --git a/README.md b/README.md index 26134b8..9be1a7c 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R Author/Maintainer: Adam Sparks -## Introduction to _getCRUCLdata_ +## Introduction to {getCRUCLdata} -The _getCRUCLdata_ package provides functions that automate importing CRU CL v. 2.0 climatology data into R, facilitate the calculation of minimum temperature and maximum temperature, and formats the data into a data frame or a [base::list()] of [terra::rast()] objects for use. +The {getCRUCLdata} package provides functions that automate importing CRU CL v. 2.0 climatology data into R, facilitate the calculation of minimum temperature and maximum temperature, and formats the data into a data frame or a [base::list()] of [terra::rast()] objects for use. CRU CL v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit (CRU), . @@ -31,7 +31,7 @@ Note that the original wind data include land area for parts of Antarctica. ## Install -_getCRUCLdata_ is not available from CRAN. +{getCRUCLdata} is not available from CRAN. You can install it from GitHub as follows. ``` r @@ -107,6 +107,5 @@ For complete documentation see the package website: Date: Sat, 30 Mar 2024 12:19:20 +0800 Subject: [PATCH 002/127] Switch from {tic} to {usethis} --- .github/workflows/R-CMD-check.yaml | 50 +++++++++ .github/workflows/test-coverage.yaml | 50 +++++++++ .github/workflows/tic.yml | 145 --------------------------- tic.R | 8 -- 4 files changed, 100 insertions(+), 153 deletions(-) create mode 100644 .github/workflows/R-CMD-check.yaml create mode 100644 .github/workflows/test-coverage.yaml delete mode 100644 .github/workflows/tic.yml delete mode 100644 tic.R diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..14159b7 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,50 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: R-CMD-check + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macos-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml new file mode 100644 index 0000000..21b8a93 --- /dev/null +++ b/.github/workflows/test-coverage.yaml @@ -0,0 +1,50 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: test-coverage + +jobs: + test-coverage: + runs-on: ubuntu-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::covr + needs: coverage + + - name: Test coverage + run: | + covr::codecov( + quiet = FALSE, + clean = FALSE, + install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") + ) + shell: Rscript {0} + + - name: Show testthat output + if: always() + run: | + ## -------------------------------------------------------------------- + find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash + + - name: Upload test results + if: failure() + uses: actions/upload-artifact@v4 + with: + name: coverage-test-failures + path: ${{ runner.temp }}/package diff --git a/.github/workflows/tic.yml b/.github/workflows/tic.yml deleted file mode 100644 index 6651e46..0000000 --- a/.github/workflows/tic.yml +++ /dev/null @@ -1,145 +0,0 @@ -## tic GitHub Actions template: linux-macos-windows-deploy -## revision date: 2022-03-01 -on: - workflow_dispatch: - push: - branches: - - main - - master - pull_request: - branches: - - main - - master - # for now, CRON jobs only run on the default branch of the repo (i.e. usually on master) - schedule: - # * is a special character in YAML so you have to quote this string - - cron: "0 4 * * *" - -name: tic - -jobs: - all: - runs-on: ${{ matrix.config.os }} - - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) - - strategy: - fail-fast: false - matrix: - config: - # use a different tic template type if you do not want to build on all listed platforms - - { os: windows-latest, r: "release" } - - { os: macOS-latest, r: "release", pkgdown: "false", latex: "true" } - - { os: ubuntu-latest, r: "devel" } - - { os: ubuntu-latest, r: "release" } - - env: - # otherwise remotes::fun() errors cause the build to fail. Example: Unavailability of binaries - R_REMOTES_NO_ERRORS_FROM_WARNINGS: true - CRAN: ${{ matrix.config.cran }} - # make sure to run `tic::use_ghactions_deploy()` to set up deployment - TIC_DEPLOY_KEY: ${{ secrets.TIC_DEPLOY_KEY }} - # prevent rgl issues because no X11 display is available - RGL_USE_NULL: true - # if you use bookdown or blogdown, replace "PKGDOWN" by the respective - # capitalized term. This also might need to be done in tic.R - BUILD_PKGDOWN: ${{ matrix.config.pkgdown }} - # macOS >= 10.15.4 linking - SDKROOT: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk - # use GITHUB_TOKEN from GitHub to workaround rate limits in {remotes} - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - - steps: - - uses: actions/checkout@v3 - - - uses: r-lib/actions/setup-r@v2 - with: - r-version: ${{ matrix.config.r }} - Ncpus: 4 - - - uses: r-lib/actions/setup-tinytex@v2 - if: matrix.config.latex == 'true' - - - uses: r-lib/actions/setup-pandoc@v2 - - # set date/week for use in cache creation - # https://github.community/t5/GitHub-Actions/How-to-set-and-access-a-Workflow-variable/m-p/42970 - # - cache R packages daily - - name: "[Cache] Prepare daily timestamp for cache" - if: runner.os != 'Windows' - id: date - run: echo "::set-output name=date::$(date '+%d-%m')" - - - name: "[Cache] Cache R packages" - if: runner.os != 'Windows' - uses: pat-s/always-upload-cache@v2 - with: - path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-r-${{ matrix.config.r }}-${{steps.date.outputs.date}} - restore-keys: ${{ runner.os }}-r-${{ matrix.config.r }}-${{steps.date.outputs.date}} - - - name: "[Stage] [Linux] Install required system libs" - if: runner.os == 'Linux' - run: sudo apt install libcurl4-openssl-dev libgit2-dev - - # for some strange Windows reason this step and the next one need to be decoupled - - name: "[Stage] Prepare" - run: | - Rscript -e "if (!requireNamespace('remotes')) install.packages('remotes', type = 'source')" - Rscript -e "if (!requireNamespace('curl')) install.packages('curl', type = 'source')" - - - name: "[Stage] [macOS] Install libgit2" - if: runner.os == 'macOS' - run: brew install libgit2 - - - name: "[Stage] [macOS] Install system libs for pkgdown" - if: runner.os == 'macOS' && matrix.config.pkgdown != '' - run: brew install harfbuzz fribidi - - - name: "[Stage] [Linux] Install system libs for pkgdown" - if: runner.os == 'Linux' && matrix.config.pkgdown != '' - run: sudo apt install libharfbuzz-dev libfribidi-dev - - # Try to automatically check for system dependencies and install them - # Note: this might not catch all required system libs and manual action might be needed - - name: "[Stage] [Linux] Install linux system dependencies" - if: runner.os == 'Linux' - run: | - while read -r cmd - do - eval sudo $cmd - done < <(Rscript -e 'writeLines(remotes::system_requirements("ubuntu", "20.04"))') - - - name: "[Stage] Install" - if: matrix.config.os != 'macOS-latest' || matrix.config.r != 'devel' - run: Rscript -e "remotes::install_github('ropensci/tic')" -e "print(tic::dsl_load())" -e "tic::prepare_all_stages()" -e "tic::before_install()" -e "tic::install()" - - # macOS devel needs its own stage because we need to work with an option to suppress the usage of binaries - - name: "[Stage] Prepare & Install (macOS-devel)" - if: matrix.config.os == 'macOS-latest' && matrix.config.r == 'devel' - run: | - echo -e 'options(Ncpus = 4, pkgType = "source", repos = structure(c(CRAN = "https://cloud.r-project.org/")))' > $HOME/.Rprofile - Rscript -e "remotes::install_github('ropensci/tic')" -e "print(tic::dsl_load())" -e "tic::prepare_all_stages()" -e "tic::before_install()" -e "tic::install()" - - - name: "[Stage] Script" - run: Rscript -e 'tic::script()' - - - name: "[Stage] After Success" - if: matrix.config.os == 'macOS-latest' && matrix.config.r == 'release' - run: Rscript -e "tic::after_success()" - - - name: "[Stage] Upload R CMD check artifacts" - if: failure() - uses: actions/upload-artifact@v2 - with: - name: ${{ runner.os }}-r${{ matrix.config.r }}-results - path: check - - name: "[Stage] Before Deploy" - run: | - Rscript -e "tic::before_deploy()" - -# - name: "[Stage] Deploy" -# run: Rscript -e "tic::deploy()" - - - name: "[Stage] After Deploy" - run: Rscript -e "tic::after_deploy()" diff --git a/tic.R b/tic.R deleted file mode 100644 index 492701d..0000000 --- a/tic.R +++ /dev/null @@ -1,8 +0,0 @@ -# installs dependencies, runs R CMD check, runs covr::codecov() -do_package_checks() - -if (ci_on_ghactions() && ci_has_env("BUILD_PKGDOWN")) { - # creates pkgdown site and pushes to gh-pages branch - # only for the runner with the "BUILD_PKGDOWN" env var set - do_pkgdown() -} From 652b6b6e7358270e346c45b2bfa07259dd64ed7b Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 30 Mar 2024 12:19:50 +0800 Subject: [PATCH 003/127] Use rOpenSci COC --- .github/CODE_OF_CONDUCT.md | 2 ++ CONDUCT.md | 25 ------------------------- 2 files changed, 2 insertions(+), 25 deletions(-) create mode 100644 .github/CODE_OF_CONDUCT.md delete mode 100644 CONDUCT.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ed7f228 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,2 @@ +Refer to [rOpenSci Code of Conduct](https://ropensci.org/code-of-conduct/). + diff --git a/CONDUCT.md b/CONDUCT.md deleted file mode 100644 index 52a673e..0000000 --- a/CONDUCT.md +++ /dev/null @@ -1,25 +0,0 @@ -# Contributor Code of Conduct - -As contributors and maintainers of this project, we pledge to respect all people who -contribute through reporting issues, posting feature requests, updating documentation, -submitting pull requests or patches, and other activities. - -We are committed to making participation in this project a harassment-free experience for -everyone, regardless of level of experience, gender, gender identity and expression, -sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. - -Examples of unacceptable behavior by participants include the use of sexual language or -imagery, derogatory comments or personal attacks, trolling, public or private harassment, -insults, or other unprofessional conduct. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, -commits, code, wiki edits, issues, and other contributions that are not aligned to this -Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed -from the project team. - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by -opening an issue or contacting one or more of the project maintainers. - -This Code of Conduct is adapted from the Contributor Covenant -(http:contributor-covenant.org), version 1.0.0, available at -http://contributor-covenant.org/version/1/0/0/ From 7d62d89cd71f68d45cea6dc43b3d122c07f09f56 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 30 Mar 2024 12:20:08 +0800 Subject: [PATCH 004/127] Update badges in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9be1a7c..f7851ca 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R ================ -[![tic](https://github.com/ropensci/getCRUCLdata/workflows/tic/badge.svg?branch=main)](https://github.com/ropensci/getCRUCLdata/actions) [![Codecov test coverage](https://codecov.io/gh/ropensci/getCRUCLdata/branch/main/graph/badge.svg)](https://app.codecov.io/gh/ropensci/getCRUCLdata?branch=main) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) [![CRAN\_Status\_Badge](http://www.r-pkg.org/badges/version/getCRUCLdata)](https://cran.r-project.org/package=getCRUCLdata) [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) +[![R-CMD-check](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml) Author/Maintainer: Adam Sparks From f0d1baea0a8748dcee70bdf28cc0d30fbea640f3 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 30 Mar 2024 13:27:37 +0800 Subject: [PATCH 005/127] Reknit vignette --- vignettes/getCRUCLdata.Rmd | 86 +++++++++++++++++++----------------- vignettes/plot_t-1.png | Bin 126309 -> 126264 bytes vignettes/violin_plot-1.png | Bin 61787 -> 61697 bytes 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/vignettes/getCRUCLdata.Rmd b/vignettes/getCRUCLdata.Rmd index 4f805f5..3796d7a 100644 --- a/vignettes/getCRUCLdata.Rmd +++ b/vignettes/getCRUCLdata.Rmd @@ -1,7 +1,7 @@ --- title: "getCRUCLdata" author: "Adam H. Sparks" -date: "2022-08-16" +date: "2024-03-30" output: rmarkdown::html_vignette: toc: true @@ -86,32 +86,32 @@ CRU_data <- get_CRU_df(pre = TRUE, elv = TRUE) CRU_data -#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv -#> -#> 1: 30.917 35.417 NA NA NA NA NA NA NA NA NA -260 -#> 2: 31.083 35.417 NA NA NA NA NA NA NA NA NA -361 -#> 3: 31.250 35.417 NA NA NA NA NA NA NA NA NA -336 -#> 4: 31.417 35.417 NA NA NA NA NA NA NA NA NA -284 -#> 5: 31.750 35.583 NA NA NA NA NA NA NA NA NA -248 -#> --- -#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 70.6 0 -31.3 5.6 283 -#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 70.6 0 -30.7 5.6 186 -#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 70.6 0 -30.8 5.6 195 -#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 70.6 0 -31.2 5.6 268 -#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 70.6 0 -31.5 5.6 328 -#> tmx tmn -#> -#> 1: NA NA -#> 2: NA NA -#> 3: NA NA -#> 4: NA NA -#> 5: NA NA -#> --- -#> 6795146: -26.95 -35.65 -#> 6795147: -26.40 -35.00 -#> 6795148: -26.50 -35.10 -#> 6795149: -26.90 -35.50 -#> 6795150: -27.20 -35.80 +#> lat lon month dtr frs pre pre_cv rd0 +#> +#> 1: 30.917 35.417 NA NA NA NA NA +#> 2: 31.083 35.417 NA NA NA NA NA +#> 3: 31.250 35.417 NA NA NA NA NA +#> 4: 31.417 35.417 NA NA NA NA NA +#> 5: 31.750 35.583 NA NA NA NA NA +#> --- +#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 +#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 +#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 +#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 +#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 +#> reh sun tmp wnd elv tmx tmn +#> +#> 1: NA NA NA NA -260 NA NA +#> 2: NA NA NA NA -361 NA NA +#> 3: NA NA NA NA -336 NA NA +#> 4: NA NA NA NA -284 NA NA +#> 5: NA NA NA NA -248 NA NA +#> --- +#> 6795146: 70.6 0 -31.3 5.6 283 -26.95 -35.65 +#> 6795147: 70.6 0 -30.7 5.6 186 -26.40 -35.00 +#> 6795148: 70.6 0 -30.8 5.6 195 -26.50 -35.10 +#> 6795149: 70.6 0 -31.2 5.6 268 -26.90 -35.50 +#> 6795150: 70.6 0 -31.5 5.6 328 -27.20 -35.80 ``` Perhaps you only need one or two elements, it is easy to create a tidy data frame of mean temperature only. @@ -153,7 +153,10 @@ ggplot(data = t, aes(x = lon, y = lat, fill = tmp)) + facet_wrap( ~ month, nrow = 4) ``` -plot of chunk plot_t +
+plot of chunk plot_t +

plot of chunk plot_t

+
We can also generate a violin plot of the same data to visualise how the temperatures change throughout the year. @@ -166,7 +169,10 @@ ggplot(data = t, aes(x = month, y = tmp)) + subtitle = "Excludes Antarctica") ``` -plot of chunk violin_plot +
+plot of chunk violin_plot +

plot of chunk violin_plot

+
#### Saving the tidy `data.frame` as a CSV (comma separated values file) locally @@ -211,7 +217,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 2.3, 2.1, 2.2, 2.3, 1.8, 2.5, ... #> max values : 22.7, 23.1, 23.5, 24.0, 24.0, 25.2, ... @@ -222,7 +228,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> name : elv #> min value : -361 #> max value : 6486 @@ -233,7 +239,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0, 0.0, 0, 0, 0, 0, ... #> max values : 31, 28.3, 31, 30, 31, 30, ... @@ -244,7 +250,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.0, 0.0, 0.0, 0.0, 0, 0.0, ... #> max values : 910.1, 824.3, 727.3, 741.3, 1100, 2512.6, ... @@ -255,7 +261,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0, 0.0, 0, 0, 0.0, 0, ... #> max values : 31, 28.2, 31, 30, 30.7, 30, ... @@ -266,7 +272,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 18.4, 14.6, 13.5, 13.4, 15.5, 10.2, ... #> max values : 100.0, 100.0, 100.0, 100.0, 96.9, 95.1, ... @@ -277,7 +283,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.0, 0, 3.3, 4.3, 8.1, 6.6, ... #> max values : 92.8, 93, 90.2, 93.1, 94.0, 98.9, ... @@ -288,7 +294,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : -51.6, -47.6, -45.2, -36.6, -22.2, -16.3, ... #> max values : 32.5, 32.1, 32.4, 34.3, 36.0, 38.3, ... @@ -299,7 +305,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.1, 0.1, 0.3, 0.4, 0.3, 0.2, ... #> max values : 9.8, 9.6, 9.4, 9.0, 8.7, 8.6, ... @@ -310,7 +316,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : -55.05, -52.95, -48.75, -41.35, -28, -21.40, ... #> max values : 26.30, 26.25, 27.40, 27.50, 30, 30.65, ... @@ -321,7 +327,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : memory +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : -48.2, -43.35, -41.65, -32.45, -17.55, -11.50, ... #> max values : 39.7, 38.40, 40.25, 41.85, 43.60, 45.95, ... diff --git a/vignettes/plot_t-1.png b/vignettes/plot_t-1.png index 2f745700890bbee77c7665c6dfc1ea8ca6f9c0a7..1591135c3f3551c5ebd9c735749615d536c890d3 100644 GIT binary patch delta 75260 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 delta 75657 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
N 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 LyH%=c750AsCd@ic literal 126264 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 bk=$^<0jH>wA*IK>KpaYP>ax|+7NP$IhNrh4 diff --git a/vignettes/violin_plot-1.png b/vignettes/violin_plot-1.png index 8c7d69729c63b22046f937d1b15bebded77d3fc4..32ed2070a0b85b624a385144cceefc9a8f0ec425 100644 GIT binary patch literal 44969 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 literal 61761 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%0AJ?%L@n{Q=u;TCbT8A7Z`0#=!@b5#U?n)I%TJ!X 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
N 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 LyH%=c750AsCd@ic diff --git a/vignettes/violin_plot-1.png b/vignettes/violin_plot-1.png index 32ed2070a0b85b624a385144cceefc9a8f0ec425..8c7d69729c63b22046f937d1b15bebded77d3fc4 100644 GIT binary patch literal 61761 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%0AJ?%L@n{Q=u;TCbT8A7Z`0#=!@b5#U?n)I%TJ!X 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 We can also generate a violin plot of the same data to visualise how the temperatures change throughout the year. @@ -170,17 +171,18 @@ ggplot(data = t, aes(x = month, y = tmp)) + ```
-plot of chunk violin_plot -

plot of chunk violin_plot

+Monthly values of global temperatures from CRU CL v. 2.0 climatology covering the Earth's surface from ymin = -60, ymax = 85, xmin = -180, xmax = 180 degrees from 1960 to 1991. +

Monthly values of global temperatures from CRU CL v. 2.0 climatology covering the Earth's surface from ymin = -60, ymax = 85, xmin = -180, xmax = 180 degrees from 1960 to 1991.

-#### Saving the tidy `data.frame` as a CSV (comma separated values file) locally +#### Saving the `data.frame` as a CSV (comma separated values file) locally -Save the resulting tidy `data.frame` to local disk as a comma separated (CSV) +Save the resulting `data.frame` to local disk as a comma separated (CSV) file to local disk, using _data.table_'s `fwrite()`. ``` r +library(data.table) fwrite(x = t, file = "~/CRU_tmp.csv") ``` @@ -188,7 +190,7 @@ fwrite(x = t, file = "~/CRU_tmp.csv") For working with spatial data, _getCRUCLdata_ provides a function that create lists of _terra_ stacks of the data. -The `get_CRU_stack()` functions provide similar functionality to `get_CRU_df()`, but rather than returning a tidy data frame, it returns a list of `terra::rast()` objects for use in an R session. +The `get_CRU_stack()` functions provide similar functionality to `get_CRU_df()`, but rather than returning a data frame, it returns a list of `terra::rast()` objects for use in an R session. The `get_CRU_stack()` function automates the download process and creates a `terra::rast()` object of the CRU CL v. 2.0 climatology elements. Illustrated here is creating a `terra::rast()` of all CRU CL v. 2.0 climatology elements available. @@ -209,10 +211,6 @@ CRU_stack <- get_CRU_stack( wnd = TRUE, elv = TRUE ) -#> -|---------|---------|---------|---------| -========================================= - CRU_stack #> $dtr @@ -254,7 +252,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : spat_fe274b2a6660_65063_GdaPwXHptgIOPSx.tif +#> source : spat_613232ecfe11_24882_GdaPwXHptgIOPSx.tif #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.0, 0.0, 0.0, 0.0, 0, 0.0, ... #> max values : 910.1, 824.3, 727.3, 741.3, 1100, 2512.6, ... diff --git a/vignettes/getCRUCLdata.Rmd.orig b/vignettes/getCRUCLdata.Rmd.orig index 3d389eb..d00894a 100644 --- a/vignettes/getCRUCLdata.Rmd.orig +++ b/vignettes/getCRUCLdata.Rmd.orig @@ -12,6 +12,7 @@ vignette: > %\VignetteDepends{terra} %\VignetteDepends{ggplot2} %\VignetteDepends{viridis} + %\VignetteDepends{data.table} --- ```{r setup, include=FALSE} @@ -71,7 +72,7 @@ The arguments for selecting the climatology elements for importing are: - **dsn** *For `create_CRU_stack()`* and *`create_CRU_df()`* only. Local file path where CRU CL v. 2.0 .dat.gz files are located. -### Creating tidy data frames for use in R +### Creating data frames for use in R The `get_CRU_df()` function automates the download process and creates data frames of the climatology elements. @@ -94,7 +95,7 @@ CRU_data <- get_CRU_df(pre = TRUE, CRU_data ``` -Perhaps you only need one or two elements, it is easy to create a tidy data frame of mean temperature only. +Perhaps you only need one or two elements, it is easy to create a data frame of mean temperature only. ```{r get_t_only, eval=TRUE} t <- get_CRU_df(tmp = TRUE) @@ -102,11 +103,11 @@ t <- get_CRU_df(tmp = TRUE) t ``` -#### Plotting data from the tidy dataframe +#### Plotting data from the data frame Now that we have the data, we can plot it easily using _ggplot2_ and the _viridis_ package for the colour scale. -```{r plot_t, eval=TRUE, message=FALSE} +```{r plot_t, eval=TRUE, message=FALSE, fig.cap="Maps of global temperatures from CRU CL v. 2.0 climatology covering the Earth's surface from ymin = -60, ymax = 85, xmin = -180, xmax = 180 degrees from 1960 to 1991."} library(ggplot2) library(viridis) @@ -120,7 +121,7 @@ ggplot(data = t, aes(x = lon, y = lat, fill = tmp)) + We can also generate a violin plot of the same data to visualise how the temperatures change throughout the year. -```{r violin_plot, eval=TRUE} +```{r violin_plot, eval=TRUE, fig.cap = "Monthly values of global temperatures from CRU CL v. 2.0 climatology covering the Earth's surface from ymin = -60, ymax = 85, xmin = -180, xmax = 180 degrees from 1960 to 1991."} ggplot(data = t, aes(x = month, y = tmp)) + geom_violin() + ylab("Temperature (˚C)") + @@ -128,12 +129,13 @@ ggplot(data = t, aes(x = month, y = tmp)) + subtitle = "Excludes Antarctica") ``` -#### Saving the tidy `data.frame` as a CSV (comma separated values file) locally +#### Saving the `data.frame` as a CSV (comma separated values file) locally -Save the resulting tidy `data.frame` to local disk as a comma separated (CSV) +Save the resulting `data.frame` to local disk as a comma separated (CSV) file to local disk, using _data.table_'s `fwrite()`. ```{r save_t, eval=FALSE} +library(data.table) fwrite(x = t, file = "~/CRU_tmp.csv") ``` @@ -141,7 +143,7 @@ fwrite(x = t, file = "~/CRU_tmp.csv") For working with spatial data, _getCRUCLdata_ provides a function that create lists of _terra_ stacks of the data. -The `get_CRU_stack()` functions provide similar functionality to `get_CRU_df()`, but rather than returning a tidy data frame, it returns a list of `terra::rast()` objects for use in an R session. +The `get_CRU_stack()` functions provide similar functionality to `get_CRU_df()`, but rather than returning a data frame, it returns a list of `terra::rast()` objects for use in an R session. The `get_CRU_stack()` function automates the download process and creates a `terra::rast()` object of the CRU CL v. 2.0 climatology elements. Illustrated here is creating a `terra::rast()` of all CRU CL v. 2.0 climatology elements available. From 7d1087e5b88106a2ac9b3f6f7cfba8b831482d08 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Mon, 16 Dec 2024 20:52:22 +0800 Subject: [PATCH 074/127] polish documentation --- DESCRIPTION | 2 +- R/create_CRU_df.R | 6 +++--- codemeta.json | 4 ++-- man/getCRUCLdata-package.Rd | 2 +- vignettes/Advanced_use.Rmd | 3 +-- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9fa85c8..904e3c1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -8,7 +8,7 @@ Authors@R: Description: Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 climatology data, facilitates the calculation of minimum temperature - and maximum temperature and formats the data into a data frame or a + and maximum temperature and formats the data into a data.table object or a list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 53c60af..e2f9935 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -1,9 +1,9 @@ #' Create a data.table of Climatology Variables From Local Disk Files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology -#' data and creates a tidy data frame of the data. If requested, minimum and -#' maximum temperature may also be automatically calculated as described in the -#' data readme.txt file. This function can be useful if you have network +#' data and creates a \CRANpkg{data.table} of the data. If requested, minimum +#' and maximum temperature may also be automatically calculated as described in +#' the data readme.txt file. This function can be useful if you have network #' connection issues that mean automated downloading of the files using \R #' does not work properly. #' diff --git a/codemeta.json b/codemeta.json index f9f5622..35e44ff 100644 --- a/codemeta.json +++ b/codemeta.json @@ -2,7 +2,7 @@ "@context": "https://doi.org/10.5063/schema/codemeta-2.0", "@type": "SoftwareSourceCode", "identifier": "getCRUCLdata", - "description": "Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 climatology data, facilitates the calculation of minimum temperature and maximum temperature and formats the data into a data frame or a list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit, .", + "description": "Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 climatology data, facilitates the calculation of minimum temperature and maximum temperature and formats the data into a data.table object or a list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit, .", "name": "getCRUCLdata: 'CRU' 'CL' v. 2.0 Climatology Client", "relatedLink": "https://docs.ropensci.org/getCRUCLdata/", "codeRepository": "https://github.com/ropensci/getCRUCLdata", @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.679KB", + "fileSize": "910.693KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/getCRUCLdata-package.Rd b/man/getCRUCLdata-package.Rd index ec5cf3c..e95db91 100644 --- a/man/getCRUCLdata-package.Rd +++ b/man/getCRUCLdata-package.Rd @@ -6,7 +6,7 @@ \alias{getCRUCLdata-package} \title{getCRUCLdata: 'CRU' 'CL' v. 2.0 Climatology Client} \description{ -Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 climatology data, facilitates the calculation of minimum temperature and maximum temperature and formats the data into a data frame or a list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt}. +Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 climatology data, facilitates the calculation of minimum temperature and maximum temperature and formats the data into a data.table object or a list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt}. } \seealso{ Useful links: diff --git a/vignettes/Advanced_use.Rmd b/vignettes/Advanced_use.Rmd index 7643474..ec7d743 100644 --- a/vignettes/Advanced_use.Rmd +++ b/vignettes/Advanced_use.Rmd @@ -19,8 +19,7 @@ knitr::opts_chunk$set( ## Caching files for later use When using the `get_CRU_df()` or `get_CRU_stack()` functions, files may be cached in the users' local space for later use (optional) or stored in a temporary directory and deleted when the R session is closed and not saved (this is the default behaviour already illustrated above). -Illustrated here, create a tidy data frame of all CRU CL v. 2.0 climatology elements available and cache -them to save time in the future. +Illustrated here, create a data.table of all CRU CL v. 2.0 climatology elements available and cache them to save time in the future. *In order to take advantage of the cached data, you must use the `get_CRU_df()` function again in the future*. This functionality is somewhat modelled after the raster package's `raster::getData()` that will not download files that already exist in the working directory, however in this case the function is portable and it will work for any working directory. That is, if you have cached the data and you use `get_CRU_df()` again, it will use the cached data no matter what working directory you are in. From 1ea4ac114f21a0548c31d1366397429ab9d9d967 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 09:57:11 +0800 Subject: [PATCH 075/127] Roxygen linting --- DESCRIPTION | 3 +- R/create_CRU_df.R | 55 ++++++------- R/create_CRU_stack.R | 6 +- R/get_CRU_df.R | 59 +++++++------- R/get_CRU_stack.R | 12 ++- R/internal_functions.R | 168 ++++++++++++++++++++-------------------- R/manage_cached_files.R | 4 +- codemeta.json | 2 +- man/create_CRU_df.Rd | 61 ++++++++------- man/create_CRU_stack.Rd | 55 ++++++------- man/get_CRU_df.Rd | 59 +++++++------- man/get_CRU_stack.Rd | 64 ++++++++------- man/manage_cache.Rd | 4 +- 13 files changed, 276 insertions(+), 276 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 904e3c1..e308643 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -51,7 +51,8 @@ Config/testthat/parallel: true Encoding: UTF-8 Language: en-US Roxygen: list(markdown = TRUE, roclets = c("collate", "namespace", "rd", - "roxyglobals::global_roclet")) + "roxyglobals::global_roclet", "roxylint::roxylint")) +Config/roxylint: list(linters = roxylint::tidy) RoxygenNote: 7.3.2 X-schema.org-applicationCategory: Tools X-schema.org-isPartOf: https://ropensci.org diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index e2f9935..15a3b9b 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -1,4 +1,4 @@ -#' Create a data.table of Climatology Variables From Local Disk Files +#' Create a data.table of CRU CL 2.0 climatology elements from local disk files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a \CRANpkg{data.table} of the data. If requested, minimum @@ -9,32 +9,33 @@ #' #' @inheritSection get_CRU_df Nomenclature and Units #' -#' @param pre Boolean. Load precipitation (millimetres/month) from server and -#' return in the data frame? Defaults to `FALSE`. -#' @param pre_cv Boolean. Load cv of precipitation (percent) from server and -#' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to -#' `TRUE` will always results in **pre** being set to `TRUE` and +#' @param pre Loads precipitation (millimetres/month) from server and +#' returns in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param pre_cv Loads cv of precipitation (percent) from server and +#' returns in the data frame, `TRUE`. Defaults to `FALSE`. NOTE. Setting this +#' to `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. -#' @param rd0 Boolean. Load wet-days (number days with >0.1millimetres rain per -#' month) and return in the data frame? Defaults to `FALSE`. -#' @param dtr Boolean. Load mean diurnal temperature range (degrees Celsius) -#' and return it in the data frame? Defaults to `FALSE`. -#' @param tmp Boolean. Load temperature (degrees Celsius) and return it in the -#' data frame? Defaults to `FALSE`. -#' @param tmn Boolean. Calculate minimum temperature values (degrees Celsius) -#' and return it in the data frame? Defaults to `FALSE`. -#' @param tmx Boolean. Calculate maximum temperature (degrees Celsius) and -#' return it in the data frame? Defaults to `FALSE`. -#' @param reh Boolean. Load relative humidity and return it in the data frame? +#' @param rd0 Loads wet-days (number days with >0.1millimetres rain per +#' month) and returns in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param dtr Loads mean diurnal temperature range (degrees Celsius) +#' and returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param tmp Loads temperature (degrees Celsius) and returns it in the +#' data frame, `TRUE`. Defaults to `FALSE`. +#' @param tmn Calculate minimum temperature values (degrees Celsius) +#' and returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param tmx Calculate maximum temperature (degrees Celsius) and +#' return it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param reh Loads relative humidity and returns it in the data frame, `TRUE`. #' Defaults to `FALSE`. -#' @param sunp Boolean. Load sunshine, percent of maximum possible (percent of -#' day length) and return it in the data frame? Defaults to `FALSE`. -#' @param frs Boolean. Load ground-frost records (number of days with ground- -#' frost per month) and return it in the data frame? Defaults to `FALSE`. -#' @param wnd Boolean. Load 10m wind speed (metres/second) and return it in the -#' data frame? Defaults to `FALSE`. -#' @param elv Boolean. Load elevation (converted to metres) and return it in -#' the data frame? Defaults to `FALSE`. +#' @param sunp Loads sunshine, percent of maximum possible (percent of +#' day length) and returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param frs Loads ground-frost records (number of days with ground- +#' frost per month) and returns it in the data frame, `TRUE`. Defaults to +#' `FALSE`. +#' @param wnd Load 10m wind speed (metres/second) and returns it in the +#' data frame, `TRUE`. Defaults to `FALSE`. +#' @param elv Loads elevation (converted to metres) and returns it in +#' the data frame, `TRUE`. Defaults to `FALSE`. #' @param dsn Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz #' files are located. #' @@ -52,10 +53,10 @@ #' CRU_tmp #' #' @seealso -#' [get_CRU_df()] +#' [get_CRU_df]. #' #' @return A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 -#' climatology elements +#' climatology elements. #' #' @author Adam H Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index e06ae47..b2e545f 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -1,4 +1,4 @@ -#' Create a List of terra rast Objects From Local Disk Files +#' Create a list of terra rast objects of CRU CL 2.0 climatology elements from local disk files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a \CRANpkg{terra} [terra::rast] object of the @@ -22,10 +22,10 @@ #' CRU_tmp #' #' @seealso -#' [get_CRU_stack()] +#' [get_CRU_stack]. #' #' @return A [base::list] of [terra::rast] objects of \acronym{CRU} \acronym{CL} -#' v. 2.0 climatology elements +#' v. 2.0 climatology elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index aa19334..ce71b9c 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -1,4 +1,4 @@ -#' Download and Create a data.table of Climatology Parameters +#' Download and create a data.table of CRU CL 2.0 climatology elements #' #' This function automates downloading and importing \acronym{CRU} #' \acronym{CL} v. 2.0 climatology data and creates a \CRANpkg{data.table} of @@ -25,36 +25,36 @@ #' For more information see the description of the data provided by #' \acronym{CRU}, #' -#' @param pre Boolean. Fetch precipitation (millimetres/month) from server and -#' return in the data frame? Defaults to `FALSE`. -#' @param pre_cv Boolean. Fetch cv of precipitation (percent) from server and -#' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to -#' `TRUE` will always results in **pre** being set to `TRUE` and +#' @param pre Fetches precipitation (millimetres/month) from server and +#' returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param pre_cv Fetch cv of precipitation (percent) from server and +#' returns it in the data frame, `TRUE`. Defaults to `FALSE`. NOTE Setting +#' this to `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. -#' @param rd0 Boolean. Fetch wet-days (number days with >0.1 millimetres rain -#' per month) and return in the data frame? Defaults to `FALSE`. -#' @param dtr Boolean. Fetch mean diurnal temperature range (degrees Celsius) -#' and return it in the data frame? Defaults to `FALSE`. -#' @param tmp Boolean. Fetch temperature (degrees Celsius) and return it in the -#' data frame? Defaults to `FALSE`. -#' @param tmn Boolean. Calculate minimum temperature values (degrees Celsius) -#' and return it in the data frame? Defaults to `FALSE`. -#' @param tmx Boolean. Calculate maximum temperature (degrees Celsius) and -#' return it in the data frame? Defaults to `FALSE`. -#' @param reh Boolean. Fetch relative humidity and return it in the data frame? -#' Defaults to FALSE. -#' @param sunp Boolean. Fetch sunshine, percent of maximum possible (percent of +#' @param rd0 Fetches wet-days (number days with >0.1 millimetres rain +#' per month) and returns it in the data frame? Defaults to `FALSE`. +#' @param dtr Fetches mean diurnal temperature range (degrees Celsius) +#' and returns it in the data frame? Defaults to `FALSE`. +#' @param tmp Fetches temperature (degrees Celsius) and returns it in the +#' data frame, `TRUE`. Defaults to `FALSE`. +#' @param tmn Calculates minimum temperature values (degrees Celsius) +#' and returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param tmx Calculates maximum temperature (degrees Celsius) and +#' returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param reh Fetches relative humidity and returns it in the data frame, +#' `TRUE`. Defaults to FALSE. +#' @param sunp Fetch sunshine, percent of maximum possible (percent of #' day length) and return it in the data frame? Defaults to `FALSE`. -#' @param frs Boolean. Fetch ground-frost records (number of days with ground- +#' @param frs Fetches ground-frost records (number of days with ground- #' frost per month) and return it in the data frame? Defaults to `FALSE`. -#' @param wnd Boolean. Fetch 10m wind speed (metres/second) and return it in the -#' data frame? Defaults to `FALSE`. -#' @param elv Boolean. Fetch elevation (converted to metres) and return it in -#' the data frame? Defaults to `FALSE`. -#' @param cache Boolean. Store CRU CL v. 2.0 data files locally for later use? -#' If `FALSE`, the downloaded files are removed when R session is closed. +#' @param wnd Fetches 10m wind speed (metres/second) and returns it in the +#' data frame, `TRUE`. Defaults to `FALSE`. +#' @param elv Fetches elevation (converted to metres) and returns it in +#' the data frame, `TRUE`. Defaults to `FALSE`. +#' @param cache Stores CRU CL v. 2.0 data files locally for later use. +#' If `FALSE`, the downloaded files are removed when the \R session is closed. #' To take advantage of cached files in future sessions, use `cache = TRUE` -#' after the initial download and caching. Defaults to `FALSE`. +#' even after the initial download and caching. Defaults to `FALSE`. #' #' @examplesIf interactive() #' # Download data and create a data frame of precipitation and temperature @@ -65,11 +65,10 @@ #' CRU_pre_tmp #' #' @seealso -#' [create_CRU_stack()] -#' [manage_cache()] +#' [create_CRU_stack], [manage_cache]. #' #' @return A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 -#' climatology elements +#' climatology elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index af83a75..b02ab1b 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -1,8 +1,8 @@ -#' Download and Create a List of terra rast Objects of Climatology Parameters +#' Download and create a list of terra rast objects of CRU CL 2.0 climatology elements #' #' This function automates downloading and importing CRU CL v. 2.0 #' climatology data into \R and creates a list of \CRANpkg{terra} -#' [terra::rast()] objects of the data. If requested, minimum and maximum +#' [terra::rast] objects of the data. If requested, minimum and maximum #' temperature may also be automatically calculated as described in the data #' readme.txt file. Data may be cached for later use by this function, saving #' time downloading files in future using this function. @@ -17,13 +17,11 @@ #' #' CRU_pre_tmp #' -#' #' @seealso -#' [create_CRU_stack()] -#' [manage_cache()] +#' [create_CRU_stack], [manage_cache]. #' -#' @return A [base::list()] of [terra::rast] objects of CRU CL v. 2.0 -#' climatology elements +#' @return A [base::list] of [terra::rast] objects of CRU CL v. 2.0 +#' climatology elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/internal_functions.R b/R/internal_functions.R index 8645c17..1def32e 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -1,30 +1,31 @@ -#' Check That at Least One var is Requested -#' @param pre Boolean. Fetch precipitation (millimetres/month) from server and -#' return in the data frame? Defaults to `FALSE`. -#' @param pre_cv Boolean. Fetch cv of precipitation (percent) from server and -#' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to -#' `TRUE` will always results in **pre** being set to `TRUE` and +#' Check that at least one element is requested +#' @param pre Fetches precipitation (millimetres/month) from server and +#' returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param pre_cv Fetches cv of precipitation (percent) from server and +#' returns it in the data frame, `TRUE`. Defaults to `FALSE`. Note, setting +#' this to `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. -#' @param rd0 Boolean. Fetch wet-days (number days with >0.1 millimetres rain -#' per month) and return in the data frame? Defaults to `FALSE`. -#' @param dtr Boolean. Fetch mean diurnal temperature range (degrees Celsius) -#' and return it in the data frame? Defaults to `FALSE`. -#' @param tmp Boolean. Fetch temperature (degrees Celsius) and return it in the -#' data frame? Defaults to `FALSE`. -#' @param tmn Boolean. Calculate minimum temperature values (degrees Celsius) -#' and return it in the data frame? Defaults to `FALSE`. -#' @param tmx Boolean. Calculate maximum temperature (degrees Celsius) and -#' return it in the data frame? Defaults to `FALSE`. -#' @param reh Boolean. Fetch relative humidity and return it in the data frame? -#' Defaults to `FALSE`. -#' @param sunp Boolean. Fetch sunshine, percent of maximum possible (percent of -#' day length) and return it in data frame? Defaults to `FALSE`. -#' @param frs Boolean. Fetch ground-frost records (number of days with ground- -#' frost per month) and return it in data frame? Defaults to `FALSE`. -#' @param wnd Boolean. Fetch 10m wind speed (metres/second) and return it in the -#' data frame? Defaults to `FALSE`. -#' @param elv Boolean. Fetch elevation (converted to metres) and return it in -#' the data frame? Defaults to `FALSE`. +#' @param rd0 Fetches wet-days (number days with >0.1 millimetres rain per +#' month) and returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param dtr Fetches mean diurnal temperature range (degrees Celsius) +#' and returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param tmp Fetches temperature (degrees Celsius) and returns it in the +#' data frame, `TRUE`. Defaults to `FALSE`. +#' @param tmn Calculates minimum temperature values (degrees Celsius) +#' and returns it in the data frame. Defaults to `FALSE`. +#' @param tmx Boolean. Calculates maximum temperature (degrees Celsius) and +#' returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param reh Fetches relative humidity and returns it in the data frame, +#' `TRUE`. Defaults to `FALSE`. +#' @param sunp Fetches sunshine, percent of maximum possible (percent of +#' day length), and returns it in the data frame, `TRUE`. Defaults to `FALSE`. +#' @param frs Boolean. Fetches ground-frost records (number of days with +#' ground-frost per month) and returns it in data frame, `TRUE`. Defaults to +#' `FALSE`. +#' @param wnd Fetches 10m wind speed (metres/second) and returns it in the data +#' frame, `TRUE`. Defaults to `FALSE`. +#' @param elv Fetches elevation (converted to metres) and returns it in the +#' data frame, `TRUE`. Defaults to `FALSE`. #' #' @examples #' .check_vars_FALSE( @@ -64,9 +65,9 @@ } } -#' Validates User Entered dsn Value +#' Validates user entered dsn value #' -#' @param dsn User provided value for checking +#' @param dsn User provided value for checking. #' @keywords Internal #' @noRd .validate_dsn <- function(dsn) { @@ -95,23 +96,22 @@ } } -#' Creates a Data Frame From the CRU Data +#' Creates a data.table from the CRU data #' -#' @param tmn Is tmn to be calculated? Boolean -#' @param tmn Is tmx to be calculated? Boolean -#' @param dtr Is dtr to be returned? Boolean -#' @param pre Is pre to be returned? Boolean -#' @param pre_cv Is pre_cv to be returned? Boolean -#' @param elv Is elv to be returned? Boolean -#' @param files File list to be used for creating data frame +#' @param tmn Is tmn to be calculated? Boolean. +#' @param tmn Is tmx to be calculated? Boolean. +#' @param dtr Is dtr to be returned? Boolean. +#' @param pre Is pre to be returned? Boolean. +#' @param pre_cv Is pre_cv to be returned? Boolean. +#' @param elv Is elv to be returned? Boolean. +#' @param files File list to be used for creating data frame. #' -#' @return A \CRANpkg{data.table} of all requested values +#' @return A \CRANpkg{data.table} of all requested values. #' @keywords Internal #' @autoglobal #' @noRd .create_df <- function(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files) { - CRU_df <- .tidy_df(pre_cv, elv, tmn, tmx, .files = files) @@ -184,8 +184,8 @@ #' Read Files From Local cache #' -#' @param .files a list of CRU CL2.0 files in local storage -#' @param .pre_cv `Boolean` return pre_cv in the data? +#' @param .files a list of CRU CL2.0 files in local storage. +#' @param .pre_cv `Boolean` return pre_cv in the data. #' #' @keywords Internal #' @autoglobal @@ -269,18 +269,18 @@ } -#' Create terra rast Objects +#' Create terra rast objects #' -#' @param pre Boolean Return precipitation in the `rast`? -#' @param pre_cv Boolean. Return cv of precipitation (percent) in the `rast`? -#' @param dtr Boolean. Return mean diurnal temperature range (degrees Celsius) -#' in the `rast`? -#' @param tmp Boolean. Return temperature (degrees Celsius) in the `rast`? -#' @param tmn Boolean. Return minimum temperature values (degrees Celsius) -#' in the `rast`? -#' @param tmx Boolean. Return maximum temperature (degrees Celsius) in the -#' `rast`? -#' @param files List. Files that are to be used in creating the `rast` object. +#' @param pre Return precipitation in the `rast`, Boolean. +#' @param pre_cv Return cv of precipitation (percent) in the `rast`, Boolean. +#' @param dtr Return mean diurnal temperature range (degrees Celsius) +#' in the `rast`, Boolean. +#' @param tmp Return temperature (degrees Celsius) in the `rast`, Boolean. +#' @param tmn Return minimum temperature values (degrees Celsius) +#' in the `rast`, Boolean. +#' @param tmx Return maximum temperature (degrees Celsius) in the +#' `rast`, Boolean. +#' @param files List. Files that are to be used in creating the `rast` object. #' #' @keywords Internal #' @autoglobal @@ -353,11 +353,11 @@ #' Helper Function Used in .create_stacks() #' -#' @param files a list of files to use in creating `rast` objects -#' @param wrld an empty [terra::rast] object for filling with values -#' @param month_names A vector of month names from jan -- dec -#' @param pre `Boolean` include precipitation? -#' @param pre_cv `Boolean` include preciptation cv? +#' @param files A list of files to use in creating `rast` objects. +#' @param wrld An empty [terra::rast] object for filling with values. +#' @param month_names A vector of month names from jan -- dec. +#' @param pre `Boolean` include precipitation. +#' @param pre_cv `Boolean` include preciptation cv. #' #' @autoglobal #' @keywords Internal @@ -435,15 +435,17 @@ #' Creates local directory for caching and/or uses it for local caching or #' uses the \R session `tempdir()`. #' -#' @param cache `Boolean` (create) and use local file cache? +#' @param cache `Boolean` (create) and use local file cache. #' #' @keywords Internal #' @noRd .set_cache <- function(cache) { manage_cache <- hoardr::hoard() - manage_cache$cache_path_set(path = "getCRUCLdata", - prefix = "org.R-project.R/R", - type = "user_cache_dir") + manage_cache$cache_path_set( + path = "getCRUCLdata", + prefix = "org.R-project.R/R", + type = "user_cache_dir" + ) if (cache) { if (!dir.exists(manage_cache$cache_path_get())) { manage_cache$mkdir() @@ -457,29 +459,29 @@ #' Create a List of Locally Cached Files for Import #' -#' @param pre Boolean. Load precipitation (millimetres/month) from server and -#' return in the data frame? -#' @param pre_cv Boolean. Load cv of precipitation (percent) from server and -#' return in the data frame? -#' @param rd0 Boolean. Load wet-days (number days with >0.1 millimetres rain -#' per month) and return in the data frame? -#' @param dtr Boolean. Load mean diurnal temperature range (degrees Celsius) -#' and return it in the data frame? -#' @param tmp Boolean. Load temperature (degrees Celsius) and return it in the -#' data frame? -#' @param tmn Boolean. Calculate minimum temperature values (degrees Celsius) -#' and return it in the data frame? -#' @param tmx Boolean. Calculate maximum temperature (degrees Celsius) and -#' return it in the data frame? -#' @param reh Boolean. Load relative humidity and return it in the data frame? -#' @param sunp Boolean. Load sunshine, percent of maximum possible (percent of -#' day length) and return it in data frame? -#' @param frs Boolean. Load ground-frost records (number of days with ground- -#' frost per month) and return it in data frame? -#' @param wnd Boolean. Load 10m wind speed (metres/second) and return it in the -#' data frame? -#' @param elv Boolean. Load elevation (converted to metres) and return it in -#' the data frame? +#' @param pre Boolean, loads precipitation (millimetres/month) from server and +#' returns in the data frame. +#' @param pre_cv Boolean, loads cv of precipitation (percent) from server and +#' returns in the data frame. +#' @param rd0 Boolean, loads wet-days (number days with >0.1 millimetres rain +#' per month) and returns in the data frame. +#' @param dtr Boolean, loads mean diurnal temperature range (degrees Celsius) +#' and returns it in the data frame. +#' @param tmp Boolean, loads temperature (degrees Celsius) and returns it in +#' the data frame. +#' @param tmn Boolean, calculates minimum temperature values (degrees Celsius) +#' and returns it in the data frame. +#' @param tmx Boolean, calculatex maximum temperature (degrees Celsius) and +#' returns it in the data frame. +#' @param reh Boolean, loads relative humidity and return it in the data frame. +#' @param sunp Boolean, loads sunshine, percent of maximum possible (percent of +#' day length) and returns it in data frame. +#' @param frs Boolean, loads ground-frost records (number of days with ground- +#' frost per month) and return it in data frame. +#' @param wnd Boolean, loads 10m wind speed (metres/second) and returns it in +#' the data frame. +#' @param elv Boolean, loads elevation (converted to metres) and returns it in +#' the data frame. #' #' @keywords Internal #' @noRd diff --git a/R/manage_cached_files.R b/R/manage_cached_files.R index 628f946..0ec97e7 100644 --- a/R/manage_cached_files.R +++ b/R/manage_cached_files.R @@ -1,6 +1,6 @@ #' Manage locally cached CRU CL v. 2.0 files #' -#' Manage cached \pkg{getCRUCLdata} files with \CRANpkg{hoardr} +#' Manage cached \pkg{getCRUCLdata} files with \CRANpkg{hoardr}. #' #' @export #' @name manage_cache @@ -13,7 +13,7 @@ #' `manage_cache$cache_delete_all` #' does not accept any names, but deletes all files. For deleting many specific #' files, use `manage_cache$cache_delete` in an -#' [base::lapply()] type call. +#' [base::lapply] type call. #' #' @section Useful user functions: #' \itemize{ diff --git a/codemeta.json b/codemeta.json index 35e44ff..289cfe8 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.693KB", + "fileSize": "910.877KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index 21fcd18..70087bc 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/create_CRU_df.R \name{create_CRU_df} \alias{create_CRU_df} -\title{Create a data.table of Climatology Variables From Local Disk Files} +\title{Create a data.table of CRU CL 2.0 climatology elements from local disk files} \usage{ create_CRU_df( pre = FALSE, @@ -21,56 +21,57 @@ create_CRU_df( ) } \arguments{ -\item{pre}{Boolean. Load precipitation (millimetres/month) from server and -return in the data frame? Defaults to \code{FALSE}.} +\item{pre}{Loads precipitation (millimetres/month) from server and +returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{pre_cv}{Boolean. Load cv of precipitation (percent) from server and -return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to -\code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and +\item{pre_cv}{Loads cv of precipitation (percent) from server and +returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}. NOTE. Setting this +to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Boolean. Load wet-days (number days with >0.1millimetres rain per -month) and return in the data frame? Defaults to \code{FALSE}.} +\item{rd0}{Loads wet-days (number days with >0.1millimetres rain per +month) and returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{tmp}{Boolean. Load temperature (degrees Celsius) and return it in the -data frame? Defaults to \code{FALSE}.} +\item{tmp}{Loads temperature (degrees Celsius) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{dtr}{Boolean. Load mean diurnal temperature range (degrees Celsius) -and return it in the data frame? Defaults to \code{FALSE}.} +\item{dtr}{Loads mean diurnal temperature range (degrees Celsius) +and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{reh}{Boolean. Load relative humidity and return it in the data frame? +\item{reh}{Loads relative humidity and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{tmn}{Boolean. Calculate minimum temperature values (degrees Celsius) -and return it in the data frame? Defaults to \code{FALSE}.} +\item{tmn}{Calculate minimum temperature values (degrees Celsius) +and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{tmx}{Boolean. Calculate maximum temperature (degrees Celsius) and -return it in the data frame? Defaults to \code{FALSE}.} +\item{tmx}{Calculate maximum temperature (degrees Celsius) and +return it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{sunp}{Boolean. Load sunshine, percent of maximum possible (percent of -day length) and return it in the data frame? Defaults to \code{FALSE}.} +\item{sunp}{Loads sunshine, percent of maximum possible (percent of +day length) and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{frs}{Boolean. Load ground-frost records (number of days with ground- -frost per month) and return it in the data frame? Defaults to \code{FALSE}.} +\item{frs}{Loads ground-frost records (number of days with ground- +frost per month) and returns it in the data frame, \code{TRUE}. Defaults to +\code{FALSE}.} -\item{wnd}{Boolean. Load 10m wind speed (metres/second) and return it in the -data frame? Defaults to \code{FALSE}.} +\item{wnd}{Load 10m wind speed (metres/second) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{elv}{Boolean. Load elevation (converted to metres) and return it in -the data frame? Defaults to \code{FALSE}.} +\item{elv}{Loads elevation (converted to metres) and returns it in +the data frame, \code{TRUE}. Defaults to \code{FALSE}.} \item{dsn}{Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz files are located.} } \value{ A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 -climatology elements +climatology elements. } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology -data and creates a tidy data frame of the data. If requested, minimum and -maximum temperature may also be automatically calculated as described in the -data readme.txt file. This function can be useful if you have network +data and creates a \CRANpkg{data.table} of the data. If requested, minimum +and maximum temperature may also be automatically calculated as described in +the data readme.txt file. This function can be useful if you have network connection issues that mean automated downloading of the files using \R does not work properly. } @@ -114,7 +115,7 @@ CRU_tmp \dontshow{\}) # examplesIf} } \seealso{ -\code{\link[=get_CRU_df]{get_CRU_df()}} +\link{get_CRU_df}. } \author{ Adam H Sparks, \email{adamhsparks@gmail.com} diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 0b5a8b0..cb9abdd 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/create_CRU_stack.R \name{create_CRU_stack} \alias{create_CRU_stack} -\title{Create a List of terra rast Objects From Local Disk Files} +\title{Create a list of terra rast objects of CRU CL 2.0 climatology elements from local disk files} \usage{ create_CRU_stack( pre = FALSE, @@ -21,50 +21,51 @@ create_CRU_stack( ) } \arguments{ -\item{pre}{Boolean. Load precipitation (millimetres/month) from server and -return in the data frame? Defaults to \code{FALSE}.} +\item{pre}{Loads precipitation (millimetres/month) from server and +returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{pre_cv}{Boolean. Load cv of precipitation (percent) from server and -return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to -\code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and +\item{pre_cv}{Loads cv of precipitation (percent) from server and +returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}. NOTE. Setting this +to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Boolean. Load wet-days (number days with >0.1millimetres rain per -month) and return in the data frame? Defaults to \code{FALSE}.} +\item{rd0}{Loads wet-days (number days with >0.1millimetres rain per +month) and returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{tmp}{Boolean. Load temperature (degrees Celsius) and return it in the -data frame? Defaults to \code{FALSE}.} +\item{tmp}{Loads temperature (degrees Celsius) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{dtr}{Boolean. Load mean diurnal temperature range (degrees Celsius) -and return it in the data frame? Defaults to \code{FALSE}.} +\item{dtr}{Loads mean diurnal temperature range (degrees Celsius) +and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{reh}{Boolean. Load relative humidity and return it in the data frame? +\item{reh}{Loads relative humidity and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{tmn}{Boolean. Calculate minimum temperature values (degrees Celsius) -and return it in the data frame? Defaults to \code{FALSE}.} +\item{tmn}{Calculate minimum temperature values (degrees Celsius) +and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{tmx}{Boolean. Calculate maximum temperature (degrees Celsius) and -return it in the data frame? Defaults to \code{FALSE}.} +\item{tmx}{Calculate maximum temperature (degrees Celsius) and +return it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{sunp}{Boolean. Load sunshine, percent of maximum possible (percent of -day length) and return it in the data frame? Defaults to \code{FALSE}.} +\item{sunp}{Loads sunshine, percent of maximum possible (percent of +day length) and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{frs}{Boolean. Load ground-frost records (number of days with ground- -frost per month) and return it in the data frame? Defaults to \code{FALSE}.} +\item{frs}{Loads ground-frost records (number of days with ground- +frost per month) and returns it in the data frame, \code{TRUE}. Defaults to +\code{FALSE}.} -\item{wnd}{Boolean. Load 10m wind speed (metres/second) and return it in the -data frame? Defaults to \code{FALSE}.} +\item{wnd}{Load 10m wind speed (metres/second) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{elv}{Boolean. Load elevation (converted to metres) and return it in -the data frame? Defaults to \code{FALSE}.} +\item{elv}{Loads elevation (converted to metres) and returns it in +the data frame, \code{TRUE}. Defaults to \code{FALSE}.} \item{dsn}{Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz files are located.} } \value{ A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of \acronym{CRU} \acronym{CL} -v. 2.0 climatology elements +v. 2.0 climatology elements. } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology @@ -117,7 +118,7 @@ CRU_tmp \dontshow{\}) # examplesIf} } \seealso{ -\code{\link[=get_CRU_stack]{get_CRU_stack()}} +\link{get_CRU_stack}. } \author{ Adam H. Sparks, \email{adamhsparks@gmail.com} diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index 8b4a7d1..e461434 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/get_CRU_df.R \name{get_CRU_df} \alias{get_CRU_df} -\title{Download and Create a data.table of Climatology Parameters} +\title{Download and create a data.table of CRU CL 2.0 climatology elements} \usage{ get_CRU_df( pre = FALSE, @@ -21,52 +21,52 @@ get_CRU_df( ) } \arguments{ -\item{pre}{Boolean. Fetch precipitation (millimetres/month) from server and -return in the data frame? Defaults to \code{FALSE}.} +\item{pre}{Fetches precipitation (millimetres/month) from server and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{pre_cv}{Boolean. Fetch cv of precipitation (percent) from server and -return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to -\code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and +\item{pre_cv}{Fetch cv of precipitation (percent) from server and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}. NOTE Setting +this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Boolean. Fetch wet-days (number days with >0.1 millimetres rain -per month) and return in the data frame? Defaults to \code{FALSE}.} +\item{rd0}{Fetches wet-days (number days with >0.1 millimetres rain +per month) and returns it in the data frame? Defaults to \code{FALSE}.} -\item{tmp}{Boolean. Fetch temperature (degrees Celsius) and return it in the -data frame? Defaults to \code{FALSE}.} +\item{tmp}{Fetches temperature (degrees Celsius) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{dtr}{Boolean. Fetch mean diurnal temperature range (degrees Celsius) -and return it in the data frame? Defaults to \code{FALSE}.} +\item{dtr}{Fetches mean diurnal temperature range (degrees Celsius) +and returns it in the data frame? Defaults to \code{FALSE}.} -\item{reh}{Boolean. Fetch relative humidity and return it in the data frame? -Defaults to FALSE.} +\item{reh}{Fetches relative humidity and returns it in the data frame, +\code{TRUE}. Defaults to FALSE.} -\item{tmn}{Boolean. Calculate minimum temperature values (degrees Celsius) -and return it in the data frame? Defaults to \code{FALSE}.} +\item{tmn}{Calculates minimum temperature values (degrees Celsius) +and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{tmx}{Boolean. Calculate maximum temperature (degrees Celsius) and -return it in the data frame? Defaults to \code{FALSE}.} +\item{tmx}{Calculates maximum temperature (degrees Celsius) and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{sunp}{Boolean. Fetch sunshine, percent of maximum possible (percent of +\item{sunp}{Fetch sunshine, percent of maximum possible (percent of day length) and return it in the data frame? Defaults to \code{FALSE}.} -\item{frs}{Boolean. Fetch ground-frost records (number of days with ground- +\item{frs}{Fetches ground-frost records (number of days with ground- frost per month) and return it in the data frame? Defaults to \code{FALSE}.} -\item{wnd}{Boolean. Fetch 10m wind speed (metres/second) and return it in the -data frame? Defaults to \code{FALSE}.} +\item{wnd}{Fetches 10m wind speed (metres/second) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{elv}{Boolean. Fetch elevation (converted to metres) and return it in -the data frame? Defaults to \code{FALSE}.} +\item{elv}{Fetches elevation (converted to metres) and returns it in +the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{cache}{Boolean. Store CRU CL v. 2.0 data files locally for later use? -If \code{FALSE}, the downloaded files are removed when R session is closed. +\item{cache}{Stores CRU CL v. 2.0 data files locally for later use. +If \code{FALSE}, the downloaded files are removed when the \R session is closed. To take advantage of cached files in future sessions, use \code{cache = TRUE} -after the initial download and caching. Defaults to \code{FALSE}.} +even after the initial download and caching. Defaults to \code{FALSE}.} } \value{ A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 -climatology elements +climatology elements. } \description{ This function automates downloading and importing \acronym{CRU} @@ -111,8 +111,7 @@ CRU_pre_tmp \dontshow{\}) # examplesIf} } \seealso{ -\code{\link[=create_CRU_stack]{create_CRU_stack()}} -\code{\link[=manage_cache]{manage_cache()}} +\link{create_CRU_stack}, \link{manage_cache}. } \author{ Adam H. Sparks, \email{adamhsparks@gmail.com} diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index b216ca6..a641ee0 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/get_CRU_stack.R \name{get_CRU_stack} \alias{get_CRU_stack} -\title{Download and Create a List of terra rast Objects of Climatology Parameters} +\title{Download and create a list of terra rast objects of CRU CL 2.0 climatology elements} \usage{ get_CRU_stack( pre = FALSE, @@ -21,57 +21,57 @@ get_CRU_stack( ) } \arguments{ -\item{pre}{Boolean. Fetch precipitation (millimetres/month) from server and -return in the data frame? Defaults to \code{FALSE}.} +\item{pre}{Fetches precipitation (millimetres/month) from server and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{pre_cv}{Boolean. Fetch cv of precipitation (percent) from server and -return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to -\code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and +\item{pre_cv}{Fetch cv of precipitation (percent) from server and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}. NOTE Setting +this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Boolean. Fetch wet-days (number days with >0.1 millimetres rain -per month) and return in the data frame? Defaults to \code{FALSE}.} +\item{rd0}{Fetches wet-days (number days with >0.1 millimetres rain +per month) and returns it in the data frame? Defaults to \code{FALSE}.} -\item{tmp}{Boolean. Fetch temperature (degrees Celsius) and return it in the -data frame? Defaults to \code{FALSE}.} +\item{tmp}{Fetches temperature (degrees Celsius) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{dtr}{Boolean. Fetch mean diurnal temperature range (degrees Celsius) -and return it in the data frame? Defaults to \code{FALSE}.} +\item{dtr}{Fetches mean diurnal temperature range (degrees Celsius) +and returns it in the data frame? Defaults to \code{FALSE}.} -\item{reh}{Boolean. Fetch relative humidity and return it in the data frame? -Defaults to FALSE.} +\item{reh}{Fetches relative humidity and returns it in the data frame, +\code{TRUE}. Defaults to FALSE.} -\item{tmn}{Boolean. Calculate minimum temperature values (degrees Celsius) -and return it in the data frame? Defaults to \code{FALSE}.} +\item{tmn}{Calculates minimum temperature values (degrees Celsius) +and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{tmx}{Boolean. Calculate maximum temperature (degrees Celsius) and -return it in the data frame? Defaults to \code{FALSE}.} +\item{tmx}{Calculates maximum temperature (degrees Celsius) and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{sunp}{Boolean. Fetch sunshine, percent of maximum possible (percent of +\item{sunp}{Fetch sunshine, percent of maximum possible (percent of day length) and return it in the data frame? Defaults to \code{FALSE}.} -\item{frs}{Boolean. Fetch ground-frost records (number of days with ground- +\item{frs}{Fetches ground-frost records (number of days with ground- frost per month) and return it in the data frame? Defaults to \code{FALSE}.} -\item{wnd}{Boolean. Fetch 10m wind speed (metres/second) and return it in the -data frame? Defaults to \code{FALSE}.} +\item{wnd}{Fetches 10m wind speed (metres/second) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{elv}{Boolean. Fetch elevation (converted to metres) and return it in -the data frame? Defaults to \code{FALSE}.} +\item{elv}{Fetches elevation (converted to metres) and returns it in +the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{cache}{Boolean. Store CRU CL v. 2.0 data files locally for later use? -If \code{FALSE}, the downloaded files are removed when R session is closed. +\item{cache}{Stores CRU CL v. 2.0 data files locally for later use. +If \code{FALSE}, the downloaded files are removed when the \R session is closed. To take advantage of cached files in future sessions, use \code{cache = TRUE} -after the initial download and caching. Defaults to \code{FALSE}.} +even after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \code{\link[base:list]{base::list()}} of \link[terra:rast]{terra::rast} objects of CRU CL v. 2.0 -climatology elements +A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of CRU CL v. 2.0 +climatology elements. } \description{ This function automates downloading and importing CRU CL v. 2.0 climatology data into \R and creates a list of \CRANpkg{terra} -\code{\link[terra:rast]{terra::rast()}} objects of the data. If requested, minimum and maximum +\link[terra:rast]{terra::rast} objects of the data. If requested, minimum and maximum temperature may also be automatically calculated as described in the data readme.txt file. Data may be cached for later use by this function, saving time downloading files in future using this function. @@ -113,12 +113,10 @@ For more information see the description of the data provided by CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) CRU_pre_tmp - \dontshow{\}) # examplesIf} } \seealso{ -\code{\link[=create_CRU_stack]{create_CRU_stack()}} -\code{\link[=manage_cache]{manage_cache()}} +\link{create_CRU_stack}, \link{manage_cache}. } \author{ Adam H. Sparks, \email{adamhsparks@gmail.com} diff --git a/man/manage_cache.Rd b/man/manage_cache.Rd index 8a795de..fe2cb81 100644 --- a/man/manage_cache.Rd +++ b/man/manage_cache.Rd @@ -4,7 +4,7 @@ \alias{manage_cache} \title{Manage locally cached CRU CL v. 2.0 files} \description{ -Manage cached \pkg{getCRUCLdata} files with \CRANpkg{hoardr} +Manage cached \pkg{getCRUCLdata} files with \CRANpkg{hoardr}. } \details{ The default cache directory is @@ -15,7 +15,7 @@ set your own path using \code{manage_cache$cache_path_set()} \code{manage_cache$cache_delete_all} does not accept any names, but deletes all files. For deleting many specific files, use \code{manage_cache$cache_delete} in an -\code{\link[base:lapply]{base::lapply()}} type call. +\link[base:lapply]{base::lapply} type call. } \section{Useful user functions}{ From 34c9865375adabea332e96d2c4b87ba4523acb42 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 10:15:13 +0800 Subject: [PATCH 076/127] update WORDLIST --- codemeta.json | 2 +- inst/WORDLIST | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index 289cfe8..a5b6401 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.877KB", + "fileSize": "910.884KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/inst/WORDLIST b/inst/WORDLIST index 2b971f2..1bc77cb 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -11,6 +11,7 @@ PURRR Precompile README ROxygen +Reknit Reorganises Sri TJ From ba447f2fffb48be499341f9e178b4335a797eb2e Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 10:22:02 +0800 Subject: [PATCH 077/127] tidy up titles --- R/create_CRU_df.R | 2 +- R/create_CRU_stack.R | 2 +- R/get_CRU_df.R | 2 +- R/get_CRU_stack.R | 2 +- R/manage_cached_files.R | 2 +- codemeta.json | 2 +- man/create_CRU_df.Rd | 2 +- man/create_CRU_stack.Rd | 2 +- man/get_CRU_df.Rd | 2 +- man/get_CRU_stack.Rd | 2 +- man/manage_cache.Rd | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 15a3b9b..f1c92a9 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -1,4 +1,4 @@ -#' Create a data.table of CRU CL 2.0 climatology elements from local disk files +#' Create a data.table of CRU CL v. 2.0 climatology elements from local disk files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a \CRANpkg{data.table} of the data. If requested, minimum diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index b2e545f..cd832b3 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -1,4 +1,4 @@ -#' Create a list of terra rast objects of CRU CL 2.0 climatology elements from local disk files +#' Create a list of terra rast objects of CRU CL v. 2.0 climatology elements from local disk files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a \CRANpkg{terra} [terra::rast] object of the diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index ce71b9c..28b66d1 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -1,4 +1,4 @@ -#' Download and create a data.table of CRU CL 2.0 climatology elements +#' Download and create a data.table of CRU CL v. 2.0 climatology elements #' #' This function automates downloading and importing \acronym{CRU} #' \acronym{CL} v. 2.0 climatology data and creates a \CRANpkg{data.table} of diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index b02ab1b..4bf0439 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -1,4 +1,4 @@ -#' Download and create a list of terra rast objects of CRU CL 2.0 climatology elements +#' Download and create a list of terra rast objects of CRU CL v. 2.0 climatology elements #' #' This function automates downloading and importing CRU CL v. 2.0 #' climatology data into \R and creates a list of \CRANpkg{terra} diff --git a/R/manage_cached_files.R b/R/manage_cached_files.R index 0ec97e7..e79159e 100644 --- a/R/manage_cached_files.R +++ b/R/manage_cached_files.R @@ -7,7 +7,7 @@ #' #' @details The default cache directory is #' `tools::R_user_dir(package = "getCRUCLdata")`, but you can -#' set your own path using `manage_cache$cache_path_set()` +#' set your own path using `manage_cache$cache_path_set()`. #' #' `manage_cache$cache_delete` only accepts one file name, while #' `manage_cache$cache_delete_all` diff --git a/codemeta.json b/codemeta.json index a5b6401..4736215 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.884KB", + "fileSize": "910.908KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index 70087bc..fcdcd85 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/create_CRU_df.R \name{create_CRU_df} \alias{create_CRU_df} -\title{Create a data.table of CRU CL 2.0 climatology elements from local disk files} +\title{Create a data.table of CRU CL v. 2.0 climatology elements from local disk files} \usage{ create_CRU_df( pre = FALSE, diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index cb9abdd..17284c8 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/create_CRU_stack.R \name{create_CRU_stack} \alias{create_CRU_stack} -\title{Create a list of terra rast objects of CRU CL 2.0 climatology elements from local disk files} +\title{Create a list of terra rast objects of CRU CL v. 2.0 climatology elements from local disk files} \usage{ create_CRU_stack( pre = FALSE, diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index e461434..ad0f879 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/get_CRU_df.R \name{get_CRU_df} \alias{get_CRU_df} -\title{Download and create a data.table of CRU CL 2.0 climatology elements} +\title{Download and create a data.table of CRU CL v. 2.0 climatology elements} \usage{ get_CRU_df( pre = FALSE, diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index a641ee0..2f69abc 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/get_CRU_stack.R \name{get_CRU_stack} \alias{get_CRU_stack} -\title{Download and create a list of terra rast objects of CRU CL 2.0 climatology elements} +\title{Download and create a list of terra rast objects of CRU CL v. 2.0 climatology elements} \usage{ get_CRU_stack( pre = FALSE, diff --git a/man/manage_cache.Rd b/man/manage_cache.Rd index fe2cb81..a0a5c9e 100644 --- a/man/manage_cache.Rd +++ b/man/manage_cache.Rd @@ -9,7 +9,7 @@ Manage cached \pkg{getCRUCLdata} files with \CRANpkg{hoardr}. \details{ The default cache directory is \code{tools::R_user_dir(package = "getCRUCLdata")}, but you can -set your own path using \code{manage_cache$cache_path_set()} +set your own path using \code{manage_cache$cache_path_set()}. \code{manage_cache$cache_delete} only accepts one file name, while \code{manage_cache$cache_delete_all} From ec3215543d184a34468d754d405841a395ddbda0 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 10:25:34 +0800 Subject: [PATCH 078/127] tidying Roxygen --- R/manage_cached_files.R | 4 ++-- man/manage_cache.Rd | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/R/manage_cached_files.R b/R/manage_cached_files.R index e79159e..145b704 100644 --- a/R/manage_cached_files.R +++ b/R/manage_cached_files.R @@ -6,8 +6,8 @@ #' @name manage_cache #' #' @details The default cache directory is -#' `tools::R_user_dir(package = "getCRUCLdata")`, but you can -#' set your own path using `manage_cache$cache_path_set()`. +#' `tools::R_user_dir(package = "getCRUCLdata")`, but you can set your own path +#' using `manage_cache$cache_path_set()`. #' #' `manage_cache$cache_delete` only accepts one file name, while #' `manage_cache$cache_delete_all` diff --git a/man/manage_cache.Rd b/man/manage_cache.Rd index a0a5c9e..f9d342f 100644 --- a/man/manage_cache.Rd +++ b/man/manage_cache.Rd @@ -8,8 +8,8 @@ Manage cached \pkg{getCRUCLdata} files with \CRANpkg{hoardr}. } \details{ The default cache directory is -\code{tools::R_user_dir(package = "getCRUCLdata")}, but you can -set your own path using \code{manage_cache$cache_path_set()}. +\code{tools::R_user_dir(package = "getCRUCLdata")}, but you can set your own path +using \code{manage_cache$cache_path_set()}. \code{manage_cache$cache_delete} only accepts one file name, while \code{manage_cache$cache_delete_all} From 9d7b394a903bf57af8789d6b8e25025627104ac8 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 10:28:01 +0800 Subject: [PATCH 079/127] more Roxygen tidying --- R/manage_cached_files.R | 3 +-- codemeta.json | 2 +- man/manage_cache.Rd | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/R/manage_cached_files.R b/R/manage_cached_files.R index 145b704..739e63a 100644 --- a/R/manage_cached_files.R +++ b/R/manage_cached_files.R @@ -12,8 +12,7 @@ #' `manage_cache$cache_delete` only accepts one file name, while #' `manage_cache$cache_delete_all` #' does not accept any names, but deletes all files. For deleting many specific -#' files, use `manage_cache$cache_delete` in an -#' [base::lapply] type call. +#' files, use `manage_cache$cache_delete` in an [base::lapply] type call. #' #' @section Useful user functions: #' \itemize{ diff --git a/codemeta.json b/codemeta.json index 4736215..8fd803e 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.908KB", + "fileSize": "910.905KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/manage_cache.Rd b/man/manage_cache.Rd index f9d342f..96580dc 100644 --- a/man/manage_cache.Rd +++ b/man/manage_cache.Rd @@ -14,8 +14,7 @@ using \code{manage_cache$cache_path_set()}. \code{manage_cache$cache_delete} only accepts one file name, while \code{manage_cache$cache_delete_all} does not accept any names, but deletes all files. For deleting many specific -files, use \code{manage_cache$cache_delete} in an -\link[base:lapply]{base::lapply} type call. +files, use \code{manage_cache$cache_delete} in an \link[base:lapply]{base::lapply} type call. } \section{Useful user functions}{ From 6f784f36f95eb5cbce1bc8fe20032307b8daa6a0 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 10:30:25 +0800 Subject: [PATCH 080/127] yet even more polishing Roxygen --- R/get_CRU_stack.R | 4 ++-- codemeta.json | 2 +- man/get_CRU_stack.Rd | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 4bf0439..7af6dc5 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -31,8 +31,8 @@ #' #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. Note that the original wind data include land area -#' for parts of Antarctica, these data are excluded in the terra rast objects -#' generated by this function. +#' for parts of Antarctica, these data are excluded in the \CRANpkg{terra} +#' [terra::rast] objects generated by this function. #' #' @export get_CRU_stack diff --git a/codemeta.json b/codemeta.json index 8fd803e..3aaa69a 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.905KB", + "fileSize": "910.96KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 2f69abc..93af381 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -82,8 +82,8 @@ metres. This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the terra rast objects -generated by this function. +for parts of Antarctica, these data are excluded in the \CRANpkg{terra} +\link[terra:rast]{terra::rast} objects generated by this function. } \section{Nomenclature and Units}{ From 18fac5475542d4defdcef63927a53faff6a22733 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 10:44:58 +0800 Subject: [PATCH 081/127] Fixes missing space in documentation --- R/create_CRU_df.R | 2 +- codemeta.json | 2 +- man/create_CRU_df.Rd | 2 +- man/create_CRU_stack.Rd | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index f1c92a9..ff1447c 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -15,7 +15,7 @@ #' returns in the data frame, `TRUE`. Defaults to `FALSE`. NOTE. Setting this #' to `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. -#' @param rd0 Loads wet-days (number days with >0.1millimetres rain per +#' @param rd0 Loads wet-days (number days with >0.1 millimetres rain per #' month) and returns in the data frame, `TRUE`. Defaults to `FALSE`. #' @param dtr Loads mean diurnal temperature range (degrees Celsius) #' and returns it in the data frame, `TRUE`. Defaults to `FALSE`. diff --git a/codemeta.json b/codemeta.json index 3aaa69a..a8c865b 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.96KB", + "fileSize": "910.963KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index fcdcd85..be6d536 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -29,7 +29,7 @@ returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}. NOTE. Setting to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Loads wet-days (number days with >0.1millimetres rain per +\item{rd0}{Loads wet-days (number days with >0.1 millimetres rain per month) and returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} \item{tmp}{Loads temperature (degrees Celsius) and returns it in the diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 17284c8..fef4507 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -29,7 +29,7 @@ returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}. NOTE. Setting to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Loads wet-days (number days with >0.1millimetres rain per +\item{rd0}{Loads wet-days (number days with >0.1 millimetres rain per month) and returns in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} \item{tmp}{Loads temperature (degrees Celsius) and returns it in the From ca0556b5410d7addbd5277ab6292f07374128e87 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 10:46:09 +0800 Subject: [PATCH 082/127] corrects units --- R/create_CRU_df.R | 2 +- codemeta.json | 2 +- man/create_CRU_df.Rd | 2 +- man/create_CRU_stack.Rd | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index ff1447c..f92aa7a 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -32,7 +32,7 @@ #' @param frs Loads ground-frost records (number of days with ground- #' frost per month) and returns it in the data frame, `TRUE`. Defaults to #' `FALSE`. -#' @param wnd Load 10m wind speed (metres/second) and returns it in the +#' @param wnd Load 10 m wind speed (metres/second) and returns it in the #' data frame, `TRUE`. Defaults to `FALSE`. #' @param elv Loads elevation (converted to metres) and returns it in #' the data frame, `TRUE`. Defaults to `FALSE`. diff --git a/codemeta.json b/codemeta.json index a8c865b..e400a3f 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.963KB", + "fileSize": "910.966KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index be6d536..c86daf2 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -54,7 +54,7 @@ day length) and returns it in the data frame, \code{TRUE}. Defaults to \code{FAL frost per month) and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{wnd}{Load 10m wind speed (metres/second) and returns it in the +\item{wnd}{Load 10 m wind speed (metres/second) and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} \item{elv}{Loads elevation (converted to metres) and returns it in diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index fef4507..edc4b78 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -54,7 +54,7 @@ day length) and returns it in the data frame, \code{TRUE}. Defaults to \code{FAL frost per month) and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} -\item{wnd}{Load 10m wind speed (metres/second) and returns it in the +\item{wnd}{Load 10 m wind speed (metres/second) and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} \item{elv}{Loads elevation (converted to metres) and returns it in From 90f3a148ac48ba74891082ce593ccbf6ac12098e Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 12:18:41 +0800 Subject: [PATCH 083/127] Still polishing Roxygen --- R/get_CRU_df.R | 2 +- codemeta.json | 2 +- man/create_CRU_df.Rd | 2 +- man/create_CRU_stack.Rd | 2 +- man/get_CRU_df.Rd | 2 +- man/get_CRU_stack.Rd | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 28b66d1..f462ec0 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -13,7 +13,7 @@ #' \describe{ #' \item{cv}{cv of precipitation (percent)} #' } -#' \item{rd0}{wet-days (number days with >0.1mm rain per month)} +#' \item{rd0}{wet-days (number days with >0.1 millimetres rain per month)} #' \item{tmp}{mean temperature (degrees Celsius)} #' \item{dtr}{mean diurnal temperature range (degrees Celsius)} #' \item{reh}{relative humidity (percent)} diff --git a/codemeta.json b/codemeta.json index e400a3f..0133408 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "910.966KB", + "fileSize": "911.016KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index c86daf2..c208e04 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -86,7 +86,7 @@ metres. \describe{ \item{cv}{cv of precipitation (percent)} } -\item{rd0}{wet-days (number days with >0.1mm rain per month)} +\item{rd0}{wet-days (number days with >0.1 millimetres rain per month)} \item{tmp}{mean temperature (degrees Celsius)} \item{dtr}{mean diurnal temperature range (degrees Celsius)} \item{reh}{relative humidity (percent)} diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index edc4b78..869d5a9 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -91,7 +91,7 @@ generated by this function. \describe{ \item{cv}{cv of precipitation (percent)} } -\item{rd0}{wet-days (number days with >0.1mm rain per month)} +\item{rd0}{wet-days (number days with >0.1 millimetres rain per month)} \item{tmp}{mean temperature (degrees Celsius)} \item{dtr}{mean diurnal temperature range (degrees Celsius)} \item{reh}{relative humidity (percent)} diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index ad0f879..e36d99b 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -87,7 +87,7 @@ metres. \describe{ \item{cv}{cv of precipitation (percent)} } -\item{rd0}{wet-days (number days with >0.1mm rain per month)} +\item{rd0}{wet-days (number days with >0.1 millimetres rain per month)} \item{tmp}{mean temperature (degrees Celsius)} \item{dtr}{mean diurnal temperature range (degrees Celsius)} \item{reh}{relative humidity (percent)} diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 93af381..edb38fd 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -92,7 +92,7 @@ for parts of Antarctica, these data are excluded in the \CRANpkg{terra} \describe{ \item{cv}{cv of precipitation (percent)} } -\item{rd0}{wet-days (number days with >0.1mm rain per month)} +\item{rd0}{wet-days (number days with >0.1 millimetres rain per month)} \item{tmp}{mean temperature (degrees Celsius)} \item{dtr}{mean diurnal temperature range (degrees Celsius)} \item{reh}{relative humidity (percent)} From e54c4919014bbe4e846960036811e2dd8a679913 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 12:29:25 +0800 Subject: [PATCH 084/127] add sources and references --- R/create_CRU_df.R | 21 +++++++++++++++++++++ R/create_CRU_stack.R | 22 +++++++++++++++++++--- R/get_CRU_df.R | 22 +++++++++++++++++++--- R/get_CRU_stack.R | 23 ++++++++++++++++++++--- codemeta.json | 2 +- man/create_CRU_df.Rd | 22 ++++++++++++++++++++++ man/create_CRU_stack.Rd | 31 ++++++++++++++++++++++--------- man/get_CRU_df.Rd | 26 ++++++++++++++++++++++---- man/get_CRU_stack.Rd | 36 +++++++++++++++++++++++++++--------- 9 files changed, 173 insertions(+), 32 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index f92aa7a..dda2259 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -60,6 +60,27 @@ #' #' @author Adam H Sparks, \email{adamhsparks@@gmail.com} #' +#' @source +#' \itemize{ +#' \item pre +#' \item rd0 +#' \item tmp +#' \item dtr +#' \item reh +#' \item sunp +#' \item frs +#' \item wnd , +#' areas originally including Antarctica are removed. +#' \item elv , +#' values are converted from kilometres to metres. +#' } +#' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +#' xmin = -180, xmax = 180. Note that the original wind data include land area +#' for parts of Antarctica, these data are excluded in the [terra::rast] objects +#' generated by this function. +#' +#' @references +#' #' @note #' This package automatically converts elevation values from kilometres to #' metres. diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index cd832b3..fdf77f8 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -30,14 +30,30 @@ #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' #' @note -#' This package automatically converts elevation values from kilometres to -#' metres. #' + +#' +#' @source +#' \itemize{ +#' \item pre +#' \item rd0 +#' \item tmp +#' \item dtr +#' \item reh +#' \item sunp +#' \item frs +#' \item wnd , +#' areas originally including Antarctica are removed. +#' \item elv , +#' values are converted from kilometres to metres. +#' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. Note that the original wind data include land area -#' for parts of Antarctica, these data are excluded in the terra rast objects +#' for parts of Antarctica, these data are excluded in the [terra::rast] objects #' generated by this function. #' +#' @references +#' #' @export create_CRU_stack create_CRU_stack <- function(pre = FALSE, diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index f462ec0..9027b9b 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -71,10 +71,26 @@ #' climatology elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} +#' @source +#' \itemize{ +#' \item pre +#' \item rd0 +#' \item tmp +#' \item dtr +#' \item reh +#' \item sunp +#' \item frs +#' \item wnd , +#' areas originally including Antarctica are removed. +#' \item elv , +#' values are converted from kilometres to metres. +#' } +#' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +#' xmin = -180, xmax = 180. Note that the original wind data include land area +#' for parts of Antarctica, these data are excluded in the [terra::rast] objects +#' generated by this function. #' -#' @note -#' This package automatically converts elevation values from kilometres to -#' metres. +#' @references #' #' @export diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 7af6dc5..413c0ee 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -25,9 +25,26 @@ #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' -#' @note -#' This package automatically converts elevation values from kilometres to -#' metres. +#' @source +#' \itemize{ +#' \item pre +#' \item rd0 +#' \item tmp +#' \item dtr +#' \item reh +#' \item sunp +#' \item frs +#' \item wnd , +#' areas originally including Antarctica are removed. +#' \item elv , +#' values are converted from kilometres to metres. +#' } +#' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +#' xmin = -180, xmax = 180. Note that the original wind data include land area +#' for parts of Antarctica, these data are excluded in the [terra::rast] objects +#' generated by this function. +#' +#' @references #' #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. Note that the original wind data include land area diff --git a/codemeta.json b/codemeta.json index 0133408..23a871d 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "911.016KB", + "fileSize": "919.822KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index c208e04..dc622ff 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -3,6 +3,25 @@ \name{create_CRU_df} \alias{create_CRU_df} \title{Create a data.table of CRU CL v. 2.0 climatology elements from local disk files} +\source{ +\itemize{ +\item pre \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz} +\item rd0 \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz} +\item tmp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz} +\item dtr \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz} +\item reh \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz} +\item sunp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz} +\item frs \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz} +\item wnd \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, +areas originally including Antarctica are removed. +\item elv \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, +values are converted from kilometres to metres. +} +This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +xmin = -180, xmax = 180. Note that the original wind data include land area +for parts of Antarctica, these data are excluded in the \link[terra:rast]{terra::rast} objects +generated by this function. +} \usage{ create_CRU_df( pre = FALSE, @@ -114,6 +133,9 @@ CRU_tmp <- create_CRU_df(tmp = TRUE, dsn = tempdir()) CRU_tmp \dontshow{\}) # examplesIf} } +\references{ +\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} +} \seealso{ \link{get_CRU_df}. } diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 869d5a9..51faa7c 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -3,6 +3,25 @@ \name{create_CRU_stack} \alias{create_CRU_stack} \title{Create a list of terra rast objects of CRU CL v. 2.0 climatology elements from local disk files} +\source{ +\itemize{ +\item pre \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz} +\item rd0 \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz} +\item tmp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz} +\item dtr \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz} +\item reh \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz} +\item sunp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz} +\item frs \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz} +\item wnd \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, +areas originally including Antarctica are removed. +\item elv \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, +values are converted from kilometres to metres. +} +This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +xmin = -180, xmax = 180. Note that the original wind data include land area +for parts of Antarctica, these data are excluded in the \link[terra:rast]{terra::rast} objects +generated by this function. +} \usage{ create_CRU_stack( pre = FALSE, @@ -75,15 +94,6 @@ automatically calculated as described in the data readme.txt file. This function can be useful if you have network connection issues that mean automated downloading of the files using \R does not work properly. } -\note{ -This package automatically converts elevation values from kilometres to -metres. - -This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the terra rast objects -generated by this function. -} \section{Nomenclature and Units}{ \describe{ @@ -117,6 +127,9 @@ CRU_tmp <- create_CRU_stack(tmp = TRUE, dsn = tempdir()) CRU_tmp \dontshow{\}) # examplesIf} } +\references{ +\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} +} \seealso{ \link{get_CRU_stack}. } diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index e36d99b..1c950b9 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -3,6 +3,25 @@ \name{get_CRU_df} \alias{get_CRU_df} \title{Download and create a data.table of CRU CL v. 2.0 climatology elements} +\source{ +\itemize{ +\item pre \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz} +\item rd0 \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz} +\item tmp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz} +\item dtr \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz} +\item reh \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz} +\item sunp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz} +\item frs \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz} +\item wnd \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, +areas originally including Antarctica are removed. +\item elv \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, +values are converted from kilometres to metres. +} +This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +xmin = -180, xmax = 180. Note that the original wind data include land area +for parts of Antarctica, these data are excluded in the \link[terra:rast]{terra::rast} objects +generated by this function. +} \usage{ get_CRU_df( pre = FALSE, @@ -76,10 +95,6 @@ automatically calculated as described in the data readme.txt file. Data may be cached for later use by this function, saving time downloading files in future use of this function. } -\note{ -This package automatically converts elevation values from kilometres to -metres. -} \section{Nomenclature and Units}{ \describe{ @@ -110,6 +125,9 @@ head(CRU_pre_tmp) CRU_pre_tmp \dontshow{\}) # examplesIf} } +\references{ +\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} +} \seealso{ \link{create_CRU_stack}, \link{manage_cache}. } diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index edb38fd..1fbe054 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -3,6 +3,25 @@ \name{get_CRU_stack} \alias{get_CRU_stack} \title{Download and create a list of terra rast objects of CRU CL v. 2.0 climatology elements} +\source{ +\itemize{ +\item pre \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz} +\item rd0 \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz} +\item tmp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz} +\item dtr \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz} +\item reh \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz} +\item sunp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz} +\item frs \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz} +\item wnd \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, +areas originally including Antarctica are removed. +\item elv \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, +values are converted from kilometres to metres. +} +This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +xmin = -180, xmax = 180. Note that the original wind data include land area +for parts of Antarctica, these data are excluded in the \link[terra:rast]{terra::rast} objects +generated by this function. +} \usage{ get_CRU_stack( pre = FALSE, @@ -76,15 +95,6 @@ temperature may also be automatically calculated as described in the data readme.txt file. Data may be cached for later use by this function, saving time downloading files in future using this function. } -\note{ -This package automatically converts elevation values from kilometres to -metres. - -This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the \CRANpkg{terra} -\link[terra:rast]{terra::rast} objects generated by this function. -} \section{Nomenclature and Units}{ \describe{ @@ -115,6 +125,14 @@ CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) CRU_pre_tmp \dontshow{\}) # examplesIf} } +\references{ +\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} + +This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +xmin = -180, xmax = 180. Note that the original wind data include land area +for parts of Antarctica, these data are excluded in the \CRANpkg{terra} +\link[terra:rast]{terra::rast} objects generated by this function. +} \seealso{ \link{create_CRU_stack}, \link{manage_cache}. } From e1bcc9c77d2418a0f9c03198aa723ff57db903b3 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 13:28:03 +0800 Subject: [PATCH 085/127] simplify @source field --- R/create_CRU_df.R | 4 +--- R/create_CRU_stack.R | 4 +--- R/get_CRU_df.R | 4 +--- R/get_CRU_stack.R | 4 +--- codemeta.json | 2 +- man/create_CRU_df.Rd | 4 +--- man/create_CRU_stack.Rd | 4 +--- man/get_CRU_df.Rd | 4 +--- man/get_CRU_stack.Rd | 4 +--- 9 files changed, 9 insertions(+), 25 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index dda2259..d6a84cd 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -75,9 +75,7 @@ #' values are converted from kilometres to metres. #' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -#' xmin = -180, xmax = 180. Note that the original wind data include land area -#' for parts of Antarctica, these data are excluded in the [terra::rast] objects -#' generated by this function. +#' xmin = -180, xmax = 180. #' #' @references #' diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index fdf77f8..34e3259 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -48,9 +48,7 @@ #' values are converted from kilometres to metres. #' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -#' xmin = -180, xmax = 180. Note that the original wind data include land area -#' for parts of Antarctica, these data are excluded in the [terra::rast] objects -#' generated by this function. +#' xmin = -180, xmax = 180. #' #' @references #' diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 9027b9b..bbbe105 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -86,9 +86,7 @@ #' values are converted from kilometres to metres. #' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -#' xmin = -180, xmax = 180. Note that the original wind data include land area -#' for parts of Antarctica, these data are excluded in the [terra::rast] objects -#' generated by this function. +#' xmin = -180, xmax = 180. #' #' @references #' diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 413c0ee..8a82bfc 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -40,9 +40,7 @@ #' values are converted from kilometres to metres. #' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -#' xmin = -180, xmax = 180. Note that the original wind data include land area -#' for parts of Antarctica, these data are excluded in the [terra::rast] objects -#' generated by this function. +#' xmin = -180, xmax = 180. #' #' @references #' diff --git a/codemeta.json b/codemeta.json index 23a871d..457588e 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "919.822KB", + "fileSize": "918.474KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index dc622ff..d5f6066 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -18,9 +18,7 @@ areas originally including Antarctica are removed. values are converted from kilometres to metres. } This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the \link[terra:rast]{terra::rast} objects -generated by this function. +xmin = -180, xmax = 180. } \usage{ create_CRU_df( diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 51faa7c..006ba5c 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -18,9 +18,7 @@ areas originally including Antarctica are removed. values are converted from kilometres to metres. } This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the \link[terra:rast]{terra::rast} objects -generated by this function. +xmin = -180, xmax = 180. } \usage{ create_CRU_stack( diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index 1c950b9..b34ac72 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -18,9 +18,7 @@ areas originally including Antarctica are removed. values are converted from kilometres to metres. } This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the \link[terra:rast]{terra::rast} objects -generated by this function. +xmin = -180, xmax = 180. } \usage{ get_CRU_df( diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 1fbe054..d632973 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -18,9 +18,7 @@ areas originally including Antarctica are removed. values are converted from kilometres to metres. } This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the \link[terra:rast]{terra::rast} objects -generated by this function. +xmin = -180, xmax = 180. } \usage{ get_CRU_stack( From 60e1fef42ea766ba9e82cbe64ecd51f60a19c0da Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 13:35:35 +0800 Subject: [PATCH 086/127] use \describe for source(s) --- R/create_CRU_df.R | 22 ++++++++++------------ R/create_CRU_stack.R | 26 ++++++++++---------------- R/get_CRU_df.R | 22 ++++++++++------------ R/get_CRU_stack.R | 22 ++++++++++------------ codemeta.json | 2 +- man/create_CRU_df.Rd | 22 ++++++++++------------ man/create_CRU_stack.Rd | 22 ++++++++++------------ man/get_CRU_df.Rd | 22 ++++++++++------------ man/get_CRU_stack.Rd | 22 ++++++++++------------ 9 files changed, 81 insertions(+), 101 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index d6a84cd..f4ab564 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -61,18 +61,16 @@ #' @author Adam H Sparks, \email{adamhsparks@@gmail.com} #' #' @source -#' \itemize{ -#' \item pre -#' \item rd0 -#' \item tmp -#' \item dtr -#' \item reh -#' \item sunp -#' \item frs -#' \item wnd , -#' areas originally including Antarctica are removed. -#' \item elv , -#' values are converted from kilometres to metres. +#' \describe{ +#' \item{pre}{} +#' \item{rd0}{} +#' \item{tmp}{} +#' \item{dtr}{} +#' \item{reh}{} +#' \item{sunp}{} +#' \item{frs}{} +#' \item{wnd}{, areas originally including Antarctica are removed.} +#' \item{elv}{, values are converted from kilometres to metres.} #' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index 34e3259..f1637f2 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -28,24 +28,18 @@ #' v. 2.0 climatology elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} -#' -#' @note -#' - #' #' @source -#' \itemize{ -#' \item pre -#' \item rd0 -#' \item tmp -#' \item dtr -#' \item reh -#' \item sunp -#' \item frs -#' \item wnd , -#' areas originally including Antarctica are removed. -#' \item elv , -#' values are converted from kilometres to metres. +#' \describe{ +#' \item{pre}{} +#' \item{rd0}{} +#' \item{tmp}{} +#' \item{dtr}{} +#' \item{reh}{} +#' \item{sunp}{} +#' \item{frs}{} +#' \item{wnd}{, areas originally including Antarctica are removed.} +#' \item{elv}{, values are converted from kilometres to metres.} #' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index bbbe105..7d4b018 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -72,18 +72,16 @@ #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' @source -#' \itemize{ -#' \item pre -#' \item rd0 -#' \item tmp -#' \item dtr -#' \item reh -#' \item sunp -#' \item frs -#' \item wnd , -#' areas originally including Antarctica are removed. -#' \item elv , -#' values are converted from kilometres to metres. +#' \describe{ +#' \item{pre}{} +#' \item{rd0}{} +#' \item{tmp}{} +#' \item{dtr}{} +#' \item{reh}{} +#' \item{sunp}{} +#' \item{frs}{} +#' \item{wnd}{, areas originally including Antarctica are removed.} +#' \item{elv}{, values are converted from kilometres to metres.} #' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 8a82bfc..afbad61 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -26,18 +26,16 @@ #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' #' @source -#' \itemize{ -#' \item pre -#' \item rd0 -#' \item tmp -#' \item dtr -#' \item reh -#' \item sunp -#' \item frs -#' \item wnd , -#' areas originally including Antarctica are removed. -#' \item elv , -#' values are converted from kilometres to metres. +#' \describe{ +#' \item{pre}{} +#' \item{rd0}{} +#' \item{tmp}{} +#' \item{dtr}{} +#' \item{reh}{} +#' \item{sunp}{} +#' \item{frs}{} +#' \item{wnd}{, areas originally including Antarctica are removed.} +#' \item{elv}{, values are converted from kilometres to metres.} #' } #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. diff --git a/codemeta.json b/codemeta.json index 457588e..82b6072 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "918.474KB", + "fileSize": "918.578KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index d5f6066..0950841 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -4,18 +4,16 @@ \alias{create_CRU_df} \title{Create a data.table of CRU CL v. 2.0 climatology elements from local disk files} \source{ -\itemize{ -\item pre \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz} -\item rd0 \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz} -\item tmp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz} -\item dtr \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz} -\item reh \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz} -\item sunp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz} -\item frs \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz} -\item wnd \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, -areas originally including Antarctica are removed. -\item elv \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, -values are converted from kilometres to metres. +\describe{ +\item{pre}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz}} +\item{rd0}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz}} +\item{tmp}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz}} +\item{dtr}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz}} +\item{reh}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz}} +\item{sunp}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz}} +\item{frs}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz}} +\item{wnd}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, areas originally including Antarctica are removed.} +\item{elv}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, values are converted from kilometres to metres.} } This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 006ba5c..274e8df 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -4,18 +4,16 @@ \alias{create_CRU_stack} \title{Create a list of terra rast objects of CRU CL v. 2.0 climatology elements from local disk files} \source{ -\itemize{ -\item pre \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz} -\item rd0 \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz} -\item tmp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz} -\item dtr \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz} -\item reh \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz} -\item sunp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz} -\item frs \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz} -\item wnd \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, -areas originally including Antarctica are removed. -\item elv \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, -values are converted from kilometres to metres. +\describe{ +\item{pre}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz}} +\item{rd0}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz}} +\item{tmp}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz}} +\item{dtr}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz}} +\item{reh}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz}} +\item{sunp}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz}} +\item{frs}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz}} +\item{wnd}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, areas originally including Antarctica are removed.} +\item{elv}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, values are converted from kilometres to metres.} } This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index b34ac72..44bdca1 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -4,18 +4,16 @@ \alias{get_CRU_df} \title{Download and create a data.table of CRU CL v. 2.0 climatology elements} \source{ -\itemize{ -\item pre \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz} -\item rd0 \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz} -\item tmp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz} -\item dtr \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz} -\item reh \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz} -\item sunp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz} -\item frs \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz} -\item wnd \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, -areas originally including Antarctica are removed. -\item elv \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, -values are converted from kilometres to metres. +\describe{ +\item{pre}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz}} +\item{rd0}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz}} +\item{tmp}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz}} +\item{dtr}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz}} +\item{reh}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz}} +\item{sunp}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz}} +\item{frs}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz}} +\item{wnd}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, areas originally including Antarctica are removed.} +\item{elv}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, values are converted from kilometres to metres.} } This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index d632973..c3acfd7 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -4,18 +4,16 @@ \alias{get_CRU_stack} \title{Download and create a list of terra rast objects of CRU CL v. 2.0 climatology elements} \source{ -\itemize{ -\item pre \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz} -\item rd0 \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz} -\item tmp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz} -\item dtr \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz} -\item reh \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz} -\item sunp \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz} -\item frs \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz} -\item wnd \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, -areas originally including Antarctica are removed. -\item elv \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, -values are converted from kilometres to metres. +\describe{ +\item{pre}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_pre.dat.gz}} +\item{rd0}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_rd0.dat.gz}} +\item{tmp}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz}} +\item{dtr}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_dtr.dat.gz}} +\item{reh}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_reh.dat.gz}} +\item{sunp}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_sunp.dat.gz}} +\item{frs}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_frs.dat.gz}} +\item{wnd}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_wnd.dat.gz}, areas originally including Antarctica are removed.} +\item{elv}{\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_elv.dat.gz}, values are converted from kilometres to metres.} } This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. From 3804753a2a8e6df89525c45c09cf07e1f7a66587 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 14:06:32 +0800 Subject: [PATCH 087/127] alias functions with all lower case --- NAMESPACE | 4 ++++ R/create_CRU_df.R | 4 ++++ R/create_CRU_stack.R | 4 ++++ R/get_CRU_df.R | 4 ++++ R/get_CRU_stack.R | 4 ++++ codemeta.json | 2 +- man/create_CRU_df.Rd | 17 +++++++++++++++++ man/create_CRU_stack.Rd | 17 +++++++++++++++++ man/get_CRU_stack.Rd | 38 ++++++++++++++++++++++++++++++++++++-- 9 files changed, 91 insertions(+), 3 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 2ad4069..5b7fb1c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,8 +2,12 @@ export(create_CRU_df) export(create_CRU_stack) +export(create_cru_df) +export(create_cru_stack) export(get_CRU_df) export(get_CRU_stack) +export(get_cru_df) +export(get_cru_stack) export(manage_cache) importFrom(data.table,":=") importFrom(data.table,.BY) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index f4ab564..6b12e4a 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -136,3 +136,7 @@ create_CRU_df <- function(pre = FALSE, return(.create_df(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files)) } + +#' @export +#' @rdname create_CRU_df +create_cru_df <- create_CRU_df diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index f1637f2..a7c29de 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -102,3 +102,7 @@ create_CRU_stack <- function(pre = FALSE, return(.create_stacks(tmn, tmx, tmp, dtr, pre, pre_cv, files)) } + +#' @export +#' @rdname create_CRU_stack +create_cru_stack <- create_CRU_stack diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 7d4b018..c416599 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -138,3 +138,7 @@ get_CRU_df <- function(pre = FALSE, return(.create_df(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files)) } + +#' @export +#' @rdname get_CRU_stack +get_cru_df <- get_CRU_df diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index afbad61..1bff52e 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -102,3 +102,7 @@ get_CRU_stack <- return(.create_stacks(tmn, tmx, tmp, dtr, pre, pre_cv, files)) } + +#' @export +#' @rdname get_CRU_stack +get_cru_stack <- get_CRU_stack diff --git a/codemeta.json b/codemeta.json index 82b6072..80f50d4 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "918.578KB", + "fileSize": "920.186KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index 0950841..e928ade 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -2,6 +2,7 @@ % Please edit documentation in R/create_CRU_df.R \name{create_CRU_df} \alias{create_CRU_df} +\alias{create_cru_df} \title{Create a data.table of CRU CL v. 2.0 climatology elements from local disk files} \source{ \describe{ @@ -34,6 +35,22 @@ create_CRU_df( elv = FALSE, dsn ) + +create_cru_df( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + dsn +) } \arguments{ \item{pre}{Loads precipitation (millimetres/month) from server and diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 274e8df..d8a4de7 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -2,6 +2,7 @@ % Please edit documentation in R/create_CRU_stack.R \name{create_CRU_stack} \alias{create_CRU_stack} +\alias{create_cru_stack} \title{Create a list of terra rast objects of CRU CL v. 2.0 climatology elements from local disk files} \source{ \describe{ @@ -34,6 +35,22 @@ create_CRU_stack( elv = FALSE, dsn ) + +create_cru_stack( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + dsn +) } \arguments{ \item{pre}{Loads precipitation (millimetres/month) from server and diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index c3acfd7..5103e1e 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -1,7 +1,9 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_CRU_stack.R -\name{get_CRU_stack} +% Please edit documentation in R/get_CRU_df.R, R/get_CRU_stack.R +\name{get_cru_df} +\alias{get_cru_df} \alias{get_CRU_stack} +\alias{get_cru_stack} \title{Download and create a list of terra rast objects of CRU CL v. 2.0 climatology elements} \source{ \describe{ @@ -19,6 +21,22 @@ This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. } \usage{ +get_cru_df( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + cache = FALSE +) + get_CRU_stack( pre = FALSE, pre_cv = FALSE, @@ -34,6 +52,22 @@ get_CRU_stack( elv = FALSE, cache = FALSE ) + +get_cru_stack( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + cache = FALSE +) } \arguments{ \item{pre}{Fetches precipitation (millimetres/month) from server and From ce3ef7ea68deb12fc6aea991c92c09efcf1815c7 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 14:06:46 +0800 Subject: [PATCH 088/127] use \describe in list of functions --- R/manage_cached_files.R | 20 ++++++++++---------- man/manage_cache.Rd | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/R/manage_cached_files.R b/R/manage_cached_files.R index 739e63a..ee142a4 100644 --- a/R/manage_cached_files.R +++ b/R/manage_cached_files.R @@ -15,16 +15,16 @@ #' files, use `manage_cache$cache_delete` in an [base::lapply] type call. #' #' @section Useful user functions: -#' \itemize{ -#' \item `manage_cache$cache_path_get()` - get cache path -#' \item `manage_cache$cache_path_set()` - set cache path -#' \item `manage_cache$list()` - returns a character vector of full -#' path file names -#' \item `manage_cache$files()` - returns file objects with metadata -#' \item `manage_cache$details()` - returns files with details -#' \item `manage_cache$delete()` - delete specific files -#' \item `manage_cache$delete_all()` - delete all files, returns -#' nothing +#' \describe{ +#' \item{`manage_cache$cache_path_get()`}{get cache path} +#' \item{`manage_cache$cache_path_set()`}{set cache path} +#' \item{`manage_cache$list()`}{returns a character vector of full +#' path file names} +#' \item{`manage_cache$files()`}{returns file objects with metadata} +#' \item{`manage_cache$details()`}{returns files with details} +#' \item{`manage_cache$delete()`}{delete specific files} +#' \item{`manage_cache$delete_all()`}{delete all files, returns +#' nothing} #' } #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} diff --git a/man/manage_cache.Rd b/man/manage_cache.Rd index 96580dc..a180d36 100644 --- a/man/manage_cache.Rd +++ b/man/manage_cache.Rd @@ -18,16 +18,16 @@ files, use \code{manage_cache$cache_delete} in an \link[base:lapply]{base::lappl } \section{Useful user functions}{ -\itemize{ -\item \code{manage_cache$cache_path_get()} - get cache path -\item \code{manage_cache$cache_path_set()} - set cache path -\item \code{manage_cache$list()} - returns a character vector of full -path file names -\item \code{manage_cache$files()} - returns file objects with metadata -\item \code{manage_cache$details()} - returns files with details -\item \code{manage_cache$delete()} - delete specific files -\item \code{manage_cache$delete_all()} - delete all files, returns -nothing +\describe{ +\item{\code{manage_cache$cache_path_get()}}{get cache path} +\item{\code{manage_cache$cache_path_set()}}{set cache path} +\item{\code{manage_cache$list()}}{returns a character vector of full +path file names} +\item{\code{manage_cache$files()}}{returns file objects with metadata} +\item{\code{manage_cache$details()}}{returns files with details} +\item{\code{manage_cache$delete()}}{delete specific files} +\item{\code{manage_cache$delete_all()}}{delete all files, returns +nothing} } } From 3bc2a3edb95feebed1306362480b2e9211769db2 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 14:06:56 +0800 Subject: [PATCH 089/127] update NEWS --- NEWS.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/NEWS.md b/NEWS.md index edffac6..3f5beff 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,13 @@ +# getCRUCLdata 1.0.2.9000 + +## Minor changes + +- Add source and references to documentation for data + +- Create function aliases that use all lower case, *e.g.*, `get_cru_stack()` vs `get_CRU_stack()` + +- Improved documentation with linting, ensuring consistency in units of measurement, etc. + # getCRUCLdata 1.0.2 ## Minor changes From d9083e63e8787f596685eeb373713625c8267eeb Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 14:27:14 +0800 Subject: [PATCH 090/127] Add citation to references along with the URL to PDF --- R/create_CRU_df.R | 4 +++- R/create_CRU_stack.R | 4 +++- R/get_CRU_df.R | 4 +++- R/get_CRU_stack.R | 4 +++- codemeta.json | 2 +- man/create_CRU_df.Rd | 2 ++ man/create_CRU_stack.Rd | 2 ++ man/get_CRU_df.Rd | 2 ++ man/get_CRU_stack.Rd | 2 ++ 9 files changed, 21 insertions(+), 5 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 6b12e4a..4818045 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -75,7 +75,9 @@ #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. #' -#' @references +#' @references New, Mark, et al. "A high-resolution data set of surface climate +#' over global land areas." Climate research 21.1 (2002): 1-25. +#' #' #' @note #' This package automatically converts elevation values from kilometres to diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index a7c29de..b8b2942 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -44,7 +44,9 @@ #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. #' -#' @references +#' @references New, Mark, et al. "A high-resolution data set of surface climate +#' over global land areas." Climate research 21.1 (2002): 1-25. +#' #' #' @export create_CRU_stack diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index c416599..888a9b5 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -86,7 +86,9 @@ #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. #' -#' @references +#' @references New, Mark, et al. "A high-resolution data set of surface climate +#' over global land areas." Climate research 21.1 (2002): 1-25. +#' #' #' @export diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 1bff52e..739e086 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -40,7 +40,9 @@ #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. #' -#' @references +#' @references New, Mark, et al. "A high-resolution data set of surface climate +#' over global land areas." Climate research 21.1 (2002): 1-25. +#' #' #' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, #' xmin = -180, xmax = 180. Note that the original wind data include land area diff --git a/codemeta.json b/codemeta.json index 80f50d4..903e3fe 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "920.186KB", + "fileSize": "921.226KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index e928ade..86c9a79 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -147,6 +147,8 @@ CRU_tmp \dontshow{\}) # examplesIf} } \references{ +New, Mark, et al. "A high-resolution data set of surface climate +over global land areas." Climate research 21.1 (2002): 1-25. \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} } \seealso{ diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index d8a4de7..2271760 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -141,6 +141,8 @@ CRU_tmp \dontshow{\}) # examplesIf} } \references{ +New, Mark, et al. "A high-resolution data set of surface climate +over global land areas." Climate research 21.1 (2002): 1-25. \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} } \seealso{ diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index 44bdca1..95c277b 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -122,6 +122,8 @@ CRU_pre_tmp \dontshow{\}) # examplesIf} } \references{ +New, Mark, et al. "A high-resolution data set of surface climate +over global land areas." Climate research 21.1 (2002): 1-25. \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} } \seealso{ diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 5103e1e..f02b156 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -156,6 +156,8 @@ CRU_pre_tmp \dontshow{\}) # examplesIf} } \references{ +New, Mark, et al. "A high-resolution data set of surface climate +over global land areas." Climate research 21.1 (2002): 1-25. \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, From 83d822e719328f7cd156a222f07b9bc1aba4e656 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 15:00:34 +0800 Subject: [PATCH 091/127] remove redundant text --- R/create_CRU_df.R | 5 +---- R/create_CRU_stack.R | 2 +- R/get_CRU_stack.R | 5 ----- codemeta.json | 2 +- man/create_CRU_df.Rd | 4 ---- man/get_CRU_stack.Rd | 5 ----- 6 files changed, 3 insertions(+), 20 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 4818045..5fbc43f 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -79,10 +79,7 @@ #' over global land areas." Climate research 21.1 (2002): 1-25. #' #' -#' @note -#' This package automatically converts elevation values from kilometres to -#' metres. -#' @export create_CRU_df +#' @export create_CRU_df <- function(pre = FALSE, pre_cv = FALSE, diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index b8b2942..4f0d9bd 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -48,7 +48,7 @@ #' over global land areas." Climate research 21.1 (2002): 1-25. #' #' -#' @export create_CRU_stack +#' @export create_CRU_stack <- function(pre = FALSE, pre_cv = FALSE, diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 739e086..9ef5504 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -44,11 +44,6 @@ #' over global land areas." Climate research 21.1 (2002): 1-25. #' #' -#' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -#' xmin = -180, xmax = 180. Note that the original wind data include land area -#' for parts of Antarctica, these data are excluded in the \CRANpkg{terra} -#' [terra::rast] objects generated by this function. -#' #' @export get_CRU_stack get_CRU_stack <- diff --git a/codemeta.json b/codemeta.json index 903e3fe..0865032 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "921.226KB", + "fileSize": "920.424KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index 86c9a79..25a05da 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -107,10 +107,6 @@ the data readme.txt file. This function can be useful if you have network connection issues that mean automated downloading of the files using \R does not work properly. } -\note{ -This package automatically converts elevation values from kilometres to -metres. -} \section{Nomenclature and Units}{ \describe{ diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index f02b156..0f70df6 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -159,11 +159,6 @@ CRU_pre_tmp New, Mark, et al. "A high-resolution data set of surface climate over global land areas." Climate research 21.1 (2002): 1-25. \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/new_et_al_10minute_climate_CR.pdf} - -This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the \CRANpkg{terra} -\link[terra:rast]{terra::rast} objects generated by this function. } \seealso{ \link{create_CRU_stack}, \link{manage_cache}. From dfe8523a9feb0af8b5d808b1b0dd228a48e72456 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 15:20:27 +0800 Subject: [PATCH 092/127] corrects invalid alias --- R/get_CRU_df.R | 2 +- man/get_CRU_df.Rd | 17 +++++++++++++++++ man/get_CRU_stack.Rd | 21 ++------------------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 888a9b5..e338f36 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -142,5 +142,5 @@ get_CRU_df <- function(pre = FALSE, } #' @export -#' @rdname get_CRU_stack +#' @rdname get_CRU_df get_cru_df <- get_CRU_df diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index 95c277b..da5362a 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -2,6 +2,7 @@ % Please edit documentation in R/get_CRU_df.R \name{get_CRU_df} \alias{get_CRU_df} +\alias{get_cru_df} \title{Download and create a data.table of CRU CL v. 2.0 climatology elements} \source{ \describe{ @@ -34,6 +35,22 @@ get_CRU_df( elv = FALSE, cache = FALSE ) + +get_cru_df( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + cache = FALSE +) } \arguments{ \item{pre}{Fetches precipitation (millimetres/month) from server and diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 0f70df6..466a772 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -1,7 +1,6 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_CRU_df.R, R/get_CRU_stack.R -\name{get_cru_df} -\alias{get_cru_df} +% Please edit documentation in R/get_CRU_stack.R +\name{get_CRU_stack} \alias{get_CRU_stack} \alias{get_cru_stack} \title{Download and create a list of terra rast objects of CRU CL v. 2.0 climatology elements} @@ -21,22 +20,6 @@ This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. } \usage{ -get_cru_df( - pre = FALSE, - pre_cv = FALSE, - rd0 = FALSE, - tmp = FALSE, - dtr = FALSE, - reh = FALSE, - tmn = FALSE, - tmx = FALSE, - sunp = FALSE, - frs = FALSE, - wnd = FALSE, - elv = FALSE, - cache = FALSE -) - get_CRU_stack( pre = FALSE, pre_cv = FALSE, From 67b06b8a59afb8c15b25bf31e2867493559c55ea Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 16:37:36 +0800 Subject: [PATCH 093/127] Remove an invalid terra fn from vignette --- codemeta.json | 2 +- vignettes/getCRUCLdata.Rmd | 58 ++++++++++++++++----------------- vignettes/getCRUCLdata.Rmd.orig | 2 +- vignettes/precompile.R | 1 + 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/codemeta.json b/codemeta.json index 0865032..765f739 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "920.424KB", + "fileSize": "920.313KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/vignettes/getCRUCLdata.Rmd b/vignettes/getCRUCLdata.Rmd index 659f467..e39b9ae 100644 --- a/vignettes/getCRUCLdata.Rmd +++ b/vignettes/getCRUCLdata.Rmd @@ -1,7 +1,7 @@ --- title: "getCRUCLdata" author: "Adam H. Sparks" -date: "2024-12-16" +date: "2024-12-17" output: rmarkdown::html_vignette: toc: true @@ -87,32 +87,32 @@ CRU_data <- get_CRU_df(pre = TRUE, elv = TRUE) CRU_data -#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv tmx -#> -#> 1: 30.917 35.417 NA NA NA NA NA NA NA NA NA -260 NA -#> 2: 31.083 35.417 NA NA NA NA NA NA NA NA NA -361 NA -#> 3: 31.250 35.417 NA NA NA NA NA NA NA NA NA -336 NA -#> 4: 31.417 35.417 NA NA NA NA NA NA NA NA NA -284 NA -#> 5: 31.750 35.583 NA NA NA NA NA NA NA NA NA -248 NA -#> --- -#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 70.6 0 -31.3 5.6 283 -26.95 -#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 70.6 0 -30.7 5.6 186 -26.40 -#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 70.6 0 -30.8 5.6 195 -26.50 -#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 70.6 0 -31.2 5.6 268 -26.90 -#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 70.6 0 -31.5 5.6 328 -27.20 -#> tmn -#> -#> 1: NA -#> 2: NA -#> 3: NA -#> 4: NA -#> 5: NA -#> --- -#> 6795146: -35.65 -#> 6795147: -35.00 -#> 6795148: -35.10 -#> 6795149: -35.50 -#> 6795150: -35.80 +#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv +#> +#> 1: 30.917 35.417 NA NA NA NA NA NA NA NA NA -260 +#> 2: 31.083 35.417 NA NA NA NA NA NA NA NA NA -361 +#> 3: 31.250 35.417 NA NA NA NA NA NA NA NA NA -336 +#> 4: 31.417 35.417 NA NA NA NA NA NA NA NA NA -284 +#> 5: 31.750 35.583 NA NA NA NA NA NA NA NA NA -248 +#> --- +#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 70.6 0 -31.3 5.6 283 +#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 70.6 0 -30.7 5.6 186 +#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 70.6 0 -30.8 5.6 195 +#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 70.6 0 -31.2 5.6 268 +#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 70.6 0 -31.5 5.6 328 +#> tmx tmn +#> +#> 1: NA NA +#> 2: NA NA +#> 3: NA NA +#> 4: NA NA +#> 5: NA NA +#> --- +#> 6795146: -26.95 -35.65 +#> 6795147: -26.40 -35.00 +#> 6795148: -26.50 -35.10 +#> 6795149: -26.90 -35.50 +#> 6795150: -27.20 -35.80 ``` Perhaps you only need one or two elements, it is easy to create a data frame of mean temperature only. @@ -252,7 +252,7 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : spat_613232ecfe11_24882_GdaPwXHptgIOPSx.tif +#> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.0, 0.0, 0.0, 0.0, 0, 0.0, ... #> max values : 910.1, 824.3, 727.3, 741.3, 1100, 2512.6, ... @@ -367,7 +367,7 @@ plot(t[[8]]$jul) #### Saving terra objects to local disk -The terra rast stack objects can be saved to disk as geotiff files (others are available, see help for `terra::writeRaster()` and `terra::writeFormats()` for more options) on the `Data` directory with a tmn or tmx prefix to the month for a file name. +The [terra::rast()] objects can be saved to disk as geotiff files (others are available, see help for `terra::writeRaster()` for more options) on the `Data` directory with a tmn or tmx prefix to the month for a file name. ``` r diff --git a/vignettes/getCRUCLdata.Rmd.orig b/vignettes/getCRUCLdata.Rmd.orig index d00894a..6242244 100644 --- a/vignettes/getCRUCLdata.Rmd.orig +++ b/vignettes/getCRUCLdata.Rmd.orig @@ -196,7 +196,7 @@ plot(t[[8]]$jul) #### Saving terra objects to local disk -The terra rast stack objects can be saved to disk as geotiff files (others are available, see help for `terra::writeRaster()` and `terra::writeFormats()` for more options) on the `Data` directory with a tmn or tmx prefix to the month for a file name. +The [terra::rast()] objects can be saved to disk as geotiff files (others are available, see help for `terra::writeRaster()` for more options) on the `Data` directory with a tmn or tmx prefix to the month for a file name. ```{r save_stack, eval=FALSE} library(terra) diff --git a/vignettes/precompile.R b/vignettes/precompile.R index 8d60904..dac85ad 100644 --- a/vignettes/precompile.R +++ b/vignettes/precompile.R @@ -20,3 +20,4 @@ resources <- file.copy(from = resources, to = "doc", overwrite = TRUE) + From a7a97f8d5da5a0e7b2cea3c2671a81f312513030 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 16:38:17 +0800 Subject: [PATCH 094/127] style with {styler} --- R/zzz.R | 8 +++++--- codemeta.json | 2 +- tests/testthat/test-get_CRU.R | 11 +++++------ tests/testthat/test_caching.R | 16 ++++++++++------ 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/R/zzz.R b/R/zzz.R index 11d64e6..c5d539e 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -8,9 +8,11 @@ manage_cache <- NULL # nocov start utils::globalVariables(c(".")) x <- hoardr::hoard() - x$cache_path_set(path = "getCRUCLdata", - prefix = "org.R-project.R/R", - type = "user_cache_dir") + x$cache_path_set( + path = "getCRUCLdata", + prefix = "org.R-project.R/R", + type = "user_cache_dir" + ) manage_cache <<- x } } diff --git a/codemeta.json b/codemeta.json index 765f739..839e3b6 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "920.313KB", + "fileSize": "920.18KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/tests/testthat/test-get_CRU.R b/tests/testthat/test-get_CRU.R index 095b521..4707316 100644 --- a/tests/testthat/test-get_CRU.R +++ b/tests/testthat/test-get_CRU.R @@ -7,7 +7,7 @@ test_that("get_CRU will retrieve only precipitation file when pre_cv TRUE", { )) skip_if_offline() - + .get_CRU( pre = FALSE, pre_cv = TRUE, @@ -36,7 +36,7 @@ test_that("get_CRU will retrieve only precipitation file when pre_cv TRUE", { test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmn TRUE", { skip_if_offline() - + .get_CRU( pre = FALSE, pre_cv = FALSE, @@ -64,7 +64,7 @@ test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmn TRUE", { # Test that get_CRU will retrieve diurnal tmp & tmp files when tmx TRUE -------- test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmx TRUE", { skip_if_offline() - + unlink(list.files( path = tempdir(), pattern = ".dat.gz$", @@ -99,7 +99,7 @@ test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmx TRUE", { test_that("get_CRU will set pre to TRUE if pre_cv is TRUE and pre is FALSE", { skip_if_offline() - + pre <- FALSE pre_cv <- TRUE @@ -117,9 +117,8 @@ test_that("get_CRU will set pre to TRUE if pre_cv is TRUE and pre is FALSE", { test_that("get_CRU will set tmp and dtr to TRUE if tmn or tmx is TRUE and either/both are false", { + skip_if_offline() - skip_if_offline() - tmp <- FALSE dtr <- FALSE tmn <- TRUE diff --git a/tests/testthat/test_caching.R b/tests/testthat/test_caching.R index 56d9f92..f0d3c00 100644 --- a/tests/testthat/test_caching.R +++ b/tests/testthat/test_caching.R @@ -4,9 +4,11 @@ test_that("test that set_cache creates a cache directory if none exists", { withr::local_envvar(R_USER_CACHE_DIR = tempdir()) temp_cache <- file.path(tempdir(), "R/getCRUCLdata/") manage_cache <- hoardr::hoard() - manage_cache$cache_path_set(path = "getCRUCLdata", - prefix = "org.R-project.R/R", - type = "user_cache_dir") + manage_cache$cache_path_set( + path = "getCRUCLdata", + prefix = "org.R-project.R/R", + type = "user_cache_dir" + ) cache <- TRUE .set_cache(cache) expect_true(file.exists(manage_cache$cache_path_get())) @@ -38,9 +40,11 @@ test_that("caching utils list files in cache and delete when asked", { withr::local_envvar(R_USER_CACHE_DIR = tempdir()) temp_cache <- file.path(tempdir(), "R/getCRUCLdata/") manage_cache <- hoardr::hoard() - manage_cache$cache_path_set(path = "getCRUCLdata", - prefix = "org.R-project.R/R", - type = "user_cache_dir") + manage_cache$cache_path_set( + path = "getCRUCLdata", + prefix = "org.R-project.R/R", + type = "user_cache_dir" + ) cache <- TRUE cache_dir <- .set_cache(cache) f <- From 57aa1f3454025509ec214136472039afceb5729e Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:26:47 +0800 Subject: [PATCH 095/127] line breaks --- R/get_CRU_stack.R | 6 +++--- man/get_CRU_stack.Rd | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 9ef5504..0249e8b 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -20,8 +20,8 @@ #' @seealso #' [create_CRU_stack], [manage_cache]. #' -#' @return A [base::list] of [terra::rast] objects of CRU CL v. 2.0 -#' climatology elements. +#' @return A [base::list] of [terra::rast] objects of CRU CL v. 2.0 climatology +#' elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' @@ -44,7 +44,7 @@ #' over global land areas." Climate research 21.1 (2002): 1-25. #' #' -#' @export get_CRU_stack +#' @export get_CRU_stack <- function(pre = FALSE, diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 466a772..44f1a72 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -97,8 +97,8 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} even after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of CRU CL v. 2.0 -climatology elements. +A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of CRU CL v. 2.0 climatology +elements. } \description{ This function automates downloading and importing CRU CL v. 2.0 From 3f9d91338b223455a0055593b765e831e11b60aa Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:27:04 +0800 Subject: [PATCH 096/127] add Curtin and AAGI/GRDC as cph --- DESCRIPTION | 19 ++++++++++++------- codemeta.json | 12 +++++++++++- man/getCRUCLdata-package.Rd | 6 ++++++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index e308643..ee8a0b4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,16 +2,21 @@ Type: Package Package: getCRUCLdata Title: 'CRU' 'CL' v. 2.0 Climatology Client Version: 1.0.2 -Authors@R: +Authors@R: c( person("Adam H.", "Sparks", , "adamhsparks@gmail.com", role = c("aut", "cre"), - comment = c(ORCID = "0000-0002-0061-8359")) + comment = c(ORCID = "0000-0002-0061-8359")), + person("Curtin University of Technology", role = "cph", + comment = "Provided support through Adam Sparks's time."), + person("Grains Research and Development Corporation", role = c("cph"), + comment = "GRDC Project CUR2210-005OPX (AAGI-CU)") + ) Description: Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 climatology data, facilitates the calculation of minimum temperature - and maximum temperature and formats the data into a data.table object or a - list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a - gridded climatology of 1961-1990 monthly means released in 2002 and - cover all land areas (excluding Antarctica) at 10 arc minutes + and maximum temperature and formats the data into a data.table object + or a list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data + are a gridded climatology of 1961-1990 monthly means released in 2002 + and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit, @@ -46,13 +51,13 @@ VignetteBuilder: ByteCompile: TRUE Config/roxyglobals/filename: globals.R Config/roxyglobals/unique: FALSE +Config/roxylint: list(linters = roxylint::tidy) Config/testthat/edition: 3 Config/testthat/parallel: true Encoding: UTF-8 Language: en-US Roxygen: list(markdown = TRUE, roclets = c("collate", "namespace", "rd", "roxyglobals::global_roclet", "roxylint::roxylint")) -Config/roxylint: list(linters = roxylint::tidy) RoxygenNote: 7.3.2 X-schema.org-applicationCategory: Tools X-schema.org-isPartOf: https://ropensci.org diff --git a/codemeta.json b/codemeta.json index 839e3b6..66c53ea 100644 --- a/codemeta.json +++ b/codemeta.json @@ -24,6 +24,16 @@ "@id": "https://orcid.org/0000-0002-0061-8359" } ], + "copyrightHolder": [ + { + "@type": "Organization", + "name": "Curtin University of Technology" + }, + { + "@type": "Organization", + "name": "Grains Research and Development Corporation" + } + ], "maintainer": [ { "@type": "Person", @@ -244,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "920.18KB", + "fileSize": "920.69KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/getCRUCLdata-package.Rd b/man/getCRUCLdata-package.Rd index e95db91..3d8e446 100644 --- a/man/getCRUCLdata-package.Rd +++ b/man/getCRUCLdata-package.Rd @@ -20,5 +20,11 @@ Useful links: \author{ \strong{Maintainer}: Adam H. Sparks \email{adamhsparks@gmail.com} (\href{https://orcid.org/0000-0002-0061-8359}{ORCID}) +Other contributors: +\itemize{ + \item Curtin University of Technology (Provided support through Adam Sparks's time.) [copyright holder] + \item Grains Research and Development Corporation (GRDC Project CUR2210-005OPX (AAGI-CU)) [copyright holder] +} + } \keyword{internal} From 2b25a39068b2ee8f6abafa6586af5f3666aaca52 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:27:47 +0800 Subject: [PATCH 097/127] Update spelling list --- codemeta.json | 2 +- inst/WORDLIST | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index 66c53ea..f74b013 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "920.69KB", + "fileSize": "920.717KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/inst/WORDLIST b/inst/WORDLIST index 1bc77cb..5c8868d 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,11 +1,15 @@ +AAGI CMD CRU Centre +Curtin DOI +GRDC Hulme JOSS Makin NOTEs +OPX ORCID PURRR Precompile @@ -15,6 +19,7 @@ Reknit Reorganises Sri TJ +al arcminutes behaviour biogeochemical @@ -28,6 +33,7 @@ dplyr dsn dtr elv +et frs geotiff getCRUCL From ef66ecbf6774d2bcec5fc68ff83a13b471dce8e5 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:34:57 +0800 Subject: [PATCH 098/127] Provide a link to the CRU's readme.txt file for these data --- R/create_CRU_df.R | 10 ++++++---- R/create_CRU_stack.R | 9 ++++++--- R/get_CRU_df.R | 7 ++++--- R/get_CRU_stack.R | 5 +++-- codemeta.json | 2 +- man/create_CRU_df.Rd | 10 ++++++---- man/create_CRU_stack.Rd | 9 ++++++--- man/get_CRU_df.Rd | 7 ++++--- man/get_CRU_stack.Rd | 5 +++-- 9 files changed, 39 insertions(+), 25 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 5fbc43f..ae0ead8 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -1,11 +1,13 @@ #' Create a data.table of CRU CL v. 2.0 climatology elements from local disk files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology -#' data and creates a \CRANpkg{data.table} of the data. If requested, minimum +#' data and creates a \CRANpkg{data.table} of the data. If requested, minimum #' and maximum temperature may also be automatically calculated as described in -#' the data readme.txt file. This function can be useful if you have network -#' connection issues that mean automated downloading of the files using \R -#' does not work properly. +#' the data [readme.txt](https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt) +#' file. Data may be cached for later use by this function, saving time +#' downloading files in future using this function. This function can be useful +#' if you have network connection issues that mean automated downloading of the +#' files using \R does not work properly. #' #' @inheritSection get_CRU_df Nomenclature and Units #' diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index 4f0d9bd..564ceba 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -3,9 +3,12 @@ #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a \CRANpkg{terra} [terra::rast] object of the #' data. If requested, minimum and maximum temperature may also be -#' automatically calculated as described in the data readme.txt file. This -#' function can be useful if you have network connection issues that mean -#' automated downloading of the files using \R does not work properly. +#' automatically calculated as described in the data +#' [readme.txt](https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt) file. +#' Data may be cached for later use by this function, saving time downloading +#' files in future using this function. This function can be useful if you have +#' network connection issues that mean automated downloading of the files using +#' \R does not work properly. #' #' @inheritSection get_CRU_df Nomenclature and Units #' @inheritParams create_CRU_df diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index e338f36..87c320a 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -3,9 +3,10 @@ #' This function automates downloading and importing \acronym{CRU} #' \acronym{CL} v. 2.0 climatology data and creates a \CRANpkg{data.table} of #' the data. If requested, minimum and maximum temperature may also be -#' automatically calculated as described in the data readme.txt file. Data may -#' be cached for later use by this function, saving time downloading files in -#' future use of this function. +#' automatically calculated as described in the data +#' [readme.txt](https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt) file. +#' Data may be cached for later use by this function, saving time downloading +#' files in future use of this function. #' #' @section Nomenclature and Units: #' \describe{ diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 0249e8b..5bcfe29 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -4,8 +4,9 @@ #' climatology data into \R and creates a list of \CRANpkg{terra} #' [terra::rast] objects of the data. If requested, minimum and maximum #' temperature may also be automatically calculated as described in the data -#' readme.txt file. Data may be cached for later use by this function, saving -#' time downloading files in future using this function. +#' [readme.txt](https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt) file. +#' Data may be cached for later use by this function, saving time downloading +#' files in future using this function. #' #' @inheritSection get_CRU_df Nomenclature and Units #' @inheritParams get_CRU_df diff --git a/codemeta.json b/codemeta.json index f74b013..5924514 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "920.717KB", + "fileSize": "921.658KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index 25a05da..7edfdce 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -101,11 +101,13 @@ climatology elements. } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology -data and creates a \CRANpkg{data.table} of the data. If requested, minimum +data and creates a \CRANpkg{data.table} of the data. If requested, minimum and maximum temperature may also be automatically calculated as described in -the data readme.txt file. This function can be useful if you have network -connection issues that mean automated downloading of the files using \R -does not work properly. +the data \href{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt}{readme.txt} +file. Data may be cached for later use by this function, saving time +downloading files in future using this function. This function can be useful +if you have network connection issues that mean automated downloading of the +files using \R does not work properly. } \section{Nomenclature and Units}{ diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 2271760..6827d94 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -103,9 +103,12 @@ v. 2.0 climatology elements. Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology data and creates a \CRANpkg{terra} \link[terra:rast]{terra::rast} object of the data. If requested, minimum and maximum temperature may also be -automatically calculated as described in the data readme.txt file. This -function can be useful if you have network connection issues that mean -automated downloading of the files using \R does not work properly. +automatically calculated as described in the data +\href{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt}{readme.txt} file. +Data may be cached for later use by this function, saving time downloading +files in future using this function. This function can be useful if you have +network connection issues that mean automated downloading of the files using +\R does not work properly. } \section{Nomenclature and Units}{ diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index da5362a..0f15410 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -104,9 +104,10 @@ climatology elements. This function automates downloading and importing \acronym{CRU} \acronym{CL} v. 2.0 climatology data and creates a \CRANpkg{data.table} of the data. If requested, minimum and maximum temperature may also be -automatically calculated as described in the data readme.txt file. Data may -be cached for later use by this function, saving time downloading files in -future use of this function. +automatically calculated as described in the data +\href{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt}{readme.txt} file. +Data may be cached for later use by this function, saving time downloading +files in future use of this function. } \section{Nomenclature and Units}{ diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 44f1a72..edd4caa 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -105,8 +105,9 @@ This function automates downloading and importing CRU CL v. 2.0 climatology data into \R and creates a list of \CRANpkg{terra} \link[terra:rast]{terra::rast} objects of the data. If requested, minimum and maximum temperature may also be automatically calculated as described in the data -readme.txt file. Data may be cached for later use by this function, saving -time downloading files in future using this function. +\href{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt}{readme.txt} file. +Data may be cached for later use by this function, saving time downloading +files in future using this function. } \section{Nomenclature and Units}{ From 2ab33a8fe0bc0eee1ea413c3f7dcb44be14a9b6e Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:36:55 +0800 Subject: [PATCH 099/127] linebreaks in example comment --- R/get_CRU_stack.R | 4 ++-- man/get_CRU_stack.Rd | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 5bcfe29..d9c74c5 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -12,8 +12,8 @@ #' @inheritParams get_CRU_df #' @examplesIf interactive() #' -#' # Download data and create a {terra} `rast` -#' # object of precipitation and temperature without caching the data files +#' # Download data and create a {terra} `rast` object of precipitation and +#' # temperature without caching the data files #' CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) #' #' CRU_pre_tmp diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index edd4caa..a3b6593 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -132,8 +132,8 @@ For more information see the description of the data provided by \examples{ \dontshow{if (interactive()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -# Download data and create a {terra} `rast` -# object of precipitation and temperature without caching the data files +# Download data and create a {terra} `rast` object of precipitation and +# temperature without caching the data files CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) CRU_pre_tmp From 17cb70d66e46db21ff620e64b75213d104621da9 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:42:02 +0800 Subject: [PATCH 100/127] simplify Roxygen reuse source and references --- R/create_CRU_stack.R | 20 ++------------------ R/get_CRU_df.R | 20 ++------------------ R/get_CRU_stack.R | 21 ++------------------- codemeta.json | 2 +- 4 files changed, 7 insertions(+), 56 deletions(-) diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index 564ceba..29832c3 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -32,24 +32,8 @@ #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' -#' @source -#' \describe{ -#' \item{pre}{} -#' \item{rd0}{} -#' \item{tmp}{} -#' \item{dtr}{} -#' \item{reh}{} -#' \item{sunp}{} -#' \item{frs}{} -#' \item{wnd}{, areas originally including Antarctica are removed.} -#' \item{elv}{, values are converted from kilometres to metres.} -#' } -#' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -#' xmin = -180, xmax = 180. -#' -#' @references New, Mark, et al. "A high-resolution data set of surface climate -#' over global land areas." Climate research 21.1 (2002): 1-25. -#' +#' @inherit create_CRU_df source +#' @inherit create_CRU_df references #' #' @export diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 87c320a..1504ba8 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -72,24 +72,8 @@ #' climatology elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} -#' @source -#' \describe{ -#' \item{pre}{} -#' \item{rd0}{} -#' \item{tmp}{} -#' \item{dtr}{} -#' \item{reh}{} -#' \item{sunp}{} -#' \item{frs}{} -#' \item{wnd}{, areas originally including Antarctica are removed.} -#' \item{elv}{, values are converted from kilometres to metres.} -#' } -#' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -#' xmin = -180, xmax = 180. -#' -#' @references New, Mark, et al. "A high-resolution data set of surface climate -#' over global land areas." Climate research 21.1 (2002): 1-25. -#' +#' @inherit create_CRU_df source +#' @inherit create_CRU_df references #' #' @export diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index d9c74c5..83cec9d 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -25,25 +25,8 @@ #' elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} -#' -#' @source -#' \describe{ -#' \item{pre}{} -#' \item{rd0}{} -#' \item{tmp}{} -#' \item{dtr}{} -#' \item{reh}{} -#' \item{sunp}{} -#' \item{frs}{} -#' \item{wnd}{, areas originally including Antarctica are removed.} -#' \item{elv}{, values are converted from kilometres to metres.} -#' } -#' This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -#' xmin = -180, xmax = 180. -#' -#' @references New, Mark, et al. "A high-resolution data set of surface climate -#' over global land areas." Climate research 21.1 (2002): 1-25. -#' +#' @inherit create_CRU_df source +#' @inherit create_CRU_df references #' #' @export diff --git a/codemeta.json b/codemeta.json index 5924514..b72e833 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "921.658KB", + "fileSize": "918.205KB", "citation": [ { "@type": "ScholarlyArticle", From b729a856543233f84f1ab02633fbbe20d1dd1958 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:44:34 +0800 Subject: [PATCH 101/127] Clarify example code --- R/get_CRU_stack.R | 4 ++-- codemeta.json | 2 +- man/get_CRU_stack.Rd | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 83cec9d..507d1e0 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -12,8 +12,8 @@ #' @inheritParams get_CRU_df #' @examplesIf interactive() #' -#' # Download data and create a {terra} `rast` object of precipitation and -#' # temperature without caching the data files +#' # Download data and create a list of {terra} `rast` objects of precipitation +#' # and temperature without caching the data files #' CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) #' #' CRU_pre_tmp diff --git a/codemeta.json b/codemeta.json index b72e833..dccb649 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "918.205KB", + "fileSize": "918.223KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index a3b6593..59cec81 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -132,8 +132,8 @@ For more information see the description of the data provided by \examples{ \dontshow{if (interactive()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -# Download data and create a {terra} `rast` object of precipitation and -# temperature without caching the data files +# Download data and create a list of {terra} `rast` objects of precipitation +# and temperature without caching the data files CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) CRU_pre_tmp From eec6c742fd5d9cc7c1671e858a815f8eac0e42f8 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:48:24 +0800 Subject: [PATCH 102/127] Use more inherited Roxygen tags --- R/create_CRU_df.R | 4 ++-- R/get_CRU_df.R | 4 +--- R/get_CRU_stack.R | 4 +--- codemeta.json | 2 +- man/create_CRU_df.Rd | 4 ++-- man/get_CRU_df.Rd | 4 ++-- man/get_CRU_stack.Rd | 4 ++-- 7 files changed, 11 insertions(+), 15 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index ae0ead8..dd0053c 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -57,8 +57,8 @@ #' @seealso #' [get_CRU_df]. #' -#' @return A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 -#' climatology elements. +#' @return A [data.table::data.table] object of \acronym{CRU} \acronym{CL} v. +#' 2.0 climatology elements. #' #' @author Adam H Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 1504ba8..bbc1245 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -68,12 +68,10 @@ #' @seealso #' [create_CRU_stack], [manage_cache]. #' -#' @return A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 -#' climatology elements. -#' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' @inherit create_CRU_df source #' @inherit create_CRU_df references +#' @inherit create_CRU_df return #' #' @export diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 507d1e0..1d5491e 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -21,12 +21,10 @@ #' @seealso #' [create_CRU_stack], [manage_cache]. #' -#' @return A [base::list] of [terra::rast] objects of CRU CL v. 2.0 climatology -#' elements. -#' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' @inherit create_CRU_df source #' @inherit create_CRU_df references +#' @inherit create_CRU_stack return #' #' @export diff --git a/codemeta.json b/codemeta.json index dccb649..a916272 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "918.223KB", + "fileSize": "918.176KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index 7edfdce..6801202 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -96,8 +96,8 @@ the data frame, \code{TRUE}. Defaults to \code{FALSE}.} files are located.} } \value{ -A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 -climatology elements. +A \link[data.table:data.table]{data.table::data.table} object of \acronym{CRU} \acronym{CL} v. +2.0 climatology elements. } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index 0f15410..a4b3e7d 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -97,8 +97,8 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} even after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 -climatology elements. +A \link[data.table:data.table]{data.table::data.table} object of \acronym{CRU} \acronym{CL} v. +2.0 climatology elements. } \description{ This function automates downloading and importing \acronym{CRU} diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 59cec81..f163261 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -97,8 +97,8 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} even after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of CRU CL v. 2.0 climatology -elements. +A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of \acronym{CRU} \acronym{CL} +v. 2.0 climatology elements. } \description{ This function automates downloading and importing CRU CL v. 2.0 From 2c70dc9b0ec22cdfbd399985d0d7f7eb8894f9be Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 17 Dec 2024 18:52:15 +0800 Subject: [PATCH 103/127] inherit author tag in Roxygen --- R/create_CRU_df.R | 2 +- R/create_CRU_stack.R | 9 ++++----- R/get_CRU_df.R | 2 +- R/get_CRU_stack.R | 10 +++++----- man/create_CRU_df.Rd | 2 +- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index dd0053c..aad08e6 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -60,7 +60,7 @@ #' @return A [data.table::data.table] object of \acronym{CRU} \acronym{CL} v. #' 2.0 climatology elements. #' -#' @author Adam H Sparks, \email{adamhsparks@@gmail.com} +#' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' #' @source #' \describe{ diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index 29832c3..34e49a7 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -12,6 +12,10 @@ #' #' @inheritSection get_CRU_df Nomenclature and Units #' @inheritParams create_CRU_df +#' @inherit create_CRU_df author +#' @inherit create_CRU_df source +#' @inherit create_CRU_df references +#' @inherit create_CRU_stack return #' #' @examplesIf interactive() #' @@ -30,11 +34,6 @@ #' @return A [base::list] of [terra::rast] objects of \acronym{CRU} \acronym{CL} #' v. 2.0 climatology elements. #' -#' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} -#' -#' @inherit create_CRU_df source -#' @inherit create_CRU_df references -#' #' @export create_CRU_stack <- function(pre = FALSE, diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index bbc1245..527afb2 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -68,7 +68,7 @@ #' @seealso #' [create_CRU_stack], [manage_cache]. #' -#' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} +#' @inherit create_CRU_df author #' @inherit create_CRU_df source #' @inherit create_CRU_df references #' @inherit create_CRU_df return diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 1d5491e..a935273 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -10,6 +10,11 @@ #' #' @inheritSection get_CRU_df Nomenclature and Units #' @inheritParams get_CRU_df +#' @inherit create_CRU_df author +#' @inherit create_CRU_df source +#' @inherit create_CRU_df references +#' @inherit create_CRU_stack return +#' #' @examplesIf interactive() #' #' # Download data and create a list of {terra} `rast` objects of precipitation @@ -21,11 +26,6 @@ #' @seealso #' [create_CRU_stack], [manage_cache]. #' -#' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} -#' @inherit create_CRU_df source -#' @inherit create_CRU_df references -#' @inherit create_CRU_stack return -#' #' @export get_CRU_stack <- diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index 6801202..cde1783 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -153,5 +153,5 @@ over global land areas." Climate research 21.1 (2002): 1-25. \link{get_CRU_df}. } \author{ -Adam H Sparks, \email{adamhsparks@gmail.com} +Adam H. Sparks, \email{adamhsparks@gmail.com} } From 5a5d2216224a147fb3692d4984fb5cb4bbc63b55 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 18 Dec 2024 08:02:20 +0800 Subject: [PATCH 104/127] lint README and remove revdepcheck infrastructure --- README.md | 42 +++++++++++++++++++++--------------------- codemeta.json | 2 +- revdep/README.md | 45 --------------------------------------------- revdep/check.R | 5 ----- revdep/checks.rds | Bin 748 -> 0 bytes revdep/cran.md | 7 ------- revdep/failures.md | 1 - revdep/problems.md | 1 - revdep/timing.md | 5 ----- 9 files changed, 22 insertions(+), 86 deletions(-) delete mode 100644 revdep/README.md delete mode 100644 revdep/check.R delete mode 100644 revdep/checks.rds delete mode 100644 revdep/cran.md delete mode 100644 revdep/failures.md delete mode 100644 revdep/problems.md delete mode 100644 revdep/timing.md diff --git a/README.md b/README.md index c411282..7a3c559 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ -getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R -================ +# getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R + [![R-CMD-check](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) [![codecov](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://codecov.io/gh/ropensci/getCRUCLdata) + ## Introduction to {getCRUCLdata} @@ -31,7 +32,7 @@ Note that the original wind data include land area for parts of Antarctica. {getCRUCLdata} is not available from CRAN. You can install it from GitHub as follows. -``` r +```r if (!require("remotes")) { install.packages("remotes") } @@ -39,18 +40,18 @@ if (!require("remotes")) { install_github("ropensci/getCRUCLdata", build_vignettes = TRUE) ``` -Or you can install it from the rOpenSci Universe. +Or you can install it from the rOpenSci [R-universe](https://r-universe.dev/search?q=getCRUCLdata). -``` r -# Enable the rOpenSci universe +```r +# Enable the rOpenSci R-universe options(repos = c( rOpenSci = "https://ropensci.r-universe.dev", - CRAN = "https://cloud.r-project.org"")) + CRAN = "https://cloud.r-project.org")) # Install the package install.packages("getCRUCLdata") ``` ------ +--- # Documentation @@ -62,15 +63,15 @@ For complete documentation see the package website: Mark New (1,\*), David Lister (2), Mike Hulme (3), Ian Makin (4) -> A high-resolution data set of surface climate over global land areas +> A high-resolution data set of surface climate over global land areas > Climate Research, 2000, Vol 21, pg 1-25 -> 1) School of Geography and the Environment, University of Oxford, -> Mansfield Road, Oxford OX1 3TB, United Kingdom -> 2) Climatic Research Unit, and (3) Tyndall Centre for Climate Change +> 1. School of Geography and the Environment, University of Oxford, +> Mansfield Road, Oxford OX1 3TB, United Kingdom +> 2. Climatic Research Unit, and (3) Tyndall Centre for Climate Change > Research, both at School of Environmental Sciences, University of -> East Anglia, Norwich NR4 7TJ, United Kingdom -> 3) International Water Management Institute, PO Box 2075, Colombo, +> East Anglia, Norwich NR4 7TJ, United Kingdom +> 3. International Water Management Institute, PO Box 2075, Colombo, > Sri Lanka > **ABSTRACT:** We describe the construction of a 10-minute @@ -93,7 +94,6 @@ For complete documentation see the package website: @@ -167,12 +167,12 @@ All contributions to this project are gratefully acknowledged using the [`allcon ## Other - - Please [report any issues or - bugs](https://github.com/ropensci/getCRUCLdata/issues). +- Please [report any issues or + bugs](https://github.com/ropensci/getCRUCLdata/issues). - - License: MIT +- License: MIT - - Get citation information for _getCRUCLdata_ in R typing `citation(package = "getCRUCLdata")` +- Get citation information for _getCRUCLdata_ in R typing `citation(package = "getCRUCLdata")` - - Please note that this package is released with a [Contributor Code of Conduct](https://ropensci.org/code-of-conduct/). -By contributing to this project, you agree to abide by its terms. +- Please note that this package is released with a [Contributor Code of Conduct](https://ropensci.org/code-of-conduct/). + By contributing to this project, you agree to abide by its terms. diff --git a/codemeta.json b/codemeta.json index a916272..8e1ecc3 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "918.176KB", + "fileSize": "918.149KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/revdep/README.md b/revdep/README.md deleted file mode 100644 index d42e1bf..0000000 --- a/revdep/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# Platform - -|field |value | -|:--------|:----------------------------| -|version |R version 4.0.3 (2020-10-10) | -|os |macOS Catalina 10.15.7 | -|system |x86_64, darwin17.0 | -|ui |RStudio | -|language |(EN) | -|collate |en_AU.UTF-8 | -|ctype |en_AU.UTF-8 | -|tz |Australia/Brisbane | -|date |2020-10-25 | - -# Dependencies - -|package |old |new |Δ | -|:------------|:------|:----------|:--| -|getCRUCLdata |0.3.1 |0.3.1.9000 |* | -|assertthat |0.2.1 |0.2.1 | | -|cli |2.1.0 |2.1.0 | | -|crayon |1.3.4 |1.3.4 | | -|curl |4.3 |4.3 | | -|data.table |1.13.2 |1.13.2 | | -|digest |0.6.27 |0.6.27 | | -|ellipsis |0.3.1 |0.3.1 | | -|fansi |0.4.1 |0.4.1 | | -|glue |1.4.2 |1.4.2 | | -|hoardr |0.5.2 |0.5.2 | | -|lifecycle |0.2.0 |0.2.0 | | -|magrittr |1.5 |1.5 | | -|pillar |1.4.6 |1.4.6 | | -|pkgconfig |2.0.3 |2.0.3 | | -|R6 |2.4.1 |2.4.1 | | -|rappdirs |0.3.1 |0.3.1 | | -|raster |3.3-13 |3.3-13 | | -|Rcpp |1.0.5 |1.0.5 | | -|rlang |0.4.8 |0.4.8 | | -|sp |1.4-4 |1.4-4 | | -|tibble |3.0.4 |3.0.4 | | -|utf8 |1.1.4 |1.1.4 | | -|vctrs |0.3.4 |0.3.4 | | - -# Revdeps - diff --git a/revdep/check.R b/revdep/check.R deleted file mode 100644 index e262948..0000000 --- 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.rds b/revdep/checks.rds deleted file mode 100644 index 0ad05039ae90a16691817f2bd1f9c55ee447383a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmV)En) zi}Ofbuhq4q(0%oMf9b3+7lctK@IudbCeR15>rY)692>Up9^>dbntpUr#2*L+GcWRd z!{*K9cezXnb0)w8-Zboy3@2YMOzb75*JoGW)sL@kY^aXTmO^rr5%lRZC*lTCY*-v@ z5{_IDDfU52V^g%iqB0*<;HWCM5?_cXA@QP;21`<%_A*50OEkyYEn!)Pq!tJAm#!x* zP$O`XAt8)B$GP&qWqff>=q+n~61y@y(u@gPab28ZN1jACnT~9ydG@5$hjT2?FR#wO z6=piq`8>~Z+alX~x?s4-2rI**oj%+t_*z6&_Bng-^x_&9Jipa#y Date: Wed, 18 Dec 2024 10:33:34 +0800 Subject: [PATCH 105/127] Fix links with redirects --- README.md | 134 +++++----------------- codemeta.json | 4 +- vignettes/getCRUCLdata.Rmd | 189 +++----------------------------- vignettes/getCRUCLdata.Rmd.orig | 2 +- vignettes/precompile.R | 1 + 5 files changed, 52 insertions(+), 278 deletions(-) diff --git a/README.md b/README.md index 7a3c559..0d20e5f 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,7 @@ -[![R-CMD-check](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml) -[![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/) -[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) -[![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) -[![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) -[![codecov](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://codecov.io/gh/ropensci/getCRUCLdata) +[![R-CMD-check](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) [![codecov](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://app.codecov.io/gh/ropensci/getCRUCLdata) @@ -15,24 +10,21 @@ The {getCRUCLdata} package provides functions that automate importing CRU CL v. 2.0 climatology data into R, facilitates the calculation of minimum temperature and maximum temperature, and formats the data into a [data.table](https://CRAN.R-project.org/package=data.table) or a list of [terra::rast](https://CRAN.R-project.org/package=terra) objects for use. -CRU CL v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. -For more information see the description of the data provided by the University of East Anglia Climate Research Unit (CRU), . +CRU CL v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit (CRU), . ## Changes to original CRU CL v. 2.0 data This package automatically converts elevation values from kilometres to metres. -This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. -Note that the original wind data include land area for parts of Antarctica. +This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, xmin = -180, xmax = 180. Note that the original wind data include land area for parts of Antarctica. # Quick Start ## Install -{getCRUCLdata} is not available from CRAN. -You can install it from GitHub as follows. +{getCRUCLdata} is not available from CRAN. You can install it from GitHub as follows. -```r +``` r if (!require("remotes")) { install.packages("remotes") } @@ -42,7 +34,7 @@ install_github("ropensci/getCRUCLdata", build_vignettes = TRUE) Or you can install it from the rOpenSci [R-universe](https://r-universe.dev/search?q=getCRUCLdata). -```r +``` r # Enable the rOpenSci R-universe options(repos = c( rOpenSci = "https://ropensci.r-universe.dev", @@ -51,7 +43,7 @@ options(repos = c( install.packages("getCRUCLdata") ``` ---- +------------------------------------------------------------------------ # Documentation @@ -63,116 +55,50 @@ For complete documentation see the package website: Mark New (1,\*), David Lister (2), Mike Hulme (3), Ian Makin (4) -> A high-resolution data set of surface climate over global land areas -> Climate Research, 2000, Vol 21, pg 1-25 - -> 1. School of Geography and the Environment, University of Oxford, -> Mansfield Road, Oxford OX1 3TB, United Kingdom -> 2. Climatic Research Unit, and (3) Tyndall Centre for Climate Change -> Research, both at School of Environmental Sciences, University of -> East Anglia, Norwich NR4 7TJ, United Kingdom -> 3. International Water Management Institute, PO Box 2075, Colombo, -> Sri Lanka - -> **ABSTRACT:** We describe the construction of a 10-minute -> latitude/longitude data set of mean monthly surface climate over -> global land areas, excluding Antarctica. The climatology includes 8 -> climate elements - precipitation, wet-day frequency, temperature, -> diurnal temperature range, relative humidity,sunshine duration, ground -> frost frequency and windspeed - and was interpolated from a data set -> of station means for the period centred on 1961 to 1990. Precipitation -> was first defined in terms of the parameters of the Gamma -> distribution, enabling the calculation of monthly precipitation at any -> given return period. The data are compared to an earlier data set at -> 0.5 degrees latitude/longitude resolution and show added value over -> most regions. The data will have many applications in applied -> climatology, biogeochemical modelling, hydrology and agricultural -> meteorology and are available through the School of Geography Oxford -> (), the International Water Management -> Institute “World Water and Climate Atlas” () and -> the Climatic Research Unit (). +> A high-resolution data set of surface climate over global land areas Climate Research, 2000, Vol 21, pg 1-25 + +> 1. School of Geography and the Environment, University of Oxford, Mansfield Road, Oxford OX1 3TB, United Kingdom +> 2. Climatic Research Unit, and (3) Tyndall Centre for Climate Change Research, both at School of Environmental Sciences, University of East Anglia, Norwich NR4 7TJ, United Kingdom +> 3. International Water Management Institute, PO Box 2075, Colombo, Sri Lanka + +> **ABSTRACT:** We describe the construction of a 10-minute latitude/longitude data set of mean monthly surface climate over global land areas, excluding Antarctica. The climatology includes 8 climate elements - precipitation, wet-day frequency, temperature, diurnal temperature range, relative humidity,sunshine duration, ground frost frequency and windspeed - and was interpolated from a data set of station means for the period centred on 1961 to 1990. Precipitation was first defined in terms of the parameters of the Gamma distribution, enabling the calculation of monthly precipitation at any given return period. The data are compared to an earlier data set at 0.5 degrees latitude/longitude resolution and show added value over most regions. The data will have many applications in applied climatology, biogeochemical modelling, hydrology and agricultural meteorology and are available through the School of Geography Oxford (), the International Water Management Institute “World Water and Climate Atlas” () and the Climatic Research Unit (). ## Contributors + + All contributions to this project are gratefully acknowledged using the [`allcontributors` package](https://github.com/ropensci/allcontributors) following the [all-contributors](https://allcontributors.org) specification. Contributions of any kind are welcome! ### Code - - - - - - - - - -
- - -
-adamhsparks -
- - -
-sckott -
- - -
-jeroen -
- - -
-karthik -
- ++------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------+ +| [![](https://avatars.githubusercontent.com/u/3195906?v=4){alt=""} ](https://github.com/adamhsparks)\ | [![](https://avatars.githubusercontent.com/u/577668?v=4){alt=""} ](https://github.com/sckott)\ | [![](https://avatars.githubusercontent.com/u/216319?v=4){alt=""} ](https://github.com/jeroen)\ | [![](https://avatars.githubusercontent.com/u/138494?v=4){alt=""} ](https://github.com/karthik)\ | +| [adamhsparks](https://github.com/ropensci/getCRUCLdata/commits?author=adamhsparks) | [sckott](https://github.com/ropensci/getCRUCLdata/commits?author=sckott) | [jeroen](https://github.com/ropensci/getCRUCLdata/commits?author=jeroen) | [karthik](https://github.com/ropensci/getCRUCLdata/commits?author=karthik) | ++------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------+ ### Issues - - - - - - - - -
- - -
-ivanhanigan -
- - -
-sunjj878 -
- - -
-mhesselbarth -
++-------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+ +| [![](https://avatars.githubusercontent.com/u/1305767?u=151f7c98a1bb78ccceac6297d28750acb42ec877&v=4){alt=""} ](https://github.com/ivanhanigan)\ | [![](https://avatars.githubusercontent.com/u/77564290?v=4){alt=""} ](https://github.com/sunjj878)\ | [![](https://avatars.githubusercontent.com/u/29225293?u=326393156ff083af6e10548ff16a1c8e439ebdf9&v=4){alt=""} ](https://github.com/mhesselbarth)\ | +| [ivanhanigan](https://github.com/ropensci/getCRUCLdata/issues?q=is%3Aissue+author%3Aivanhanigan) | [sunjj878](https://github.com/ropensci/getCRUCLdata/issues?q=is%3Aissue+author%3Asunjj878) | [mhesselbarth](https://github.com/ropensci/getCRUCLdata/issues?q=is%3Aissue+author%3Amhesselbarth) | ++-------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------+ + + ## Other -- Please [report any issues or - bugs](https://github.com/ropensci/getCRUCLdata/issues). +- Please [report any issues or bugs](https://github.com/ropensci/getCRUCLdata/issues). -- License: MIT +- License: MIT -- Get citation information for _getCRUCLdata_ in R typing `citation(package = "getCRUCLdata")` +- Get citation information for *getCRUCLdata* in R typing `citation(package = "getCRUCLdata")` -- Please note that this package is released with a [Contributor Code of Conduct](https://ropensci.org/code-of-conduct/). - By contributing to this project, you agree to abide by its terms. +- Please note that this package is released with a [Contributor Code of Conduct](https://ropensci.org/code-of-conduct/). By contributing to this project, you agree to abide by its terms. diff --git a/codemeta.json b/codemeta.json index 8e1ecc3..b4b06a3 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "918.149KB", + "fileSize": "912.473KB", "citation": [ { "@type": "ScholarlyArticle", @@ -286,7 +286,7 @@ ], "releaseNotes": "https://github.com/ropensci/getCRUCLdata/blob/master/NEWS.md", "readme": "https://github.com/ropensci/getCRUCLdata/blob/main/README.md", - "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml", "https://codecov.io/gh/ropensci/getCRUCLdata"], + "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/ropensci/getCRUCLdata"], "developmentStatus": "https://www.repostatus.org/", "review": { "@type": "Review", diff --git a/vignettes/getCRUCLdata.Rmd b/vignettes/getCRUCLdata.Rmd index e39b9ae..194466b 100644 --- a/vignettes/getCRUCLdata.Rmd +++ b/vignettes/getCRUCLdata.Rmd @@ -1,7 +1,7 @@ --- title: "getCRUCLdata" author: "Adam H. Sparks" -date: "2024-12-17" +date: "2024-12-18" output: rmarkdown::html_vignette: toc: true @@ -72,6 +72,7 @@ The `get_CRU_df()` function automates the download process and creates data fram ``` r library(getCRUCLdata) +#> Error in library(getCRUCLdata): there is no package called 'getCRUCLdata' CRU_data <- get_CRU_df(pre = TRUE, pre_cv = TRUE, @@ -85,34 +86,10 @@ CRU_data <- get_CRU_df(pre = TRUE, frs = TRUE, wnd = TRUE, elv = TRUE) +#> Error in get_CRU_df(pre = TRUE, pre_cv = TRUE, rd0 = TRUE, tmp = TRUE, : could not find function "get_CRU_df" CRU_data -#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv -#> -#> 1: 30.917 35.417 NA NA NA NA NA NA NA NA NA -260 -#> 2: 31.083 35.417 NA NA NA NA NA NA NA NA NA -361 -#> 3: 31.250 35.417 NA NA NA NA NA NA NA NA NA -336 -#> 4: 31.417 35.417 NA NA NA NA NA NA NA NA NA -284 -#> 5: 31.750 35.583 NA NA NA NA NA NA NA NA NA -248 -#> --- -#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 70.6 0 -31.3 5.6 283 -#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 70.6 0 -30.7 5.6 186 -#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 70.6 0 -30.8 5.6 195 -#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 70.6 0 -31.2 5.6 268 -#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 70.6 0 -31.5 5.6 328 -#> tmx tmn -#> -#> 1: NA NA -#> 2: NA NA -#> 3: NA NA -#> 4: NA NA -#> 5: NA NA -#> --- -#> 6795146: -26.95 -35.65 -#> 6795147: -26.40 -35.00 -#> 6795148: -26.50 -35.10 -#> 6795149: -26.90 -35.50 -#> 6795150: -27.20 -35.80 +#> Error: object 'CRU_data' not found ``` Perhaps you only need one or two elements, it is easy to create a data frame of mean temperature only. @@ -120,21 +97,13 @@ Perhaps you only need one or two elements, it is easy to create a data frame of ``` r t <- get_CRU_df(tmp = TRUE) +#> Error in get_CRU_df(tmp = TRUE): could not find function "get_CRU_df" t -#> lat lon month tmp -#> -#> 1: -59.083 -26.583 jan 0.2 -#> 2: -58.417 -26.250 jan 0.6 -#> 3: -58.417 -26.417 jan 0.4 -#> 4: -55.917 -67.250 jan 8.0 -#> 5: -55.750 -67.250 jan 8.2 -#> --- -#> 6795140: 83.583 -36.083 dec -32.6 -#> 6795141: 83.583 -36.250 dec -33.0 -#> 6795142: 83.583 -36.417 dec -33.4 -#> 6795143: 83.583 -36.583 dec -33.3 -#> 6795144: 83.583 -36.750 dec -33.3 +#> function (x) +#> UseMethod("t") +#> +#> ``` #### Plotting data from the data frame @@ -152,13 +121,11 @@ ggplot(data = t, aes(x = lon, y = lat, fill = tmp)) + coord_quickmap() + ggtitle("Global Mean Monthly Temperatures 1961-1990") + facet_wrap( ~ month, nrow = 4) +#> Error in `ggplot()`: +#> ! `data` cannot be a function. +#> ℹ Have you misspelled the `data` argument in `ggplot()` ``` -
-Maps of global temperatures from CRU CL v. 2.0 climatology covering the Earth's surface from ymin = -60, ymax = 85, xmin = -180, xmax = 180 degrees from 1960 to 1991. -

Maps of global temperatures from CRU CL v. 2.0 climatology covering the Earth's surface from ymin = -60, ymax = 85, xmin = -180, xmax = 180 degrees from 1960 to 1991.

-
- We can also generate a violin plot of the same data to visualise how the temperatures change throughout the year. @@ -168,13 +135,11 @@ ggplot(data = t, aes(x = month, y = tmp)) + ylab("Temperature (˚C)") + labs(title = "Global Monthly Mean Land Surface Temperatures From 1960-1991", subtitle = "Excludes Antarctica") +#> Error in `ggplot()`: +#> ! `data` cannot be a function. +#> ℹ Have you misspelled the `data` argument in `ggplot()` ``` -
-Monthly values of global temperatures from CRU CL v. 2.0 climatology covering the Earth's surface from ymin = -60, ymax = 85, xmin = -180, xmax = 180 degrees from 1960 to 1991. -

Monthly values of global temperatures from CRU CL v. 2.0 climatology covering the Earth's surface from ymin = -60, ymax = 85, xmin = -180, xmax = 180 degrees from 1960 to 1991.

-
- #### Saving the `data.frame` as a CSV (comma separated values file) locally Save the resulting `data.frame` to local disk as a comma separated (CSV) @@ -211,128 +176,10 @@ CRU_stack <- get_CRU_stack( wnd = TRUE, elv = TRUE ) +#> Error in get_CRU_stack(pre = TRUE, pre_cv = TRUE, rd0 = TRUE, tmp = TRUE, : could not find function "get_CRU_stack" CRU_stack -#> $dtr -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 2.3, 2.1, 2.2, 2.3, 1.8, 2.5, ... -#> max values : 22.7, 23.1, 23.5, 24.0, 24.0, 25.2, ... -#> -#> $elv -#> class : SpatRaster -#> dimensions : 870, 2160, 1 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> name : elv -#> min value : -361 -#> max value : 6486 -#> -#> $frs -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 0, 0.0, 0, 0, 0, 0, ... -#> max values : 31, 28.3, 31, 30, 31, 30, ... -#> -#> $pre -#> class : SpatRaster -#> dimensions : 870, 2160, 24 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 0.0, 0.0, 0.0, 0.0, 0, 0.0, ... -#> max values : 910.1, 824.3, 727.3, 741.3, 1100, 2512.6, ... -#> -#> $rd0 -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 0, 0.0, 0, 0, 0.0, 0, ... -#> max values : 31, 28.2, 31, 30, 30.7, 30, ... -#> -#> $reh -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 18.4, 14.6, 13.5, 13.4, 15.5, 10.2, ... -#> max values : 100.0, 100.0, 100.0, 100.0, 96.9, 95.1, ... -#> -#> $sun -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 0.0, 0, 3.3, 4.3, 8.1, 6.6, ... -#> max values : 92.8, 93, 90.2, 93.1, 94.0, 98.9, ... -#> -#> $tmp -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : -51.6, -47.6, -45.2, -36.6, -22.2, -16.3, ... -#> max values : 32.5, 32.1, 32.4, 34.3, 36.0, 38.3, ... -#> -#> $wnd -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 0.1, 0.1, 0.3, 0.4, 0.3, 0.2, ... -#> max values : 9.8, 9.6, 9.4, 9.0, 8.7, 8.6, ... -#> -#> $tmn -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : -55.05, -52.95, -48.75, -41.35, -28, -21.40, ... -#> max values : 26.30, 26.25, 27.40, 27.50, 30, 30.65, ... -#> -#> $tmx -#> class : SpatRaster -#> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) -#> resolution : 0.1666667, 0.1666667 (x, y) -#> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : -48.2, -43.35, -41.65, -32.45, -17.55, -11.50, ... -#> max values : 39.7, 38.40, 40.25, 41.85, 43.60, 45.95, ... +#> Error: object 'CRU_stack' not found ``` The `create_CRU_stack()` function works in the same way with only one minor difference. @@ -413,5 +260,5 @@ and show added value over most regions. The data will have many applications in applied climatology, biogeochemical modelling, hydrology and agricultural meteorology and are available through the School of Geography Oxford (https://www.geog.ox.ac.uk), the International Water Management Institute -"World Water and Climate Atlas" (https://www.iwmi.cgiar.org/) and the Climatic +"World Water and Climate Atlas" (https://www.iwmi.org/) and the Climatic Research Unit (https://www.uea.ac.uk/groups-and-centres/climatic-research-unit). diff --git a/vignettes/getCRUCLdata.Rmd.orig b/vignettes/getCRUCLdata.Rmd.orig index 6242244..eb86aa2 100644 --- a/vignettes/getCRUCLdata.Rmd.orig +++ b/vignettes/getCRUCLdata.Rmd.orig @@ -241,5 +241,5 @@ and show added value over most regions. The data will have many applications in applied climatology, biogeochemical modelling, hydrology and agricultural meteorology and are available through the School of Geography Oxford (https://www.geog.ox.ac.uk), the International Water Management Institute -"World Water and Climate Atlas" (https://www.iwmi.cgiar.org/) and the Climatic +"World Water and Climate Atlas" (https://www.iwmi.org/) and the Climatic Research Unit (https://www.uea.ac.uk/groups-and-centres/climatic-research-unit). diff --git a/vignettes/precompile.R b/vignettes/precompile.R index dac85ad..e68c787 100644 --- a/vignettes/precompile.R +++ b/vignettes/precompile.R @@ -21,3 +21,4 @@ file.copy(from = resources, to = "doc", overwrite = TRUE) + From 11f3a5eb9be1b1cddde64f8d6d38dcc45253abc2 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 18 Dec 2024 10:42:14 +0800 Subject: [PATCH 106/127] update wordlist --- codemeta.json | 2 +- inst/WORDLIST | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index b4b06a3..a4caa27 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "912.473KB", + "fileSize": "912.538KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/inst/WORDLIST b/inst/WORDLIST index 5c8868d..16cfc1c 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -19,6 +19,7 @@ Reknit Reorganises Sri TJ +adamhsparks al arcminutes behaviour @@ -43,12 +44,16 @@ globals gridded gz hoardr +ivanhanigan +jeroen +karthik kilometres magrittr maintainer's md metre metres +mhesselbarth millimetres modelled modelling @@ -62,7 +67,9 @@ readme readr reh roxyglobals +sckott sp +sunjj sunp terra tibble From 1c43348381b8b50b1a7c9e0868d80fd86048ccef Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 18 Dec 2024 11:08:54 +0800 Subject: [PATCH 107/127] add cran-comments.md --- cran-comments.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 cran-comments.md diff --git a/cran-comments.md b/cran-comments.md new file mode 100644 index 0000000..ab83bbb --- /dev/null +++ b/cran-comments.md @@ -0,0 +1,17 @@ +## R CMD check results + +0 errors | 0 warnings | 2 notes + +## Fixes from previous CRAN version + +I had asked that the last version of this package on CRAN be removed, but the +notes indicate it was forcibly removed for "leaving things behind". + +Therefore, in this release, the caching capabilities now follow the new R +standard `tools::R_user_dir(package = "getCRUCLdata")` in spite of the default +behaviour of the underlying CRAN packages, {hoadr} and {rappdirs}, which have +been used since this package was first submitted to CRAN to proovide file +caching functionality in this package. I trust that this is sufficient to have +the {getCRUCLdata} package reinstated on CRAN. + +* This is a new release. From b75cbad8d5859bca20a8d48c6aa2ddb704c00103 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 18 Dec 2024 11:12:57 +0800 Subject: [PATCH 108/127] prep for CRAN re-release --- DESCRIPTION | 2 +- NEWS.md | 2 +- codemeta.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index ee8a0b4..8b0b2ef 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: getCRUCLdata Title: 'CRU' 'CL' v. 2.0 Climatology Client -Version: 1.0.2 +Version: 1.0.3 Authors@R: c( person("Adam H.", "Sparks", , "adamhsparks@gmail.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-0061-8359")), diff --git a/NEWS.md b/NEWS.md index 3f5beff..4967a27 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# getCRUCLdata 1.0.2.9000 +# getCRUCLdata 1.0.3 ## Minor changes diff --git a/codemeta.json b/codemeta.json index a4caa27..f3c0335 100644 --- a/codemeta.json +++ b/codemeta.json @@ -8,7 +8,7 @@ "codeRepository": "https://github.com/ropensci/getCRUCLdata", "issueTracker": "https://github.com/ropensci/getCRUCLdata/issues", "license": "https://spdx.org/licenses/MIT", - "version": "1.0.2", + "version": "1.0.3", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "912.538KB", + "fileSize": "912.533KB", "citation": [ { "@type": "ScholarlyArticle", From 1529626aeaf0b90d91b09241fa22d32be7797fb0 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 5 Feb 2025 09:32:54 +0800 Subject: [PATCH 109/127] use {devtag} and fix @returns tag --- .Rbuildignore | 9 +++++ DESCRIPTION | 4 +- R/create_CRU_df.R | 2 +- R/create_CRU_stack.R | 11 ++--- R/internal_functions.R | 33 +++++++-------- codemeta.json | 2 +- man/create_CRU_stack.Rd | 11 ++--- man/dot-check_vars_FALSE.Rd | 81 +++++++++++++++++++++++++++++++++++++ man/dot-create_df.Rd | 28 +++++++++++++ man/dot-create_stack.Rd | 23 +++++++++++ man/dot-create_stacks.Rd | 30 ++++++++++++++ man/dot-get_local.Rd | 62 ++++++++++++++++++++++++++++ man/dot-read_cache.Rd | 17 ++++++++ man/dot-set_cache.Rd | 16 ++++++++ man/dot-tidy_df.Rd | 12 ++++++ man/dot-validate_dsn.Rd | 15 +++++++ man/get_CRU_stack.Rd | 4 +- 17 files changed, 325 insertions(+), 35 deletions(-) create mode 100644 man/dot-check_vars_FALSE.Rd create mode 100644 man/dot-create_df.Rd create mode 100644 man/dot-create_stack.Rd create mode 100644 man/dot-create_stacks.Rd create mode 100644 man/dot-get_local.Rd create mode 100644 man/dot-read_cache.Rd create mode 100644 man/dot-set_cache.Rd create mode 100644 man/dot-tidy_df.Rd create mode 100644 man/dot-validate_dsn.Rd diff --git a/.Rbuildignore b/.Rbuildignore index 43d8729..4c89960 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -21,3 +21,12 @@ # flint files ^flint$ +^man/dot-check_vars_FALSE\.Rd$ +^man/dot-validate_dsn\.Rd$ +^man/dot-create_df\.Rd$ +^man/dot-tidy_df\.Rd$ +^man/dot-read_cache\.Rd$ +^man/dot-create_stacks\.Rd$ +^man/dot-create_stack\.Rd$ +^man/dot-set_cache\.Rd$ +^man/dot-get_local\.Rd$ diff --git a/DESCRIPTION b/DESCRIPTION index 8b0b2ef..ecae0ea 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -56,11 +56,11 @@ Config/testthat/edition: 3 Config/testthat/parallel: true Encoding: UTF-8 Language: en-US -Roxygen: list(markdown = TRUE, roclets = c("collate", "namespace", "rd", - "roxyglobals::global_roclet", "roxylint::roxylint")) +Roxygen: list(markdown = TRUE, roclets = c("collate", "namespace", "rd", "roxyglobals::global_roclet", "roxylint::roxylint", "devtag::dev_roclet")) RoxygenNote: 7.3.2 X-schema.org-applicationCategory: Tools X-schema.org-isPartOf: https://ropensci.org X-schema.org-keywords: anglia-cru, climate-data, cru-cl2, temperature, rainfall, elevation, data-access, wind, relative-humidity, solar-radiation, diurnal-temperature, frost +Config/Needs/build: moodymudskipper/devtag diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index aad08e6..0535199 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -57,7 +57,7 @@ #' @seealso #' [get_CRU_df]. #' -#' @return A [data.table::data.table] object of \acronym{CRU} \acronym{CL} v. +#' @returns A [data.table::data.table] object of \acronym{CRU} \acronym{CL} v. #' 2.0 climatology elements. #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index 34e49a7..b921d1c 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -6,9 +6,10 @@ #' automatically calculated as described in the data #' [readme.txt](https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt) file. #' Data may be cached for later use by this function, saving time downloading -#' files in future using this function. This function can be useful if you have -#' network connection issues that mean automated downloading of the files using -#' \R does not work properly. +#' files in future using this function. This function can be useful if you +#' have network connection issues that mean automated downloading of the files +#' using \R does not work properly or you have cached the files locally for +#' your own future use. #' #' @inheritSection get_CRU_df Nomenclature and Units #' @inheritParams create_CRU_df @@ -31,8 +32,8 @@ #' @seealso #' [get_CRU_stack]. #' -#' @return A [base::list] of [terra::rast] objects of \acronym{CRU} \acronym{CL} -#' v. 2.0 climatology elements. +#' @returns A [base::list] of [terra::rast] objects of \acronym{CRU} +#' \acronym{CL} v. 2.0 climatology elements. #' #' @export diff --git a/R/internal_functions.R b/R/internal_functions.R index 1def32e..3ac53e1 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -42,8 +42,8 @@ #' wnd, #' elv #' ) -#' @noRd -#' @keywords Internal +#' @dev + .check_vars_FALSE <- function(pre, pre_cv, @@ -68,8 +68,8 @@ #' Validates user entered dsn value #' #' @param dsn User provided value for checking. -#' @keywords Internal -#' @noRd + +#' @dev .validate_dsn <- function(dsn) { if (missing(dsn)) { cli::cli_abort( @@ -106,10 +106,9 @@ #' @param elv Is elv to be returned? Boolean. #' @param files File list to be used for creating data frame. #' -#' @return A \CRANpkg{data.table} of all requested values. -#' @keywords Internal +#' @returns A \CRANpkg{data.table} of all requested values. #' @autoglobal -#' @noRd +#' @dev .create_df <- function(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files) { CRU_df <- @@ -141,8 +140,8 @@ } #' Read Files from Disk Directory and Tidy Them -#' @noRd -#' @keywords Internal +#' @dev + .tidy_df <- function(pre_cv, elv, tmn, tmx, .files) { # create list of tidied data frames ---------------------------------------- CRU_list <- @@ -187,9 +186,8 @@ #' @param .files a list of CRU CL2.0 files in local storage. #' @param .pre_cv `Boolean` return pre_cv in the data. #' -#' @keywords Internal #' @autoglobal -#' @noRd +#' @dev .read_cache <- function(.files, .pre_cv) { month_names <- @@ -282,9 +280,8 @@ #' `rast`, Boolean. #' @param files List. Files that are to be used in creating the `rast` object. #' -#' @keywords Internal #' @autoglobal -#' @noRd +#' @dev #' .create_stacks <- function(tmn, tmx, tmp, dtr, pre, pre_cv, files) { wrld <- @@ -360,8 +357,7 @@ #' @param pre_cv `Boolean` include preciptation cv. #' #' @autoglobal -#' @keywords Internal -#' @noRd +#' @dev .create_stack <- function(files, wrld, month_names, @@ -437,8 +433,8 @@ #' #' @param cache `Boolean` (create) and use local file cache. #' -#' @keywords Internal -#' @noRd + +#' @dev .set_cache <- function(cache) { manage_cache <- hoardr::hoard() manage_cache$cache_path_set( @@ -483,8 +479,7 @@ #' @param elv Boolean, loads elevation (converted to metres) and returns it in #' the data frame. #' -#' @keywords Internal -#' @noRd +#' @dev .get_local <- function(pre, pre_cv, rd0, diff --git a/codemeta.json b/codemeta.json index f3c0335..8672b8b 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "912.533KB", + "fileSize": "912.393KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 6827d94..a1a2e95 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -96,8 +96,8 @@ the data frame, \code{TRUE}. Defaults to \code{FALSE}.} files are located.} } \value{ -A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of \acronym{CRU} \acronym{CL} -v. 2.0 climatology elements. +A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of \acronym{CRU} +\acronym{CL} v. 2.0 climatology elements. } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology @@ -106,9 +106,10 @@ data. If requested, minimum and maximum temperature may also be automatically calculated as described in the data \href{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt}{readme.txt} file. Data may be cached for later use by this function, saving time downloading -files in future using this function. This function can be useful if you have -network connection issues that mean automated downloading of the files using -\R does not work properly. +files in future using this function. This function can be useful if you +have network connection issues that mean automated downloading of the files +using \R does not work properly or you have cached the files locally for +your own future use. } \section{Nomenclature and Units}{ diff --git a/man/dot-check_vars_FALSE.Rd b/man/dot-check_vars_FALSE.Rd new file mode 100644 index 0000000..ecccd12 --- /dev/null +++ b/man/dot-check_vars_FALSE.Rd @@ -0,0 +1,81 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.check_vars_FALSE} +\alias{.check_vars_FALSE} +\title{Check that at least one element is requested} +\usage{ +.check_vars_FALSE( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv +) +} +\arguments{ +\item{pre}{Fetches precipitation (millimetres/month) from server and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} + +\item{pre_cv}{Fetches cv of precipitation (percent) from server and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}. Note, setting +this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and +returned as well.} + +\item{rd0}{Fetches wet-days (number days with >0.1 millimetres rain per +month) and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} + +\item{tmp}{Fetches temperature (degrees Celsius) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} + +\item{dtr}{Fetches mean diurnal temperature range (degrees Celsius) +and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} + +\item{reh}{Fetches relative humidity and returns it in the data frame, +\code{TRUE}. Defaults to \code{FALSE}.} + +\item{tmn}{Calculates minimum temperature values (degrees Celsius) +and returns it in the data frame. Defaults to \code{FALSE}.} + +\item{tmx}{Boolean. Calculates maximum temperature (degrees Celsius) and +returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} + +\item{sunp}{Fetches sunshine, percent of maximum possible (percent of +day length), and returns it in the data frame, \code{TRUE}. Defaults to \code{FALSE}.} + +\item{frs}{Boolean. Fetches ground-frost records (number of days with +ground-frost per month) and returns it in data frame, \code{TRUE}. Defaults to +\code{FALSE}.} + +\item{wnd}{Fetches 10m wind speed (metres/second) and returns it in the data +frame, \code{TRUE}. Defaults to \code{FALSE}.} + +\item{elv}{Fetches elevation (converted to metres) and returns it in the +data frame, \code{TRUE}. Defaults to \code{FALSE}.} +} +\description{ +Check that at least one element is requested +} +\examples{ +.check_vars_FALSE( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv +) +} +\keyword{internal} diff --git a/man/dot-create_df.Rd b/man/dot-create_df.Rd new file mode 100644 index 0000000..1cba491 --- /dev/null +++ b/man/dot-create_df.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.create_df} +\alias{.create_df} +\title{Creates a data.table from the CRU data} +\usage{ +.create_df(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files) +} +\arguments{ +\item{tmn}{Is tmx to be calculated? Boolean.} + +\item{dtr}{Is dtr to be returned? Boolean.} + +\item{pre}{Is pre to be returned? Boolean.} + +\item{pre_cv}{Is pre_cv to be returned? Boolean.} + +\item{elv}{Is elv to be returned? Boolean.} + +\item{files}{File list to be used for creating data frame.} +} +\value{ +A \CRANpkg{data.table} of all requested values. +} +\description{ +Creates a data.table from the CRU data +} +\keyword{internal} diff --git a/man/dot-create_stack.Rd b/man/dot-create_stack.Rd new file mode 100644 index 0000000..e5ad03d --- /dev/null +++ b/man/dot-create_stack.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.create_stack} +\alias{.create_stack} +\title{Helper Function Used in .create_stacks()} +\usage{ +.create_stack(files, wrld, month_names, pre, pre_cv) +} +\arguments{ +\item{files}{A list of files to use in creating \code{rast} objects.} + +\item{wrld}{An empty \link[terra:rast]{terra::rast} object for filling with values.} + +\item{month_names}{A vector of month names from jan -- dec.} + +\item{pre}{\code{Boolean} include precipitation.} + +\item{pre_cv}{\code{Boolean} include preciptation cv.} +} +\description{ +Helper Function Used in .create_stacks() +} +\keyword{internal} diff --git a/man/dot-create_stacks.Rd b/man/dot-create_stacks.Rd new file mode 100644 index 0000000..8e478ef --- /dev/null +++ b/man/dot-create_stacks.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.create_stacks} +\alias{.create_stacks} +\title{Create terra rast objects} +\usage{ +.create_stacks(tmn, tmx, tmp, dtr, pre, pre_cv, files) +} +\arguments{ +\item{tmn}{Return minimum temperature values (degrees Celsius) +in the \code{rast}, Boolean.} + +\item{tmx}{Return maximum temperature (degrees Celsius) in the +\code{rast}, Boolean.} + +\item{tmp}{Return temperature (degrees Celsius) in the \code{rast}, Boolean.} + +\item{dtr}{Return mean diurnal temperature range (degrees Celsius) +in the \code{rast}, Boolean.} + +\item{pre}{Return precipitation in the \code{rast}, Boolean.} + +\item{pre_cv}{Return cv of precipitation (percent) in the \code{rast}, Boolean.} + +\item{files}{List. Files that are to be used in creating the \code{rast} object.} +} +\description{ +Create terra rast objects +} +\keyword{internal} diff --git a/man/dot-get_local.Rd b/man/dot-get_local.Rd new file mode 100644 index 0000000..fca609d --- /dev/null +++ b/man/dot-get_local.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.get_local} +\alias{.get_local} +\title{Create a List of Locally Cached Files for Import} +\usage{ +.get_local( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir +) +} +\arguments{ +\item{pre}{Boolean, loads precipitation (millimetres/month) from server and +returns in the data frame.} + +\item{pre_cv}{Boolean, loads cv of precipitation (percent) from server and +returns in the data frame.} + +\item{rd0}{Boolean, loads wet-days (number days with >0.1 millimetres rain +per month) and returns in the data frame.} + +\item{tmp}{Boolean, loads temperature (degrees Celsius) and returns it in +the data frame.} + +\item{dtr}{Boolean, loads mean diurnal temperature range (degrees Celsius) +and returns it in the data frame.} + +\item{reh}{Boolean, loads relative humidity and return it in the data frame.} + +\item{tmn}{Boolean, calculates minimum temperature values (degrees Celsius) +and returns it in the data frame.} + +\item{tmx}{Boolean, calculatex maximum temperature (degrees Celsius) and +returns it in the data frame.} + +\item{sunp}{Boolean, loads sunshine, percent of maximum possible (percent of +day length) and returns it in data frame.} + +\item{frs}{Boolean, loads ground-frost records (number of days with ground- +frost per month) and return it in data frame.} + +\item{wnd}{Boolean, loads 10m wind speed (metres/second) and returns it in +the data frame.} + +\item{elv}{Boolean, loads elevation (converted to metres) and returns it in +the data frame.} +} +\description{ +Create a List of Locally Cached Files for Import +} +\keyword{internal} diff --git a/man/dot-read_cache.Rd b/man/dot-read_cache.Rd new file mode 100644 index 0000000..3706fb9 --- /dev/null +++ b/man/dot-read_cache.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.read_cache} +\alias{.read_cache} +\title{Read Files From Local cache} +\usage{ +.read_cache(.files, .pre_cv) +} +\arguments{ +\item{.files}{a list of CRU CL2.0 files in local storage.} + +\item{.pre_cv}{\code{Boolean} return pre_cv in the data.} +} +\description{ +Read Files From Local cache +} +\keyword{internal} diff --git a/man/dot-set_cache.Rd b/man/dot-set_cache.Rd new file mode 100644 index 0000000..fa6068e --- /dev/null +++ b/man/dot-set_cache.Rd @@ -0,0 +1,16 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.set_cache} +\alias{.set_cache} +\title{Set Up User Cache} +\usage{ +.set_cache(cache) +} +\arguments{ +\item{cache}{\code{Boolean} (create) and use local file cache.} +} +\description{ +Creates local directory for caching and/or uses it for local caching or +uses the \R session \code{tempdir()}. +} +\keyword{internal} diff --git a/man/dot-tidy_df.Rd b/man/dot-tidy_df.Rd new file mode 100644 index 0000000..af8f61f --- /dev/null +++ b/man/dot-tidy_df.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.tidy_df} +\alias{.tidy_df} +\title{Read Files from Disk Directory and Tidy Them} +\usage{ +.tidy_df(pre_cv, elv, tmn, tmx, .files) +} +\description{ +Read Files from Disk Directory and Tidy Them +} +\keyword{internal} diff --git a/man/dot-validate_dsn.Rd b/man/dot-validate_dsn.Rd new file mode 100644 index 0000000..408ae7c --- /dev/null +++ b/man/dot-validate_dsn.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_functions.R +\name{.validate_dsn} +\alias{.validate_dsn} +\title{Validates user entered dsn value} +\usage{ +.validate_dsn(dsn) +} +\arguments{ +\item{dsn}{User provided value for checking.} +} +\description{ +Validates user entered dsn value +} +\keyword{internal} diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index f163261..4f9c9d1 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -97,8 +97,8 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} even after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of \acronym{CRU} \acronym{CL} -v. 2.0 climatology elements. +A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of \acronym{CRU} +\acronym{CL} v. 2.0 climatology elements. } \description{ This function automates downloading and importing CRU CL v. 2.0 From 4a719dc9c798bf05b3d504c0369f22c9dbe56502 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Thu, 6 Feb 2025 11:30:01 +0800 Subject: [PATCH 110/127] update .gitignore and streamline precompile.R --- .gitignore | 4 +--- vignettes/precompile.R | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 30fdec5..a5c0d45 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,8 @@ .Rhistory .RData .Ruserdata -*.Rproj +.Rproj inst/doc -*.DS_Store - .DS_Store *.code-workspace docs/ diff --git a/vignettes/precompile.R b/vignettes/precompile.R index e68c787..b5a725d 100644 --- a/vignettes/precompile.R +++ b/vignettes/precompile.R @@ -1,7 +1,6 @@ # vignettes that depend on internet access need to be precompiled and take a # while to run -library("knitr") -knit("vignettes/getCRUCLdata.Rmd.orig", "vignettes/getCRUCLdata.Rmd") +knitr::knit("vignettes/getCRUCLdata.Rmd.orig", "vignettes/getCRUCLdata.Rmd") # remove file path such that vignettes will build with figures replace <- readLines("vignettes/getCRUCLdata.Rmd") @@ -11,8 +10,7 @@ writeLines(replace, fileConn) close(fileConn) # build vignettes -library("devtools") -build_vignettes() +devtools::build_vignettes() # move resource files to /doc resources <- From 621bbe1222b34b691dceace3ab93508a24ce08bf Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Fri, 7 Feb 2025 15:48:48 +0800 Subject: [PATCH 111/127] document internal function --- R/get_CRU.R | 31 ++++++++++++++++++++---- man/dot-get_CRU.Rd | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 man/dot-get_CRU.Rd diff --git a/R/get_CRU.R b/R/get_CRU.R index 2e7d656..a2565ca 100644 --- a/R/get_CRU.R +++ b/R/get_CRU.R @@ -1,4 +1,25 @@ -#' @noRd +#' Downloads and formats CRU CL 2.0 data +#' +#' @param pre Logical. If TRUE, downloads precipitation data. +#' @param pre_cv Logical. If TRUE, downloads precipitation data. +#' @param rd0 Logical. If TRUE, downloads runoff data. +#' @param tmp Logical. If TRUE, downloads temperature data. +#' @param dtr Logical. If TRUE, downloads diurnal temperature range data. +#' @param reh Logical. If TRUE, downloads relative humidity data. +#' @param tmn Logical. If TRUE, downloads minimum temperature data. +#' @param tmx Logical. If TRUE, downloads maximum temperature data. +#' @param sunp Logical. If TRUE, downloads sunshine data. +#' @param frs Logical. If TRUE, downloads frost day frequency data. +#' @param wnd Logical. If TRUE, downloads wind speed data. +#' @param elv Logical. If TRUE, downloads elevation data. +#' @param cache_dir Character. Path to the cache directory. +#' +#' Handles the downloading of CRU CL 2.0 data. This function is called by +#' [get_cru_df] and [get_cru_stack]. It is not intended to be called directly. +#' +#' @returns A data.table with the requested data. +#' +#' @dev .get_CRU <- function(pre, pre_cv, @@ -23,7 +44,7 @@ frs_file <- "grid_10min_frs.dat.gz" rd0_file <- "grid_10min_rd0.dat.gz" - # check if pre_cv or tmx/tmn (derived) are true, make sure proper ---------- + # check if pre_cv or tmx/tmn (derived) are true, make sure proper --------- # parameters set TRUE if (pre_cv) { pre <- TRUE @@ -32,7 +53,7 @@ if (any(tmn, tmx)) { dtr <- tmp <- TRUE } - # create object list to filter downloads ----------------------------------- + # create object list to filter downloads ---------------------------------- object_list <- c(dtr, tmp, reh, elv, pre, sunp, wnd, frs, rd0) files <- @@ -61,7 +82,7 @@ "rd0_file" ) - # filter downloaded -------------------------------------------------------- + # filter downloaded ------------------------------------------------------- # which files are being requested? files <- files[which(object_list)] @@ -72,7 +93,7 @@ # which files requested need to be downloaded dl_files <- files[!(files %in% cache_dir_contents)] - # download files ----------------------------------------------------------- + # download files ---------------------------------------------------------- if (length(dl_files) > 0) { CRU_url <- "https://crudata.uea.ac.uk/cru/data/hrg/tmc/" dl_files <- as.list(paste0(CRU_url, dl_files)) diff --git a/man/dot-get_CRU.Rd b/man/dot-get_CRU.Rd new file mode 100644 index 0000000..8e09d24 --- /dev/null +++ b/man/dot-get_CRU.Rd @@ -0,0 +1,59 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_CRU.R +\name{.get_CRU} +\alias{.get_CRU} +\title{Fetches and Formats CRUL CL 2.0 Data} +\usage{ +.get_CRU( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir +) +} +\arguments{ +\item{pre}{Logical. If TRUE, downloads precipitation data.} + +\item{pre_cv}{Logical. If TRUE, downloads precipitation data.} + +\item{rd0}{Logical. If TRUE, downloads runoff data.} + +\item{tmp}{Logical. If TRUE, downloads temperature data.} + +\item{dtr}{Logical. If TRUE, downloads diurnal temperature range data.} + +\item{reh}{Logical. If TRUE, downloads relative humidity data.} + +\item{tmn}{Logical. If TRUE, downloads minimum temperature data.} + +\item{tmx}{Logical. If TRUE, downloads maximum temperature data.} + +\item{sunp}{Logical. If TRUE, downloads sunshine data.} + +\item{frs}{Logical. If TRUE, downloads frost day frequency data.} + +\item{wnd}{Logical. If TRUE, downloads wind speed data.} + +\item{elv}{Logical. If TRUE, downloads elevation data.} + +\item{cache_dir}{Character. Path to the cache directory. + +Handles the downloading of CRU CL 2.0 data. This function is called by +\link{get_cru_df} and \link{get_cru_stack}. It is not intended to be called directly.} +} +\value{ +A data.table with the requested data. +} +\description{ +Fetches and Formats CRUL CL 2.0 Data +} +\keyword{internal} From babc498b1276b33d26e6bddf4fbba7467d2a1aac Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Fri, 7 Feb 2025 15:49:05 +0800 Subject: [PATCH 112/127] update .Rbuildignore file --- .Rbuildignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.Rbuildignore b/.Rbuildignore index 4c89960..49ed843 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -21,6 +21,7 @@ # flint files ^flint$ +^man/dot-get_CRU\.Rd$ ^man/dot-check_vars_FALSE\.Rd$ ^man/dot-validate_dsn\.Rd$ ^man/dot-create_df\.Rd$ From 2857259b552b278c4c7e45f7c0ee96a8c644ec9d Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Fri, 7 Feb 2025 15:49:15 +0800 Subject: [PATCH 113/127] update codemeta.json --- codemeta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index 8672b8b..26d0a39 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "912.393KB", + "fileSize": "913.57KB", "citation": [ { "@type": "ScholarlyArticle", From 4ba8467347c604e6de2a1249e1eb7cdf9743b1d3 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Fri, 7 Feb 2025 15:49:23 +0800 Subject: [PATCH 114/127] update cran-comments.md --- cran-comments.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cran-comments.md b/cran-comments.md index ab83bbb..14eae13 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -10,8 +10,8 @@ notes indicate it was forcibly removed for "leaving things behind". Therefore, in this release, the caching capabilities now follow the new R standard `tools::R_user_dir(package = "getCRUCLdata")` in spite of the default behaviour of the underlying CRAN packages, {hoadr} and {rappdirs}, which have -been used since this package was first submitted to CRAN to proovide file +been used since this package was first submitted to CRAN to provide file caching functionality in this package. I trust that this is sufficient to have -the {getCRUCLdata} package reinstated on CRAN. +this package reinstated on CRAN. -* This is a new release. +- This is a new release. From 2118d07e032df64e22a1cc18eb4bd7c9d22c0a71 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Fri, 7 Feb 2025 15:55:26 +0800 Subject: [PATCH 115/127] correct spelling --- R/internal_functions.R | 4 ++-- codemeta.json | 2 +- inst/WORDLIST | 2 ++ man/dot-create_stack.Rd | 2 +- man/dot-get_CRU.Rd | 4 ++-- man/dot-get_local.Rd | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/R/internal_functions.R b/R/internal_functions.R index 3ac53e1..ef6f8de 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -354,7 +354,7 @@ #' @param wrld An empty [terra::rast] object for filling with values. #' @param month_names A vector of month names from jan -- dec. #' @param pre `Boolean` include precipitation. -#' @param pre_cv `Boolean` include preciptation cv. +#' @param pre_cv `Boolean` include precipitation cv. #' #' @autoglobal #' @dev @@ -467,7 +467,7 @@ #' the data frame. #' @param tmn Boolean, calculates minimum temperature values (degrees Celsius) #' and returns it in the data frame. -#' @param tmx Boolean, calculatex maximum temperature (degrees Celsius) and +#' @param tmx Boolean, calculate maximum temperature (degrees Celsius) and #' returns it in the data frame. #' @param reh Boolean, loads relative humidity and return it in the data frame. #' @param sunp Boolean, loads sunshine, percent of maximum possible (percent of diff --git a/codemeta.json b/codemeta.json index 26d0a39..d72f5a6 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "913.57KB", + "fileSize": "913.578KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/inst/WORDLIST b/inst/WORDLIST index 16cfc1c..8c0a123 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -30,6 +30,7 @@ codecov colour cv dat +dec dplyr dsn dtr @@ -45,6 +46,7 @@ gridded gz hoardr ivanhanigan +jan jeroen karthik kilometres diff --git a/man/dot-create_stack.Rd b/man/dot-create_stack.Rd index e5ad03d..ae7c9bc 100644 --- a/man/dot-create_stack.Rd +++ b/man/dot-create_stack.Rd @@ -15,7 +15,7 @@ \item{pre}{\code{Boolean} include precipitation.} -\item{pre_cv}{\code{Boolean} include preciptation cv.} +\item{pre_cv}{\code{Boolean} include precipitation cv.} } \description{ Helper Function Used in .create_stacks() diff --git a/man/dot-get_CRU.Rd b/man/dot-get_CRU.Rd index 8e09d24..aee07a4 100644 --- a/man/dot-get_CRU.Rd +++ b/man/dot-get_CRU.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/get_CRU.R \name{.get_CRU} \alias{.get_CRU} -\title{Fetches and Formats CRUL CL 2.0 Data} +\title{Downloads and formats CRU CL 2.0 data} \usage{ .get_CRU( pre, @@ -54,6 +54,6 @@ Handles the downloading of CRU CL 2.0 data. This function is called by A data.table with the requested data. } \description{ -Fetches and Formats CRUL CL 2.0 Data +Downloads and formats CRU CL 2.0 data } \keyword{internal} diff --git a/man/dot-get_local.Rd b/man/dot-get_local.Rd index fca609d..b431817 100644 --- a/man/dot-get_local.Rd +++ b/man/dot-get_local.Rd @@ -41,7 +41,7 @@ and returns it in the data frame.} \item{tmn}{Boolean, calculates minimum temperature values (degrees Celsius) and returns it in the data frame.} -\item{tmx}{Boolean, calculatex maximum temperature (degrees Celsius) and +\item{tmx}{Boolean, calculate maximum temperature (degrees Celsius) and returns it in the data frame.} \item{sunp}{Boolean, loads sunshine, percent of maximum possible (percent of From ee7dc7c024f2304f5b6c7639536bf4fa0133dc52 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Fri, 7 Feb 2025 15:55:35 +0800 Subject: [PATCH 116/127] update cran-comments.md --- cran-comments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cran-comments.md b/cran-comments.md index 14eae13..98bc0e7 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,4 +1,4 @@ -## R CMD check results +# R CMD check results 0 errors | 0 warnings | 2 notes From ddf702ce703001878bbecb823184e9bb0422c930 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Fri, 7 Feb 2025 16:05:58 +0800 Subject: [PATCH 117/127] increment version number for CRAN release --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index ecae0ea..073decc 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: getCRUCLdata Title: 'CRU' 'CL' v. 2.0 Climatology Client -Version: 1.0.3 +Version: 2.0.0 Authors@R: c( person("Adam H.", "Sparks", , "adamhsparks@gmail.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-0061-8359")), From 608507d96a4cb37e87dcf52d9aa376abfdd96f66 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Fri, 7 Feb 2025 16:08:30 +0800 Subject: [PATCH 118/127] It IS v1.0.3 being released and a new major release on CRAN --- DESCRIPTION | 2 +- NEWS.md | 50 ++++++++++++++++++++++++------------------------ cran-comments.md | 2 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 073decc..ecae0ea 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: getCRUCLdata Title: 'CRU' 'CL' v. 2.0 Climatology Client -Version: 2.0.0 +Version: 1.0.3 Authors@R: c( person("Adam H.", "Sparks", , "adamhsparks@gmail.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-0061-8359")), diff --git a/NEWS.md b/NEWS.md index 4967a27..c610330 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,7 +4,7 @@ - Add source and references to documentation for data -- Create function aliases that use all lower case, *e.g.*, `get_cru_stack()` vs `get_CRU_stack()` +- Create function aliases that use all lower case, _e.g._, `get_cru_stack()` vs `get_CRU_stack()` - Improved documentation with linting, ensuring consistency in units of measurement, etc. @@ -32,7 +32,7 @@ ## Major changes -- The cache is now where ever `tools::R_user_dir(package = "getCRUCLdata", which = "cache")` is defined by R (>= 4.0.0) and *should* align with CRAN standards, so it *might* be possible to get this back on CRAN +- The cache is now where ever `tools::R_user_dir(package = "getCRUCLdata", which = "cache")` is defined by R (>= 4.0.0) and _should_ align with CRAN standards, so it _might_ be possible to get this back on CRAN - Depends on R (>= 4.0.0) @@ -105,14 +105,14 @@ - Removes startup message, instead placing information in CITATION file - Reorganises internal functions consolidating functions all in a single file -and following a standard naming scheme for all internal functions + and following a standard naming scheme for all internal functions # getCRUCLdata 0.2.4 ## Bug fixes - Fix bug where `tmp` and `dtr` could not be returned with `tmn` or `tmx` raster -stacks + stacks - Move `rappdirs` to SUGGESTS to fix NOTEs @@ -121,7 +121,7 @@ stacks - Fix documentation formatting issues - Enhance `stop` messages for user, just print message, not the function that -called it to clarify + called it to clarify # getCRUCLdata 0.2.3 @@ -154,9 +154,9 @@ called it to clarify - Use _hoardr_ for managing cached files - Fixed a bug where the file cache was not in the proper subdirectory. The file -cache has moved to the proper location in a `R/getCRUCLdata` location rather -than `getCRUCLdata`. You may wish to move files externally to R in order to keep -them in the cache where the package will find them + cache has moved to the proper location in a `R/getCRUCLdata` location rather + than `getCRUCLdata`. You may wish to move files externally to R in order to keep + them in the cache where the package will find them - Use `lapply` in place of `purrr::map`, _purrr_ is no longer imported @@ -178,7 +178,7 @@ them in the cache where the package will find them - Add startup message regarding data source, use and citation - Include Scott Chamberlain as copyright holder and contributor for file -caching functionality + caching functionality # getCRUCLdata 0.1.9 @@ -191,18 +191,18 @@ caching functionality ## Bug Fixes - Fix bug where `cache` was not specified in internal function, `.set_cache()`, -this caused either of the functions fetching data from CRU to fail + this caused either of the functions fetching data from CRU to fail - Fix bug where `cache` directory could not be created on Windows OS machines -- Fix bug where tmx was returned when *either* tmn *or* tmx was requested for -data frame, tmn now returned when requested and tmx now returned when requested. -Raster stacks were not affected by this bug +- Fix bug where tmx was returned when _either_ tmn _or_ tmx was requested for + data frame, tmn now returned when requested and tmx now returned when requested. + Raster stacks were not affected by this bug ## Minor Changes - Replaced `for f in 1:length()` with `for f in seq_along()` for better -programming practices + programming practices # getCRUCLdata 0.1.7 @@ -213,7 +213,7 @@ programming practices ## Bug Fixes - Fix bug where `rappdirs::user_config_dir()` was incorrectly used in place of -`rappdirs::user_cache_dir()` + `rappdirs::user_cache_dir()` # getCRUCLdata 0.1.6 @@ -236,27 +236,27 @@ programming practices ## Major Changes - `create_CRU_stack()` and `create_CRU_df()` now only work with locally - available files. If you need to fetch and create a data frame or raster stack - of the data, please use the new functions, `get_CRU_stack()` and - `get_CRU_stack()` + available files. If you need to fetch and create a data frame or raster stack + of the data, please use the new functions, `get_CRU_stack()` and + `get_CRU_stack()` - R >=3.2.0 now required - Data can be cached using either `get_CRU_stack()` or `get_CRU_df()` for later - use + use ## Minor Changes - Improved documentation with examples on mapping and graphing and more detail -regarding the data itself + regarding the data itself - Change the method in which files are downloaded to use `httr::GET()` - Ingest data using `data.table::fread` to decrease the amount of time necessary -to run the functions + to run the functions - Functions check to see if data file(s) have already been downloaded during -current R session, if so data file(s) are not requested for download again + current R session, if so data file(s) are not requested for download again - Months are returned as a factor object in the tidy data frame @@ -265,14 +265,14 @@ current R session, if so data file(s) are not requested for download again ## Minor Changes - Correct fix bug in data frame object generation where elevation was improperly -handled and function would stop + handled and function would stop # getCRUCLdata 0.1.3 ## Minor Changes - Correct fix bug in raster object generation where the objects were incorrectly -cropped + cropped - Update documentation with ROxygen 6.0.0 @@ -283,7 +283,7 @@ cropped ## Minor Changes - Correct documentation to read that the data resolution is 10 minute, not 10 -seconds + seconds - Correct URLs in DESCRIPTION file diff --git a/cran-comments.md b/cran-comments.md index 98bc0e7..87dd8b6 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -14,4 +14,4 @@ been used since this package was first submitted to CRAN to provide file caching functionality in this package. I trust that this is sufficient to have this package reinstated on CRAN. -- This is a new release. +- This is a new major release. From 64eadcafa3cfc4df2e7240fe1292be71072fcd8e Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 8 Feb 2025 17:39:27 +0800 Subject: [PATCH 119/127] update codemeta.json --- codemeta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index d72f5a6..2d90592 100644 --- a/codemeta.json +++ b/codemeta.json @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "913.578KB", + "fileSize": "913.618KB", "citation": [ { "@type": "ScholarlyArticle", From 7415a36c32af316a15c4fa3a950811579e3aee16 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 8 Feb 2025 20:09:03 +0800 Subject: [PATCH 120/127] update licence year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index b42b4ce..45f1016 100644 --- a/LICENSE +++ b/LICENSE @@ -1,2 +1,2 @@ -YEAR: 2017 +YEAR: 2025 COPYRIGHT HOLDER: Adam H. Sparks From e9620caeb7cf939da6b4e54c0a070ee26d476b85 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 8 Feb 2025 20:09:27 +0800 Subject: [PATCH 121/127] Increment version number to 1.0.3 --- codemeta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index 2d90592..b45f3de 100644 --- a/codemeta.json +++ b/codemeta.json @@ -8,7 +8,7 @@ "codeRepository": "https://github.com/ropensci/getCRUCLdata", "issueTracker": "https://github.com/ropensci/getCRUCLdata/issues", "license": "https://spdx.org/licenses/MIT", - "version": "1.0.3", + "version": "1.0.2", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", From e53f149ae28a096405785cec0756a3b71c866f34 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Mon, 10 Feb 2025 12:51:56 +0800 Subject: [PATCH 122/127] delete cran-comments, there's no need any longer --- cran-comments.md | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 cran-comments.md diff --git a/cran-comments.md b/cran-comments.md deleted file mode 100644 index 87dd8b6..0000000 --- a/cran-comments.md +++ /dev/null @@ -1,17 +0,0 @@ -# R CMD check results - -0 errors | 0 warnings | 2 notes - -## Fixes from previous CRAN version - -I had asked that the last version of this package on CRAN be removed, but the -notes indicate it was forcibly removed for "leaving things behind". - -Therefore, in this release, the caching capabilities now follow the new R -standard `tools::R_user_dir(package = "getCRUCLdata")` in spite of the default -behaviour of the underlying CRAN packages, {hoadr} and {rappdirs}, which have -been used since this package was first submitted to CRAN to provide file -caching functionality in this package. I trust that this is sufficient to have -this package reinstated on CRAN. - -- This is a new major release. From fd66773d062ca5fb618d709a0f9c950927e9585d Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Mon, 3 Mar 2025 13:52:31 +0800 Subject: [PATCH 123/127] Format with Air and desc::desc_normalize() --- DESCRIPTION | 8 +- R/create_CRU_df.R | 31 +++--- R/create_CRU_stack.R | 31 +++--- R/get_CRU.R | 60 +++++------ R/get_CRU_df.R | 28 +++--- R/get_CRU_stack.R | 28 +++--- R/internal_functions.R | 132 +++++++++++++------------ R/zzz.R | 3 +- tests/spelling.R | 3 +- tests/testthat/test-create_CRU_stack.R | 44 +++------ tests/testthat/test-create_stack.R | 62 +++++------- tests/testthat/test-get_CRU.R | 1 - tests/testthat/test_caching.R | 8 +- tests/testthat/test_get_local.R | 12 +-- vignettes/precompile.R | 6 +- 15 files changed, 213 insertions(+), 244 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index ecae0ea..588e9e7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -7,7 +7,7 @@ Authors@R: c( comment = c(ORCID = "0000-0002-0061-8359")), person("Curtin University of Technology", role = "cph", comment = "Provided support through Adam Sparks's time."), - person("Grains Research and Development Corporation", role = c("cph"), + person("Grains Research and Development Corporation", role = "cph", comment = "GRDC Project CUR2210-005OPX (AAGI-CU)") ) Description: Provides functions that automate downloading and importing @@ -49,6 +49,7 @@ Suggests: VignetteBuilder: knitr ByteCompile: TRUE +Config/Needs/build: moodymudskipper/devtag Config/roxyglobals/filename: globals.R Config/roxyglobals/unique: FALSE Config/roxylint: list(linters = roxylint::tidy) @@ -56,11 +57,12 @@ Config/testthat/edition: 3 Config/testthat/parallel: true Encoding: UTF-8 Language: en-US -Roxygen: list(markdown = TRUE, roclets = c("collate", "namespace", "rd", "roxyglobals::global_roclet", "roxylint::roxylint", "devtag::dev_roclet")) +Roxygen: list(markdown = TRUE, roclets = c("collate", "namespace", "rd", + "roxyglobals::global_roclet", "roxylint::roxylint", + "devtag::dev_roclet")) RoxygenNote: 7.3.2 X-schema.org-applicationCategory: Tools X-schema.org-isPartOf: https://ropensci.org X-schema.org-keywords: anglia-cru, climate-data, cru-cl2, temperature, rainfall, elevation, data-access, wind, relative-humidity, solar-radiation, diurnal-temperature, frost -Config/Needs/build: moodymudskipper/devtag diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 0535199..1c0ad4e 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -83,19 +83,21 @@ #' #' @export -create_CRU_df <- function(pre = FALSE, - pre_cv = FALSE, - rd0 = FALSE, - tmp = FALSE, - dtr = FALSE, - reh = FALSE, - tmn = FALSE, - tmx = FALSE, - sunp = FALSE, - frs = FALSE, - wnd = FALSE, - elv = FALSE, - dsn) { +create_CRU_df <- function( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + dsn +) { .check_vars_FALSE( pre, pre_cv, @@ -113,7 +115,8 @@ create_CRU_df <- function(pre = FALSE, .validate_dsn(dsn) - files <- .get_local(pre, + files <- .get_local( + pre, pre_cv, rd0, tmp, diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index b921d1c..cf16b95 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -37,19 +37,21 @@ #' #' @export -create_CRU_stack <- function(pre = FALSE, - pre_cv = FALSE, - rd0 = FALSE, - tmp = FALSE, - dtr = FALSE, - reh = FALSE, - tmn = FALSE, - tmx = FALSE, - sunp = FALSE, - frs = FALSE, - wnd = FALSE, - elv = FALSE, - dsn) { +create_CRU_stack <- function( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + dsn +) { .check_vars_FALSE( pre, pre_cv, @@ -67,7 +69,8 @@ create_CRU_stack <- function(pre = FALSE, .validate_dsn(dsn) - files <- .get_local(pre, + files <- .get_local( + pre, pre_cv, rd0, tmp, diff --git a/R/get_CRU.R b/R/get_CRU.R index a2565ca..d160423 100644 --- a/R/get_CRU.R +++ b/R/get_CRU.R @@ -21,19 +21,21 @@ #' #' @dev .get_CRU <- - function(pre, - pre_cv, - rd0, - tmp, - dtr, - reh, - tmn, - tmx, - sunp, - frs, - wnd, - elv, - cache_dir) { + function( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir + ) { dtr_file <- "grid_10min_dtr.dat.gz" tmp_file <- "grid_10min_tmp.dat.gz" reh_file <- "grid_10min_reh.dat.gz" @@ -70,17 +72,17 @@ ) names(files) <- names(object_list) <- - c( - "dtr_file", - "tmp_file", - "reh_file", - "elv_file", - "pre_file", - "sun_file", - "wnd_file", - "frs_file", - "rd0_file" - ) + c( + "dtr_file", + "tmp_file", + "reh_file", + "elv_file", + "pre_file", + "sun_file", + "wnd_file", + "frs_file", + "rd0_file" + ) # filter downloaded ------------------------------------------------------- # which files are being requested? @@ -108,17 +110,17 @@ }, error = function(x) { manage_cache$delete_all() - cli::cli_abort("The file downloads have failed. - Please start the download again.") + cli::cli_abort( + "The file downloads have failed. + Please start the download again." + ) } ) } # filter files from cache directory in case there are local files for which # we do not want data - cache_dir_contents <- as.list(list.files(cache_dir, - pattern = ".dat.gz$" - )) + cache_dir_contents <- as.list(list.files(cache_dir, pattern = ".dat.gz$")) files <- cache_dir_contents[cache_dir_contents %in% files] diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 527afb2..b330bf3 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -75,19 +75,21 @@ #' #' @export -get_CRU_df <- function(pre = FALSE, - pre_cv = FALSE, - rd0 = FALSE, - tmp = FALSE, - dtr = FALSE, - reh = FALSE, - tmn = FALSE, - tmx = FALSE, - sunp = FALSE, - frs = FALSE, - wnd = FALSE, - elv = FALSE, - cache = FALSE) { +get_CRU_df <- function( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + cache = FALSE +) { .check_vars_FALSE( pre, pre_cv, diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index a935273..4281f9c 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -29,19 +29,21 @@ #' @export get_CRU_stack <- - function(pre = FALSE, - pre_cv = FALSE, - rd0 = FALSE, - tmp = FALSE, - dtr = FALSE, - reh = FALSE, - tmn = FALSE, - tmx = FALSE, - sunp = FALSE, - frs = FALSE, - wnd = FALSE, - elv = FALSE, - cache = FALSE) { + function( + pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + cache = FALSE + ) { .check_vars_FALSE( pre, pre_cv, diff --git a/R/internal_functions.R b/R/internal_functions.R index ef6f8de..13635ce 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -44,19 +44,20 @@ #' ) #' @dev - -.check_vars_FALSE <- function(pre, - pre_cv, - rd0, - tmp, - dtr, - reh, - tmn, - tmx, - sunp, - frs, - wnd, - elv) { +.check_vars_FALSE <- function( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv +) { if (!any(pre, pre_cv, rd0, tmp, dtr, reh, tmn, tmx, sunp, frs, wnd, elv)) { cli::cli_abort( "You must select at least one element for download or import.", @@ -82,14 +83,17 @@ dsn <- trimws(dsn) if (substr(dsn, nchar(dsn) - 1, nchar(dsn)) == "//") { p <- substr(dsn, 1, nchar(dsn) - 2) - } else if (substr(dsn, nchar(dsn), nchar(dsn)) == "/" | - substr(dsn, nchar(dsn), nchar(dsn)) == "\\") { + } else if ( + substr(dsn, nchar(dsn), nchar(dsn)) == "/" | + substr(dsn, nchar(dsn), nchar(dsn)) == "\\" + ) { p <- substr(dsn, 1, nchar(dsn) - 1) } else { p <- dsn } if (!file.exists(p) || !file.exists(dsn)) { - cli::cli_abort("File directory does not exist: {.var dsn}.", + cli::cli_abort( + "File directory does not exist: {.var dsn}.", call = rlang::caller_env() ) } @@ -164,15 +168,21 @@ # lastly merge the data frames into one tidy (large) data frame -------------- if (isFALSE(elv)) { - CRU_df <- Reduce(function(...) { - merge(..., by = c("lat", "lon", "month")) - }, CRU_list) + CRU_df <- Reduce( + function(...) { + merge(..., by = c("lat", "lon", "month")) + }, + CRU_list + ) } else if (elv && length(CRU_list) > 1) { elv_df <- CRU_list[which(names(CRU_list) %in% "elv")] CRU_list[which(names(CRU_list) %in% "elv")] <- NULL - CRU_df <- Reduce(function(...) { - merge(..., by = c("lat", "lon", "month")) - }, CRU_list) + CRU_df <- Reduce( + function(...) { + merge(..., by = c("lat", "lon", "month")) + }, + CRU_list + ) CRU_df <- CRU_df[elv_df$elv, on = c("lat", "lon")] } else if (elv) { @@ -289,7 +299,8 @@ nrows = 930, ncols = 2160, ymin = -65, - ymax = 90, xmin = -180, + ymax = 90, + xmin = -180, xmax = 180 ) @@ -358,11 +369,7 @@ #' #' @autoglobal #' @dev -.create_stack <- function(files, - wrld, - month_names, - pre, - pre_cv) { +.create_stack <- function(files, wrld, month_names, pre, pre_cv) { wvar <- data.frame(data.table::fread( cmd = paste0("gzip -dc ", files[[1]]), @@ -417,12 +424,15 @@ names(y) <- "elv" } - y <- terra::crop(y, terra::ext( - -180, - 180, - -60, - 85 - )) + y <- terra::crop( + y, + terra::ext( + -180, + 180, + -60, + 85 + ) + ) return(y) } @@ -480,19 +490,21 @@ #' the data frame. #' #' @dev -.get_local <- function(pre, - pre_cv, - rd0, - tmp, - dtr, - reh, - tmn, - tmx, - sunp, - frs, - wnd, - elv, - cache_dir) { +.get_local <- function( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir +) { # check if pre_cv or tmx/tmn (derived) are true, make sure proper ------------ # parameters set TRUE if (pre_cv) { @@ -529,17 +541,17 @@ ) names(files) <- names(object_list) <- - c( - "dtr_file", - "tmp_file", - "reh_file", - "elv_file", - "pre_file", - "sun_file", - "wnd_file", - "frs_file", - "rd0_file" - ) + c( + "dtr_file", + "tmp_file", + "reh_file", + "elv_file", + "pre_file", + "sun_file", + "wnd_file", + "frs_file", + "rd0_file" + ) # filter files --------------------------------------------------------------- # which files are being requested? @@ -547,9 +559,7 @@ # filter files from cache directory in case there are local files for which # we do not want data - cache_dir_contents <- as.list(list.files(cache_dir, - pattern = ".dat.gz$" - )) + cache_dir_contents <- as.list(list.files(cache_dir, pattern = ".dat.gz$")) files <- cache_dir_contents[cache_dir_contents %in% files] diff --git a/R/zzz.R b/R/zzz.R index c5d539e..a6f992d 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,8 +1,7 @@ manage_cache <- NULL # nocov start .onLoad <- - function(libname = find.package("getCRUCLdata"), - pkgname = "getCRUCLdata") { + function(libname = find.package("getCRUCLdata"), pkgname = "getCRUCLdata") { # CRAN Note avoidance if (getRversion() >= "2.15.1") { utils::globalVariables(c(".")) diff --git a/tests/spelling.R b/tests/spelling.R index 13f77d9..d60e024 100644 --- a/tests/spelling.R +++ b/tests/spelling.R @@ -1,6 +1,7 @@ if (requireNamespace("spelling", quietly = TRUE)) { spelling::spell_check_test( - vignettes = TRUE, error = FALSE, + vignettes = TRUE, + error = FALSE, skip_on_cran = TRUE ) } diff --git a/tests/testthat/test-create_CRU_stack.R b/tests/testthat/test-create_CRU_stack.R index 9a6d4d9..82b7c2d 100644 --- a/tests/testthat/test-create_CRU_stack.R +++ b/tests/testthat/test-create_CRU_stack.R @@ -479,19 +479,11 @@ test_that("create_CRU_stack returns a list of terra rast objects", { ) ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") - utils::write.table(pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(pre_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") - utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(tmp_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) dsn <- tempdir() @@ -837,19 +829,11 @@ test_that("Test that create_stack creates tmx if requested", { ) ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_dtr.dat.gz"), "w") - utils::write.table(dtr_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(dtr_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") - utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(tmp_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) pre_cv <- FALSE @@ -868,7 +852,9 @@ test_that("Test that create_stack creates tmx if requested", { .create_stacks(tmn, tmx, tmp, dtr, pre, pre_cv, files) expect_named(CRU_stack_list, c("tmx")) - expect_equal(terra::minmax(CRU_stack_list[[1]])[[2]][[1]], 12.9, + expect_equal( + terra::minmax(CRU_stack_list[[1]])[[2]][[1]], + 12.9, tolerance = 0.1 ) unlink(list.files( @@ -1206,19 +1192,11 @@ test_that("Test that create_stack creates tmn if requested", { ) ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_dtr.dat.gz"), "w") - utils::write.table(dtr_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(dtr_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") - utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(tmp_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) pre_cv <- FALSE @@ -1237,7 +1215,9 @@ test_that("Test that create_stack creates tmn if requested", { .create_stacks(tmn, tmx, tmp, dtr, pre, pre_cv, files) expect_named(CRU_stack_list, c("tmn")) - expect_equal(terra::minmax(CRU_stack_list[[1]])[[2]][[1]], 4.3, + expect_equal( + terra::minmax(CRU_stack_list[[1]])[[2]][[1]], + 4.3, tolerance = 0.1 ) unlink(list.files( diff --git a/tests/testthat/test-create_stack.R b/tests/testthat/test-create_stack.R index 46ee7b8..de7814b 100644 --- a/tests/testthat/test-create_stack.R +++ b/tests/testthat/test-create_stack.R @@ -484,19 +484,11 @@ test_that("create_CRU_stack creates a list of terra rast of pre and tmp", { ) ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") - utils::write.table(pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(pre_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") - utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(tmp_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) pre_cv <- TRUE @@ -623,14 +615,9 @@ test_that("create_CRU_stack creates a list containing only elv", { ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_elv.dat.gz"), "w") - utils::write.table(elv_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(elv_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) - files <- list.files( path = tempdir(), pattern = ".dat.gz$", @@ -701,20 +688,23 @@ test_that("month names are appropriate", { "dec" ) - expect_identical(month_names, c( - "jan", - "feb", - "mar", - "apr", - "may", - "jun", - "jul", - "aug", - "sep", - "oct", - "nov", - "dec" - )) + expect_identical( + month_names, + c( + "jan", + "feb", + "mar", + "apr", + "may", + "jun", + "jul", + "aug", + "sep", + "oct", + "nov", + "dec" + ) + ) }) # Test that CRU_stack_list returns list of raster stacks with proper names ----- @@ -1174,19 +1164,11 @@ test_that("CRU_stack_list returns list of raster stacks with proper names", { ) ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") - utils::write.table(pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(pre_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") - utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(tmp_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) files <- diff --git a/tests/testthat/test-get_CRU.R b/tests/testthat/test-get_CRU.R index 4707316..95a8b83 100644 --- a/tests/testthat/test-get_CRU.R +++ b/tests/testthat/test-get_CRU.R @@ -100,7 +100,6 @@ test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmx TRUE", { test_that("get_CRU will set pre to TRUE if pre_cv is TRUE and pre is FALSE", { skip_if_offline() - pre <- FALSE pre_cv <- TRUE diff --git a/tests/testthat/test_caching.R b/tests/testthat/test_caching.R index f0d3c00..8e989b9 100644 --- a/tests/testthat/test_caching.R +++ b/tests/testthat/test_caching.R @@ -24,9 +24,7 @@ test_that("test that set_cache does not create a dir if cache == FALSE", { test_that("cache directory is created if necessary", { # if cache directory exists during testing, remove it - unlink(manage_cache$cache_path_get(), - recursive = TRUE - ) + unlink(manage_cache$cache_path_get(), recursive = TRUE) cache <- TRUE cache_dir <- .set_cache(cache) expect_true(dir.exists(manage_cache$cache_path_get())) @@ -34,9 +32,7 @@ test_that("cache directory is created if necessary", { test_that("caching utils list files in cache and delete when asked", { skip_if_offline() - unlink(list.files(manage_cache$cache_path_get()), - recursive = TRUE - ) + unlink(list.files(manage_cache$cache_path_get()), recursive = TRUE) withr::local_envvar(R_USER_CACHE_DIR = tempdir()) temp_cache <- file.path(tempdir(), "R/getCRUCLdata/") manage_cache <- hoardr::hoard() diff --git a/tests/testthat/test_get_local.R b/tests/testthat/test_get_local.R index d2083eb..db5ca6d 100644 --- a/tests/testthat/test_get_local.R +++ b/tests/testthat/test_get_local.R @@ -458,19 +458,11 @@ test_that("Test that .get_local lists local files", { ) ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") - utils::write.table(pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(pre_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") - utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE - ) + utils::write.table(tmp_data, file = gz1, col.names = FALSE, row.names = FALSE) close(gz1) pre <- TRUE diff --git a/vignettes/precompile.R b/vignettes/precompile.R index b5a725d..0d3040b 100644 --- a/vignettes/precompile.R +++ b/vignettes/precompile.R @@ -15,8 +15,4 @@ devtools::build_vignettes() # move resource files to /doc resources <- list.files("vignettes/", pattern = ".png$", full.names = TRUE) -file.copy(from = resources, - to = "doc", - overwrite = TRUE) - - +file.copy(from = resources, to = "doc", overwrite = TRUE) From 45aefba390d2fb242ea7e21b8c6b6738b0e1e6d1 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Mon, 3 Mar 2025 17:06:35 +0800 Subject: [PATCH 124/127] fix test that was rightfully not passing --- tests/testthat/test_caching.R | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/testthat/test_caching.R b/tests/testthat/test_caching.R index 8e989b9..3d849b2 100644 --- a/tests/testthat/test_caching.R +++ b/tests/testthat/test_caching.R @@ -32,7 +32,6 @@ test_that("cache directory is created if necessary", { test_that("caching utils list files in cache and delete when asked", { skip_if_offline() - unlink(list.files(manage_cache$cache_path_get()), recursive = TRUE) withr::local_envvar(R_USER_CACHE_DIR = tempdir()) temp_cache <- file.path(tempdir(), "R/getCRUCLdata/") manage_cache <- hoardr::hoard() @@ -46,8 +45,10 @@ test_that("caching utils list files in cache and delete when asked", { f <- terra::rast(system.file("ex/test.grd", package = "terra")) cache_dir <- manage_cache$cache_path_get() - terra::writeRaster(f, file.path(cache_dir, "file1.asc")) - terra::writeRaster(f, file.path(cache_dir, "file2.asc")) + manage_cache$delete_all() + + terra::writeRaster(f, file.path(cache_dir, "file1.grd")) + terra::writeRaster(f, file.path(cache_dir, "file2.grd")) # test getCRUCLdata cache list k <- list.files(manage_cache$cache_path_get()) @@ -56,7 +57,7 @@ test_that("caching utils list files in cache and delete when asked", { # test delete one file expect_error(manage_cache$delete("file1.tif")) - manage_cache$delete("file1.asc") + manage_cache$delete("file1.grd") l <- list.files(manage_cache$cache_path_get()) expect_identical(basename(manage_cache$list()), l) From 72f654945d504ce45b56a05c23c509e31d4e410a Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Mon, 3 Mar 2025 17:07:02 +0800 Subject: [PATCH 125/127] update codemeta.json --- codemeta.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codemeta.json b/codemeta.json index b45f3de..f74219d 100644 --- a/codemeta.json +++ b/codemeta.json @@ -8,7 +8,7 @@ "codeRepository": "https://github.com/ropensci/getCRUCLdata", "issueTracker": "https://github.com/ropensci/getCRUCLdata/issues", "license": "https://spdx.org/licenses/MIT", - "version": "1.0.2", + "version": "1.0.3", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", @@ -254,7 +254,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "913.618KB", + "fileSize": "911.891KB", "citation": [ { "@type": "ScholarlyArticle", From bc711d2d6500d753c19e3fcb5863f95ff2f8af82 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Tue, 4 Mar 2025 20:10:24 +0800 Subject: [PATCH 126/127] update CONTRIBUTING.md --- .github/CONTRIBUTING.md | 45 +++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index fbcc9e7..b5e92d8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,56 +1,57 @@ -# CONTRIBUTING # +# CONTRIBUTING ### Fixing typos Small typos or grammatical errors in documentation may be edited directly using the GitHub web interface, so long as the changes are made in the _source_ file. -* YES: you edit a roxygen comment in a `.R` file below `R/`. -* NO: you edit an `.Rd` file below `man/`. +- YES: you edit a roxygen comment in a `.R` file below `R/`. +- NO: you edit an `.Rd` file below `man/`. ### Prerequisites Before you make a substantial pull request, you should always file an issue and make sure someone from the team agrees that it’s a problem. If you’ve found a -bug, create an associated issue and illustrate the bug with a minimal +bug, create an associated issue and illustrate the bug with a minimal [reprex](https://www.tidyverse.org/help/#reprex). ### Pull request process -* We recommend that you create a Git branch for each pull request (PR). -* Look at the Travis and AppVeyor build status before and after making changes. -The `README` should contain badges for any continuous integration services used -by the package. -* We recommend the tidyverse [style guide](http://style.tidyverse.org). -You can use the [styler](https://CRAN.R-project.org/package=styler) package to -apply these styles, but please don't restyle code that has nothing to do with -your PR. -* We use [roxygen2](https://cran.r-project.org/package=roxygen2). -* We use [testthat](https://cran.r-project.org/package=testthat). Contributions -with test cases included are easier to accept. -* For user-facing changes, add a bullet to the top of `NEWS.md` below the -current development version header describing the changes made followed by your -GitHub username, and links to relevant issue(s)/PR(s). +- We recommend that you create a Git branch for each pull request (PR). +- Look at the Travis and AppVeyor build status before and after making changes. + The `README` should contain badges for any continuous integration services used + by the package. +- We recommend the tidyverse [style guide](http://style.tidyverse.org). + You can use the [styler](https://CRAN.R-project.org/package=styler) package or + the [Air formatter](https://posit-dev.github.io/air/formatter.html) to apply + these styles, but please don't restyle code that has nothing to do with your PR. +- We use [roxygen2](https://cran.r-project.org/package=roxygen2). +- We use [testthat](https://cran.r-project.org/package=testthat). Contributions + with test cases included are easier to accept. +- For user-facing changes, add a bullet to the top of `NEWS.md` below the + current development version header describing the changes made followed by your + GitHub username, and links to relevant issue(s)/PR(s). ### Code of Conduct -Please note that the getCRUCLdata project is released with a +Please note that the nasapower project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By contributing to this project you agree to abide by its terms. ### See rOpenSci [contributing guide](https://ropensci.github.io/dev_guide/contributingguide.html) + for further details. ### Discussion forum Check out our [discussion forum](https://discuss.ropensci.org) if you think your issue requires a longer form discussion. -### Prefer to Email? +### Prefer to Email? Email the person listed as maintainer in the `DESCRIPTION` file of this repo. Though note that private discussions over email don't help others - of course email is totally warranted if it's a sensitive problem of any kind. -### Thanks for contributing! +### Thanks for contributing -This contributing guide is adapted from the tidyverse contributing guide available at https://raw.githubusercontent.com/r-lib/usethis/master/inst/templates/tidy-contributing.md +This contributing guide is adapted from the tidyverse contributing guide available at From 1555031f739979bed196c923e2a3a261ea98c1ff Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Thu, 6 Mar 2025 16:12:13 +0800 Subject: [PATCH 127/127] set up flir --- .Rbuildignore | 4 + .github/workflows/flir.yaml | 37 +++++ flir/cache_file_state.rds | Bin 0 -> 44 bytes flir/config.yml | 51 +++++++ flir/rules/builtin/T_and_F_symbol.yml | 97 +++++++++++++ flir/rules/builtin/absolute_path.yml | 13 ++ flir/rules/builtin/any_duplicated.yml | 91 +++++++++++++ flir/rules/builtin/any_is_na.yml | 25 ++++ flir/rules/builtin/class_equals.yml | 42 ++++++ flir/rules/builtin/condition_message.yml | 23 ++++ flir/rules/builtin/double_assignment.yml | 23 ++++ flir/rules/builtin/duplicate_argument.yml | 46 +++++++ flir/rules/builtin/empty_assignment.yml | 15 +++ flir/rules/builtin/equal_assignment.yml | 10 ++ flir/rules/builtin/equals_na.yml | 37 +++++ flir/rules/builtin/expect_comparison.yml | 37 +++++ flir/rules/builtin/expect_identical.yml | 42 ++++++ flir/rules/builtin/expect_length.yml | 15 +++ flir/rules/builtin/expect_named.yml | 79 +++++++++++ flir/rules/builtin/expect_not.yml | 23 ++++ flir/rules/builtin/expect_null.yml | 22 +++ flir/rules/builtin/expect_true_false.yml | 28 ++++ flir/rules/builtin/expect_type.yml | 51 +++++++ flir/rules/builtin/for_loop_index.yml | 27 ++++ flir/rules/builtin/function_return.yml | 11 ++ flir/rules/builtin/implicit_assignment.yml | 69 ++++++++++ flir/rules/builtin/is_numeric.yml | 25 ++++ flir/rules/builtin/length_levels.yml | 7 + flir/rules/builtin/length_test.yml | 59 ++++++++ flir/rules/builtin/lengths.yml | 59 ++++++++ flir/rules/builtin/library_call.yml | 26 ++++ flir/rules/builtin/list_comparison.yml | 18 +++ flir/rules/builtin/literal_coercion.yml | 89 ++++++++++++ flir/rules/builtin/matrix_apply.yml | 142 ++++++++++++++++++++ flir/rules/builtin/missing_argument.yml | 44 ++++++ flir/rules/builtin/nested_ifelse.yml | 29 ++++ flir/rules/builtin/numeric_leading_zero.yml | 11 ++ flir/rules/builtin/outer_negation.yml | 29 ++++ flir/rules/builtin/package_hooks.yml | 127 +++++++++++++++++ flir/rules/builtin/paste.yml | 75 +++++++++++ flir/rules/builtin/redundant_equals.yml | 29 ++++ flir/rules/builtin/redundant_ifelse.yml | 67 +++++++++ flir/rules/builtin/rep_len.yml | 7 + flir/rules/builtin/right_assignment.yml | 10 ++ flir/rules/builtin/sample_int.yml | 43 ++++++ flir/rules/builtin/semicolon.yml | 10 ++ flir/rules/builtin/seq.yml | 121 +++++++++++++++++ flir/rules/builtin/sort.yml | 85 ++++++++++++ flir/rules/builtin/stopifnot_all.yml | 24 ++++ flir/rules/builtin/todo_comment.yml | 7 + flir/rules/builtin/undesirable_function.yml | 13 ++ flir/rules/builtin/undesirable_operator.yml | 29 ++++ flir/rules/builtin/unnecessary_nesting.yml | 36 +++++ flir/rules/builtin/unreachable_code.yml | 64 +++++++++ flir/rules/builtin/which_grepl.yml | 7 + getCRUCLdata.Rproj | 21 +++ 56 files changed, 2231 insertions(+) create mode 100644 .github/workflows/flir.yaml create mode 100644 flir/cache_file_state.rds create mode 100644 flir/config.yml create mode 100644 flir/rules/builtin/T_and_F_symbol.yml create mode 100644 flir/rules/builtin/absolute_path.yml create mode 100644 flir/rules/builtin/any_duplicated.yml create mode 100644 flir/rules/builtin/any_is_na.yml create mode 100644 flir/rules/builtin/class_equals.yml create mode 100644 flir/rules/builtin/condition_message.yml create mode 100644 flir/rules/builtin/double_assignment.yml create mode 100644 flir/rules/builtin/duplicate_argument.yml create mode 100644 flir/rules/builtin/empty_assignment.yml create mode 100644 flir/rules/builtin/equal_assignment.yml create mode 100644 flir/rules/builtin/equals_na.yml create mode 100644 flir/rules/builtin/expect_comparison.yml create mode 100644 flir/rules/builtin/expect_identical.yml create mode 100644 flir/rules/builtin/expect_length.yml create mode 100644 flir/rules/builtin/expect_named.yml create mode 100644 flir/rules/builtin/expect_not.yml create mode 100644 flir/rules/builtin/expect_null.yml create mode 100644 flir/rules/builtin/expect_true_false.yml create mode 100644 flir/rules/builtin/expect_type.yml create mode 100644 flir/rules/builtin/for_loop_index.yml create mode 100644 flir/rules/builtin/function_return.yml create mode 100644 flir/rules/builtin/implicit_assignment.yml create mode 100644 flir/rules/builtin/is_numeric.yml create mode 100644 flir/rules/builtin/length_levels.yml create mode 100644 flir/rules/builtin/length_test.yml create mode 100644 flir/rules/builtin/lengths.yml create mode 100644 flir/rules/builtin/library_call.yml create mode 100644 flir/rules/builtin/list_comparison.yml create mode 100644 flir/rules/builtin/literal_coercion.yml create mode 100644 flir/rules/builtin/matrix_apply.yml create mode 100644 flir/rules/builtin/missing_argument.yml create mode 100644 flir/rules/builtin/nested_ifelse.yml create mode 100644 flir/rules/builtin/numeric_leading_zero.yml create mode 100644 flir/rules/builtin/outer_negation.yml create mode 100644 flir/rules/builtin/package_hooks.yml create mode 100644 flir/rules/builtin/paste.yml create mode 100644 flir/rules/builtin/redundant_equals.yml create mode 100644 flir/rules/builtin/redundant_ifelse.yml create mode 100644 flir/rules/builtin/rep_len.yml create mode 100644 flir/rules/builtin/right_assignment.yml create mode 100644 flir/rules/builtin/sample_int.yml create mode 100644 flir/rules/builtin/semicolon.yml create mode 100644 flir/rules/builtin/seq.yml create mode 100644 flir/rules/builtin/sort.yml create mode 100644 flir/rules/builtin/stopifnot_all.yml create mode 100644 flir/rules/builtin/todo_comment.yml create mode 100644 flir/rules/builtin/undesirable_function.yml create mode 100644 flir/rules/builtin/undesirable_operator.yml create mode 100644 flir/rules/builtin/unnecessary_nesting.yml create mode 100644 flir/rules/builtin/unreachable_code.yml create mode 100644 flir/rules/builtin/which_grepl.yml create mode 100644 getCRUCLdata.Rproj diff --git a/.Rbuildignore b/.Rbuildignore index 49ed843..6901b71 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -31,3 +31,7 @@ ^man/dot-create_stack\.Rd$ ^man/dot-set_cache\.Rd$ ^man/dot-get_local\.Rd$ + + +# flir files +^flir$ diff --git a/.github/workflows/flir.yaml b/.github/workflows/flir.yaml new file mode 100644 index 0000000..a82408f --- /dev/null +++ b/.github/workflows/flir.yaml @@ -0,0 +1,37 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + release: + types: [published] + workflow_dispatch: + +name: flir + +jobs: + flir: + runs-on: macOS-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: flir-${{ github.event_name != 'pull_request' || github.run_id }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + + - name: Install flir + run: install.packages("flir", repos = c("https://etiennebacher.r-universe.dev/", getOption("repos"))) + shell: Rscript {0} + + - name: Run flir + run: flir::lint() + shell: Rscript {0} + env: + FLIR_ERROR_ON_LINT: true diff --git a/flir/cache_file_state.rds b/flir/cache_file_state.rds new file mode 100644 index 0000000000000000000000000000000000000000..b8cafa45bcdfa1d213bd233dd6c72780e7314417 GIT binary patch literal 44 vcmb2|=3oE==I#ec2?+^l35jWG32CfGk`d0%cS>{{dg>Xr@2!@Q1}Xvo3Mve= literal 0 HcmV?d00001 diff --git a/flir/config.yml b/flir/config.yml new file mode 100644 index 0000000..6909752 --- /dev/null +++ b/flir/config.yml @@ -0,0 +1,51 @@ +keep: + - any_duplicated + - any_is_na + - class_equals + - condition_message + - double_assignment + - duplicate_argument + - empty_assignment + - equal_assignment + - equals_na + - expect_comparison + - expect_identical + - expect_length + - expect_named + - expect_not + - expect_null + - expect_true_false + - expect_type + - for_loop_index + - function_return + - implicit_assignment + - is_numeric + - length_levels + - length_test + - lengths + - library_call + - list_comparison + - literal_coercion + - matrix_apply + - missing_argument + - nested_ifelse + - numeric_leading_zero + - outer_negation + - package_hooks + - paste + - redundant_equals + - redundant_ifelse + - rep_len + - right_assignment + - sample_int + - semicolon + - seq + - sort + - stopifnot_all + - T_and_F_symbol + - todo_comment + - undesirable_function + - undesirable_operator + - unnecessary_nesting + - unreachable_code + - which_grepl diff --git a/flir/rules/builtin/T_and_F_symbol.yml b/flir/rules/builtin/T_and_F_symbol.yml new file mode 100644 index 0000000..ebe54ba --- /dev/null +++ b/flir/rules/builtin/T_and_F_symbol.yml @@ -0,0 +1,97 @@ +id: true_false_symbol +language: r +severity: warning +rule: + pattern: T + kind: identifier + not: + any: + - precedes: + any: + - pattern: <- + - pattern: = + - regex: ^~$ + - follows: + any: + - pattern: $ + - regex: ^~$ + - inside: + any: + - kind: parameter + - kind: call + - kind: binary_operator + follows: + regex: ^~$ + stopBy: end + stopBy: + kind: + argument +fix: TRUE +message: Use TRUE instead of the symbol T. + +--- + +id: true_false_symbol-2 +language: r +severity: warning +rule: + pattern: F + kind: identifier + not: + any: + - precedes: + any: + - pattern: <- + - pattern: = + - regex: ^~$ + - follows: + any: + - pattern: $ + - regex: ^~$ + - inside: + any: + - kind: parameter + - kind: call + - kind: binary_operator + follows: + regex: ^~$ + stopBy: end + stopBy: + kind: + argument +fix: FALSE +message: Use FALSE instead of the symbol F. + +--- + +id: true_false_symbol-3 +language: r +severity: warning +rule: + pattern: T + kind: identifier + precedes: + any: + - pattern: <- + - pattern: = + not: + inside: + kind: argument +message: Don't use T as a variable name, as it can break code relying on T being TRUE. + +--- + +id: true_false_symbol-4 +language: r +severity: warning +rule: + pattern: F + kind: identifier + precedes: + any: + - pattern: <- + - pattern: = + not: + inside: + kind: argument +message: Don't use F as a variable name, as it can break code relying on F being FALSE. diff --git a/flir/rules/builtin/absolute_path.yml b/flir/rules/builtin/absolute_path.yml new file mode 100644 index 0000000..2c5bb3d --- /dev/null +++ b/flir/rules/builtin/absolute_path.yml @@ -0,0 +1,13 @@ +# id: absolute_path-1 +# language: r +# severity: warning +# rule: +# kind: string_content +# any: +# - regex: '^~[[:alpha:]]' +# - regex: '^~/[[:alpha:]]' +# - regex: '^[[:alpha:]]:' +# - regex: '^(/|~)$' +# - regex: '^/[[:alpha:]]' +# - regex: '^\\' +# message: Do not use absolute paths. diff --git a/flir/rules/builtin/any_duplicated.yml b/flir/rules/builtin/any_duplicated.yml new file mode 100644 index 0000000..514b028 --- /dev/null +++ b/flir/rules/builtin/any_duplicated.yml @@ -0,0 +1,91 @@ +id: any_duplicated-1 +language: r +severity: warning +rule: + pattern: any($$$ duplicated($MYVAR) $$$) +fix: anyDuplicated(~~MYVAR~~) > 0 +message: anyDuplicated(x, ...) > 0 is better than any(duplicated(x), ...). + +--- + +id: any_duplicated-2 +language: r +severity: warning +rule: + any: + - pattern: length(unique($MYVAR)) == length($MYVAR) + - pattern: length($MYVAR) == length(unique($MYVAR)) +fix: anyDuplicated(~~MYVAR~~) == 0L +message: anyDuplicated(x) == 0L is better than length(unique(x)) == length(x). + +--- + +id: any_duplicated-3 +language: r +severity: warning +rule: + pattern: length(unique($MYVAR)) != length($MYVAR) +fix: anyDuplicated(~~MYVAR~~) != 0L +message: | + Use anyDuplicated(x) != 0L (or > or <) instead of length(unique(x)) != length(x) + (or > or <). + +--- + +id: any_duplicated-4 +language: r +severity: warning +rule: + any: + - pattern: nrow($DATA) != length(unique($DATA$µCOL)) + - pattern: length(unique($DATA$µCOL)) != nrow($DATA) +fix: anyDuplicated(~~DATA~~$~~COL~~) != 0L +message: | + anyDuplicated(DF$col) != 0L is better than length(unique(DF$col)) != nrow(DF) + +--- + +# id: any_duplicated-5 +# language: r +# severity: warning +# rule: +# any: +# - pattern: +# context: nrow($DATA) != length(unique($DATA[["µCOL"]])) +# strictness: ast +# - pattern: +# context: length(unique($DATA[["µCOL"]])) != nrow($DATA) +# strictness: ast +# fix: anyDuplicated(~~DATA~~[["~~COL~~"]]) != 0L +# message: | +# anyDuplicated(DF[["col"]]) != 0L is better than length(unique(DF[["col"]])) != nrow(DF) +# +# --- + +id: any_duplicated-6 +language: r +severity: warning +rule: + any: + - pattern: nrow($DATA) == length(unique($DATA$µCOL)) + - pattern: length(unique($DATA$µCOL)) == nrow($DATA) +fix: anyDuplicated(~~DATA~~$~~COL~~) == 0L +message: | + anyDuplicated(DF$col) == 0L is better than length(unique(DF$col)) == nrow(DF) + +# --- +# +# id: any_duplicated-7 +# language: r +# severity: warning +# rule: +# any: +# - pattern: +# context: nrow($DATA) == length(unique($DATA[["µCOL"]])) +# strictness: ast +# - pattern: +# context: length(unique($DATA[["µCOL"]])) == nrow($DATA) +# strictness: ast +# fix: anyDuplicated(~~DATA~~[["~~COL~~"]]) == 0L +# message: | +# anyDuplicated(DF[["col"]]) == 0L is better than length(unique(DF[["col"]])) == nrow(DF) diff --git a/flir/rules/builtin/any_is_na.yml b/flir/rules/builtin/any_is_na.yml new file mode 100644 index 0000000..68acfae --- /dev/null +++ b/flir/rules/builtin/any_is_na.yml @@ -0,0 +1,25 @@ +id: any_na-1 +language: r +severity: warning +rule: + any: + - pattern: any(is.na($MYVAR)) + - pattern: any(na.rm = $NARM, is.na($MYVAR)) + - pattern: any(is.na($MYVAR), na.rm = $NARM) +fix: anyNA(~~MYVAR~~) +message: anyNA(x) is better than any(is.na(x)). + +--- + +id: any_na-2 +language: r +severity: warning +rule: + any: + - pattern: NA %in% $ELEM + - pattern: NA_real_ %in% $ELEM + - pattern: NA_logical_ %in% $ELEM + - pattern: NA_character_ %in% $ELEM + - pattern: NA_complex_ %in% $ELEM +fix: anyNA(~~ELEM~~) +message: anyNA(x) is better than NA %in% x. diff --git a/flir/rules/builtin/class_equals.yml b/flir/rules/builtin/class_equals.yml new file mode 100644 index 0000000..2b7eb4c --- /dev/null +++ b/flir/rules/builtin/class_equals.yml @@ -0,0 +1,42 @@ +id: class_equals-1 +language: r +severity: warning +rule: + any: + - pattern: class($VAR) == $CLASSNAME + - pattern: $CLASSNAME == class($VAR) + not: + inside: + kind: argument +fix: inherits(~~VAR~~, ~~CLASSNAME~~) +message: Instead of comparing class(x) with ==, use inherits(x, 'class-name') or is. or is(x, 'class') + +--- + +id: class_equals-2 +language: r +severity: warning +rule: + any: + - pattern: class($VAR) != $CLASSNAME + - pattern: $CLASSNAME != class($VAR) + not: + inside: + kind: argument +fix: "!inherits(~~VAR~~, ~~CLASSNAME~~)" +message: "Instead of comparing class(x) with !=, use !inherits(x, 'class-name') or is. or is(x, 'class')" + +--- + +id: class_equals-3 +language: r +severity: warning +rule: + any: + - pattern: $CLASSNAME %in% class($VAR) + - pattern: class($VAR) %in% $CLASSNAME +constraints: + CLASSNAME: + kind: string +fix: inherits(~~VAR~~, ~~CLASSNAME~~) +message: Instead of comparing class(x) with %in%, use inherits(x, 'class-name') or is. or is(x, 'class') diff --git a/flir/rules/builtin/condition_message.yml b/flir/rules/builtin/condition_message.yml new file mode 100644 index 0000000..eb32466 --- /dev/null +++ b/flir/rules/builtin/condition_message.yml @@ -0,0 +1,23 @@ +id: condition_message-1 +language: r +severity: warning +rule: + pattern: $FUN($$$ paste0($$$MSG) $$$) + kind: call + not: + any: + - has: + kind: extract_operator + - has: + stopBy: end + kind: argument + has: + field: name + regex: "^collapse|recycle0$" + stopBy: end +constraints: + FUN: + regex: "^(packageStartupMessage|stop|warning)$" +fix: ~~FUN~~(~~MSG~~) +message: | + ~~FUN~~(paste0(...)) can be rewritten as ~~FUN~~(...). diff --git a/flir/rules/builtin/double_assignment.yml b/flir/rules/builtin/double_assignment.yml new file mode 100644 index 0000000..60a04e2 --- /dev/null +++ b/flir/rules/builtin/double_assignment.yml @@ -0,0 +1,23 @@ +id: right_double_assignment +language: r +severity: hint +rule: + pattern: $RHS ->> $LHS + has: + field: rhs + kind: identifier +message: ->> can have hard-to-predict behavior; prefer assigning to a + specific environment instead (with assign() or <-). + +--- + +id: left_double_assignment +language: r +severity: hint +rule: + pattern: $LHS <<- $RHS + has: + field: lhs + kind: identifier +message: <<- can have hard-to-predict behavior; prefer assigning to a + specific environment instead (with assign() or <-). diff --git a/flir/rules/builtin/duplicate_argument.yml b/flir/rules/builtin/duplicate_argument.yml new file mode 100644 index 0000000..415b9ff --- /dev/null +++ b/flir/rules/builtin/duplicate_argument.yml @@ -0,0 +1,46 @@ +id: duplicate_argument-1 +language: r +severity: warning +rule: + # Look for a function argument... + kind: argument + any: + - has: + kind: identifier + field: name + pattern: $OBJ + - has: + kind: string_content + pattern: $OBJ + stopBy: end + + # ... that follows other argument(s) with the same name... + follows: + kind: argument + stopBy: end + has: + stopBy: end + kind: identifier + field: name + pattern: $OBJ + + # ... inside a function call (or a subset environment for data.table)... + inside: + kind: arguments + follows: + any: + - kind: identifier + pattern: $FUN + - kind: string + inside: + any: + - kind: call + - kind: subset + +# ... that is not a function listed below. +constraints: + FUN: + not: + regex: ^(mutate|transmute)$ + +message: Avoid duplicate arguments in function calls. diff --git a/flir/rules/builtin/empty_assignment.yml b/flir/rules/builtin/empty_assignment.yml new file mode 100644 index 0000000..ccc995f --- /dev/null +++ b/flir/rules/builtin/empty_assignment.yml @@ -0,0 +1,15 @@ +id: empty_assignment-1 +language: r +severity: warning +rule: + any: + - pattern: $OBJ <- {} + - pattern: $OBJ <- {$CONTENT} + - pattern: $OBJ = {} + - pattern: $OBJ = {$CONTENT} +constraints: + CONTENT: + regex: ^\s+$ +message: | + Assign NULL explicitly or, whenever possible, allocate the empty object with + the right type and size. diff --git a/flir/rules/builtin/equal_assignment.yml b/flir/rules/builtin/equal_assignment.yml new file mode 100644 index 0000000..77074fe --- /dev/null +++ b/flir/rules/builtin/equal_assignment.yml @@ -0,0 +1,10 @@ +id: equal_assignment +language: r +severity: hint +rule: + pattern: $LHS = $RHS + has: + field: lhs + kind: identifier +fix: ~~LHS~~ <- ~~RHS~~ +message: Use <-, not =, for assignment. diff --git a/flir/rules/builtin/equals_na.yml b/flir/rules/builtin/equals_na.yml new file mode 100644 index 0000000..64e7454 --- /dev/null +++ b/flir/rules/builtin/equals_na.yml @@ -0,0 +1,37 @@ +id: equals_na +language: r +severity: warning +rule: + any: + - pattern: $MYVAR == NA + - pattern: $MYVAR == NA_integer_ + - pattern: $MYVAR == NA_real_ + - pattern: $MYVAR == NA_complex_ + - pattern: $MYVAR == NA_character_ + - pattern: NA == $MYVAR + - pattern: NA_integer_ == $MYVAR + - pattern: NA_real_ == $MYVAR + - pattern: NA_complex_ == $MYVAR + - pattern: NA_character_ == $MYVAR +fix: is.na(~~MYVAR~~) +message: Use is.na for comparisons to NA (not == or !=). + +--- + +id: equals_na-2 +language: r +severity: warning +rule: + any: + - pattern: $MYVAR != NA + - pattern: $MYVAR != NA_integer_ + - pattern: $MYVAR != NA_real_ + - pattern: $MYVAR != NA_complex_ + - pattern: $MYVAR != NA_character_ + - pattern: NA != $MYVAR + - pattern: NA_integer_ != $MYVAR + - pattern: NA_real_ != $MYVAR + - pattern: NA_complex_ != $MYVAR + - pattern: NA_character_ != $MYVAR +fix: is.na(~~MYVAR~~) +message: Use is.na for comparisons to NA (not == or !=). diff --git a/flir/rules/builtin/expect_comparison.yml b/flir/rules/builtin/expect_comparison.yml new file mode 100644 index 0000000..6af9bb1 --- /dev/null +++ b/flir/rules/builtin/expect_comparison.yml @@ -0,0 +1,37 @@ +id: expect_comparison-1 +language: r +severity: warning +rule: + pattern: expect_true($X > $Y) +fix: expect_gt(~~X~~, ~~Y~~) +message: expect_gt(x, y) is better than expect_true(x > y). + +--- + +id: expect_comparison-2 +language: r +severity: warning +rule: + pattern: expect_true($X >= $Y) +fix: expect_gte(~~X~~, ~~Y~~) +message: expect_gte(x, y) is better than expect_true(x >= y). + +--- + +id: expect_comparison-3 +language: r +severity: warning +rule: + pattern: expect_true($X < $Y) +fix: expect_lt(~~X~~, ~~Y~~) +message: expect_lt(x, y) is better than expect_true(x < y). + +--- + +id: expect_comparison-4 +language: r +severity: warning +rule: + pattern: expect_true($X <= $Y) +fix: expect_lte(~~X~~, ~~Y~~) +message: expect_lte(x, y) is better than expect_true(x <= y). diff --git a/flir/rules/builtin/expect_identical.yml b/flir/rules/builtin/expect_identical.yml new file mode 100644 index 0000000..3af5a85 --- /dev/null +++ b/flir/rules/builtin/expect_identical.yml @@ -0,0 +1,42 @@ +id: expect_identical-1 +language: r +severity: warning +rule: + pattern: expect_true(identical($VAL1, $VAL2)) +fix: expect_identical(~~VAL1~~, ~~VAL2~~) +message: Use expect_identical(x, y) instead of expect_true(identical(x, y)). + +--- + +id: expect_identical-2 +language: r +severity: warning +rule: + pattern: expect_equal($VAL1, $VAL2) +fix: expect_identical(~~VAL1~~, ~~VAL2~~) +constraints: + VAL1: + all: + - not: + has: + stopBy: end + kind: float + regex: \. + - not: + regex: ^typeof + - not: + pattern: NULL + VAL2: + all: + - not: + has: + stopBy: end + kind: float + regex: \. + - not: + regex: ^typeof + - not: + pattern: NULL +message: | + Use expect_identical(x, y) by default; resort to expect_equal() only when + needed, e.g. when setting ignore_attr= or tolerance=. diff --git a/flir/rules/builtin/expect_length.yml b/flir/rules/builtin/expect_length.yml new file mode 100644 index 0000000..fe233a7 --- /dev/null +++ b/flir/rules/builtin/expect_length.yml @@ -0,0 +1,15 @@ +id: expect_length-1 +language: r +severity: warning +rule: + any: + - pattern: $FUN(length($OBJ), $VALUE) + - pattern: $FUN($VALUE, length($OBJ)) +constraints: + FUN: + regex: ^(expect_identical|expect_equal)$ + VALUE: + not: + regex: length\( +fix: expect_length(~~OBJ~~, ~~VALUE~~) +message: expect_length(x, n) is better than ~~FUN~~(length(x), n). diff --git a/flir/rules/builtin/expect_named.yml b/flir/rules/builtin/expect_named.yml new file mode 100644 index 0000000..7d0691e --- /dev/null +++ b/flir/rules/builtin/expect_named.yml @@ -0,0 +1,79 @@ +id: expect_named-1 +language: r +severity: warning +rule: + any: + - pattern: + context: expect_identical(names($OBJ), $VALUES) + strictness: ast + - pattern: + context: expect_identical($VALUES, names($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: ^(colnames\(|rownames\(|dimnames\(|NULL|names\() + has: + kind: null +fix: expect_named(~~OBJ~~, ~~VALUES~~) +message: expect_named(x, n) is better than expect_identical(names(x), n). + +--- + +id: expect_named-2 +language: r +severity: warning +rule: + any: + - pattern: + context: expect_equal(names($OBJ), $VALUES) + strictness: ast + - pattern: + context: expect_equal($VALUES, names($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: ^(colnames\(|rownames\(|dimnames\(|NULL|names\() +fix: expect_named(~~OBJ~~, ~~VALUES~~) +message: expect_named(x, n) is better than expect_equal(names(x), n). + +--- + +id: expect_named-3 +language: r +severity: warning +rule: + any: + - pattern: + context: testthat::expect_identical(names($OBJ), $VALUES) + strictness: ast + - pattern: + context: testthat::expect_identical($VALUES, names($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: ^(colnames\(|rownames\(|dimnames\(|NULL|names\() +fix: testthat::expect_named(~~OBJ~~, ~~VALUES~~) +message: expect_named(x, n) is better than expect_identical(names(x), n). + +--- + +id: expect_named-4 +language: r +severity: warning +rule: + any: + - pattern: + context: testthat::expect_equal(names($OBJ), $VALUES) + strictness: ast + - pattern: + context: testthat::expect_equal($VALUES, names($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: ^(colnames\(|rownames\(|dimnames\(|NULL|names\() +fix: testthat::expect_named(~~OBJ~~, ~~VALUES~~) +message: expect_named(x, n) is better than expect_equal(names(x), n). diff --git a/flir/rules/builtin/expect_not.yml b/flir/rules/builtin/expect_not.yml new file mode 100644 index 0000000..3a23e9f --- /dev/null +++ b/flir/rules/builtin/expect_not.yml @@ -0,0 +1,23 @@ +id: expect_not-1 +language: r +severity: warning +rule: + all: + - pattern: expect_true(!$COND) + - not: + regex: '^expect_true\(!!' +fix: expect_false(~~COND~~) +message: expect_false(x) is better than expect_true(!x), and vice versa. + +--- + +id: expect_not-2 +language: r +severity: warning +rule: + all: + - pattern: expect_false(!$COND) + - not: + regex: '^expect_false\(!!' +fix: expect_true(~~COND~~) +message: expect_false(x) is better than expect_true(!x), and vice versa. diff --git a/flir/rules/builtin/expect_null.yml b/flir/rules/builtin/expect_null.yml new file mode 100644 index 0000000..7888fdb --- /dev/null +++ b/flir/rules/builtin/expect_null.yml @@ -0,0 +1,22 @@ +id: expect_null-1 +language: r +severity: warning +rule: + any: + - pattern: $FUN(NULL, $VALUES) + - pattern: $FUN($VALUES, NULL) +constraints: + FUN: + regex: ^(expect_identical|expect_equal)$ +fix: expect_null(~~VALUES~~) +message: expect_null(x) is better than ~~FUN~~(x, NULL). + +--- + +id: expect_null-2 +language: r +severity: warning +rule: + pattern: expect_true(is.null($VALUES)) +fix: expect_null(~~VALUES~~) +message: expect_null(x) is better than expect_true(is.null(x)). diff --git a/flir/rules/builtin/expect_true_false.yml b/flir/rules/builtin/expect_true_false.yml new file mode 100644 index 0000000..784843d --- /dev/null +++ b/flir/rules/builtin/expect_true_false.yml @@ -0,0 +1,28 @@ +id: expect_true_false-1 +language: r +severity: warning +rule: + any: + - pattern: $FUN(TRUE, $VALUES) + - pattern: $FUN($VALUES, TRUE) +constraints: + FUN: + regex: ^(expect_identical|expect_equal)$ +fix: expect_true(~~VALUES~~) +message: expect_true(x) is better than ~~FUN~~(x, TRUE). + +--- + +id: expect_true_false-2 +language: r +severity: warning +rule: + any: + - pattern: $FUN(FALSE, $VALUES) + - pattern: $FUN($VALUES, FALSE) +constraints: + FUN: + regex: ^(expect_identical|expect_equal)$ +fix: expect_false(~~VALUES~~) +message: expect_false(x) is better than ~~FUN~~(x, FALSE). + diff --git a/flir/rules/builtin/expect_type.yml b/flir/rules/builtin/expect_type.yml new file mode 100644 index 0000000..1ab20ec --- /dev/null +++ b/flir/rules/builtin/expect_type.yml @@ -0,0 +1,51 @@ +id: expect_type-1 +language: r +severity: warning +rule: + any: + - pattern: + context: expect_identical(typeof($OBJ), $VALUES) + strictness: ast + - pattern: + context: expect_identical($VALUES, typeof($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: typeof +fix: expect_type(~~OBJ~~, ~~VALUES~~) +message: expect_type(x, t) is better than expect_identical(typeof(x), t). + +--- + +id: expect_type-2 +language: r +severity: warning +rule: + any: + - pattern: + context: expect_equal(typeof($OBJ), $VALUES) + strictness: ast + - pattern: + context: expect_equal($VALUES, typeof($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: typeof +fix: expect_type(~~OBJ~~, ~~VALUES~~) +message: expect_type(x, t) is better than expect_equal(typeof(x), t). + +--- + +id: expect_type-3 +language: r +severity: warning +rule: + pattern: expect_true($FUN($OBJ)) +constraints: + FUN: + regex: ^is\. + not: + regex: data\.frame$ +message: expect_type(x, t) is better than expect_true(is.(x)). diff --git a/flir/rules/builtin/for_loop_index.yml b/flir/rules/builtin/for_loop_index.yml new file mode 100644 index 0000000..e5b28b4 --- /dev/null +++ b/flir/rules/builtin/for_loop_index.yml @@ -0,0 +1,27 @@ +id: for_loop_index-1 +language: r +severity: warning +rule: + pattern: for ($IDX in $IDX) +message: Don't re-use any sequence symbols as the index symbol in a for loop. + +--- + +id: for_loop_index-2 +language: r +severity: warning +rule: + pattern: for ($IDX in $SEQ) +constraints: + SEQ: + kind: call + has: + kind: arguments + has: + kind: argument + stopBy: end + has: + kind: identifier + field: value + pattern: $IDX +message: Don't re-use any sequence symbols as the index symbol in a for loop. diff --git a/flir/rules/builtin/function_return.yml b/flir/rules/builtin/function_return.yml new file mode 100644 index 0000000..31ba46b --- /dev/null +++ b/flir/rules/builtin/function_return.yml @@ -0,0 +1,11 @@ +id: function_return-1 +language: r +severity: warning +rule: + any: + - pattern: return($OBJ <- $VAL) + - pattern: return($OBJ <<- $VAL) + - pattern: return($VAL -> $OBJ) + - pattern: return($VAL ->> $OBJ) +message: | + Move the assignment outside of the return() clause, or skip assignment altogether. diff --git a/flir/rules/builtin/implicit_assignment.yml b/flir/rules/builtin/implicit_assignment.yml new file mode 100644 index 0000000..133a40e --- /dev/null +++ b/flir/rules/builtin/implicit_assignment.yml @@ -0,0 +1,69 @@ +id: implicit_assignment-1 +language: r +severity: warning +rule: + any: + - pattern: $RECEIVER <- $VALUE + - pattern: $RECEIVER <<- $VALUE + - pattern: $VALUE -> $RECEIVER + - pattern: $VALUE ->> $RECEIVER + inside: + any: + - kind: if_statement + - kind: while_statement + field: condition + stopBy: end + strictness: cst +message: | + Avoid implicit assignments in function calls. For example, instead of + `if (x <- 1L) { ... }`, write `x <- 1L; if (x) { ... }`. + +--- + +id: implicit_assignment-2 +language: r +severity: warning +rule: + any: + - pattern: $RECEIVER <- $VALUE + - pattern: $RECEIVER <<- $VALUE + - pattern: $VALUE -> $RECEIVER + - pattern: $VALUE ->> $RECEIVER + inside: + kind: for_statement + field: sequence + stopBy: end + strictness: cst +message: | + Avoid implicit assignments in function calls. For example, instead of + `if (x <- 1L) { ... }`, write `x <- 1L; if (x) { ... }`. + +# --- +# +# id: implicit_assignment-3 +# language: r +# severity: warning +# rule: +# any: +# - pattern: $RECEIVER <- $VALUE +# - pattern: $RECEIVER <<- $VALUE +# - pattern: $VALUE -> $RECEIVER +# - pattern: $VALUE ->> $RECEIVER +# inside: +# kind: argument +# field: value +# strictness: cst +# stopBy: end +# not: +# inside: +# kind: call +# field: function +# has: +# kind: identifier +# regex: ^(lapply)$ +# stopBy: end +# strictness: cst +# message: | +# Avoid implicit assignments in function calls. For example, instead of +# `if (x <- 1L) { ... }`, write `x <- 1L; if (x) { ... }`. + diff --git a/flir/rules/builtin/is_numeric.yml b/flir/rules/builtin/is_numeric.yml new file mode 100644 index 0000000..0a76b08 --- /dev/null +++ b/flir/rules/builtin/is_numeric.yml @@ -0,0 +1,25 @@ +id: is_numeric-1 +language: r +severity: warning +rule: + any: + - pattern: is.numeric($VAR) || is.integer($VAR) + - pattern: is.integer($VAR) || is.numeric($VAR) +message: is.numeric(x) || is.integer(x) can be simplified to is.numeric(x). Use + is.double(x) to test for objects stored as 64-bit floating point. + +--- + +id: is_numeric-2 +language: r +severity: warning +rule: + any: + - pattern: + context: class($VAR) %in% c("numeric", "integer") + strictness: ast + - pattern: + context: class($VAR) %in% c("integer", "numeric") + strictness: ast +message: class(x) %in% c("numeric", "integer") can be simplified to is.numeric(x). Use + is.double(x) to test for objects stored as 64-bit floating point. diff --git a/flir/rules/builtin/length_levels.yml b/flir/rules/builtin/length_levels.yml new file mode 100644 index 0000000..8e02978 --- /dev/null +++ b/flir/rules/builtin/length_levels.yml @@ -0,0 +1,7 @@ +id: length_levels-1 +language: r +severity: warning +rule: + pattern: length(levels($VAR)) +fix: nlevels(~~VAR~~) +message: nlevels(x) is better than length(levels(x)). df diff --git a/flir/rules/builtin/length_test.yml b/flir/rules/builtin/length_test.yml new file mode 100644 index 0000000..f9ba9ed --- /dev/null +++ b/flir/rules/builtin/length_test.yml @@ -0,0 +1,59 @@ +# Strangely, having something like pattern: length($VAR $OP $VAR2) doesn't work + +id: length_test-1 +language: r +severity: warning +rule: + pattern: length($VAR == $VAR2) +fix: length(~~VAR~~) == ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-2 +language: r +severity: warning +rule: + pattern: length($VAR != $VAR2) +fix: length(~~VAR~~) != ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-3 +language: r +severity: warning +rule: + pattern: length($VAR > $VAR2) +fix: length(~~VAR~~) > ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-4 +language: r +severity: warning +rule: + pattern: length($VAR >= $VAR2) +fix: length(~~VAR~~) >= ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-5 +language: r +severity: warning +rule: + pattern: length($VAR < $VAR2) +fix: length(~~VAR~~) < ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-6 +language: r +severity: warning +rule: + pattern: length($VAR <= $VAR2) +fix: length(~~VAR~~) <= ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. diff --git a/flir/rules/builtin/lengths.yml b/flir/rules/builtin/lengths.yml new file mode 100644 index 0000000..a416440 --- /dev/null +++ b/flir/rules/builtin/lengths.yml @@ -0,0 +1,59 @@ +id: sapply_lengths-1 +language: r +severity: warning +rule: + any: + - pattern: sapply($MYVAR, length) + - pattern: sapply(FUN = length, $MYVAR) + - pattern: sapply($MYVAR, FUN = length) + - pattern: vapply($MYVAR, length $$$) + + - pattern: map_dbl($MYVAR, length) + - pattern: map_dbl($MYVAR, .f = length) + - pattern: map_dbl(.f = length, $MYVAR) + - pattern: map_int($MYVAR, length) + - pattern: map_int($MYVAR, .f = length) + - pattern: map_int(.f = length, $MYVAR) + + - pattern: purrr::map_dbl($MYVAR, length) + - pattern: purrr::map_dbl($MYVAR, .f = length) + - pattern: purrr::map_dbl(.f = length, $MYVAR) + - pattern: purrr::map_int($MYVAR, length) + - pattern: purrr::map_int($MYVAR, .f = length) + - pattern: purrr::map_int(.f = length, $MYVAR) +fix: lengths(~~MYVAR~~) +message: Use lengths() to find the length of each element in a list. + +--- + +id: sapply_lengths-2 +language: r +severity: warning +rule: + any: + - pattern: $MYVAR |> sapply(length) + - pattern: $MYVAR |> sapply(FUN = length) + - pattern: $MYVAR |> vapply(length $$$) + - pattern: $MYVAR |> map_int(length) + - pattern: $MYVAR |> map_int(length $$$) + - pattern: $MYVAR |> purrr::map_int(length) + - pattern: $MYVAR |> purrr::map_int(length $$$) +fix: ~~MYVAR~~ |> lengths() +message: Use lengths() to find the length of each element in a list. + +--- + +id: sapply_lengths-3 +language: r +severity: warning +rule: + any: + - pattern: $MYVAR %>% sapply(length) + - pattern: $MYVAR %>% sapply(FUN = length) + - pattern: $MYVAR %>% vapply(length $$$) + - pattern: $MYVAR %>% map_int(length) + - pattern: $MYVAR %>% map_int(length $$$) + - pattern: $MYVAR %>% purrr::map_int(length) + - pattern: $MYVAR %>% purrr::map_int(length $$$) +fix: ~~MYVAR~~ %>% lengths() +message: Use lengths() to find the length of each element in a list. diff --git a/flir/rules/builtin/library_call.yml b/flir/rules/builtin/library_call.yml new file mode 100644 index 0000000..4b578fe --- /dev/null +++ b/flir/rules/builtin/library_call.yml @@ -0,0 +1,26 @@ +id: library_call +language: r +severity: warning +rule: + kind: call + has: + regex: ^library|require$ + kind: identifier + follows: + not: + any: + - kind: call + has: + regex: ^library|require$ + kind: identifier + - kind: comment + not: + inside: + stopBy: end + any: + - kind: function_definition + - kind: call + has: + pattern: suppressPackageStartupMessages + kind: identifier +message: Move all library/require calls to the top of the script. diff --git a/flir/rules/builtin/list_comparison.yml b/flir/rules/builtin/list_comparison.yml new file mode 100644 index 0000000..772d433 --- /dev/null +++ b/flir/rules/builtin/list_comparison.yml @@ -0,0 +1,18 @@ +id: list_comparison-1 +language: r +severity: warning +rule: + any: + - pattern: $FUN($$$) > $$$ + - pattern: $FUN($$$) >= $$$ + - pattern: $FUN($$$) < $$$ + - pattern: $FUN($$$) <= $$$ + - pattern: $FUN($$$) == $$$ + - pattern: $FUN($$$) != $$$ +constraints: + FUN: + regex: ^(lapply|map|Map|\.mapply)$ +message: | + The output of ~~FUN~~(), a list, is being coerced for comparison. + Instead, use a mapper that generates a vector with the correct type directly, + for example vapply(x, FUN, character(1L)) if the output is a string. diff --git a/flir/rules/builtin/literal_coercion.yml b/flir/rules/builtin/literal_coercion.yml new file mode 100644 index 0000000..e61fb24 --- /dev/null +++ b/flir/rules/builtin/literal_coercion.yml @@ -0,0 +1,89 @@ +id: literal_coercion-1 +language: r +severity: warning +rule: + pattern: $FUN($VALUE) +constraints: + VALUE: + kind: argument + has: + kind: float + not: + regex: 'e' + FUN: + regex: ^(int|as\.integer)$ +fix: ~~VALUE~~L +message: | + Use ~~VALUE~~L instead of ~~FUN~~(~~VALUE~~), i.e., use literals directly + where possible, instead of coercion. + +--- + +id: literal_coercion-2 +language: r +severity: warning +rule: + pattern: as.character(NA) +fix: NA_character_ +message: | + Use NA_character_ instead of as.character(NA), i.e., use literals directly + where possible, instead of coercion. + +--- + +id: literal_coercion-3 +language: r +severity: warning +rule: + pattern: as.logical($VAR) +constraints: + VAR: + kind: argument + has: + any: + - regex: ^1L$ + - regex: ^1$ + - regex: 'true' +fix: TRUE +message: Use TRUE instead of as.logical(~~VAR~~). + +--- + +id: literal_coercion-4 +language: r +severity: warning +rule: + pattern: $FUN($VAR) +constraints: + VAR: + kind: argument + has: + kind: float + FUN: + regex: ^(as\.numeric|as\.double)$ +fix: ~~VAR~~ +message: Use ~~VAR~~ instead of ~~FUN~~(~~VAR~~). + +--- + +id: literal_coercion-5 +language: r +severity: warning +rule: + pattern: as.integer(NA) +fix: NA_integer_ +message: Use NA_integer_ instead of as.integer(NA). + +--- + +id: literal_coercion-6 +language: r +severity: warning +rule: + pattern: $FUN(NA) +constraints: + FUN: + regex: ^(as\.numeric|as\.double)$ +fix: NA_real_ +message: Use NA_real_ instead of ~~FUN~~(NA). + diff --git a/flir/rules/builtin/matrix_apply.yml b/flir/rules/builtin/matrix_apply.yml new file mode 100644 index 0000000..7eaa40c --- /dev/null +++ b/flir/rules/builtin/matrix_apply.yml @@ -0,0 +1,142 @@ +id: matrix_apply-1 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, $MARG, sum) + - pattern: apply($INPUT, MARGIN = $MARG, sum) + - pattern: apply($INPUT, $MARG, FUN = sum) + - pattern: apply($INPUT, MARGIN = $MARG, FUN = sum) +constraints: + MARG: + has: + regex: ^(2|2L)$ +fix: colSums(~~INPUT~~) +message: Use colSums(x) rather than apply(x, 2, sum) + +--- + +id: matrix_apply-2 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, $MARG, sum, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = $MARG, sum, na.rm = $NARM) + - pattern: apply($INPUT, $MARG, FUN = sum, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = $MARG, FUN = sum, na.rm = $NARM) +constraints: + MARG: + has: + regex: ^(2|2L)$ +fix: colSums(~~INPUT~~, na.rm = ~~NARM~~) +message: Use colSums(x, na.rm = ~~NARM~~) rather than apply(x, 2, sum, na.rm = ~~NARM~~). + +--- + +id: matrix_apply-3 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, $MARG, sum) + - pattern: apply($INPUT, MARGIN = $MARG, sum) + - pattern: apply($INPUT, $MARG, FUN = sum) + - pattern: apply($INPUT, MARGIN = $MARG, FUN = sum) +constraints: + MARG: + has: + regex: ^(1|1L)$ +fix: rowSums(~~INPUT~~) +message: Use rowSums(x) rather than apply(x, 1, sum) + +--- + +id: matrix_apply-4 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, $MARG, sum, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = $MARG, sum, na.rm = $NARM) + - pattern: apply($INPUT, $MARG, FUN = sum, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = $MARG, FUN = sum, na.rm = $NARM) +constraints: + MARG: + has: + regex: ^(1|1L)$ +fix: rowSums(~~INPUT~~, na.rm = ~~NARM~~) +message: Use rowSums(x, na.rm = ~~NARM~~) rather than apply(x, 1, sum, na.rm = ~~NARM~~). + +--- + +id: matrix_apply-5 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, $MARG, mean) + - pattern: apply($INPUT, MARGIN = $MARG, mean) + - pattern: apply($INPUT, $MARG, FUN = mean) + - pattern: apply($INPUT, MARGIN = $MARG, FUN = mean) +constraints: + MARG: + has: + regex: ^(1|1L)$ +fix: rowMeans(~~INPUT~~) +message: Use rowMeans(x) rather than apply(x, 1, mean). + +--- + +id: matrix_apply-6 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, $MARG, mean, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = $MARG, mean, na.rm = $NARM) + - pattern: apply($INPUT, $MARG, FUN = mean, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = $MARG, FUN = mean, na.rm = $NARM) +constraints: + MARG: + has: + regex: ^(1|1L)$ +fix: rowMeans(~~INPUT~~, na.rm = ~~NARM~~) +message: Use rowMeans(x, na.rm = ~~NARM~~) rather than apply(x, 1, mean, na.rm = ~~NARM~~). + +--- + +id: matrix_apply-7 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, $MARG, mean) + - pattern: apply($INPUT, MARGIN = $MARG, mean) + - pattern: apply($INPUT, $MARG, FUN = mean) + - pattern: apply($INPUT, MARGIN = $MARG, FUN = mean) +constraints: + MARG: + has: + regex: ^(2|2L)$ +fix: colMeans(~~INPUT~~) +message: Use colMeans(x) rather than apply(x, 2, mean). + +--- + +id: matrix_apply-8 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, $MARG, mean, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = $MARG, mean, na.rm = $NARM) + - pattern: apply($INPUT, $MARG, FUN = mean, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = $MARG, FUN = mean, na.rm = $NARM) +constraints: + MARG: + has: + regex: ^(2|2L)$ +fix: colMeans(~~INPUT~~, na.rm = ~~NARM~~) +message: Use colMeans(x, na.rm = ~~NARM~~) rather than apply(x, 2, mean, na.rm = ~~NARM~~). + diff --git a/flir/rules/builtin/missing_argument.yml b/flir/rules/builtin/missing_argument.yml new file mode 100644 index 0000000..9f47d17 --- /dev/null +++ b/flir/rules/builtin/missing_argument.yml @@ -0,0 +1,44 @@ +id: missing_argument-1 +language: r +severity: warning +rule: + kind: arguments + has: + kind: comma + any: + - precedes: + stopBy: neighbor + any: + - regex: '^\)$' + - kind: comma + - follows: + any: + - regex: '^\($' + - kind: argument + regex: '=$' + follows: + kind: identifier + not: + regex: '^(quote|switch|alist)$' + inside: + kind: call +message: Missing argument in function call. + +--- + +id: missing_argument-2 +language: r +severity: warning +rule: + kind: arguments + regex: '=(\s+|)\)$' + follows: + any: + - kind: identifier + - kind: extract_operator + - kind: namespace_operator + not: + regex: '^(quote|switch|alist)$' + inside: + kind: call +message: Missing argument in function call. diff --git a/flir/rules/builtin/nested_ifelse.yml b/flir/rules/builtin/nested_ifelse.yml new file mode 100644 index 0000000..64dcb08 --- /dev/null +++ b/flir/rules/builtin/nested_ifelse.yml @@ -0,0 +1,29 @@ +id: nested_ifelse-1 +language: r +severity: warning +rule: + pattern: $FUN($COND, $TRUE, $FALSE) +constraints: + FALSE: + regex: ^(ifelse|if_else|fifelse) + FUN: + regex: ^(ifelse|if_else|fifelse) +message: | + Don't use nested ~~FUN~~() calls; instead, try (1) data.table::fcase; + (2) dplyr::case_when; or (3) using a lookup table. + +--- + +id: nested_ifelse-2 +language: r +severity: warning +rule: + pattern: $FUN($COND, $TRUE, $FALSE) +constraints: + TRUE: + regex: ^(ifelse|if_else|fifelse) + FUN: + regex: ^(ifelse|if_else|fifelse) +message: | + Don't use nested ~~FUN~~() calls; instead, try (1) data.table::fcase; + (2) dplyr::case_when; or (3) using a lookup table. diff --git a/flir/rules/builtin/numeric_leading_zero.yml b/flir/rules/builtin/numeric_leading_zero.yml new file mode 100644 index 0000000..1d6762d --- /dev/null +++ b/flir/rules/builtin/numeric_leading_zero.yml @@ -0,0 +1,11 @@ +id: numeric_leading_zero-1 +language: r +severity: warning +rule: + pattern: $VALUE + any: + - kind: float + - kind: identifier + regex: ^\.[0-9] +fix: 0~~VALUE~~ +message: Include the leading zero for fractional numeric constants. diff --git a/flir/rules/builtin/outer_negation.yml b/flir/rules/builtin/outer_negation.yml new file mode 100644 index 0000000..ca377de --- /dev/null +++ b/flir/rules/builtin/outer_negation.yml @@ -0,0 +1,29 @@ +id: outer_negation-1 +language: r +severity: warning +rule: + pattern: all(!$VAR) +constraints: + VAR: + not: + regex: '^!' +fix: '!any(~~VAR~~)' +message: | + !any(x) is better than all(!x). The former applies negation only once after + aggregation instead of many times for each element of x. + +--- + +id: outer_negation-2 +language: r +severity: warning +rule: + pattern: any(! $VAR) +constraints: + VAR: + not: + regex: '^!' +fix: '!all(~~VAR~~)' +message: | + !all(x) is better than any(!x). The former applies negation only once after + aggregation instead of many times for each element of x. diff --git a/flir/rules/builtin/package_hooks.yml b/flir/rules/builtin/package_hooks.yml new file mode 100644 index 0000000..f4dfa75 --- /dev/null +++ b/flir/rules/builtin/package_hooks.yml @@ -0,0 +1,127 @@ +id: package_hooks-1 +language: r +severity: warning +rule: + pattern: packageStartupMessage($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: .onLoad +message: Put packageStartupMessage() calls in .onAttach(), not .onLoad(). + +--- + +id: package_hooks-2 +language: r +severity: warning +rule: + pattern: library.dynam($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: .onAttach +message: Put library.dynam() calls in .onLoad(), not .onAttach(). + +--- + +id: package_hooks-3 +language: r +severity: warning +rule: + pattern: $FN($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: .onLoad +constraints: + FN: + regex: '^(cat|installed.packages|message|packageStartupMessage|print|writeLines)$' +message: Don't use ~~FN~~() in .onLoad(). + +--- + +id: package_hooks-4 +language: r +severity: warning +rule: + pattern: $FN($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: .onAttach +constraints: + FN: + # library.dynam already has its own linter + regex: '^(cat|installed.packages|message|print|writeLines)$' +message: Don't use ~~FN~~() in .onAttach(). + +--- + +id: package_hooks-5 +language: r +severity: warning +rule: + pattern: $FN($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: $LOAD +constraints: + LOAD: + regex: '^(\.onAttach|\.onLoad)$' + FN: + regex: '^(require|library)$' +message: Don't alter the search() path in ~~LOAD~~() by calling ~~FN~~(). + +--- + +id: package_hooks-6 +language: r +severity: warning +rule: + pattern: installed.packages($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: $LOAD +constraints: + LOAD: + regex: '^(\.onAttach|\.onLoad)$' +message: Don't slow down package load by running installed.packages() in ~~LOAD~~(). + +--- + +id: package_hooks-7 +language: r +severity: warning +rule: + pattern: library.dynam.unload($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: $LOAD +constraints: + LOAD: + regex: '^(\.onDetach|\.Last\.lib)$' +message: Use library.dynam.unload() calls in .onUnload(), not ~~LOAD~~(). diff --git a/flir/rules/builtin/paste.yml b/flir/rules/builtin/paste.yml new file mode 100644 index 0000000..800b676 --- /dev/null +++ b/flir/rules/builtin/paste.yml @@ -0,0 +1,75 @@ +id: paste-1 +language: r +severity: warning +rule: + pattern: + context: paste($$$CONTENT sep = "" $$$CONTENT2) + strictness: ast +# fix: paste0($$$CONTENT) +message: paste0(...) is better than paste(..., sep = ""). + +--- + +id: paste-2 +language: r +severity: warning +rule: + any: + - pattern: + context: paste($CONTENT, collapse = ", ") + strictness: ast + - pattern: + context: paste(collapse = ", ", $CONTENT) + strictness: ast +# fix: paste0($$$CONTENT) +message: toString(.) is more expressive than paste(., collapse = ", "). + +--- + +id: paste-3 +language: r +severity: warning +rule: + pattern: + context: paste0($$$CONTENT sep = $USELESS $$$CONTENT2) + strictness: ast +# fix: paste0($$$CONTENT) +message: | + sep= is not a formal argument to paste0(); did you mean to use paste(), or + collapse=? + +--- + +id: paste-4 +language: r +severity: warning +rule: + any: + - pattern: + context: paste0($CONTENT, collapse = $FOO) + strictness: ast + - pattern: + context: paste0(collapse = $FOO, $CONTENT) + strictness: ast + not: + has: + regex: sep + kind: argument +# fix: paste0($$$CONTENT) +message: | + Use paste(), not paste0(), to collapse a character vector when sep= is not used. + +# --- +# +# id: paste-5 +# language: r +# severity: warning +# rule: +# pattern: +# context: paste0(rep($VAR, $TIMES), collapse = "") +# strictness: ast +# constraints: +# VAR: +# kind: string +# fix: strrep(~~VAR~~, ~~TIMES~~) +# message: strrep(x, times) is better than paste0(rep(x, times), collapse = ""). diff --git a/flir/rules/builtin/redundant_equals.yml b/flir/rules/builtin/redundant_equals.yml new file mode 100644 index 0000000..79a6abc --- /dev/null +++ b/flir/rules/builtin/redundant_equals.yml @@ -0,0 +1,29 @@ +id: redundant_equals-1 +language: r +severity: warning +rule: + any: + - pattern: $VAR == TRUE + - pattern: TRUE == $VAR + - pattern: $VAR == FALSE + - pattern: FALSE == $VAR +message: | + Using == on a logical vector is redundant. Well-named logical vectors can be + used directly in filtering. For data.table's `i` argument, wrap the column + name in (), like `DT[(is_treatment)]`. + +--- + +id: redundant_equals-2 +language: r +severity: warning +rule: + any: + - pattern: $VAR != TRUE + - pattern: TRUE != $VAR + - pattern: $VAR != FALSE + - pattern: FALSE != $VAR +message: | + Using != on a logical vector is redundant. Well-named logical vectors can be + used directly in filtering. For data.table's `i` argument, wrap the column + name in (), like `DT[(is_treatment)]`. diff --git a/flir/rules/builtin/redundant_ifelse.yml b/flir/rules/builtin/redundant_ifelse.yml new file mode 100644 index 0000000..8f252e6 --- /dev/null +++ b/flir/rules/builtin/redundant_ifelse.yml @@ -0,0 +1,67 @@ +id: redundant_ifelse-1 +language: r +severity: warning +rule: + pattern: $FUN($COND, $VAL1, $VAL2) +constraints: + VAL1: + regex: ^TRUE$ + VAL2: + regex: ^FALSE$ + FUN: + regex: ^(ifelse|fifelse|if_else)$ +fix: ~~COND~~ +message: | + Use ~~COND~~ directly instead of calling ~~FUN~~(~~COND~~, TRUE, FALSE). + +--- + +id: redundant_ifelse-2 +language: r +severity: warning +rule: + pattern: $FUN($COND, $VAL1, $VAL2) +constraints: + VAL1: + regex: ^FALSE$ + VAL2: + regex: ^TRUE$ + FUN: + regex: ^(ifelse|fifelse|if_else)$ +fix: '!(~~COND~~)' +message: | + Use !(~~COND~~) directly instead of calling ~~FUN~~(~~COND~~, FALSE, TRUE). + +--- + +id: redundant_ifelse-3 +language: r +severity: warning +rule: + pattern: $FUN($COND, $VAL1, $VAL2) +constraints: + VAL1: + regex: ^(1|1L)$ + VAL2: + regex: ^(0|0L)$ + FUN: + regex: ^(ifelse|fifelse|if_else)$ +fix: as.integer(~~COND~~) +message: Prefer as.integer(~~COND~~) to ~~FUN~~(~~COND~~, ~~VAL1~~, ~~VAL2~~). + +--- + +id: redundant_ifelse-4 +language: r +severity: warning +rule: + pattern: $FUN($COND, $VAL1, $VAL2) +constraints: + VAL1: + regex: ^(0|0L)$ + VAL2: + regex: ^(1|1L)$ + FUN: + regex: ^(ifelse|fifelse|if_else)$ +fix: as.integer(!(~~COND~~)) +message: Prefer as.integer(!(~~COND~~)) to ~~FUN~~(~~COND~~, ~~VAL1~~, ~~VAL2~~). diff --git a/flir/rules/builtin/rep_len.yml b/flir/rules/builtin/rep_len.yml new file mode 100644 index 0000000..d4d78e5 --- /dev/null +++ b/flir/rules/builtin/rep_len.yml @@ -0,0 +1,7 @@ +id: rep_len-1 +language: r +severity: warning +rule: + pattern: rep($OBJ, length.out = $LEN) +fix: rep_len(~~OBJ~~, ~~LEN~~) +message: Use rep_len(x, n) instead of rep(x, length.out = n). diff --git a/flir/rules/builtin/right_assignment.yml b/flir/rules/builtin/right_assignment.yml new file mode 100644 index 0000000..76b736e --- /dev/null +++ b/flir/rules/builtin/right_assignment.yml @@ -0,0 +1,10 @@ +id: right_assignment +language: r +severity: hint +rule: + pattern: $RHS -> $LHS + has: + field: rhs + kind: identifier +fix: ~~LHS~~<- ~~RHS~~ +message: Use <-, not ->, for assignment. diff --git a/flir/rules/builtin/sample_int.yml b/flir/rules/builtin/sample_int.yml new file mode 100644 index 0000000..091825c --- /dev/null +++ b/flir/rules/builtin/sample_int.yml @@ -0,0 +1,43 @@ +id: sample_int-1 +language: r +severity: warning +rule: + any: + - pattern: sample(1:$N, $$$OTHER) + - pattern: sample(1L:$N, $$$OTHER) +fix: sample.int(~~N~~, ~~OTHER~~) +message: sample.int(n, m, ...) is preferable to sample(1:n, m, ...). + +--- + +id: sample_int-2 +language: r +severity: warning +rule: + pattern: sample(seq($N), $$$OTHER) +fix: sample.int(~~N~~, ~~OTHER~~) +message: sample.int(n, m, ...) is preferable to sample(seq(n), m, ...). + +--- + +id: sample_int-3 +language: r +severity: warning +rule: + pattern: sample(seq_len($N), $$$OTHER) +fix: sample.int(~~N~~, ~~OTHER~~) +message: sample.int(n, m, ...) is preferable to sample(seq_len(n), m, ...). + +--- + +# Strangely this panicks if I rename FIRST to N +id: sample_int-4 +language: r +severity: warning +rule: + pattern: sample($FIRST, $$$OTHER) +constraints: + FIRST: + regex: ^\d+(L|)$ +fix: sample.int(~~N~~, ~~OTHER~~) +message: sample.int(n, m, ...) is preferable to sample(n, m, ...). diff --git a/flir/rules/builtin/semicolon.yml b/flir/rules/builtin/semicolon.yml new file mode 100644 index 0000000..fb5dd75 --- /dev/null +++ b/flir/rules/builtin/semicolon.yml @@ -0,0 +1,10 @@ +id: semicolon-1 +language: r +severity: warning +rule: + regex: ;\s+$ + not: + inside: + kind: string + stopBy: end +message: Trailing semicolons are not needed. diff --git a/flir/rules/builtin/seq.yml b/flir/rules/builtin/seq.yml new file mode 100644 index 0000000..c199c5d --- /dev/null +++ b/flir/rules/builtin/seq.yml @@ -0,0 +1,121 @@ +id: seq-1 +language: r +severity: warning +rule: + pattern: seq(length($VAR)) +fix: seq_along(~~VAR~~) +message: | + seq(length(...)) is likely to be wrong in the empty edge case. Use seq_along(...) instead. + +--- + +id: seq-2 +language: r +severity: warning +rule: + any: + - pattern: 1:nrow($VAR) + - pattern: 1L:nrow($VAR) + regex: ^1 +fix: seq_len(nrow(~~VAR~~)) +message: | + 1:nrow(...) is likely to be wrong in the empty edge case. Use seq_len(nrow(...)) instead. + +--- + +id: seq-3 +language: r +severity: warning +rule: + any: + - pattern: 1:n() + - pattern: 1L:n() + regex: ^1 +fix: seq_len(n()) +message: | + 1:n() is likely to be wrong in the empty edge case. Use seq_len(n()) instead. + +--- + +id: seq-4 +language: r +severity: warning +rule: + pattern: seq(nrow($VAR)) +fix: seq_len(nrow(~~VAR~~)) +message: | + seq(nrow(...)) is likely to be wrong in the empty edge case. Use seq_len(nrow(...)) instead. + +--- + +id: seq-5 +language: r +severity: warning +rule: + any: + - pattern: 1:length($VAR) + - pattern: 1L:length($VAR) + regex: ^1 +fix: seq_along(~~VAR~~) +message: | + 1:length(...) is likely to be wrong in the empty edge case. Use seq_along(...) instead. + +--- + +id: seq-6 +language: r +severity: warning +rule: + any: + - pattern: 1:ncol($VAR) + - pattern: 1L:ncol($VAR) + regex: ^1 +fix: seq_len(ncol(~~VAR~~)) +message: | + 1:ncol(...) is likely to be wrong in the empty edge case. Use seq_len(ncol(...)) instead. + +--- + +id: seq-7 +language: r +severity: warning +rule: + any: + - pattern: 1:NCOL($VAR) + - pattern: 1L:NCOL($VAR) + regex: ^1 +fix: seq_len(NCOL(~~VAR~~)) +message: | + 1:NCOL(...) is likely to be wrong in the empty edge case. Use seq_len(NCOL(...)) instead. + +--- + +id: seq-8 +language: r +severity: warning +rule: + any: + - pattern: 1:NROW($VAR) + - pattern: 1L:NROW($VAR) + regex: ^1 +fix: seq_len(NROW(~~VAR~~)) +message: | + 1:NROW(...) is likely to be wrong in the empty edge case. Use seq_len(NROW(...)) instead. + + +--- + +id: seq-9 +language: r +severity: warning +rule: + pattern: seq(1, $VAL) + not: + pattern: seq(1, 0) +constraints: + VAL: + regex: ^\d+(|L)$ +fix: seq_len(~~VAL~~) +message: seq_len(~~VAL~~) is more efficient than seq(1, ~~VAL~~). + + diff --git a/flir/rules/builtin/sort.yml b/flir/rules/builtin/sort.yml new file mode 100644 index 0000000..930f5c6 --- /dev/null +++ b/flir/rules/builtin/sort.yml @@ -0,0 +1,85 @@ +id: sort-1 +language: r +severity: warning +rule: + pattern: $OBJ[order($OBJ)] +fix: sort(~~OBJ~~, na.last = TRUE) +message: sort(~~OBJ~~, na.last = TRUE) is better than ~~OBJ~~[order(~~OBJ~~)]. + +--- + +id: sort-2 +language: r +severity: warning +rule: + any: + - pattern: $OBJ[order($OBJ, decreasing = $DECREASING)] + - pattern: $OBJ[order(decreasing = $DECREASING, $OBJ)] +constraints: + DECREASING: + regex: ^(TRUE|FALSE)$ +fix: sort(~~OBJ~~, decreasing = ~~DECREASING~~, na.last = TRUE) +message: | + sort(~~OBJ~~, decreasing = ~~DECREASING~~, na.last = TRUE) is better than + ~~OBJ~~[order(~~OBJ~~, decreasing = ~~DECREASING~~)]. + +--- + +id: sort-3 +language: r +severity: warning +rule: + any: + - pattern: $OBJ[order($OBJ, na.last = $NALAST)] + - pattern: $OBJ[order(na.last = $NALAST, $OBJ)] +constraints: + NALAST: + regex: ^(TRUE|FALSE)$ +fix: sort(~~OBJ~~, na.last = ~~NALAST~~, na.last = TRUE) +message: | + sort(~~OBJ~~, na.last = ~~NALAST~~, na.last = TRUE) is better than + ~~OBJ~~[order(~~OBJ~~, na.last = ~~NALAST~~)]. + +--- + +id: sort-4 +language: r +severity: warning +rule: + any: + - pattern: $OBJ[order($OBJ, decreasing = TRUE, na.last = FALSE)] + - pattern: $OBJ[order($OBJ, na.last = FALSE, decreasing = TRUE)] + - pattern: $OBJ[order(decreasing = TRUE, $OBJ, na.last = FALSE)] + - pattern: $OBJ[order(decreasing = TRUE, na.last = FALSE, $OBJ)] + - pattern: $OBJ[order(na.last = FALSE, decreasing = TRUE, $OBJ)] + - pattern: $OBJ[order(na.last = FALSE, $OBJ, decreasing = TRUE)] +fix: sort(~~OBJ~~, decreasing = TRUE, na.last = FALSE) +message: | + sort(~~OBJ~~, decreasing = TRUE, na.last = FALSE) is better than + ~~OBJ~~[order(~~OBJ~~, na.last = FALSE, decreasing = TRUE)]. + +--- + +id: sort-5 +language: r +severity: warning +rule: + any: + - pattern: sort($OBJ) == $OBJ + - pattern: $OBJ == sort($OBJ) +fix: !is.unsorted(~~OBJ~~) +message: | + Use !is.unsorted(~~OBJ~~) to test the sortedness of a vector. + +--- + +id: sort-6 +language: r +severity: warning +rule: + any: + - pattern: sort($OBJ) != $OBJ + - pattern: $OBJ != sort($OBJ) +fix: is.unsorted(~~OBJ~~) +message: | + Use is.unsorted(~~OBJ~~) to test the unsortedness of a vector. diff --git a/flir/rules/builtin/stopifnot_all.yml b/flir/rules/builtin/stopifnot_all.yml new file mode 100644 index 0000000..6f6619b --- /dev/null +++ b/flir/rules/builtin/stopifnot_all.yml @@ -0,0 +1,24 @@ +id: stopifnot_all-1 +language: r +severity: warning +rule: + pattern: stopifnot(all($$$CODE)) +fix: stopifnot(~~CODE~~) +message: | + Use stopifnot(x) instead of stopifnot(all(x)). stopifnot(x) runs all() 'under + the hood' and provides a better error message in case of failure. + +--- + +id: stopifnot_all-2 +language: r +severity: warning +rule: + pattern: stopifnot(exprs = { all($$$CODE) }) +fix: | + stopifnot(exprs = { + ~~CODE~~ + }) +message: | + Use stopifnot(x) instead of stopifnot(all(x)). stopifnot(x) runs all() 'under + the hood' and provides a better error message in case of failure. diff --git a/flir/rules/builtin/todo_comment.yml b/flir/rules/builtin/todo_comment.yml new file mode 100644 index 0000000..83d86ed --- /dev/null +++ b/flir/rules/builtin/todo_comment.yml @@ -0,0 +1,7 @@ +id: todo_comment-1 +language: r +severity: warning +rule: + kind: comment + regex: '(?i)#(|\s+)\b(todo|fixme)\b' +message: Remove TODO comments. diff --git a/flir/rules/builtin/undesirable_function.yml b/flir/rules/builtin/undesirable_function.yml new file mode 100644 index 0000000..c9b1756 --- /dev/null +++ b/flir/rules/builtin/undesirable_function.yml @@ -0,0 +1,13 @@ +id: undesirable_function-1 +language: r +severity: warning +rule: + pattern: $FUN + kind: identifier + not: + inside: + kind: argument +constraints: + FUN: + regex: ^(\.libPaths|attach|browser|debug|debugcall|debugonce|detach|par|setwd|structure|Sys\.setenv|Sys\.setlocale|trace|undebug|untrace)$ +message: Function "~~FUN~~()" is undesirable. diff --git a/flir/rules/builtin/undesirable_operator.yml b/flir/rules/builtin/undesirable_operator.yml new file mode 100644 index 0000000..7d63513 --- /dev/null +++ b/flir/rules/builtin/undesirable_operator.yml @@ -0,0 +1,29 @@ +id: undesirable_operator-1 +language: r +severity: warning +rule: + any: + - pattern: $X <<- $Y + - pattern: $X ->> $Y +message: | + Avoid undesirable operators `<<-` and `->>`. They assign outside the current + environment in a way that can be hard to reason about. Prefer fully-encapsulated + functions wherever possible, or, if necessary, assign to a specific environment + with assign(). Recall that you can create an environment at the desired scope + with new.env(). + +--- + +id: undesirable_operator-2 +language: r +severity: warning +rule: + kind: namespace_operator + has: + pattern: ':::' +message: | + Operator `:::` is undesirable. It accesses non-exported functions inside + packages. Code relying on these is likely to break in future versions of the + package because the functions are not part of the public interface and may be + changed or removed by the maintainers without notice. Use public functions + via :: instead. diff --git a/flir/rules/builtin/unnecessary_nesting.yml b/flir/rules/builtin/unnecessary_nesting.yml new file mode 100644 index 0000000..b56b467 --- /dev/null +++ b/flir/rules/builtin/unnecessary_nesting.yml @@ -0,0 +1,36 @@ +id: unnecessary_nesting-1 +language: r +severity: warning +rule: + kind: if_statement + any: + - has: + kind: 'braced_expression' + field: consequence + has: + kind: if_statement + stopBy: neighbor + not: + has: + kind: 'braced_expression' + field: alternative + stopBy: end + not: + any: + - has: + nthChild: 2 + - precedes: + regex: "^else$" + - has: + kind: if_statement + field: consequence + stopBy: neighbor + # Can be in if(), but not else if() + not: + inside: + field: alternative + kind: if_statement +message: | + Don't use nested `if` statements, where a single `if` with the combined + conditional expression will do. For example, instead of `if (x) { if (y) { ... }}`, + use `if (x && y) { ... }`. diff --git a/flir/rules/builtin/unreachable_code.yml b/flir/rules/builtin/unreachable_code.yml new file mode 100644 index 0000000..56eb497 --- /dev/null +++ b/flir/rules/builtin/unreachable_code.yml @@ -0,0 +1,64 @@ +id: unreachable_code-1 +language: r +severity: warning +rule: + regex: '[^}]+' + not: + regex: 'else' + follows: + any: + - pattern: return($$$A) + - pattern: stop($$$A) + not: + precedes: + regex: 'else' + stopBy: end +message: Code and comments coming after a return() or stop() should be removed. + +--- + +id: unreachable_code-2 +language: r +severity: warning +rule: + regex: '[^}]+' + not: + regex: 'else' + follows: + any: + - pattern: next + - pattern: break + stopBy: end +message: Remove code and comments coming after `next` or `break` + +--- + +id: unreachable_code-3 +language: r +severity: warning +rule: + inside: + any: + - kind: if_statement + pattern: if (FALSE) + - kind: while_statement + pattern: while (FALSE) + stopBy: end +message: Remove code inside a conditional loop with a deterministically false condition. + +--- + +id: unreachable_code-4 +language: r +severity: warning +rule: + inside: + any: + - kind: if_statement + pattern: if (TRUE) + - kind: while_statement + pattern: while (TRUE) + stopBy: end +message: | + One branch has a a deterministically true condition. The other branches can + be removed. diff --git a/flir/rules/builtin/which_grepl.yml b/flir/rules/builtin/which_grepl.yml new file mode 100644 index 0000000..81e30f2 --- /dev/null +++ b/flir/rules/builtin/which_grepl.yml @@ -0,0 +1,7 @@ +id: which_grepl-1 +language: r +severity: warning +rule: + pattern: which(grepl($$$ARGS)) +fix: grep(~~ARGS~~) +message: grep(pattern, x) is better than which(grepl(pattern, x)). diff --git a/getCRUCLdata.Rproj b/getCRUCLdata.Rproj new file mode 100644 index 0000000..25074f7 --- /dev/null +++ b/getCRUCLdata.Rproj @@ -0,0 +1,21 @@ +Version: 1.0 +ProjectId: b876aac1-663c-4e95-b4b7-a129e578fd9b + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source

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 From f147d80ffef1ec2558807d8dc048287b9168557a Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 17:35:56 +0800 Subject: [PATCH 069/127] update codemeta.json --- codemeta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index 9abb12b..e5b60fa 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.224KB", + "fileSize": "909.623KB", "citation": [ { "@type": "ScholarlyArticle", From e1ba872f11c346aa255aa025155c2e307b93cecb Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 17:39:01 +0800 Subject: [PATCH 070/127] prep for v1.0.2 --- DESCRIPTION | 2 +- NEWS.md | 6 ++++++ codemeta.json | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index be8761e..6a7cadb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: getCRUCLdata Title: 'CRU' 'CL' v. 2.0 Climatology Client -Version: 1.0.1 +Version: 1.0.2 Authors@R: person("Adam H.", "Sparks", , "adamhsparks@gmail.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-0061-8359")) diff --git a/NEWS.md b/NEWS.md index ef21644..edffac6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,9 @@ +# getCRUCLdata 1.0.2 + +## Minor changes + +- Reknit vignette with proper values + # getCRUCLdata 1.0.1 ## Minor changes diff --git a/codemeta.json b/codemeta.json index e5b60fa..bcc649d 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/ropensci/getCRUCLdata", "issueTracker": "https://github.com/ropensci/getCRUCLdata/issues", "license": "https://spdx.org/licenses/MIT", - "version": "1.0.1", + "version": "1.0.2", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "909.623KB", + "fileSize": "909.701KB", "citation": [ { "@type": "ScholarlyArticle", From b59c0bfbb0259bad763fa07690e42dfb606d5513 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 17:56:32 +0800 Subject: [PATCH 071/127] Add link to repo in DESCRIPTION --- DESCRIPTION | 7 ++++--- codemeta.json | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6a7cadb..9fa85c8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,7 +17,8 @@ Description: Provides functions that automate downloading and importing Climate Research Unit, . License: MIT + file LICENSE -URL: https://docs.ropensci.org/getCRUCLdata/ +URL: https://github.com/ropensci/getCRUCLdata, + https://docs.ropensci.org/getCRUCLdata/ BugReports: https://github.com/ropensci/getCRUCLdata/issues Depends: R (>= 4.0.0) @@ -43,6 +44,8 @@ Suggests: VignetteBuilder: knitr ByteCompile: TRUE +Config/roxyglobals/filename: globals.R +Config/roxyglobals/unique: FALSE Config/testthat/edition: 3 Config/testthat/parallel: true Encoding: UTF-8 @@ -55,5 +58,3 @@ X-schema.org-isPartOf: https://ropensci.org X-schema.org-keywords: anglia-cru, climate-data, cru-cl2, temperature, rainfall, elevation, data-access, wind, relative-humidity, solar-radiation, diurnal-temperature, frost -Config/roxyglobals/filename: globals.R -Config/roxyglobals/unique: FALSE diff --git a/codemeta.json b/codemeta.json index bcc649d..0eb1901 100644 --- a/codemeta.json +++ b/codemeta.json @@ -4,6 +4,7 @@ "identifier": "getCRUCLdata", "description": "Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 climatology data, facilitates the calculation of minimum temperature and maximum temperature and formats the data into a data frame or a list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit, .", "name": "getCRUCLdata: 'CRU' 'CL' v. 2.0 Climatology Client", + "relatedLink": "https://docs.ropensci.org/getCRUCLdata/", "codeRepository": "https://github.com/ropensci/getCRUCLdata", "issueTracker": "https://github.com/ropensci/getCRUCLdata/issues", "license": "https://spdx.org/licenses/MIT", @@ -243,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "909.701KB", + "fileSize": "909.747KB", "citation": [ { "@type": "ScholarlyArticle", @@ -273,7 +274,6 @@ } } ], - "relatedLink": "https://docs.ropensci.org/getCRUCLdata/", "releaseNotes": "https://github.com/ropensci/getCRUCLdata/blob/master/NEWS.md", "readme": "https://github.com/ropensci/getCRUCLdata/blob/main/README.md", "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/ropensci/getCRUCLdata"], From 50eab86c13bb4a14747ba54914f0d312f26725b3 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Mon, 16 Dec 2024 18:12:54 +0800 Subject: [PATCH 072/127] Update documentation --- man/getCRUCLdata-package.Rd | 1 + 1 file changed, 1 insertion(+) diff --git a/man/getCRUCLdata-package.Rd b/man/getCRUCLdata-package.Rd index 275c873..ec5cf3c 100644 --- a/man/getCRUCLdata-package.Rd +++ b/man/getCRUCLdata-package.Rd @@ -11,6 +11,7 @@ Provides functions that automate downloading and importing University of East An \seealso{ Useful links: \itemize{ + \item \url{https://github.com/ropensci/getCRUCLdata} \item \url{https://docs.ropensci.org/getCRUCLdata/} \item Report bugs at \url{https://github.com/ropensci/getCRUCLdata/issues} } From 51a2d66bde16731d5e2f0f7696c52a608bf74559 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Mon, 16 Dec 2024 19:13:19 +0800 Subject: [PATCH 073/127] Polish vignette --- codemeta.json | 4 ++-- vignettes/getCRUCLdata.Rmd | 30 ++++++++++++++---------------- vignettes/getCRUCLdata.Rmd.orig | 18 ++++++++++-------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/codemeta.json b/codemeta.json index 0eb1901..f9f5622 100644 --- a/codemeta.json +++ b/codemeta.json @@ -244,7 +244,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "909.747KB", + "fileSize": "910.679KB", "citation": [ { "@type": "ScholarlyArticle", @@ -276,7 +276,7 @@ ], "releaseNotes": "https://github.com/ropensci/getCRUCLdata/blob/master/NEWS.md", "readme": "https://github.com/ropensci/getCRUCLdata/blob/main/README.md", - "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/ropensci/getCRUCLdata"], + "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml", "https://codecov.io/gh/ropensci/getCRUCLdata"], "developmentStatus": "https://www.repostatus.org/", "review": { "@type": "Review", diff --git a/vignettes/getCRUCLdata.Rmd b/vignettes/getCRUCLdata.Rmd index f5a13ff..659f467 100644 --- a/vignettes/getCRUCLdata.Rmd +++ b/vignettes/getCRUCLdata.Rmd @@ -1,7 +1,7 @@ --- title: "getCRUCLdata" author: "Adam H. Sparks" -date: "2024-12-15" +date: "2024-12-16" output: rmarkdown::html_vignette: toc: true @@ -12,6 +12,7 @@ vignette: > %\VignetteDepends{terra} %\VignetteDepends{ggplot2} %\VignetteDepends{viridis} + %\VignetteDepends{data.table} --- @@ -64,7 +65,7 @@ The arguments for selecting the climatology elements for importing are: - **dsn** *For `create_CRU_stack()`* and *`create_CRU_df()`* only. Local file path where CRU CL v. 2.0 .dat.gz files are located. -### Creating tidy data frames for use in R +### Creating data frames for use in R The `get_CRU_df()` function automates the download process and creates data frames of the climatology elements. @@ -114,7 +115,7 @@ CRU_data #> 6795150: -35.80 ``` -Perhaps you only need one or two elements, it is easy to create a tidy data frame of mean temperature only. +Perhaps you only need one or two elements, it is easy to create a data frame of mean temperature only. ``` r @@ -136,7 +137,7 @@ t #> 6795144: 83.583 -36.750 dec -33.3 ``` -#### Plotting data from the tidy dataframe +#### Plotting data from the data frame Now that we have the data, we can plot it easily using _ggplot2_ and the _viridis_ package for the colour scale. @@ -154,8 +155,8 @@ ggplot(data = t, aes(x = lon, y = lat, fill = tmp)) + ```

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 Date: Sun, 15 Dec 2024 10:45:26 +0800 Subject: [PATCH 037/127] tidy README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8e30db9..2e3207e 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Author/Maintainer: Adam Sparks ## Introduction to {getCRUCLdata} -The {getCRUCLdata} package provides functions that automate importing CRU CL v. 2.0 climatology data into R, facilitate the calculation of minimum temperature and maximum temperature, and formats the data into a data frame or a [base::list()] of [terra::rast()] objects for use. +The {getCRUCLdata} package provides functions that automate importing CRU CL v. 2.0 climatology data into R, facilitate the calculation of minimum temperature and maximum temperature, and formats the data into a [data.table](https://CRAN.R-project.org/package=data.table) or a list of [terra::rast](https://CRAN.R-project.org/package=terra) objects for use. CRU CL v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit (CRU), . From 9e59f0358c04f1e7db8154c3c4d5ff9de29a9e04 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:45:43 +0800 Subject: [PATCH 038/127] lint code --- R/get_CRU.R | 4 ++-- R/get_CRU_stack.R | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/R/get_CRU.R b/R/get_CRU.R index b69bd4e..2e7d656 100644 --- a/R/get_CRU.R +++ b/R/get_CRU.R @@ -25,11 +25,11 @@ # check if pre_cv or tmx/tmn (derived) are true, make sure proper ---------- # parameters set TRUE - if (isTRUE(pre_cv)) { + if (pre_cv) { pre <- TRUE } - if (isTRUE(tmn) || isTRUE(tmx)) { + if (any(tmn, tmx)) { dtr <- tmp <- TRUE } # create object list to filter downloads ----------------------------------- diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index f687c78..4823ac5 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -85,7 +85,7 @@ get_CRU_stack <- cache_dir ) - if (isTRUE(pre_cv)) { + if (pre_cv) { pre <- TRUE } From 92b263b957653b87dfdffd3cfaab170886d40ca5 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:46:25 +0800 Subject: [PATCH 039/127] document internal fns --- R/internal_functions.R | 137 ++++++++++++++++++++++++++++------------- 1 file changed, 94 insertions(+), 43 deletions(-) diff --git a/R/internal_functions.R b/R/internal_functions.R index 939f440..d199aba 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -1,29 +1,29 @@ #' Check That at Least One var is Requested -#' @param pre Logical. Fetch precipitation (millimetres/month) from server and +#' @param pre Boolean. Fetch precipitation (millimetres/month) from server and #' return in the data frame? Defaults to `FALSE`. -#' @param pre_cv Logical. Fetch cv of precipitation (percent) from server and +#' @param pre_cv Boolean. Fetch cv of precipitation (percent) from server and #' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to #' `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. -#' @param rd0 Logical. Fetch wet-days (number days with >0.1 millimetres rain +#' @param rd0 Boolean. Fetch wet-days (number days with >0.1 millimetres rain #' per month) and return in the data frame? Defaults to `FALSE`. -#' @param dtr Logical. Fetch mean diurnal temperature range (degrees Celsius) +#' @param dtr Boolean. Fetch mean diurnal temperature range (degrees Celsius) #' and return it in the data frame? Defaults to `FALSE`. -#' @param tmp Logical. Fetch temperature (degrees Celsius) and return it in the +#' @param tmp Boolean. Fetch temperature (degrees Celsius) and return it in the #' data frame? Defaults to `FALSE`. -#' @param tmn Logical. Calculate minimum temperature values (degrees Celsius) +#' @param tmn Boolean. Calculate minimum temperature values (degrees Celsius) #' and return it in the data frame? Defaults to `FALSE`. -#' @param tmx Logical. Calculate maximum temperature (degrees Celsius) and +#' @param tmx Boolean. Calculate maximum temperature (degrees Celsius) and #' return it in the data frame? Defaults to `FALSE`. -#' @param reh Logical. Fetch relative humidity and return it in the data frame? -#' Defaults to FALSE. -#' @param sunp Logical. Fetch sunshine, percent of maximum possible (percent of +#' @param reh Boolean. Fetch relative humidity and return it in the data frame? +#' Defaults to `FALSE`. +#' @param sunp Boolean. Fetch sunshine, percent of maximum possible (percent of #' day length) and return it in data frame? Defaults to `FALSE`. -#' @param frs Logical. Fetch ground-frost records (number of days with ground- +#' @param frs Boolean. Fetch ground-frost records (number of days with ground- #' frost per month) and return it in data frame? Defaults to `FALSE`. -#' @param wnd Logical. Fetch 10m wind speed (metres/second) and return it in the +#' @param wnd Boolean. Fetch 10m wind speed (metres/second) and return it in the #' data frame? Defaults to `FALSE`. -#' @param elv Logical. Fetch elevation (converted to metres) and return it in +#' @param elv Boolean. Fetch elevation (converted to metres) and return it in #' the data frame? Defaults to `FALSE`. #' #' @examples @@ -94,7 +94,7 @@ } } -#' Creates a Data Frame from the CRU Data +#' Creates a Data Frame From the CRU Data #' #' @param tmn Is tmn to be calculated? Boolean #' @param tmn Is tmx to be calculated? Boolean @@ -104,59 +104,44 @@ #' @param elv Is elv to be returned? Boolean #' @param files File list to be used for creating data frame #' -#' @return Data frame of all requested values -#' +#' @return A \CRANpkg{data.table} of all requested values +#' @keywords Internal +#' @autoglobal #' @noRd .create_df <- function(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files) { - month <- NULL CRU_df <- .tidy_df(pre_cv, elv, tmn, tmx, .files = files) - if (isTRUE(tmx)) { + if (tmx) { CRU_df[, tmx := tmp + (0.5 * dtr)] } - if (isTRUE(tmn)) { + if (tmn) { CRU_df[, tmn := tmp - (0.5 * dtr)] } # Remove tmp/dtr if they aren't specified (necessary for tmn/tmx) - if (isTRUE(tmx) | isTRUE(tmn)) { - if (isFALSE(tmp)) { - CRU_df <- subset(CRU_df, select = -tmp) - } + if (any(tmx, tmn) && isFALSE(tmp)) { + CRU_df[, tmp := NULL] + # if dtr is not requested, drop from the data.table if (isFALSE(dtr)) { - CRU_df <- subset(CRU_df, select = -dtr) + CRU_df[, dtr := NULL] } } - CRU_df$month <- factor( - CRU_df$month, - levels = c( - "jan", - "feb", - "mar", - "apr", - "may", - "jun", - "jul", - "aug", - "sep", - "oct", - "nov", - "dec" - ) - ) + + CRU_df[, month := factor(CRU_df$month)] data.table::setorder(CRU_df, month) - return(CRU_df) + return(CRU_df[]) } #' Read Files from Disk Directory and Tidy Them #' @noRd +#' @keywords Internal .tidy_df <- function(pre_cv, elv, tmn, tmx, .files) { # create list of tidied data frames ---------------------------------------- CRU_list <- @@ -275,6 +260,22 @@ return(x_df) } + +#' Create terra rast Objects +#' +#' @param pre Boolean Return precipitation in the `rast`? +#' @param pre_cv Boolean. Return cv of precipitation (percent) in the `rast`? +#' @param dtr Boolean. Return mean diurnal temperature range (degrees Celsius) +#' in the `rast`? +#' @param tmp Boolean. Return temperature (degrees Celsius) in the `rast`? +#' @param tmn Boolean. Return minimum temperature values (degrees Celsius) +#' in the `rast`? +#' @param tmx Boolean. Return maximum temperature (degrees Celsius) in the +#' `rast`? +#' @param files List. Files that are to be used in creating the `rast` object. +#' +#' @keywords Internal +#' @autoglobal #' @noRd #' .create_stacks <- function(tmn, tmx, tmp, dtr, pre, pre_cv, files) { @@ -342,6 +343,16 @@ return(CRU_stack_list) } +#' Helper Function Used in .create_stacks() +#' +#' @param files a list of files to use in creating `rast` objects +#' @param wrld an empty [terra::rast] object for filling with values +#' @param month_names A vector of month names from jan -- dec +#' @param pre `Boolean` include precipitation? +#' @param pre_cv `Boolean` include preciptation cv? +#' +#' @autoglobal +#' @keywords Internal #' @noRd .create_stack <- function(files, wrld, @@ -411,8 +422,21 @@ return(y) } +#' Set Up User Cache +#' +#' Creates local directory for caching and/or uses it for local caching or +#' uses the \R session `tempdir()`. +#' +#' @param cache `Boolean` (create) and use local file cache? +#' +#' @keywords Internal +#' @noRd .set_cache <- function(cache) { - if (isTRUE(cache)) { + manage_cache <- hoardr::hoard() + manage_cache$cache_path_set(path = "getCRUCLdata", + prefix = "org.R-project.R/R", + type = "user_cache_dir") + if (cache) { if (!dir.exists(manage_cache$cache_path_get())) { manage_cache$mkdir() } @@ -423,6 +447,33 @@ return(cache_dir) } +#' Create a List of Locally Cached Files for Import +#' +#' @param pre Boolean. Load precipitation (millimetres/month) from server and +#' return in the data frame? +#' @param pre_cv Boolean. Load cv of precipitation (percent) from server and +#' return in the data frame? +#' @param rd0 Boolean. Load wet-days (number days with >0.1 millimetres rain +#' per month) and return in the data frame? +#' @param dtr Boolean. Load mean diurnal temperature range (degrees Celsius) +#' and return it in the data frame? +#' @param tmp Boolean. Load temperature (degrees Celsius) and return it in the +#' data frame? +#' @param tmn Boolean. Calculate minimum temperature values (degrees Celsius) +#' and return it in the data frame? +#' @param tmx Boolean. Calculate maximum temperature (degrees Celsius) and +#' return it in the data frame? +#' @param reh Boolean. Load relative humidity and return it in the data frame? +#' @param sunp Boolean. Load sunshine, percent of maximum possible (percent of +#' day length) and return it in data frame? +#' @param frs Boolean. Load ground-frost records (number of days with ground- +#' frost per month) and return it in data frame? +#' @param wnd Boolean. Load 10m wind speed (metres/second) and return it in the +#' data frame? +#' @param elv Boolean. Load elevation (converted to metres) and return it in +#' the data frame? +#' +#' @keywords Internal #' @noRd .get_local <- function(pre, pre_cv, From ef1bc0899a26eb56e36e650e2be1805e07c95ef5 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:46:44 +0800 Subject: [PATCH 040/127] lint file --- R/internal_functions.R | 49 +++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/R/internal_functions.R b/R/internal_functions.R index d199aba..8645c17 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -57,16 +57,17 @@ wnd, elv) { if (!any(pre, pre_cv, rd0, tmp, dtr, reh, tmn, tmx, sunp, frs, wnd, elv)) { - cli::cli_abort("You must select at least one element for download or import.", + cli::cli_abort( + "You must select at least one element for download or import.", call = rlang::caller_env() ) } } -#' Validates User Entered dsn value +#' Validates User Entered dsn Value #' #' @param dsn User provided value for checking -#' +#' @keywords Internal #' @noRd .validate_dsn <- function(dsn) { if (missing(dsn)) { @@ -167,7 +168,7 @@ CRU_df <- Reduce(function(...) { merge(..., by = c("lat", "lon", "month")) }, CRU_list) - } else if (isTRUE(elv) & length(CRU_list) > 1) { + } else if (elv && length(CRU_list) > 1) { elv_df <- CRU_list[which(names(CRU_list) %in% "elv")] CRU_list[which(names(CRU_list) %in% "elv")] <- NULL CRU_df <- Reduce(function(...) { @@ -175,15 +176,22 @@ }, CRU_list) CRU_df <- CRU_df[elv_df$elv, on = c("lat", "lon")] - } else if (isTRUE(elv)) { + } else if (elv) { CRU_df <- CRU_list["elv"] } return(CRU_df) } +#' Read Files From Local cache +#' +#' @param .files a list of CRU CL2.0 files in local storage +#' @param .pre_cv `Boolean` return pre_cv in the data? +#' +#' @keywords Internal +#' @autoglobal #' @noRd + .read_cache <- function(.files, .pre_cv) { - pre_cv <- i.pre_cv <- elv <- NULL month_names <- c( "jan", @@ -216,7 +224,7 @@ ) data.table::setnames(x_df, c("lat", "lon", "month", "wvar")) } else if (ncol(x) == 26) { - if (isTRUE(.pre_cv)) { + if (.pre_cv) { x_df <- x[, c(1:14)] data.table::setnames(x_df, c("lat", "lon", month_names)) x_df <- data.table::melt( @@ -306,7 +314,7 @@ "dec" ) - # Create terra objects using cellFromXY and generate a terra rast + # Create terra objects using cellFromXY() and generate a terra rast # create.stack takes pre, tmp, tmn and tmx and creates a terra rast # object stack of 12 month data @@ -322,13 +330,13 @@ names(CRU_stack_list) <- substr(basename(files), 12, 14) - # cacluate tmn ------------------------------------------------------------- - if (isTRUE(tmn)) { + # calculate tmn ------------------------------------------------------------- + if (tmn) { CRU_stack_list$tmn <- CRU_stack_list$tmp - (0.5 * CRU_stack_list$dtr) } - # cacluate tmx ------------------------------------------------------------- - if (isTRUE(tmx)) { + # calculate tmx ------------------------------------------------------------- + if (tmx) { CRU_stack_list$tmx <- CRU_stack_list$tmp + (0.5 * CRU_stack_list$dtr) } @@ -376,7 +384,7 @@ } names(y) <- month_names } else if (ncol(wvar) == 26) { - if (isTRUE(pre) & isTRUE(pre_cv)) { + if (pre && pre_cv) { for (k in 3:26) { wrld[cells] <- wvar[, k] if (k == 3) { @@ -386,7 +394,7 @@ } } names(y) <- c(month_names, paste0("pre_cv_", month_names)) - } else if (isTRUE(pre)) { + } else if (pre) { for (k in 3:14) { wrld[cells] <- wvar[, k] if (k == 3) { @@ -396,7 +404,7 @@ } } names(y) <- month_names - } else if (isTRUE(pre_cv)) { + } else if (pre_cv) { for (k in 15:26) { wrld[cells] <- wvar[, k] if (k == 15) { @@ -488,13 +496,13 @@ wnd, elv, cache_dir) { - # check if pre_cv or tmx/tmn (derived) are true, make sure proper ---------- + # check if pre_cv or tmx/tmn (derived) are true, make sure proper ------------ # parameters set TRUE - if (isTRUE(pre_cv)) { + if (pre_cv) { pre <- TRUE } - if (isTRUE(tmn) | isTRUE(tmx)) { + if (any(tmn, tmx)) { dtr <- tmp <- TRUE } @@ -536,7 +544,7 @@ "rd0_file" ) - # filter files ------------------------------------------------------------- + # filter files --------------------------------------------------------------- # which files are being requested? files <- files[which(object_list)] @@ -549,7 +557,8 @@ files <- cache_dir_contents[cache_dir_contents %in% files] if (length(files) < 0) { - cli::cli_abort("There are no CRU CL v. 2.0 data files available in this directory.", + cli::cli_abort( + "There are no CRU CL v. 2.0 data files available in this directory.", call = rlang::caller_env() ) } From 00d757f96bdab44c81cf904a87011044f9251156 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:46:55 +0800 Subject: [PATCH 041/127] Update spelling WORDLIST --- inst/WORDLIST | 1 + 1 file changed, 1 insertion(+) diff --git a/inst/WORDLIST b/inst/WORDLIST index eb7c92d..2c9fa08 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -18,6 +18,7 @@ arcminutes behaviour biogeochemical centred +cli codecov colour cv From c6156982b9a8ca86b606c32d37e0ab92256d9081 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:47:30 +0800 Subject: [PATCH 042/127] replace skip_on_cran with skip_if_offline and skip on CI for long running --- tests/testthat/test-create_CRU_df.R | 2 +- tests/testthat/test-create_CRU_stack.R | 2 +- tests/testthat/test-create_df.R | 54 +++++++++++++++++++++----- tests/testthat/test-create_stack.R | 8 ++-- tests/testthat/test-get_CRU.R | 27 ++++++------- tests/testthat/test-get_CRU_df.R | 12 +++--- tests/testthat/test-get_CRU_stack.R | 10 ++--- tests/testthat/test-validate_dsn.R | 2 +- tests/testthat/test_get_local.R | 2 +- tests/testthat/test_set_cache.R | 2 +- 10 files changed, 78 insertions(+), 43 deletions(-) diff --git a/tests/testthat/test-create_CRU_df.R b/tests/testthat/test-create_CRU_df.R index 0fe627c..8ccd60f 100644 --- a/tests/testthat/test-create_CRU_df.R +++ b/tests/testthat/test-create_CRU_df.R @@ -25,7 +25,7 @@ test_that("create_CRU_df fails if dsn does not contain CRU files", { # Test that create_CRU_df loads files and creates a proper df -------------- test_that("create_CRU_df loads files and creates a proper df", { - skip_on_cran() + skip_if_offline() # create files for testing, these data are the first 10 lines of pre and tmp # from the CRU CL v. 2.0 data diff --git a/tests/testthat/test-create_CRU_stack.R b/tests/testthat/test-create_CRU_stack.R index 4e7e4c8..9a6d4d9 100644 --- a/tests/testthat/test-create_CRU_stack.R +++ b/tests/testthat/test-create_CRU_stack.R @@ -25,7 +25,7 @@ test_that("create_CRU_stack fails if dsn does not contain CRU files", { # Test that create_CRU_stack returns a list of terra objects ------------------- test_that("create_CRU_stack returns a list of terra rast objects", { - skip_on_cran() + skip_if_offline() unlink(list.files( path = tempdir(), diff --git a/tests/testthat/test-create_df.R b/tests/testthat/test-create_df.R index c0f2723..3372835 100644 --- a/tests/testthat/test-create_df.R +++ b/tests/testthat/test-create_df.R @@ -477,7 +477,7 @@ test_that("Test that .create_df() creates a tidy df of pre, pre_cv and tmp", { tmx <- FALSE elv <- FALSE rd0 <- FALSE - tmp <- FALSE + tmp <- TRUE dtr <- FALSE reh <- FALSE sunp <- FALSE @@ -492,12 +492,17 @@ test_that("Test that .create_df() creates a tidy df of pre, pre_cv and tmp", { expect_true(is.data.frame(CRU_df)) expect_named(CRU_df, c("lat", "lon", "month", "pre", "pre_cv", "tmp")) - expect_type(CRU_df$lat, "double") - expect_type(CRU_df$lon, "double") - expect_type(CRU_df$month, "integer") - expect_type(CRU_df$pre, "double") - expect_type(CRU_df$pre_cv, "double") - expect_type(CRU_df$tmp, "double") + expect_identical( + lapply(CRU_df, typeof), + list( + lat = "double", + lon = "double", + month = "integer", + pre = "double", + pre_cv = "double", + tmp = "double" + ) + ) }) test_that("Test that .create_df() creates a tidy dataframe of pre, tmp, elv", { @@ -571,9 +576,18 @@ test_that("Test that .create_df() creates a tidy dataframe of pre, tmp, elv", { expect_true(is.data.frame(CRU_df)) expect_named(CRU_df, c("lat", "lon", "month", "pre", "tmp", "elv")) - expect_type(CRU_df$lat, "double") - expect_type(CRU_df$lon, "double") - expect_type(CRU_df$elv, "double") + + expect_identical( + lapply(CRU_df, typeof), + list( + lat = "double", + lon = "double", + month = "integer", + pre = "double", + tmp = "double", + elv = "double" + ) + ) }) unlink(list.files( @@ -949,6 +963,15 @@ test_that("Test that .create_df() creates a tidy dataframe of pre, tmp, elv", { expect_named(CRU_df, c("lat", "lon", "month", "tmn")) expect_equal(CRU_df$tmn[1], 0.1) + expect_equal( + lapply(CRU_df, typeof), + list( + lat = "double", + lon = "double", + month = "integer", + tmn = "double" + ) + ) }) @@ -1324,6 +1347,17 @@ test_that("Test that .create_df() creates tmx if requested", { expect_named(CRU_df, c("lat", "lon", "month", "tmx")) expect_equal(CRU_df$tmx[1], 0.3) + + expect_identical( + lapply(CRU_df, typeof), + list( + lat = "double", + lon = "double", + month = "integer", + tmx = "double" + ) + ) + unlink(list.files( path = tempdir(), pattern = ".dat.gz$", diff --git a/tests/testthat/test-create_stack.R b/tests/testthat/test-create_stack.R index 275b9a0..46ee7b8 100644 --- a/tests/testthat/test-create_stack.R +++ b/tests/testthat/test-create_stack.R @@ -6,7 +6,7 @@ unlink(list.files( # Test that create_CRU_stack creates a list of terra rast of pre and tmp ---- test_that("create_CRU_stack creates a list of terra rast of pre and tmp", { - skip_on_cran() + skip_if_offline() wrld <- terra::rast( @@ -562,7 +562,7 @@ test_that("create_CRU_stack creates a list of terra rast of pre and tmp", { # Test that create_CRU_stack creates a list containing only elv ---------------- test_that("create_CRU_stack creates a list containing only elv", { - skip_on_cran() + skip_if_offline() unlink(list.files( path = tempdir(), @@ -661,7 +661,7 @@ test_that("create_CRU_stack creates a list containing only elv", { # Test that wrld raster object resolution and extent are appropriate ----------- test_that("Test that wrld raster object resolution and extent are appropriate", { - skip_on_cran() + skip_if_offline() wrld <- terra::rast( nrows = 930, @@ -720,7 +720,7 @@ test_that("month names are appropriate", { # Test that CRU_stack_list returns list of raster stacks with proper names ----- test_that("CRU_stack_list returns list of raster stacks with proper names", { - skip_on_cran() + skip_if_offline() unlink(list.files( path = tempdir(), diff --git a/tests/testthat/test-get_CRU.R b/tests/testthat/test-get_CRU.R index 0fde465..045eac0 100644 --- a/tests/testthat/test-get_CRU.R +++ b/tests/testthat/test-get_CRU.R @@ -6,8 +6,8 @@ test_that("get_CRU will retrieve only precipitation file when pre_cv TRUE", { full.names = TRUE )) - skip_on_cran() - skip_on_appveyor() + skip_if_offline() + skip_on_ci() .get_CRU( pre = FALSE, pre_cv = TRUE, @@ -35,8 +35,8 @@ test_that("get_CRU will retrieve only precipitation file when pre_cv TRUE", { # Test that get_CRU will retrieve diurnal tmp & tmp files when tmn TRUE -------- test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmn TRUE", { - skip_on_cran() - skip_on_appveyor() + skip_if_offline() + skip_on_ci() .get_CRU( pre = FALSE, pre_cv = FALSE, @@ -63,9 +63,8 @@ test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmn TRUE", { # Test that get_CRU will retrieve diurnal tmp & tmp files when tmx TRUE -------- test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmx TRUE", { - skip_on_cran() - skip_on_appveyor() - + skip_if_offline() + skip_on_ci() unlink(list.files( path = tempdir(), pattern = ".dat.gz$", @@ -99,14 +98,15 @@ test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmx TRUE", { # Test that get_CRU will set pre to TRUE if pre_cv is TRUE and pre is FALSE ---- test_that("get_CRU will set pre to TRUE if pre_cv is TRUE and pre is FALSE", { - skip_on_cran() - skip_on_appveyor() + skip_if_offline() + skip_on_ci() + pre <- FALSE pre_cv <- TRUE - expect_false(isTRUE(pre)) + expect_false(pre) - if (isTRUE(pre_cv)) { + if (pre_cv) { pre <- TRUE } expect_true(pre) @@ -117,8 +117,9 @@ test_that("get_CRU will set pre to TRUE if pre_cv is TRUE and pre is FALSE", { test_that("get_CRU will set tmp and dtr to TRUE if tmn or tmx is TRUE and either/both are false", { - skip_on_cran() + skip_if_offline() + skip_on_ci() tmp <- FALSE dtr <- FALSE tmn <- TRUE @@ -126,7 +127,7 @@ test_that("get_CRU will set tmp and dtr to TRUE if tmn or tmx expect_false(isTRUE(tmp)) expect_false(isTRUE(dtr)) - if (isTRUE(tmn) | isTRUE(tmx)) { + if (any(tmn, tmx)) { dtr <- tmp <- TRUE } diff --git a/tests/testthat/test-get_CRU_df.R b/tests/testthat/test-get_CRU_df.R index 62eba5a..27066c2 100644 --- a/tests/testthat/test-get_CRU_df.R +++ b/tests/testthat/test-get_CRU_df.R @@ -9,7 +9,7 @@ test_that("get_CRU_df fails if no parameters are TRUE", { # Test that get_CRU_df will retrieve files from CRU server test_that("get_CRU_df will retrieve files from CRU server", { - skip_on_cran() + skip_if_offline() CRU_tmp <- get_CRU_df(tmp = TRUE, cache = FALSE) expect_type(CRU_tmp, "list") }) @@ -20,7 +20,7 @@ test_that("get_CRU_df lists only .dat.gz files in the given dsn", { # create files for testing, these data are the first 10 lines of pre and tmp # from the CRU CL v. 2.0 data - skip_on_cran() + skip_if_offline() unlink(list.files( path = tempdir(), @@ -501,11 +501,11 @@ test_that("get_CRU_df lists only .dat.gz files in the given dsn", { # Test that get_CRU_df sets the cache directory properly when cache is TRUE ---- test_that("get_CRU_df sets the cache directory properly when cache is TRUE", { - skip_on_cran() + skip_if_offline() cache <- TRUE - if (isTRUE(cache)) { + if (cache) { cache_dir <- rappdirs::user_config_dir("getCRUCLdata") if (!file.exists(cache_dir)) { dir.create(cache_dir) @@ -520,10 +520,10 @@ test_that("get_CRU_df sets the cache directory properly when cache is TRUE", { # Test that get_CRU_df sets the cache dir properly when cache is FALSE --------- test_that("get_CRU_df sets the cache directory properly when cache is FALSE", { - skip_on_cran() + skip_if_offline() cache <- FALSE - if (isTRUE(cache)) { + if (cache) { cache_dir <- rappdirs::user_config_dir("getCRUCLdata") if (!file.exists(cache_dir)) { dir.create(cache_dir) diff --git a/tests/testthat/test-get_CRU_stack.R b/tests/testthat/test-get_CRU_stack.R index b84b2c6..82786f1 100644 --- a/tests/testthat/test-get_CRU_stack.R +++ b/tests/testthat/test-get_CRU_stack.R @@ -1,6 +1,6 @@ # Test that get_CRU_stack will retrieve files from CRU server -------------- test_that("get_CRU_stack will retrieve files from CRU server", { - skip_on_cran() + skip_if_offline() CRU_tmp <- get_CRU_stack(tmp = TRUE, tmn = FALSE, tmx = FALSE, cache = FALSE) expect_type(CRU_tmp, "list") @@ -500,10 +500,10 @@ test_that("create_CRU_df lists only .dat.gz files in the given dsn", { # Test that get_CRU_stack sets the cache dir properly when cache is TRUE ------- test_that("get_CRU_stack sets the cache dir properly when cache is TRUE", { - skip_on_cran() + skip_if_offline() cache <- TRUE - if (isTRUE(cache)) { + if (cache) { cache_dir <- rappdirs::user_config_dir("getCRUCLdata") if (!file.exists(cache_dir)) { dir.create(cache_dir) @@ -518,10 +518,10 @@ test_that("get_CRU_stack sets the cache dir properly when cache is TRUE", { # Test that get_CRU_stack sets the cache dir properly when cache is FALSE ------ test_that("get_CRU_stack sets the cache dir properly when cache is FALSE", { - skip_on_cran() + skip_if_offline() cache <- FALSE - if (isTRUE(cache)) { + if (cache) { cache_dir <- rappdirs::user_config_dir("getCRUCLdata") if (!file.exists(cache_dir)) { dir.create(cache_dir) diff --git a/tests/testthat/test-validate_dsn.R b/tests/testthat/test-validate_dsn.R index 6beb0df..74b5e0c 100644 --- a/tests/testthat/test-validate_dsn.R +++ b/tests/testthat/test-validate_dsn.R @@ -1,7 +1,7 @@ # Test that .validate_dsn stops if the dsn is not provided --------------------- test_that(".validate_dsn stops if the dsn is not provided", { - skip_on_cran() + skip_if_offline() dsn <- NULL expect_error(.validate_dsn(dsn)) }) diff --git a/tests/testthat/test_get_local.R b/tests/testthat/test_get_local.R index feea928..d2083eb 100644 --- a/tests/testthat/test_get_local.R +++ b/tests/testthat/test_get_local.R @@ -1,7 +1,7 @@ # Test that .get_local lists local files --------------------------------------- test_that("Test that .get_local lists local files", { - skip_on_cran() + skip_if_offline() # create files for testing, these data are the first 10 lines of pre and tmp # from the CRU CL v. 2.0 data diff --git a/tests/testthat/test_set_cache.R b/tests/testthat/test_set_cache.R index 1180753..12f8b27 100644 --- a/tests/testthat/test_set_cache.R +++ b/tests/testthat/test_set_cache.R @@ -1,7 +1,7 @@ # test that .set_cache creates a cache directory if none exists ---------------- test_that("test that .set_cache creates a cache directory if none exists", { - skip_on_cran() + skip_if_offline() unlink(manage_cache$cache_path_get(), recursive = TRUE) cache <- TRUE .set_cache(cache) From f49501bc50310a7d686e5d7da817f1acb7c2ecd6 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:47:39 +0800 Subject: [PATCH 043/127] update caching tests --- tests/testthat/test_caching.R | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/testthat/test_caching.R b/tests/testthat/test_caching.R index a411e33..6aaa980 100644 --- a/tests/testthat/test_caching.R +++ b/tests/testthat/test_caching.R @@ -1,19 +1,22 @@ # test that .set_cache creates a cache directory if none exists ---------------- test_that("test that set_cache creates a cache directory if none exists", { - skip_on_cran() - unlink(manage_cache$cache_path_get(), recursive = TRUE) + skip_if_offline() + withr::local_envvar(R_USER_CACHE_DIR = tempdir()) + temp_cache <- file.path(tempdir(), "R/getCRUCLdata/") + manage_cache <- hoardr::hoard() + manage_cache$cache_path_set(path = "getCRUCLdata", + prefix = "org.R-project.R/R", + type = "user_cache_dir") cache <- TRUE .set_cache(cache) expect_true(file.exists(manage_cache$cache_path_get())) - # cleanup - unlink(manage_cache$cache_path_get(), recursive = TRUE) + withr::deferred_run() }) # test that .set_cache does a cache directory if cache is FALSE ---------------- test_that("test that set_cache does not create a dir if cache == FALSE", { - cache <- FALSE - cache_dir <- .set_cache(cache) + cache_dir <- .set_cache(cache = FALSE) expect_true(cache_dir == tempdir()) }) @@ -28,7 +31,7 @@ test_that("cache directory is created if necessary", { }) test_that("caching utils list files in cache and delete when asked", { - skip_on_cran() + skip_if_offline() unlink(list.files(manage_cache$cache_path_get()), recursive = TRUE ) @@ -55,3 +58,5 @@ test_that("caching utils list files in cache and delete when asked", { manage_cache$delete_all() expect_identical(list.files(manage_cache$list()), character(0)) }) + + From 6dfcbb9bf2c92c5a97b2e62acac3dfa7a1344643 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:48:07 +0800 Subject: [PATCH 044/127] use roxyglobals --- DESCRIPTION | 9 +++++++-- R/globals.R | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 R/globals.R diff --git a/DESCRIPTION b/DESCRIPTION index 016540c..500995e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -35,9 +35,11 @@ Suggests: rappdirs, rmarkdown, roxygen2, + roxyglobals, spelling, testthat, - viridis + viridis, + withr VignetteBuilder: knitr ByteCompile: TRUE @@ -45,10 +47,13 @@ Config/testthat/edition: 3 Config/testthat/parallel: true Encoding: UTF-8 Language: en-US -Roxygen: list(markdown = TRUE) +Roxygen: list(markdown = TRUE, roclets = c("collate", "namespace", "rd", + "roxyglobals::global_roclet")) RoxygenNote: 7.3.2 X-schema.org-applicationCategory: Tools X-schema.org-isPartOf: https://ropensci.org X-schema.org-keywords: anglia-cru, climate-data, cru-cl2, temperature, rainfall, elevation, data-access, wind, relative-humidity, solar-radiation, diurnal-temperature, frost +Config/roxyglobals/filename: globals.R +Config/roxyglobals/unique: FALSE diff --git a/R/globals.R b/R/globals.R new file mode 100644 index 0000000..81b88c2 --- /dev/null +++ b/R/globals.R @@ -0,0 +1,9 @@ +# Generated by roxyglobals: do not edit by hand + +utils::globalVariables(c( + "month", # <.create_df> + "pre_cv", # <.read_cache> + "i.pre_cv", # <.read_cache> + "elv", # <.read_cache> + NULL +)) From 3edc189dc8838124e05c62898d737c30bfd6232d Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:48:28 +0800 Subject: [PATCH 045/127] update NEWS.md --- NEWS.md | 45 +++++++++++++++------------------------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/NEWS.md b/NEWS.md index 482d867..1d96893 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,17 @@ +# getCRUCLdata 1.0.0 + +## Major changes + +- The cache is now where ever `tools::R_user_dir(package = "getCRUCLdata", which = "cache")` is defined by R (>= 4.0.0) + +- Depends on R (>= 4.0.0) + +## Minor changes + +- {cli} is used for errors that are emitted to the user + +- Many internal changes including code linting and styling to improve code smells + # getCRUCLdata 0.3.3 ## Minor changes @@ -32,8 +46,6 @@ - Update URL in DESCRIPTION file --------------------------------------------------------------------------------- - # getCRUCLdata 0.3.0 ## Major changes @@ -50,8 +62,6 @@ - Update package to follow CRAN policies --------------------------------------------------------------------------------- - # getCRUCLdata 0.2.5 ## Minor changes @@ -61,8 +71,6 @@ - Reorganises internal functions consolidating functions all in a single file and following a standard naming scheme for all internal functions --------------------------------------------------------------------------------- - # getCRUCLdata 0.2.4 ## Bug fixes @@ -71,7 +79,7 @@ and following a standard naming scheme for all internal functions stacks - Move `rappdirs` to SUGGESTS to fix NOTEs on -https://cran.rstudio.com/web/checks/check_results_getCRUCLdata.html + ## Minor changes @@ -80,8 +88,6 @@ https://cran.rstudio.com/web/checks/check_results_getCRUCLdata.html - Enhance `stop` messages for user, just print message, not the function that called it to clarify --------------------------------------------------------------------------------- - # getCRUCLdata 0.2.3 ## Bug fixes @@ -92,15 +98,12 @@ called it to clarify - Remove the use of `plyr` in tests --------------------------------------------------------------------------------- - # getCRUCLdata 0.2.2 ## Bug fixes - Fix incorrect ORCID entry author field --------------------------------------------------------------------------------- # getCRUCLdata 0.2.1 ## Minor changes @@ -109,8 +112,6 @@ called it to clarify - Remove Scott as contributor, the code contributed has been removed --------------------------------------------------------------------------------- - # getCRUCLdata 0.2.0 ## Major changes @@ -135,8 +136,6 @@ them in the cache where the package will find them `CRU_cache_delete()` now superseded by `manage_cache$delete()` `CRU_cache_delete_all()` now superseded by `manage_cache$delete_all()` --------------------------------------------------------------------------------- - # getCRUCLdata 0.1.10 ## Major changes @@ -170,8 +169,6 @@ Raster stacks were not affected by this bug - Replaced `for f in 1:length()` with `for f in seq_along()` for better programming practices --------------------------------------------------------------------------------- - # getCRUCLdata 0.1.7 ## Minor Changes @@ -183,8 +180,6 @@ programming practices - Fix bug where `rappdirs::user_config_dir()` was incorrectly used in place of `rappdirs::user_cache_dir()` --------------------------------------------------------------------------------- - # getCRUCLdata 0.1.6 ## Minor Changes @@ -201,8 +196,6 @@ programming practices - Format NEWS.md to be more markdown standards compliant --------------------------------------------------------------------------------- - # getCRUCLdata 0.1.5 ## Major Changes @@ -232,8 +225,6 @@ current R session, if so data file(s) are not requested for download again - Months are returned as a factor object in the tidy data frame --------------------------------------------------------------------------------- - # getCRUCLdata 0.1.4 ## Minor Changes @@ -252,8 +243,6 @@ cropped - Minor edits to documentation for clarity --------------------------------------------------------------------------------- - # getCRUCLdata 0.1.2 ## Minor Changes @@ -269,8 +258,6 @@ seconds - Corrected URL pointing to CRU readme.txt file --------------------------------------------------------------------------------- - # getCRUCLdata 0.1.1 ## Minor Changes @@ -281,8 +268,6 @@ seconds - Enhanced vignette --------------------------------------------------------------------------------- - ## getCRUCL2.0 0.1.0 ## Minor Changes From 548b65471ec45bc4565ab4946a5391aba3cb956f Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:48:40 +0800 Subject: [PATCH 046/127] update codemeta.json --- codemeta.json | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index 58a68a9..f90d99c 100644 --- a/codemeta.json +++ b/codemeta.json @@ -93,6 +93,18 @@ }, "sameAs": "https://CRAN.R-project.org/package=roxygen2" }, + { + "@type": "SoftwareApplication", + "identifier": "roxyglobals", + "name": "roxyglobals", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=roxyglobals" + }, { "@type": "SoftwareApplication", "identifier": "spelling", @@ -128,6 +140,18 @@ "url": "https://cran.r-project.org" }, "sameAs": "https://CRAN.R-project.org/package=viridis" + }, + { + "@type": "SoftwareApplication", + "identifier": "withr", + "name": "withr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=withr" } ], "softwareRequirements": { @@ -219,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "907.301KB", + "fileSize": "800.593KB", "citation": [ { "@type": "ScholarlyArticle", From e02fb14909d59d3cd00992666139a47d17e25a4a Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:49:14 +0800 Subject: [PATCH 047/127] Update README --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 2e3207e..90c3f5d 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R [![codecov](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://codecov.io/gh/ropensci/getCRUCLdata) -Author/Maintainer: Adam Sparks - ## Introduction to {getCRUCLdata} The {getCRUCLdata} package provides functions that automate importing CRU CL v. 2.0 climatology data into R, facilitate the calculation of minimum temperature and maximum temperature, and formats the data into a [data.table](https://CRAN.R-project.org/package=data.table) or a list of [terra::rast](https://CRAN.R-project.org/package=terra) objects for use. From 73c0968445713925f2e9943f1934286b7de5dfc3 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:49:31 +0800 Subject: [PATCH 048/127] update codemeta.json --- codemeta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index f90d99c..3c4b773 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.593KB", + "fileSize": "800.561KB", "citation": [ { "@type": "ScholarlyArticle", From 92a5f3557a04ae528fbe355dd10161a6ae4ba68f Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:54:09 +0800 Subject: [PATCH 049/127] set up caching on macOS for tests --- codemeta.json | 2 +- tests/testthat/test_caching.R | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index 3c4b773..3df6150 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.561KB", + "fileSize": "800.871KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/tests/testthat/test_caching.R b/tests/testthat/test_caching.R index 6aaa980..8ad15e5 100644 --- a/tests/testthat/test_caching.R +++ b/tests/testthat/test_caching.R @@ -35,6 +35,12 @@ test_that("caching utils list files in cache and delete when asked", { unlink(list.files(manage_cache$cache_path_get()), recursive = TRUE ) + withr::local_envvar(R_USER_CACHE_DIR = tempdir()) + temp_cache <- file.path(tempdir(), "R/getCRUCLdata/") + manage_cache <- hoardr::hoard() + manage_cache$cache_path_set(path = "getCRUCLdata", + prefix = "org.R-project.R/R", + type = "user_cache_dir") cache <- TRUE cache_dir <- .set_cache(cache) f <- From 95e2c81b330bb9e02089c240f929868c93c549dc Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:54:38 +0800 Subject: [PATCH 050/127] Set deferred run for withr in tests --- codemeta.json | 2 +- tests/testthat/test_caching.R | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/codemeta.json b/codemeta.json index 3df6150..6bde0af 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.871KB", + "fileSize": "800.893KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/tests/testthat/test_caching.R b/tests/testthat/test_caching.R index 8ad15e5..56d9f92 100644 --- a/tests/testthat/test_caching.R +++ b/tests/testthat/test_caching.R @@ -63,6 +63,5 @@ test_that("caching utils list files in cache and delete when asked", { # test delete all manage_cache$delete_all() expect_identical(list.files(manage_cache$list()), character(0)) + withr::deferred_run() }) - - From 744cb07be06df1ad2b32fe2143e0f2c91271a937 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:57:14 +0800 Subject: [PATCH 051/127] correct return value, it is a data.table not a base data frame --- R/create_CRU_df.R | 4 ++-- R/get_CRU_df.R | 4 ++-- codemeta.json | 2 +- man/create_CRU_df.Rd | 4 ++-- man/get_CRU_df.Rd | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 807cf48..5d89961 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -54,8 +54,8 @@ #' @seealso #' [get_CRU_df()] #' -#' @return A tidy data frame of \acronym{CRU} \acronym{CL} v. 2.0 climatology -#' elements as a [base::data.frame()] object +#' @return A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 +#' climatology elements #' #' @author Adam H Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 59a83ed..1b844a5 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -68,8 +68,8 @@ #' [create_CRU_stack()] #' [manage_cache()] #' -#' @return A tidy data frame of \acronym{CRU} \acronym{CL} v. 2.0 climatology -#' elements as a [tibble::tibble()] object +#' @return A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 +#' climatology elements #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/codemeta.json b/codemeta.json index 6bde0af..d6448b9 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.893KB", + "fileSize": "800.759KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index bb8c381..2120840 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -63,8 +63,8 @@ the data frame? Defaults to \code{FALSE}.} files are located.} } \value{ -A tidy data frame of \acronym{CRU} \acronym{CL} v. 2.0 climatology -elements as a \code{\link[base:data.frame]{base::data.frame()}} object +A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 +climatology elements } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index 53c1544..537dc37 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -65,8 +65,8 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A tidy data frame of \acronym{CRU} \acronym{CL} v. 2.0 climatology -elements as a \code{\link[tibble:tibble]{tibble::tibble()}} object +A \CRANpkg{data.table} object of \acronym{CRU} \acronym{CL} v. 2.0 +climatology elements } \description{ This function automates downloading and importing \acronym{CRU} From 8600df44c8d8aea41a30d46bf91e375d5c4f4176 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 10:59:28 +0800 Subject: [PATCH 052/127] Replace Logical with Boolean --- R/create_CRU_df.R | 24 ++++++++++++------------ R/get_CRU_df.R | 26 +++++++++++++------------- man/create_CRU_df.Rd | 24 ++++++++++++------------ man/create_CRU_stack.Rd | 24 ++++++++++++------------ man/get_CRU_df.Rd | 26 +++++++++++++------------- man/get_CRU_stack.Rd | 26 +++++++++++++------------- 6 files changed, 75 insertions(+), 75 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 5d89961..c83c00b 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -9,31 +9,31 @@ #' #' @inheritSection get_CRU_df Nomenclature and Units #' -#' @param pre Logical. Load precipitation (millimetres/month) from server and +#' @param pre Boolean. Load precipitation (millimetres/month) from server and #' return in the data frame? Defaults to `FALSE`. -#' @param pre_cv Logical. Load cv of precipitation (percent) from server and +#' @param pre_cv Boolean. Load cv of precipitation (percent) from server and #' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to #' `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. -#' @param rd0 Logical. Load wet-days (number days with >0.1millimetres rain per +#' @param rd0 Boolean. Load wet-days (number days with >0.1millimetres rain per #' month) and return in the data frame? Defaults to `FALSE`. -#' @param dtr Logical. Load mean diurnal temperature range (degrees Celsius) +#' @param dtr Boolean. Load mean diurnal temperature range (degrees Celsius) #' and return it in the data frame? Defaults to `FALSE`. -#' @param tmp Logical. Load temperature (degrees Celsius) and return it in the +#' @param tmp Boolean. Load temperature (degrees Celsius) and return it in the #' data frame? Defaults to `FALSE`. -#' @param tmn Logical. Calculate minimum temperature values (degrees Celsius) +#' @param tmn Boolean. Calculate minimum temperature values (degrees Celsius) #' and return it in the data frame? Defaults to `FALSE`. -#' @param tmx Logical. Calculate maximum temperature (degrees Celsius) and +#' @param tmx Boolean. Calculate maximum temperature (degrees Celsius) and #' return it in the data frame? Defaults to `FALSE`. -#' @param reh Logical. Load relative humidity and return it in the data frame? +#' @param reh Boolean. Load relative humidity and return it in the data frame? #' Defaults to `FALSE`. -#' @param sunp Logical. Load sunshine, percent of maximum possible (percent of +#' @param sunp Boolean. Load sunshine, percent of maximum possible (percent of #' day length) and return it in data frame? Defaults to `FALSE`. -#' @param frs Logical. Load ground-frost records (number of days with ground- +#' @param frs Boolean. Load ground-frost records (number of days with ground- #' frost per month) and return it in data frame? Defaults to `FALSE`. -#' @param wnd Logical. Load 10m wind speed (metres/second) and return it in the +#' @param wnd Boolean. Load 10m wind speed (metres/second) and return it in the #' data frame? Defaults to `FALSE`. -#' @param elv Logical. Load elevation (converted to metres) and return it in +#' @param elv Boolean. Load elevation (converted to metres) and return it in #' the data frame? Defaults to `FALSE`. #' @param dsn Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz #' files are located. diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 1b844a5..c67e32a 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -25,33 +25,33 @@ #' For more information see the description of the data provided by #' \acronym{CRU}, #' -#' @param pre Logical. Fetch precipitation (millimetres/month) from server and +#' @param pre Boolean. Fetch precipitation (millimetres/month) from server and #' return in the data frame? Defaults to `FALSE`. -#' @param pre_cv Logical. Fetch cv of precipitation (percent) from server and +#' @param pre_cv Boolean. Fetch cv of precipitation (percent) from server and #' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to #' `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. -#' @param rd0 Logical. Fetch wet-days (number days with >0.1 millimetres rain +#' @param rd0 Boolean. Fetch wet-days (number days with >0.1 millimetres rain #' per month) and return in the data frame? Defaults to `FALSE`. -#' @param dtr Logical. Fetch mean diurnal temperature range (degrees Celsius) +#' @param dtr Boolean. Fetch mean diurnal temperature range (degrees Celsius) #' and return it in the data frame? Defaults to `FALSE`. -#' @param tmp Logical. Fetch temperature (degrees Celsius) and return it in the +#' @param tmp Boolean. Fetch temperature (degrees Celsius) and return it in the #' data frame? Defaults to `FALSE`. -#' @param tmn Logical. Calculate minimum temperature values (degrees Celsius) +#' @param tmn Boolean. Calculate minimum temperature values (degrees Celsius) #' and return it in the data frame? Defaults to `FALSE`. -#' @param tmx Logical. Calculate maximum temperature (degrees Celsius) and +#' @param tmx Boolean. Calculate maximum temperature (degrees Celsius) and #' return it in the data frame? Defaults to `FALSE`. -#' @param reh Logical. Fetch relative humidity and return it in the data frame? +#' @param reh Boolean. Fetch relative humidity and return it in the data frame? #' Defaults to FALSE. -#' @param sunp Logical. Fetch sunshine, percent of maximum possible (percent of +#' @param sunp Boolean. Fetch sunshine, percent of maximum possible (percent of #' day length) and return it in data frame? Defaults to `FALSE`. -#' @param frs Logical. Fetch ground-frost records (number of days with ground- +#' @param frs Boolean. Fetch ground-frost records (number of days with ground- #' frost per month) and return it in data frame? Defaults to `FALSE`. -#' @param wnd Logical. Fetch 10m wind speed (metres/second) and return it in the +#' @param wnd Boolean. Fetch 10m wind speed (metres/second) and return it in the #' data frame? Defaults to `FALSE`. -#' @param elv Logical. Fetch elevation (converted to metres) and return it in +#' @param elv Boolean. Fetch elevation (converted to metres) and return it in #' the data frame? Defaults to `FALSE`. -#' @param cache Logical. Store CRU CL v. 2.0 data files locally for later use? +#' @param cache Boolean. Store CRU CL v. 2.0 data files locally for later use? #' If `FALSE`, the downloaded files are removed when R session is closed. #' To take advantage of cached files in future sessions, use `cache = TRUE` #' after the initial download and caching. Defaults to `FALSE`. diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index 2120840..c2b382f 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -21,42 +21,42 @@ create_CRU_df( ) } \arguments{ -\item{pre}{Logical. Load precipitation (millimetres/month) from server and +\item{pre}{Boolean. Load precipitation (millimetres/month) from server and return in the data frame? Defaults to \code{FALSE}.} -\item{pre_cv}{Logical. Load cv of precipitation (percent) from server and +\item{pre_cv}{Boolean. Load cv of precipitation (percent) from server and return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Logical. Load wet-days (number days with >0.1millimetres rain per +\item{rd0}{Boolean. Load wet-days (number days with >0.1millimetres rain per month) and return in the data frame? Defaults to \code{FALSE}.} -\item{tmp}{Logical. Load temperature (degrees Celsius) and return it in the +\item{tmp}{Boolean. Load temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{dtr}{Logical. Load mean diurnal temperature range (degrees Celsius) +\item{dtr}{Boolean. Load mean diurnal temperature range (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{reh}{Logical. Load relative humidity and return it in the data frame? +\item{reh}{Boolean. Load relative humidity and return it in the data frame? Defaults to \code{FALSE}.} -\item{tmn}{Logical. Calculate minimum temperature values (degrees Celsius) +\item{tmn}{Boolean. Calculate minimum temperature values (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{tmx}{Logical. Calculate maximum temperature (degrees Celsius) and +\item{tmx}{Boolean. Calculate maximum temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{sunp}{Logical. Load sunshine, percent of maximum possible (percent of +\item{sunp}{Boolean. Load sunshine, percent of maximum possible (percent of day length) and return it in data frame? Defaults to \code{FALSE}.} -\item{frs}{Logical. Load ground-frost records (number of days with ground- +\item{frs}{Boolean. Load ground-frost records (number of days with ground- frost per month) and return it in data frame? Defaults to \code{FALSE}.} -\item{wnd}{Logical. Load 10m wind speed (metres/second) and return it in the +\item{wnd}{Boolean. Load 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} -\item{elv}{Logical. Load elevation (converted to metres) and return it in +\item{elv}{Boolean. Load elevation (converted to metres) and return it in the data frame? Defaults to \code{FALSE}.} \item{dsn}{Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 43178c7..72b69f2 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -21,42 +21,42 @@ create_CRU_stack( ) } \arguments{ -\item{pre}{Logical. Load precipitation (millimetres/month) from server and +\item{pre}{Boolean. Load precipitation (millimetres/month) from server and return in the data frame? Defaults to \code{FALSE}.} -\item{pre_cv}{Logical. Load cv of precipitation (percent) from server and +\item{pre_cv}{Boolean. Load cv of precipitation (percent) from server and return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Logical. Load wet-days (number days with >0.1millimetres rain per +\item{rd0}{Boolean. Load wet-days (number days with >0.1millimetres rain per month) and return in the data frame? Defaults to \code{FALSE}.} -\item{tmp}{Logical. Load temperature (degrees Celsius) and return it in the +\item{tmp}{Boolean. Load temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{dtr}{Logical. Load mean diurnal temperature range (degrees Celsius) +\item{dtr}{Boolean. Load mean diurnal temperature range (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{reh}{Logical. Load relative humidity and return it in the data frame? +\item{reh}{Boolean. Load relative humidity and return it in the data frame? Defaults to \code{FALSE}.} -\item{tmn}{Logical. Calculate minimum temperature values (degrees Celsius) +\item{tmn}{Boolean. Calculate minimum temperature values (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{tmx}{Logical. Calculate maximum temperature (degrees Celsius) and +\item{tmx}{Boolean. Calculate maximum temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{sunp}{Logical. Load sunshine, percent of maximum possible (percent of +\item{sunp}{Boolean. Load sunshine, percent of maximum possible (percent of day length) and return it in data frame? Defaults to \code{FALSE}.} -\item{frs}{Logical. Load ground-frost records (number of days with ground- +\item{frs}{Boolean. Load ground-frost records (number of days with ground- frost per month) and return it in data frame? Defaults to \code{FALSE}.} -\item{wnd}{Logical. Load 10m wind speed (metres/second) and return it in the +\item{wnd}{Boolean. Load 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} -\item{elv}{Logical. Load elevation (converted to metres) and return it in +\item{elv}{Boolean. Load elevation (converted to metres) and return it in the data frame? Defaults to \code{FALSE}.} \item{dsn}{Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index 537dc37..0f6451f 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -21,45 +21,45 @@ get_CRU_df( ) } \arguments{ -\item{pre}{Logical. Fetch precipitation (millimetres/month) from server and +\item{pre}{Boolean. Fetch precipitation (millimetres/month) from server and return in the data frame? Defaults to \code{FALSE}.} -\item{pre_cv}{Logical. Fetch cv of precipitation (percent) from server and +\item{pre_cv}{Boolean. Fetch cv of precipitation (percent) from server and return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Logical. Fetch wet-days (number days with >0.1 millimetres rain +\item{rd0}{Boolean. Fetch wet-days (number days with >0.1 millimetres rain per month) and return in the data frame? Defaults to \code{FALSE}.} -\item{tmp}{Logical. Fetch temperature (degrees Celsius) and return it in the +\item{tmp}{Boolean. Fetch temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{dtr}{Logical. Fetch mean diurnal temperature range (degrees Celsius) +\item{dtr}{Boolean. Fetch mean diurnal temperature range (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{reh}{Logical. Fetch relative humidity and return it in the data frame? +\item{reh}{Boolean. Fetch relative humidity and return it in the data frame? Defaults to FALSE.} -\item{tmn}{Logical. Calculate minimum temperature values (degrees Celsius) +\item{tmn}{Boolean. Calculate minimum temperature values (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{tmx}{Logical. Calculate maximum temperature (degrees Celsius) and +\item{tmx}{Boolean. Calculate maximum temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{sunp}{Logical. Fetch sunshine, percent of maximum possible (percent of +\item{sunp}{Boolean. Fetch sunshine, percent of maximum possible (percent of day length) and return it in data frame? Defaults to \code{FALSE}.} -\item{frs}{Logical. Fetch ground-frost records (number of days with ground- +\item{frs}{Boolean. Fetch ground-frost records (number of days with ground- frost per month) and return it in data frame? Defaults to \code{FALSE}.} -\item{wnd}{Logical. Fetch 10m wind speed (metres/second) and return it in the +\item{wnd}{Boolean. Fetch 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} -\item{elv}{Logical. Fetch elevation (converted to metres) and return it in +\item{elv}{Boolean. Fetch elevation (converted to metres) and return it in the data frame? Defaults to \code{FALSE}.} -\item{cache}{Logical. Store CRU CL v. 2.0 data files locally for later use? +\item{cache}{Boolean. Store CRU CL v. 2.0 data files locally for later use? If \code{FALSE}, the downloaded files are removed when R session is closed. To take advantage of cached files in future sessions, use \code{cache = TRUE} after the initial download and caching. Defaults to \code{FALSE}.} diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 56ce281..5067969 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -21,45 +21,45 @@ get_CRU_stack( ) } \arguments{ -\item{pre}{Logical. Fetch precipitation (millimetres/month) from server and +\item{pre}{Boolean. Fetch precipitation (millimetres/month) from server and return in the data frame? Defaults to \code{FALSE}.} -\item{pre_cv}{Logical. Fetch cv of precipitation (percent) from server and +\item{pre_cv}{Boolean. Fetch cv of precipitation (percent) from server and return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Logical. Fetch wet-days (number days with >0.1 millimetres rain +\item{rd0}{Boolean. Fetch wet-days (number days with >0.1 millimetres rain per month) and return in the data frame? Defaults to \code{FALSE}.} -\item{tmp}{Logical. Fetch temperature (degrees Celsius) and return it in the +\item{tmp}{Boolean. Fetch temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{dtr}{Logical. Fetch mean diurnal temperature range (degrees Celsius) +\item{dtr}{Boolean. Fetch mean diurnal temperature range (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{reh}{Logical. Fetch relative humidity and return it in the data frame? +\item{reh}{Boolean. Fetch relative humidity and return it in the data frame? Defaults to FALSE.} -\item{tmn}{Logical. Calculate minimum temperature values (degrees Celsius) +\item{tmn}{Boolean. Calculate minimum temperature values (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{tmx}{Logical. Calculate maximum temperature (degrees Celsius) and +\item{tmx}{Boolean. Calculate maximum temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{sunp}{Logical. Fetch sunshine, percent of maximum possible (percent of +\item{sunp}{Boolean. Fetch sunshine, percent of maximum possible (percent of day length) and return it in data frame? Defaults to \code{FALSE}.} -\item{frs}{Logical. Fetch ground-frost records (number of days with ground- +\item{frs}{Boolean. Fetch ground-frost records (number of days with ground- frost per month) and return it in data frame? Defaults to \code{FALSE}.} -\item{wnd}{Logical. Fetch 10m wind speed (metres/second) and return it in the +\item{wnd}{Boolean. Fetch 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} -\item{elv}{Logical. Fetch elevation (converted to metres) and return it in +\item{elv}{Boolean. Fetch elevation (converted to metres) and return it in the data frame? Defaults to \code{FALSE}.} -\item{cache}{Logical. Store CRU CL v. 2.0 data files locally for later use? +\item{cache}{Boolean. Store CRU CL v. 2.0 data files locally for later use? If \code{FALSE}, the downloaded files are removed when R session is closed. To take advantage of cached files in future sessions, use \code{cache = TRUE} after the initial download and caching. Defaults to \code{FALSE}.} From d8d7636705674f804130e0eabf28da03f018cecd Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 11:01:08 +0800 Subject: [PATCH 053/127] more polishing in documentation --- R/get_CRU_stack.R | 4 ++-- codemeta.json | 2 +- man/get_CRU_stack.Rd | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 4823ac5..9d7869c 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -22,8 +22,8 @@ #' [create_CRU_stack()] #' [manage_cache()] #' -#' @return A [base::list()] of [terra()] -#' [terra::rast()] objects of CRU CL v. 2.0 climatology elements +#' @return A [base::list()] of \CRANpkg{terra} [terra::rast()] objects of CRU CL +#' v. 2.0 climatology elements #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/codemeta.json b/codemeta.json index d6448b9..3a1a044 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.759KB", + "fileSize": "800.752KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 5067969..2281629 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -65,8 +65,8 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \code{\link[base:list]{base::list()}} of \code{\link[=terra]{terra()}} -\code{\link[terra:rast]{terra::rast()}} objects of CRU CL v. 2.0 climatology elements +A \code{\link[base:list]{base::list()}} of \CRANpkg{terra} \code{\link[terra:rast]{terra::rast()}} objects of CRU CL +v. 2.0 climatology elements } \description{ This function automates downloading and importing CRU CL v. 2.0 From 59272f09accee65084c91adfb77858fd04e36ef2 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 11:03:23 +0800 Subject: [PATCH 054/127] don't skip tests on CI, seems to run fine already --- codemeta.json | 2 +- tests/testthat/test-get_CRU.R | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/codemeta.json b/codemeta.json index 3a1a044..59bd639 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.752KB", + "fileSize": "800.692KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/tests/testthat/test-get_CRU.R b/tests/testthat/test-get_CRU.R index 045eac0..095b521 100644 --- a/tests/testthat/test-get_CRU.R +++ b/tests/testthat/test-get_CRU.R @@ -7,7 +7,7 @@ test_that("get_CRU will retrieve only precipitation file when pre_cv TRUE", { )) skip_if_offline() - skip_on_ci() + .get_CRU( pre = FALSE, pre_cv = TRUE, @@ -36,7 +36,7 @@ test_that("get_CRU will retrieve only precipitation file when pre_cv TRUE", { test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmn TRUE", { skip_if_offline() - skip_on_ci() + .get_CRU( pre = FALSE, pre_cv = FALSE, @@ -64,7 +64,7 @@ test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmn TRUE", { # Test that get_CRU will retrieve diurnal tmp & tmp files when tmx TRUE -------- test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmx TRUE", { skip_if_offline() - skip_on_ci() + unlink(list.files( path = tempdir(), pattern = ".dat.gz$", @@ -99,7 +99,7 @@ test_that("get_CRU will retrieve diurnal tmp range & tmp files when tmx TRUE", { test_that("get_CRU will set pre to TRUE if pre_cv is TRUE and pre is FALSE", { skip_if_offline() - skip_on_ci() + pre <- FALSE pre_cv <- TRUE @@ -119,7 +119,7 @@ test_that("get_CRU will set tmp and dtr to TRUE if tmn or tmx is TRUE and either/both are false", { skip_if_offline() - skip_on_ci() + tmp <- FALSE dtr <- FALSE tmn <- TRUE From eac9a003cfdd5268f6c57570484d321ddeed5db8 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 11:10:57 +0800 Subject: [PATCH 055/127] Polish NEWS and update to v1.0.0 --- DESCRIPTION | 2 +- NEWS.md | 8 +++++++- codemeta.json | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 500995e..2cef2eb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: getCRUCLdata Title: 'CRU' 'CL' v. 2.0 Climatology Client -Version: 0.3.3 +Version: 1.0.0 Authors@R: person("Adam H.", "Sparks", , "adamhsparks@gmail.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-0061-8359")) diff --git a/NEWS.md b/NEWS.md index 1d96893..ca4c1eb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,16 +2,22 @@ ## Major changes -- The cache is now where ever `tools::R_user_dir(package = "getCRUCLdata", which = "cache")` is defined by R (>= 4.0.0) +- The cache is now where ever `tools::R_user_dir(package = "getCRUCLdata", which = "cache")` is defined by R (>= 4.0.0) and *should* align with CRAN standards, so it *might* be possible to get this back on CRAN - Depends on R (>= 4.0.0) +- {data.table} is no longer imported as a whole + ## Minor changes - {cli} is used for errors that are emitted to the user - Many internal changes including code linting and styling to improve code smells +- Improved documentation + +- Use {roxyglobals} for undefined globals + # getCRUCLdata 0.3.3 ## Minor changes diff --git a/codemeta.json b/codemeta.json index 59bd639..5012f0b 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/ropensci/getCRUCLdata", "issueTracker": "https://github.com/ropensci/getCRUCLdata/issues", "license": "https://spdx.org/licenses/MIT", - "version": "0.3.3", + "version": "1.0.0", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.692KB", + "fileSize": "800.901KB", "citation": [ { "@type": "ScholarlyArticle", From 8275899aeaea6a4da7d3ae8aa04431a64c6f7fc0 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 11:14:10 +0800 Subject: [PATCH 056/127] update WORDLIST --- codemeta.json | 2 +- inst/WORDLIST | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index 5012f0b..c9a4c50 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.901KB", + "fileSize": "800.921KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/inst/WORDLIST b/inst/WORDLIST index 2c9fa08..2b971f2 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -32,6 +32,7 @@ geotiff getCRUCL getCRUdata ggplot +globals gridded gz hoardr @@ -53,6 +54,7 @@ rast readme readr reh +roxyglobals sp sunp terra From 132dc011ef56a0f4042c9d0ca4b0d86763e41a69 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 11:22:54 +0800 Subject: [PATCH 057/127] Grammar in README --- README.md | 2 +- codemeta.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 90c3f5d..8125a6d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R ## Introduction to {getCRUCLdata} -The {getCRUCLdata} package provides functions that automate importing CRU CL v. 2.0 climatology data into R, facilitate the calculation of minimum temperature and maximum temperature, and formats the data into a [data.table](https://CRAN.R-project.org/package=data.table) or a list of [terra::rast](https://CRAN.R-project.org/package=terra) objects for use. +The {getCRUCLdata} package provides functions that automate importing CRU CL v. 2.0 climatology data into R, facilitates the calculation of minimum temperature and maximum temperature, and formats the data into a [data.table](https://CRAN.R-project.org/package=data.table) or a list of [terra::rast](https://CRAN.R-project.org/package=terra) objects for use. CRU CL v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit (CRU), . diff --git a/codemeta.json b/codemeta.json index c9a4c50..890db39 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.921KB", + "fileSize": "800.922KB", "citation": [ { "@type": "ScholarlyArticle", From 078576bcc1a319248c83aaa4256be092e91e2edc Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:19:37 +0800 Subject: [PATCH 058/127] fix up CITATION file to meet CRAN standards --- inst/CITATION | 48 +++++++++++++----------------------------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/inst/CITATION b/inst/CITATION index 2aa770c..c50af7c 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -1,35 +1,13 @@ -citHeader("CRU CL 2.0 data are provided by the Climate Research Unit\n", - "at the University of East Anglia. This data-set is owned by\n", - "its author, Mark New. It is being distributed, where\n", - "necessary by Tim Mitchell.\n", - "\n", - "Users should refer to the published literature for details\n", - "of it.\n", - "\n", - "The data set may be freely used for non-commerical\n", - "scientific and educational purposes, provided it is\n", - "described as CRU CL 2.0 and attributed to:\n", - "\n", - "New, M., Lister, D., Hulme, M. and Makin, I., 2002: A\n", - "high-resolution data set of surface climate over global\n", - "land areas. Climate Research 21:1-25\n", - "\n", - "To cite getCRUCLdata in publications, please use:") - -citEntry( - entry = "Article", - author = personList(as.person("Adam H Sparks")), - title = "{getCRUCLdata}: Use and Explore {CRU} {CL} v. 2.0 Climatology Elements in R", - doi = "10.21105/joss.00230", - year = 2017, - month = "apr", - publisher = "The Open Journal", - volume = 2, - number = 12, - journal = "The Journal of Open Source Software", - - textVersion = paste("Adam H Sparks.", - "getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R.", - "The Journal of Open Source Software, 2(12).", - "DOI: 10.21105/joss.00230.") -) +bibentry(bibtype = "Article", + key = "Sparks2017", + author = person(given = c("Adam", "H"), + family = "Sparks"), + title = "getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R", + journal = "Journal of Open Source Software", + year = "2017", + publisher = "The Open Journal", + volume = "2", + number = "12", + pages = "230", + doi = "10.21105/joss.00230", + url = "https://doi.org/10.21105/joss.00230") From 4a7471b7e21ad289ea74b9b8386e055858db1f7d Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:20:20 +0800 Subject: [PATCH 059/127] fix links --- NEWS.md | 3 +-- README.md | 6 +++--- vignettes/getCRUCLdata.Rmd | 4 ++-- vignettes/getCRUCLdata.Rmd.orig | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/NEWS.md b/NEWS.md index ca4c1eb..5597c3d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -84,8 +84,7 @@ and following a standard naming scheme for all internal functions - Fix bug where `tmp` and `dtr` could not be returned with `tmn` or `tmx` raster stacks -- Move `rappdirs` to SUGGESTS to fix NOTEs on - +- Move `rappdirs` to SUGGESTS to fix NOTEs ## Minor changes diff --git a/README.md b/README.md index 8125a6d..64964d6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) -[![codecov](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://codecov.io/gh/ropensci/getCRUCLdata) +[![codecov](https://app.codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://app.codecov.io/gh/ropensci/getCRUCLdata) ## Introduction to {getCRUCLdata} @@ -87,8 +87,8 @@ For complete documentation see the package website: most regions. The data will have many applications in applied > climatology, biogeochemical modelling, hydrology and agricultural > meteorology and are available through the School of Geography Oxford -> (), the International Water Management -> Institute “World Water and Climate Atlas” () and +> (), the International Water Management +> Institute “World Water and Climate Atlas” () and > the Climatic Research Unit (). ## Contributors diff --git a/vignettes/getCRUCLdata.Rmd b/vignettes/getCRUCLdata.Rmd index d996e64..0a93dbf 100644 --- a/vignettes/getCRUCLdata.Rmd +++ b/vignettes/getCRUCLdata.Rmd @@ -410,6 +410,6 @@ are compared to an earlier data set at 0.5 degrees latitude/longitude resolution and show added value over most regions. The data will have many applications in applied climatology, biogeochemical modelling, hydrology and agricultural meteorology and are available through the School of Geography Oxford -(http://www.geog.ox.ac.uk), the International Water Management Institute -"World Water and Climate Atlas" (https://www.iwmi.cgiar.org/) and the Climatic +(https://www.geog.ox.ac.uk/), the International Water Management Institute +"World Water and Climate Atlas" (https://www.iwmi.org/) and the Climatic Research Unit (https://www.uea.ac.uk/groups-and-centres/climatic-research-unit). diff --git a/vignettes/getCRUCLdata.Rmd.orig b/vignettes/getCRUCLdata.Rmd.orig index 294f707..3d389eb 100644 --- a/vignettes/getCRUCLdata.Rmd.orig +++ b/vignettes/getCRUCLdata.Rmd.orig @@ -238,6 +238,6 @@ are compared to an earlier data set at 0.5 degrees latitude/longitude resolution and show added value over most regions. The data will have many applications in applied climatology, biogeochemical modelling, hydrology and agricultural meteorology and are available through the School of Geography Oxford -(http://www.geog.ox.ac.uk), the International Water Management Institute +(https://www.geog.ox.ac.uk), the International Water Management Institute "World Water and Climate Atlas" (https://www.iwmi.cgiar.org/) and the Climatic Research Unit (https://www.uea.ac.uk/groups-and-centres/climatic-research-unit). From 6a025dee30874d941a70e798ed2acc88ebde1cdc Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:21:32 +0800 Subject: [PATCH 060/127] ensure bibligraphy keeps letter case --- codemeta.json | 10 ++++++---- inst/CITATION | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/codemeta.json b/codemeta.json index 890db39..96b7298 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.922KB", + "fileSize": "800.015KB", "citation": [ { "@type": "ScholarlyArticle", @@ -255,8 +255,10 @@ "familyName": "Sparks" } ], - "name": "{getCRUCLdata}: Use and Explore {CRU} {CL} v. 2.0 Climatology Elements in R", + "name": "{getCRUCLdata}: Use and Explore {CRU CL} v. 2.0 Climatology Elements in {R}", "identifier": "10.21105/joss.00230", + "url": "https://doi.org/10.21105/joss.00230", + "pagination": "230", "@id": "https://doi.org/10.21105/joss.00230", "sameAs": "https://doi.org/10.21105/joss.00230", "isPartOf": { @@ -266,7 +268,7 @@ "isPartOf": { "@type": ["PublicationVolume", "Periodical"], "volumeNumber": "2", - "name": "The Journal of Open Source Software" + "name": "Journal of Open Source Software" } } } @@ -274,7 +276,7 @@ "relatedLink": "https://docs.ropensci.org/getCRUCLdata/", "releaseNotes": "https://github.com/ropensci/getCRUCLdata/blob/master/NEWS.md", "readme": "https://github.com/ropensci/getCRUCLdata/blob/main/README.md", - "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml", "https://codecov.io/gh/ropensci/getCRUCLdata"], + "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml", "https://app.codecov.io/gh/ropensci/getCRUCLdata"], "developmentStatus": "https://www.repostatus.org/", "review": { "@type": "Review", diff --git a/inst/CITATION b/inst/CITATION index c50af7c..43f8ec0 100644 --- a/inst/CITATION +++ b/inst/CITATION @@ -2,7 +2,7 @@ bibentry(bibtype = "Article", key = "Sparks2017", author = person(given = c("Adam", "H"), family = "Sparks"), - title = "getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R", + title = "{getCRUCLdata}: Use and Explore {CRU CL} v. 2.0 Climatology Elements in {R}", journal = "Journal of Open Source Software", year = "2017", publisher = "The Open Journal", From bbc7daae8744d311d66c2be56ad785dc264325d4 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:29:20 +0800 Subject: [PATCH 061/127] address CRAN check issues and increment version number --- DESCRIPTION | 2 +- R/create_CRU_df.R | 2 +- R/create_CRU_stack.R | 2 +- R/get_CRU_df.R | 12 ++++++------ R/get_CRU_stack.R | 16 ++++++++-------- codemeta.json | 4 ++-- man/create_CRU_df.Rd | 2 +- man/create_CRU_stack.Rd | 2 +- man/get_CRU_df.Rd | 12 ++++++------ man/get_CRU_stack.Rd | 12 ++++++------ 10 files changed, 33 insertions(+), 33 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 2cef2eb..be8761e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: getCRUCLdata Title: 'CRU' 'CL' v. 2.0 Climatology Client -Version: 1.0.0 +Version: 1.0.1 Authors@R: person("Adam H.", "Sparks", , "adamhsparks@gmail.com", role = c("aut", "cre"), comment = c(ORCID = "0000-0002-0061-8359")) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index c83c00b..e859aad 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -1,4 +1,4 @@ -#' Create a data of climatology variables from local disk files +#' Create a data.table of Climatology Variables From Local Disk Files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a tidy data frame of the data. If requested, minimum and diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index 697e982..4ca67fe 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -1,4 +1,4 @@ -#' Create a list of terra rast objects from local disk files +#' Create a List of terra rast Objects From Local Disk Files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a [terra()] [terra::rast()] of the diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index c67e32a..8904bcc 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -1,11 +1,11 @@ -#' Download and create a data frame of climatology parameters +#' Download and Dreate a data.table of Climatology Parameters #' #' This function automates downloading and importing \acronym{CRU} -#' \acronym{CL} v. 2.0 climatology data and creates a data frame of the data. -#' If requested, minimum and maximum temperature may also be automatically -#' calculated as described in the data readme.txt file. Data may be cached for -#' later use by this function, saving time downloading files in future use of -#' the function. +#' \acronym{CL} v. 2.0 climatology data and creates a \CRANpkg{data.table} of +#' the data. If requested, minimum and maximum temperature may also be +#' automatically calculated as described in the data readme.txt file. Data may +#' be cached for later use by this function, saving time downloading files in +#' future use of this function. #' #' @section Nomenclature and Units: #' \describe{ diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 9d7869c..7f7435d 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -1,17 +1,17 @@ -#' Download and create a list of terra rast objects of climatology parameters +#' Download and Create a List of terra rast Objects of Climatology Parameters #' #' This function automates downloading and importing CRU CL v. 2.0 -#' climatology data into \R and creates a list of [terra()] -#' [terra::rast()] of the data. If requested, minimum and maximum -#' temperature may also be automatically calculated as described in the data -#' readme.txt file. Data may be cached for later use by this function, saving -#' time downloading files in future use of the function. +#' climatology data into \R and creates a list of \CRANpkg{terra} +#' [terra::rast()] objects of the data. If requested, minimum and maximum +#' temperature may also be automatically calculated as described in the data +#' readme.txt file. Data may be cached for later use by this function, saving +#' time downloading files in future using this function. #' #' @inheritSection get_CRU_df Nomenclature and Units #' @inheritParams get_CRU_df #' @examplesIf interactive() #' -#' # Download data and create a [terra()] [terra::rast()] +#' # Download data and create a {terra} `rast` #' # object of precipitation and temperature without caching the data files #' CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) #' @@ -22,7 +22,7 @@ #' [create_CRU_stack()] #' [manage_cache()] #' -#' @return A [base::list()] of \CRANpkg{terra} [terra::rast()] objects of CRU CL +#' @return A [base::list()] of \CRANpkg{terra} [terra::rast] objects of CRU CL #' v. 2.0 climatology elements #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} diff --git a/codemeta.json b/codemeta.json index 96b7298..f54bbc2 100644 --- a/codemeta.json +++ b/codemeta.json @@ -7,7 +7,7 @@ "codeRepository": "https://github.com/ropensci/getCRUCLdata", "issueTracker": "https://github.com/ropensci/getCRUCLdata/issues", "license": "https://spdx.org/licenses/MIT", - "version": "1.0.0", + "version": "1.0.1", "programmingLanguage": { "@type": "ComputerLanguage", "name": "R", @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.015KB", + "fileSize": "800.034KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index c2b382f..daaccde 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/create_CRU_df.R \name{create_CRU_df} \alias{create_CRU_df} -\title{Create a data of climatology variables from local disk files} +\title{Create a data.table of Climatology Variables From Local Disk Files} \usage{ create_CRU_df( pre = FALSE, diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 72b69f2..942a94f 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/create_CRU_stack.R \name{create_CRU_stack} \alias{create_CRU_stack} -\title{Create a list of terra rast objects from local disk files} +\title{Create a List of terra rast Objects From Local Disk Files} \usage{ create_CRU_stack( pre = FALSE, diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index 0f6451f..cbb6246 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/get_CRU_df.R \name{get_CRU_df} \alias{get_CRU_df} -\title{Download and create a data frame of climatology parameters} +\title{Download and Dreate a data.table of Climatology Parameters} \usage{ get_CRU_df( pre = FALSE, @@ -70,11 +70,11 @@ climatology elements } \description{ This function automates downloading and importing \acronym{CRU} -\acronym{CL} v. 2.0 climatology data and creates a data frame of the data. -If requested, minimum and maximum temperature may also be automatically -calculated as described in the data readme.txt file. Data may be cached for -later use by this function, saving time downloading files in future use of -the function. +\acronym{CL} v. 2.0 climatology data and creates a \CRANpkg{data.table} of +the data. If requested, minimum and maximum temperature may also be +automatically calculated as described in the data readme.txt file. Data may +be cached for later use by this function, saving time downloading files in +future use of this function. } \note{ This package automatically converts elevation values from kilometres to diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 2281629..e3ba73b 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/get_CRU_stack.R \name{get_CRU_stack} \alias{get_CRU_stack} -\title{Download and create a list of terra rast objects of climatology parameters} +\title{Download and Create a List of terra rast Objects of Climatology Parameters} \usage{ get_CRU_stack( pre = FALSE, @@ -65,16 +65,16 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \code{\link[base:list]{base::list()}} of \CRANpkg{terra} \code{\link[terra:rast]{terra::rast()}} objects of CRU CL +A \code{\link[base:list]{base::list()}} of \CRANpkg{terra} \link[terra:rast]{terra::rast} objects of CRU CL v. 2.0 climatology elements } \description{ This function automates downloading and importing CRU CL v. 2.0 -climatology data into \R and creates a list of \code{\link[=terra]{terra()}} -\code{\link[terra:rast]{terra::rast()}} of the data. If requested, minimum and maximum +climatology data into \R and creates a list of \CRANpkg{terra} +\code{\link[terra:rast]{terra::rast()}} objects of the data. If requested, minimum and maximum temperature may also be automatically calculated as described in the data readme.txt file. Data may be cached for later use by this function, saving -time downloading files in future use of the function. +time downloading files in future using this function. } \note{ This package automatically converts elevation values from kilometres to @@ -108,7 +108,7 @@ For more information see the description of the data provided by \examples{ \dontshow{if (interactive()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -# Download data and create a [terra()] [terra::rast()] +# Download data and create a {terra} `rast` # object of precipitation and temperature without caching the data files CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) From b04b8e774082a8935a25e909b203b04f3c0d1004 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:40:34 +0800 Subject: [PATCH 062/127] Fix more cross-links in docs --- R/create_CRU_stack.R | 7 +++---- R/get_CRU_stack.R | 4 ++-- codemeta.json | 2 +- man/create_CRU_stack.Rd | 7 +++---- man/get_CRU_stack.Rd | 4 ++-- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index 4ca67fe..e06ae47 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -1,7 +1,7 @@ #' Create a List of terra rast Objects From Local Disk Files #' #' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology -#' data and creates a [terra()] [terra::rast()] of the +#' data and creates a \CRANpkg{terra} [terra::rast] object of the #' data. If requested, minimum and maximum temperature may also be #' automatically calculated as described in the data readme.txt file. This #' function can be useful if you have network connection issues that mean @@ -24,9 +24,8 @@ #' @seealso #' [get_CRU_stack()] #' -#' @return A [base::list()] of [terra()] -#' [terra::rast()] objects of \acronym{CRU} \acronym{CL} v. 2.0 -#' climatology elements +#' @return A [base::list] of [terra::rast] objects of \acronym{CRU} \acronym{CL} +#' v. 2.0 climatology elements #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 7f7435d..af83a75 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -22,8 +22,8 @@ #' [create_CRU_stack()] #' [manage_cache()] #' -#' @return A [base::list()] of \CRANpkg{terra} [terra::rast] objects of CRU CL -#' v. 2.0 climatology elements +#' @return A [base::list()] of [terra::rast] objects of CRU CL v. 2.0 +#' climatology elements #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/codemeta.json b/codemeta.json index f54bbc2..070b7de 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.034KB", + "fileSize": "799.933KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 942a94f..4ca4c5e 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -63,13 +63,12 @@ the data frame? Defaults to \code{FALSE}.} files are located.} } \value{ -A \code{\link[base:list]{base::list()}} of \code{\link[=terra]{terra()}} -\code{\link[terra:rast]{terra::rast()}} objects of \acronym{CRU} \acronym{CL} v. 2.0 -climatology elements +A \link[base:list]{base::list} of \link[terra:rast]{terra::rast} objects of \acronym{CRU} \acronym{CL} +v. 2.0 climatology elements } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology -data and creates a \code{\link[=terra]{terra()}} \code{\link[terra:rast]{terra::rast()}} of the +data and creates a \CRANpkg{terra} \link[terra:rast]{terra::rast} object of the data. If requested, minimum and maximum temperature may also be automatically calculated as described in the data readme.txt file. This function can be useful if you have network connection issues that mean diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index e3ba73b..9762f20 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -65,8 +65,8 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \code{\link[base:list]{base::list()}} of \CRANpkg{terra} \link[terra:rast]{terra::rast} objects of CRU CL -v. 2.0 climatology elements +A \code{\link[base:list]{base::list()}} of \link[terra:rast]{terra::rast} objects of CRU CL v. 2.0 +climatology elements } \description{ This function automates downloading and importing CRU CL v. 2.0 From b0374978d9b91244479f39037f8188d4f5306374 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:46:39 +0800 Subject: [PATCH 063/127] Grammar in Roxygen --- R/create_CRU_df.R | 4 ++-- R/get_CRU_df.R | 4 ++-- codemeta.json | 2 +- man/create_CRU_df.Rd | 4 ++-- man/create_CRU_stack.Rd | 4 ++-- man/get_CRU_df.Rd | 4 ++-- man/get_CRU_stack.Rd | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index e859aad..53c60af 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -28,9 +28,9 @@ #' @param reh Boolean. Load relative humidity and return it in the data frame? #' Defaults to `FALSE`. #' @param sunp Boolean. Load sunshine, percent of maximum possible (percent of -#' day length) and return it in data frame? Defaults to `FALSE`. +#' day length) and return it in the data frame? Defaults to `FALSE`. #' @param frs Boolean. Load ground-frost records (number of days with ground- -#' frost per month) and return it in data frame? Defaults to `FALSE`. +#' frost per month) and return it in the data frame? Defaults to `FALSE`. #' @param wnd Boolean. Load 10m wind speed (metres/second) and return it in the #' data frame? Defaults to `FALSE`. #' @param elv Boolean. Load elevation (converted to metres) and return it in diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 8904bcc..8b5698a 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -44,9 +44,9 @@ #' @param reh Boolean. Fetch relative humidity and return it in the data frame? #' Defaults to FALSE. #' @param sunp Boolean. Fetch sunshine, percent of maximum possible (percent of -#' day length) and return it in data frame? Defaults to `FALSE`. +#' day length) and return it in the data frame? Defaults to `FALSE`. #' @param frs Boolean. Fetch ground-frost records (number of days with ground- -#' frost per month) and return it in data frame? Defaults to `FALSE`. +#' frost per month) and return it in the data frame? Defaults to `FALSE`. #' @param wnd Boolean. Fetch 10m wind speed (metres/second) and return it in the #' data frame? Defaults to `FALSE`. #' @param elv Boolean. Fetch elevation (converted to metres) and return it in diff --git a/codemeta.json b/codemeta.json index 070b7de..3959514 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "799.933KB", + "fileSize": "799.981KB", "citation": [ { "@type": "ScholarlyArticle", diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index daaccde..21fcd18 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -48,10 +48,10 @@ and return it in the data frame? Defaults to \code{FALSE}.} return it in the data frame? Defaults to \code{FALSE}.} \item{sunp}{Boolean. Load sunshine, percent of maximum possible (percent of -day length) and return it in data frame? Defaults to \code{FALSE}.} +day length) and return it in the data frame? Defaults to \code{FALSE}.} \item{frs}{Boolean. Load ground-frost records (number of days with ground- -frost per month) and return it in data frame? Defaults to \code{FALSE}.} +frost per month) and return it in the data frame? Defaults to \code{FALSE}.} \item{wnd}{Boolean. Load 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index 4ca4c5e..0b5a8b0 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -48,10 +48,10 @@ and return it in the data frame? Defaults to \code{FALSE}.} return it in the data frame? Defaults to \code{FALSE}.} \item{sunp}{Boolean. Load sunshine, percent of maximum possible (percent of -day length) and return it in data frame? Defaults to \code{FALSE}.} +day length) and return it in the data frame? Defaults to \code{FALSE}.} \item{frs}{Boolean. Load ground-frost records (number of days with ground- -frost per month) and return it in data frame? Defaults to \code{FALSE}.} +frost per month) and return it in the data frame? Defaults to \code{FALSE}.} \item{wnd}{Boolean. Load 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index cbb6246..ada5f55 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -48,10 +48,10 @@ and return it in the data frame? Defaults to \code{FALSE}.} return it in the data frame? Defaults to \code{FALSE}.} \item{sunp}{Boolean. Fetch sunshine, percent of maximum possible (percent of -day length) and return it in data frame? Defaults to \code{FALSE}.} +day length) and return it in the data frame? Defaults to \code{FALSE}.} \item{frs}{Boolean. Fetch ground-frost records (number of days with ground- -frost per month) and return it in data frame? Defaults to \code{FALSE}.} +frost per month) and return it in the data frame? Defaults to \code{FALSE}.} \item{wnd}{Boolean. Fetch 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 9762f20..b216ca6 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -48,10 +48,10 @@ and return it in the data frame? Defaults to \code{FALSE}.} return it in the data frame? Defaults to \code{FALSE}.} \item{sunp}{Boolean. Fetch sunshine, percent of maximum possible (percent of -day length) and return it in data frame? Defaults to \code{FALSE}.} +day length) and return it in the data frame? Defaults to \code{FALSE}.} \item{frs}{Boolean. Fetch ground-frost records (number of days with ground- -frost per month) and return it in data frame? Defaults to \code{FALSE}.} +frost per month) and return it in the data frame? Defaults to \code{FALSE}.} \item{wnd}{Boolean. Fetch 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} From 7a917466f71c1ceea152c8c717fb2686a02adc8c Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:49:32 +0800 Subject: [PATCH 064/127] Add rhub workflows --- .github/workflows/rhub.yaml | 95 +++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 .github/workflows/rhub.yaml diff --git a/.github/workflows/rhub.yaml b/.github/workflows/rhub.yaml new file mode 100644 index 0000000..74ec7b0 --- /dev/null +++ b/.github/workflows/rhub.yaml @@ -0,0 +1,95 @@ +# R-hub's generic GitHub Actions workflow file. It's canonical location is at +# https://github.com/r-hub/actions/blob/v1/workflows/rhub.yaml +# You can update this file to a newer version using the rhub2 package: +# +# rhub::rhub_setup() +# +# It is unlikely that you need to modify this file manually. + +name: R-hub +run-name: "${{ github.event.inputs.id }}: ${{ github.event.inputs.name || format('Manually run by {0}', github.triggering_actor) }}" + +on: + workflow_dispatch: + inputs: + config: + description: 'A comma separated list of R-hub platforms to use.' + type: string + default: 'linux,windows,macos' + name: + description: 'Run name. You can leave this empty now.' + type: string + id: + description: 'Unique ID. You can leave this empty now.' + type: string + +jobs: + + setup: + runs-on: ubuntu-latest + outputs: + containers: ${{ steps.rhub-setup.outputs.containers }} + platforms: ${{ steps.rhub-setup.outputs.platforms }} + + steps: + # NO NEED TO CHECKOUT HERE + - uses: r-hub/actions/setup@v1 + with: + config: ${{ github.event.inputs.config }} + id: rhub-setup + + linux-containers: + needs: setup + if: ${{ needs.setup.outputs.containers != '[]' }} + runs-on: ubuntu-latest + name: ${{ matrix.config.label }} + strategy: + fail-fast: false + matrix: + config: ${{ fromJson(needs.setup.outputs.containers) }} + container: + image: ${{ matrix.config.container }} + + steps: + - uses: r-hub/actions/checkout@v1 + - uses: r-hub/actions/platform-info@v1 + with: + token: ${{ secrets.RHUB_TOKEN }} + job-config: ${{ matrix.config.job-config }} + - uses: r-hub/actions/setup-deps@v1 + with: + token: ${{ secrets.RHUB_TOKEN }} + job-config: ${{ matrix.config.job-config }} + - uses: r-hub/actions/run-check@v1 + with: + token: ${{ secrets.RHUB_TOKEN }} + job-config: ${{ matrix.config.job-config }} + + other-platforms: + needs: setup + if: ${{ needs.setup.outputs.platforms != '[]' }} + runs-on: ${{ matrix.config.os }} + name: ${{ matrix.config.label }} + strategy: + fail-fast: false + matrix: + config: ${{ fromJson(needs.setup.outputs.platforms) }} + + steps: + - uses: r-hub/actions/checkout@v1 + - uses: r-hub/actions/setup-r@v1 + with: + job-config: ${{ matrix.config.job-config }} + token: ${{ secrets.RHUB_TOKEN }} + - uses: r-hub/actions/platform-info@v1 + with: + token: ${{ secrets.RHUB_TOKEN }} + job-config: ${{ matrix.config.job-config }} + - uses: r-hub/actions/setup-deps@v1 + with: + job-config: ${{ matrix.config.job-config }} + token: ${{ secrets.RHUB_TOKEN }} + - uses: r-hub/actions/run-check@v1 + with: + job-config: ${{ matrix.config.job-config }} + token: ${{ secrets.RHUB_TOKEN }} From 64df999a54cb9a1d15a0fd73654493200c6ca40f Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:52:22 +0800 Subject: [PATCH 065/127] Correct spelling --- R/get_CRU_df.R | 2 +- man/get_CRU_df.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 8b5698a..aa19334 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -1,4 +1,4 @@ -#' Download and Dreate a data.table of Climatology Parameters +#' Download and Create a data.table of Climatology Parameters #' #' This function automates downloading and importing \acronym{CRU} #' \acronym{CL} v. 2.0 climatology data and creates a \CRANpkg{data.table} of diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index ada5f55..8b4a7d1 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/get_CRU_df.R \name{get_CRU_df} \alias{get_CRU_df} -\title{Download and Dreate a data.table of Climatology Parameters} +\title{Download and Create a data.table of Climatology Parameters} \usage{ get_CRU_df( pre = FALSE, From 2cd2a52292fb43f62b3046130c8497eac05507a7 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 16:53:05 +0800 Subject: [PATCH 066/127] Update NEWS.md --- NEWS.md | 14 ++++++++++++++ codemeta.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 5597c3d..ef21644 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,17 @@ +# getCRUCLdata 1.0.1 + +## Minor changes + +- Fix CITATION to align with current CRAN standards + +- Update URLs to ensure all are valid + +- Correct grammar in several parts of documentation and README + +## Bug fixes + +- Fix cross references in documentation + # getCRUCLdata 1.0.0 ## Major changes diff --git a/codemeta.json b/codemeta.json index 3959514..35e3f6c 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "799.981KB", + "fileSize": "800.232KB", "citation": [ { "@type": "ScholarlyArticle", From e296973e22413ccc155cb26c94b27a545425c4be Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 17:10:16 +0800 Subject: [PATCH 067/127] fix codecov badge --- README.md | 2 +- codemeta.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 64964d6..c411282 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) -[![codecov](https://app.codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://app.codecov.io/gh/ropensci/getCRUCLdata) +[![codecov](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://codecov.io/gh/ropensci/getCRUCLdata) ## Introduction to {getCRUCLdata} diff --git a/codemeta.json b/codemeta.json index 35e3f6c..9abb12b 100644 --- a/codemeta.json +++ b/codemeta.json @@ -243,7 +243,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "800.232KB", + "fileSize": "800.224KB", "citation": [ { "@type": "ScholarlyArticle", From c9f5d490410b92709768852bed8ce3027a1019f0 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 17:35:38 +0800 Subject: [PATCH 068/127] Reknit vingette with proper values after bug fixes in code --- vignettes/getCRUCLdata.Rmd | 112 +++++++++++++++++++----------------- vignettes/plot_t-1.png | Bin 33938 -> 126264 bytes vignettes/violin_plot-1.png | Bin 44969 -> 61761 bytes 3 files changed, 58 insertions(+), 54 deletions(-) diff --git a/vignettes/getCRUCLdata.Rmd b/vignettes/getCRUCLdata.Rmd index 0a93dbf..f5a13ff 100644 --- a/vignettes/getCRUCLdata.Rmd +++ b/vignettes/getCRUCLdata.Rmd @@ -86,32 +86,32 @@ CRU_data <- get_CRU_df(pre = TRUE, elv = TRUE) CRU_data -#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv tmx -#> -#> 1: -55.583 -68.250 NA NA NA NA NA NA NA NA NA 62 NA -#> 2: -55.417 -69.750 NA NA NA NA NA NA NA NA NA 86 NA -#> 3: -55.417 -69.583 NA NA NA NA NA NA NA NA NA 83 NA -#> 4: -55.417 -69.417 NA NA NA NA NA NA NA NA NA 121 NA -#> 5: -55.417 -69.250 NA NA NA NA NA NA NA NA NA 51 NA -#> --- -#> 566374: -55.750 -67.417 dec 7.7 8.7 68.4 47.6 11.1 80.1 34.2 7.3 5.3 103 11.15 -#> 566375: -55.750 -67.250 dec 7.6 8.7 67.1 47.6 11.1 79.9 34.2 7.5 5.3 63 11.30 -#> 566376: -55.583 -68.083 dec 7.9 8.4 69.8 48.6 10.9 80.1 34.7 7.6 5.2 123 11.55 -#> 566377: -55.583 -67.583 dec 7.8 8.3 65.2 48.4 10.9 79.4 34.6 8.0 5.2 19 11.90 -#> 566378: -55.583 -67.417 dec 7.8 8.5 64.0 48.3 11.1 79.1 34.4 7.7 5.3 77 11.60 -#> tmn -#> -#> 1: NA -#> 2: NA -#> 3: NA -#> 4: NA -#> 5: NA -#> --- -#> 566374: 3.45 -#> 566375: 3.70 -#> 566376: 3.65 -#> 566377: 4.10 -#> 566378: 3.80 +#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv tmx +#> +#> 1: 30.917 35.417 NA NA NA NA NA NA NA NA NA -260 NA +#> 2: 31.083 35.417 NA NA NA NA NA NA NA NA NA -361 NA +#> 3: 31.250 35.417 NA NA NA NA NA NA NA NA NA -336 NA +#> 4: 31.417 35.417 NA NA NA NA NA NA NA NA NA -284 NA +#> 5: 31.750 35.583 NA NA NA NA NA NA NA NA NA -248 NA +#> --- +#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 70.6 0 -31.3 5.6 283 -26.95 +#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 70.6 0 -30.7 5.6 186 -26.40 +#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 70.6 0 -30.8 5.6 195 -26.50 +#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 70.6 0 -31.2 5.6 268 -26.90 +#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 70.6 0 -31.5 5.6 328 -27.20 +#> tmn +#> +#> 1: NA +#> 2: NA +#> 3: NA +#> 4: NA +#> 5: NA +#> --- +#> 6795146: -35.65 +#> 6795147: -35.00 +#> 6795148: -35.10 +#> 6795149: -35.50 +#> 6795150: -35.80 ``` Perhaps you only need one or two elements, it is easy to create a tidy data frame of mean temperature only. @@ -121,19 +121,19 @@ Perhaps you only need one or two elements, it is easy to create a tidy data fram t <- get_CRU_df(tmp = TRUE) t -#> lat lon month tmp -#> -#> 1: -59.083 -26.583 jan 0.2 -#> 2: -58.417 -26.250 jan 0.6 -#> 3: -58.417 -26.417 jan 0.4 -#> 4: -55.917 -67.250 jan 8.0 -#> 5: -55.750 -67.250 jan 8.2 -#> --- -#> 116: -55.750 -67.417 dec 7.3 -#> 117: -55.750 -67.583 dec 7.7 -#> 118: -55.583 -67.417 dec 7.7 -#> 119: -55.583 -67.583 dec 8.0 -#> 120: -55.583 -68.083 dec 7.6 +#> lat lon month tmp +#> +#> 1: -59.083 -26.583 jan 0.2 +#> 2: -58.417 -26.250 jan 0.6 +#> 3: -58.417 -26.417 jan 0.4 +#> 4: -55.917 -67.250 jan 8.0 +#> 5: -55.750 -67.250 jan 8.2 +#> --- +#> 6795140: 83.583 -36.083 dec -32.6 +#> 6795141: 83.583 -36.250 dec -33.0 +#> 6795142: 83.583 -36.417 dec -33.4 +#> 6795143: 83.583 -36.583 dec -33.3 +#> 6795144: 83.583 -36.750 dec -33.3 ``` #### Plotting data from the tidy dataframe @@ -209,6 +209,10 @@ CRU_stack <- get_CRU_stack( wnd = TRUE, elv = TRUE ) +#> +|---------|---------|---------|---------| +========================================= + CRU_stack #> $dtr @@ -250,10 +254,10 @@ CRU_stack #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 -#> source : spat_4486664f1fd6_17542_SskviV5XwhZb4QV.tif -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 65.3, 70.3, 73.4, 74.0, 63.3, 62.4, ... -#> max values : 106.6, 121.9, 142.1, 147.5, 160.3, 163.5, ... +#> source : spat_fe274b2a6660_65063_GdaPwXHptgIOPSx.tif +#> names : jan, feb, mar, apr, may, jun, ... +#> min values : 0.0, 0.0, 0.0, 0.0, 0, 0.0, ... +#> max values : 910.1, 824.3, 727.3, 741.3, 1100, 2512.6, ... #> #> $rd0 #> class : SpatRaster @@ -295,9 +299,9 @@ CRU_stack #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 #> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 0.2, 0.3, 0.2, -1.9, -6.0, -9.8, ... -#> max values : 8.6, 8.6, 7.3, 5.6, 3.4, 2.0, ... +#> names : jan, feb, mar, apr, may, jun, ... +#> min values : -51.6, -47.6, -45.2, -36.6, -22.2, -16.3, ... +#> max values : 32.5, 32.1, 32.4, 34.3, 36.0, 38.3, ... #> #> $wnd #> class : SpatRaster @@ -317,9 +321,9 @@ CRU_stack #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 #> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : -0.95, -0.75, -0.9, -3.05, -7.90, -12.05, ... -#> max values : 4.70, 4.75, 3.5, 2.20, 0.45, -0.75, ... +#> names : jan, feb, mar, apr, may, jun, ... +#> min values : -55.05, -52.95, -48.75, -41.35, -28, -21.40, ... +#> max values : 26.30, 26.25, 27.40, 27.50, 30, 30.65, ... #> #> $tmx #> class : SpatRaster @@ -328,9 +332,9 @@ CRU_stack #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 #> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 1.35, 1.35, 1.3, -0.75, -4.10, -7.55, ... -#> max values : 12.50, 12.45, 11.1, 9.00, 6.35, 4.75, ... +#> names : jan, feb, mar, apr, may, jun, ... +#> min values : -48.2, -43.35, -41.65, -32.45, -17.55, -11.50, ... +#> max values : 39.7, 38.40, 40.25, 41.85, 43.60, 45.95, ... ``` The `create_CRU_stack()` function works in the same way with only one minor difference. @@ -410,6 +414,6 @@ are compared to an earlier data set at 0.5 degrees latitude/longitude resolution and show added value over most regions. The data will have many applications in applied climatology, biogeochemical modelling, hydrology and agricultural meteorology and are available through the School of Geography Oxford -(https://www.geog.ox.ac.uk/), the International Water Management Institute -"World Water and Climate Atlas" (https://www.iwmi.org/) and the Climatic +(https://www.geog.ox.ac.uk), the International Water Management Institute +"World Water and Climate Atlas" (https://www.iwmi.cgiar.org/) and the Climatic Research Unit (https://www.uea.ac.uk/groups-and-centres/climatic-research-unit). diff --git a/vignettes/plot_t-1.png b/vignettes/plot_t-1.png index ad5d32c9e4602cece768d3be67f03bddc44d13bc..1591135c3f3551c5ebd9c735749615d536c890d3 100644 GIT binary patch literal 126264 zcmeFZ<9BAy(m$MJV%xrA+tw8u6VJr9IkA(8HL-2mHYc`i=a=s}_c`~A=TCU<7rj>R z>e}74tE;Q4KC9LaQ0D1}s?z91mrh~}cAik6~4 zQCllp2Nk=YhQ>f+8)FA^LuH@{2nbhHl$x#?z8bnfdP^NG*<`?cVPPEN2YW)jmGVsB z%F%~$o%I@Byj8vM?~$|h408(B-M4&mY5{a%Sy z#TC?~W8xzmWohz&xsHHW-$wCu%l_2>g_t@fZ}iP?%@4^m4oTY~$XRN8Yfhn64CZwM z$e+e7<}lX)5Z$)+AP3lMfqp|Z&vyJHr;<|6nQq#m`BYQn%>Xy&9=_4R3$eEbX8k{~ z&OXY2;17@pLAG{i=&L;*0fg0Z<}{&WQ5t3(LpPyM%?Fq!VBQz>rsh0L)7%9n;lgwm z5xX}i>O}(m8YP*@BJcY2P3VK<{K0yE;GKqeZ1JYTX$jej9Qov0WId;FWD?F zs`6@J56qL5*0Myjmg)JZjDq-k`+ALJ6pk>017UtLdbn_wp+#Zowm}Y6+ZvU5m;b^l zaXhmruUp&}RFz1Ar1UD>y=46+Z?hW+kP^fp4YF?Y2t2 z*^RQ_U=xgMA)v2ELjiZHjOg@U+s%f217z8&L+|tT-NXC#+x#X-bN1)APjWZ70mH?y zF9*S8{9VdKP7Z|Ts}BtV8e$Ft{?!BhYPeqw1OzM_>^~IHr|fV4+y7?}T;BWy1Vji# zN=#VQ4fISG>WAvU3V*uX-#b{Cjz_(MP%7f^WugA)j?+4R@0YXv4$~#m%a^kb*Rw9@ z@X%jW9ZPqaRx9sQsm8k$WPafD)#KeJmm9pU7vrh6ogACv&fK!qBcwl2s-eGw(}7|7 zWs4A#6>Ayd8UBX?8u3fG8`ez*8uP0s-u=Z2EdpNt3#nJWL9X`SFMSPQTqQw%z5Z_& z{C@@i0nuLYpRcTj1}6bi?}qwWv_hfzk81uk@TG`v|DEsu z6!Cu+@z2rtKa2Rs4*vhDhzq=wG|M)h*K^MH+eu!xia`M!ell1ubfDj@d zYydEN?dN@#?}vL}P*9F|1San|UP?}mDV=65_>{ma9V{H&Oo2>t_o||*Y9JJ$8;GW+ z=FvunXOyMyUX1IeHx`lC6{uE|O;liDAZ|>Wps#?Q$1!<+em*fbcgtYI;D;SPR6#)j zp?( zhrgy-xN4f6Ufg=_`xsX1tr+Jk4Xp2YDciSGf ze%_1EIIV1(Ol2_+M72=7t#!{0oAqL2y?FSI`IVMdOG#<_ zkK0ZdV&XdPLN@8SqP+u!LZ+2~s#eDM`1lE5YshG#a!I7A_ICoKoOPcv+7XL>ntpO4p*aSEz zTfE17@nA*M#);GU%EI4fd&8(()C<%X2nYyy!@waT@-1GcqaP{b{t$2$^S7aZXr}wm zI-E%Gw_l*&{;Ws?_4G1-x|NiaOkN;gp(6Sw{6Yf1Ij!pA0P`_TXzqSZ+qM7NTD5nd z=Y1^Gqv;&^bPnrAw5$5%jIyfE)>ezdEZC#kl zkpj;#*>BL4(|WROP1u%MLjwb1tgA1Xw01XMe8j}Weu*qJ!@s+$R<4c3Q^?(9v1~dV zKAtSV8A)Ob`ta?AKNKklJcIXzAaO345%`T`lqRF5(#6PPv4qs z9{KHe#PW-Z47YoO7M3=AUaj%Hu6o#YR$E$Ho~C?144KRqN--w+A9WP%SswYW`_Y~b z1wUat6yWuGB~-|zPXf-)tp3>b!VG4VIkwskM&e}O1a*49?&QS?%pT(&mzGt6K}be9 z*1ugJ7iBGSHL(h^L6AnO+IllIZ-Jp>VWn%Ux$?{0&m}|`+Oc&wew{VECKh^CMeg!R z83mLh0+uC2zAK@(x7(=&wWs?feL4M-DK?0l5<=fu{#@~vFa_>?^f~?e871p+wg#se zajfSEmJ6dqM*M}Q*Yl>Vo>Jqnqy=nFF+q!}BRv(y+_r@>4UJ?1x2r{M+wJ1KXciS2 zzr%&B)1@jXjMTBz>+7U2hIUwmrUI=2STTxZyb!i{Z4NsKIl-+T=== zAnQGnf=`1XFC`UrJHffhwY|L^eM2*{6UVt5!PsfXVZCB>;`4G`ly2GZIqaW|;c`+^ z#N%h+QDZp7b0aXG&N-C>_EV>cM#aXpY4x1%X)6FR5#sP5-PXm3 z00wQ+54U`wu(p;ZJ{f+={cZ**x4PG=rcVX&5PPEnlIrOsr~c-Rq;6}$=YD%< zAcBB~rI6q-!!?t7Q2)_1(|yqG*B)+6WTewY^Dbh*ea#S|<=XgYc{~2oftHU?rzoiP zi}+$zyI3yHeWK1nuiW{|%^2f^BP1fe+1fy)JCnMhsFNxlD^1nHVhyZHS1F-tEB;JQ zHP(4(Bb8f5@DXrnkL7T!E@yK$ns;)hD2EIe&S_>$mmv*J?scx~V{VDTS2f{7;ZS)Jej?$r!tUuR{)F68;v1Nr zto~?7Tp(J7Ea1=k*ORujs(`P@mq8FDj~Soj9UixQlCKem~DTb~%E{duT>Dmhwq z2>B4ZR*EX-(?cx270EhzwW)sSstcxvEd?UI^>UprZgvo}KdRwFQRXN?ZWk2b}6E7EF4BKx71k-zx zLb)&c+8i4T>U{V#R@kT`d!Pz#FS}y*DYwIj%yIkY$7@t?-a`ptt^xsEaw@ASE_p&G z5gJk+2UKC}C_=m5Yjfq7D;6Ea2r!QFFTAECS2$P9D&43*vgF(Gpg9fauNfh&ZX%sN z)44OEfJQ(VP!N0<``D2Q!FPZ*Q`*}6{NQZYtFkwLsX9(y?6jYVz1GM|dX4rkdErbI zzOPwZuNRQx_E?PK+%U@xE)i30`+1rMSs=X?i9Ja##e?xn&G4g z#INcz==*jlb*C(R`*>4Lc?*HuESyD2RdDA12 zyy1DtuA-ARsVVx{<`Y3Ep5^eaqRBBQs?|e$W_}$o>J|`_1H$P%!2+iGR7tb*->dxO()dExaYZ%e37bIlnXju^mLvO>XPz+j;?{4p% zaKyl|>F3+Ob{vPm2ho~gNvAY-gX23J$NX8#J+Uy$4>z$JhBNIP`MBx3Iez|pdwG;z zDauMo*OS}wS4dp+G5k4_kbi|P<2IR`g!X_8lx{#gQpR8Z(V|j7u{(krval6gWXrj0 zR+tuR)BBO28J6U#7A2TQ^mgLwQsjsF{p)o2S*>7YijDI0xvtKg+ZmMF4pkks{lj!g z#VVtSov|XH+Z=|IoEq&eT$ORXG^%Svb&9C%;Js)3MQ?tfE+}Za8r*|<6 zEGv)eS4II~y@=f4quzK7^YiDu>yN((GcgC}Is2O3C#2= z80R!T!r^TRNaXZQDzf2nn0_4?ekP_pWq>0GRzEG%4Cf>i5!`x%{#qOIgrlUg8GTsj z*)&HOcNmHN84o)Mx##%BM`>g#$>jXB#(b1Cp4g$70^_n zlWG>inj|Cw&bY{bfSY84l$GgZ%<-7PvtceeW-a^L?*;FJ(e2kGp#nGq zF7zlvtlbi)B1qt?|zHt~H^*@s;s z)9Xg+w&IW@!RTE^^WHbGCt6wbek%cKZ{ik8b<~jbGJy|4nSw2N|2RIk@cJtr-o(3H ziOw{y(gyec(l7NEh7z4?aXGU2mIIuFJa%~C=ULrUxBE2iI|){XPUoK`_5fW53-KUU z>@uFLz~-9~k;Lr7wel8<2=Q?t8y#Jh{$^~6?0qF&Nq#8Q@o;&}x(DDjq{+SxE0?cj zU~{<_O!E+-=Xi4*dFVijv!3&BMRhhu!%U(ly3d+&Z8_6oy^mtUPj+uhRvb++k4idX z%>-qC7mBbEno_Ot`Wh*&;o7*i&XVJjqD&T)!_qbZWrILdl{j^ECZQ=eP3+Ad>Ttsj z$;e5{g^7?l>L!JX^EUU!y5>M9^w887u{$cHXn|U3@`O{FFM}<2g=rD+e!+fOI02&` z_9OiDGK#=gg@KqhJ2U@_&+J5>8dF+XASi&3p;vnd9&FtvKDGNM&0|fGKi?^gNK$G3 zdm<@*F}~FG@3^XKTKxR((oPOd@CS8po%!LWED$RbvteDDGDo1SjNH$ym=Wz{#rW>{ zfpMy>b1f>)lC>`9^(Nf|ip<}}B&WldCWv$rN%cArwH_bi`7cK;AMOts-i_r{E#j{8 zlnrBO-;zj`mXupp++FXq)$8aMGHT#YX=DhoCIDlWxdlPa_YoJC@YZYzO&li5Kh#{e zn^{XpUQo`*%5v>%X{GcasJWb@z6}UKQ^HIO^02ESQRgWaV#FwGpdvl7o_t@bJLirN zauoRygM2js!=#;DNRs`m1mmpf>(Dof`&y=w{p+*r)F8|DU)Y)pCs-E{{`?}&+8xsm z1RPx@o62H9i4AJIvUG&Mt8URzNaZZ&U$EUW0J$3Tjc`V;G48*hnHfIV1j}%xy zBCtaKVVyoL3I4WcS_A0&wOKpA6bN0Rc{Z!Y{ z)Ady%pC^*I`1tE}*UeN{$5Y*Pj&ogTubUCdX-oV2G{Xv}=dVbz=4T(|(fiGZM(zp! z#Y-d}=VZH(>7|I-rA@_A-|qERQI=0{P6(leo^`v|vx97wzJ z%`k=^^Xm@mYB(rU`pb)WFrFGvUQUPq75qJ|Zhi!RMW&?G)G(V~w+IK58J2->L0Ecb z;IFn_@4*RVsyve`O0wdi<4NqXATRzPgZ^5{ptefc*|_}1cLXbcRDK@TDhtCW(Q z$-niFB*cD%sHg_uZ7I(O6Y1A|NP@(ioLIHJ31nB=^=5uwUO}k0({{7-p#8nhm6*w4 zPjYwSc&&xi0YifL4ESW(! zP0HGu{euoXADpIT{Q@_}>no3ms^v5sgkN)B(p}&U3=Rod8aDL>XZ*4v&iGCOrXL{a zOyo=L;B5yx*0s>!q)g5ys(g3TqM_m8EaN)%xYC!MuMG8$>2yyo{?}k*HA9|IU^~=W z-ZgI5249&mUe(mbjKiw5AQ%HI`p{<{w-=*Uy;;>t>BCoU%aYWV(s-~#zIMKr5`#LB zeIgBqNmqP&r{^f&y)_!3R!PgzIo=^ZKB9O@HDD`(^Gh2{c|dU-YW{^zc~H} zY~P9z>Sl<41t>NcYyFqTDDj2+cQt=I+x@SnxB?RY69=yp=agIqEUo1mK)UYhPJ47F z;juR$YSonsaaV|2Tg*ye1O)||9M%>lp`f7|j+&jk+uPfl(0BTtTd9oxUErC2l)YC{ zi5E<<*LcxrgEKKQVrzh1xXp$AWnnQ}%VljhJMTjETLtB@ZMG{cENuD%zHK)8KoZcV zMR`q<7@Lu?K7YaPy?gJGzSgxPN=;2o;n7)=IDNxAGg5h1b)?Frs;)tfNDc0v{;?_yMQOe z%Dpw5!r7$w5f)a0!Q7}5JkF|Z(*ospxR*q>xVW@mRRX({4(=^f!;FQG#poD%SiOJj z-2On5kqwcgx|8y4Q&HdN*4Be%QX#=QL_AXqnaDGYj&`KnzZj@y$DyP8lK@%`uRi!u z(vhPYbybv7)IwuJ5LPOfJpN9(<2j(L@=Q)kMnqFnQQze*$WQ-VJkW{P$b?VFmDu8( zl_Yx}Ui%xd{7F7MIxcLiiP63Xvz;G%RBcvoNaQI=q*{Uy6&gdD~hUlB5LD<(V< z9p>FGDj*I8p#T_B7jHWM9&v(b8FWjrod!uK3k*;eH>&C4`A;7zz8fN}aB|wSMws#k zEf9vLZ`8dk;xYJEpUfxa6Hk3oKf?bG%B2$BASg!d1B7|QtH7I zFp`M*3J+F~HoC6a$2~0tbc+}w+wO?h9Ov`6-bw>pq`R}Y_atUrFbXrd5j!4_BRST! zE*98oU7k&hO!o|@iwTF9{{$G{F6F3&sJ`*o!q~LjNIm#qM5i&MR0+I-wmMnGI9tvl z5S8pDCQ0s6CaEeJKS{zImrTEv?xjj6w7@ChNay+Ap`&8@U)`A9M1J?W{>w-AW`)xN zKNZiz(D}Gb0QtW|FQq(<|Ci%ZPzhZKk?L}hBB844y_T$al^M7QCo^H$;galf%o}q$G*yN?t zYd5C2-xbzNJ8n8$Uz$ytZM%;BmMNo(54f(u+YsqO$*_MadA)UIP}U+dJW~p=Q(Spo zP@7hCe5y(axJ&|0^)2@WZ?!Kb=c#=zJ~?kg8vV9@b>K2uPc-sDy(lo+Ft+P&FZ)&P zfCOa%FWw&FF908cFMz%g#m)6OP}fvfX^iu{NqA7z4;L^g>LZSg=zGK0?)f6hby6TR z69?AWiH?V7IXY~ZuKv~xDRmyFsHGD;Tx{o5F8YlzXR#wT$y3h+l%rA_s3U@}POlR( zm6;Y4JA^0#-vJtu*-WHWUs@syF7Vm*c#xiDKf-LbPy(S7jVD!M_^poZWcjnPeudLq z@S(6UBO~DRxvk*)!x#_x0mk-UPl5jGcTd9)4H^5HiXjp@Hn0qjqMbKU8$)(4#IF1;oBu{Hpn9~Xa&C4rzLLUbMBY|6pminF0@39b4NGCy!s5qn4T zkheo6a^Vxn;td`Iy+GvK4S7f{-G3P2P^**K**MOv6}TPNhuEF*YHU{kK7-J@+Pryt zE{5bPRVI2Y5&69b)XU$(L`pnqZdl=Fd_`=18*w-P<`+zqvBuVrq>qX*Xf@h|84FhQ znofCzFtY}eP;lc?>iU>Pd0Kov?JQhQlq6ZlBX5!-(ksVrh22^=Xz^Z7zI_19`UPEF z?%s%w{Kl3OqAE^nuTDg>e%|GSK7Hir+ii~f{&IdV05d4X%1u~g)M<5iE2K+-fr4mDLheYK~};9zDxr@d#C-^_Ns4( z3`Q5&?KM7W)WzS}nD|+@z*J|q6i?XPnFikv=ex()qu(!u73qGN8J+t#NSY<~zku>f zI9J3jeF8$*;^c8h0KW9J)IdpbXv`^Xze~Lrln@=3=xeDQt~Xn#mpa?W4s&kvSXkxn zM%b+g=b<{dBJaR^Hm6qIgA6_;qNuaIb5EznF8}}t1ai9T$+xjfb<0dIB@@06$x!7s z;`a2AkEvc%%CE1Ida8h$yuCy7xvqM;oyIb9S&2vuzfg|xCx}k=^u$8~xT!%6K&CLP zK3$qvcP4u&1O(GX8-Kr8nsbMUxCPa0kwbe0G=*!J9|yI}WZ5iZR%lyks5OZCQ&kfj zmb+E*=ufdLs1Yr>W(#F)ZlpzERk=ZsV=(Bj-%8&R%|VerlRtf|KOafE>QU>~I<(Ng z|0LIIzSgb9mZz-FkQPwdL(W3>db+`H>F%EN;i^CV_95t zoW6eD&YJs-$YV?~3w#|Bt?JQ$;H@lcX+iM~^i_#ZN#Y1Hr&`?Yl*wdeP*srS;&HN^ z_<-%3M(H@_xr{<%;6jgCe}Zfr6vHMt(>VKHssy5tW)Cis!6XW(S`r2f4Q56~8C|<$ zKv0zri@1YBbd|H-=nTmnOcEUHoPC=q2<+Xu_NJ0-Dnglke<&9$mCBwUQ_z_HANPV}8zs*`Y2uMZRwGlYQM^;im*A^M7|W#0?%=K<~J z?vo6qwdcyk>k0<$%<|uv_s7gn_}<M)N!0!@b+uEc) zKE#Adg^7<%(#JNjBjF`m^$r%KU-jr_)kqL$RJXnzecwzId3wrZ9B+EkHxt9|2%xV? z9TZEUgb&fRBMu))Uvah$@Qv<3gUYO7)M~IEp{^EdcfTx3aXIdx>nR*0tseS*b&6Ro z`U-k(S+B5oJax$^#L>WKS3N*Eh;0xSnk)~WKW!m*DngoT+-m<<9o=E$HVAKn6`WG| zV6NC(R(jlN>to%1tPac2;q`XByW?(S_iAgPDy=8KhniRSlgGu%uSO;KM{gLQWadNQ z(Al#pA~uoInhzXLawn+0Z;Yh0HBbqEnB%k;$?%IqlFCoxZ|dW^0XkZR;iA)jxQv-eQIBQ9_VC?dJ;`~%T5$d#ZT>c-3;E1^ z$G3z5341lEm z6M+>qY=RD%t4prr_xZ>7>`9BpkMXhgGK=r~%afVxT^}{H9$Gj6=`6sla`NdTYTyh^ zpULu7z#N;UhI3CioIL7|XnlRFX!gb&!lRf>OgZ(eBi)QFnGaw$UTO`u@tN9d9&xQV z-0^3H0f&ST6$V0qu0tt|-Y|-V?lSm@BlyrJWel;G*45h|(JFm# zdXtC;!k5UiEeAz6S-T_B?e2UNRCMsMw|>l$hHJ^C1)f_curAEqVOTW$c)ALn`Vbvi z<7m2VF70lHAwegQz~L=Jg~=&BUDsFxJ&~A=XSUt1ngOn}v>5vtE-5>dS(N7*l#s|$V{_NgU+nuSbF-Ny{&w+w$@4ixPQ+%+k#%i{_CUii ze}qs&I^bfk7uT5^R-5`J#>?+eqeH3@1vF_X{muyzk{9J!EAI%Kk>z?mI8mfa)5t7$ z+c#O*s~P=8RmOYsd*r1=oFi3fu zKDyJTKs=|7E+p6^(ss{rdaCTw@5+-~=nn}zx>kKf{NWSQj!xIRb7W03sn6$V7Xq|_ ztUAF`QGzbm0-o*{9FY5Mf^p@NMC+albw%4fI8!O6p%T1EW>HEi#|J!)biU8CL&<_+ z++>po1%$r`(j1)0gIo&&RjAs^?4A;#eom*xD~|N2C#6OWBU(4DpTCyMbXRdbNtRD3 zbk~Z&QWZKNJ`Des?stsNlIFek`}Tt&!*L*UK2#>e(WKLERf!x(kS%HK zmE$G6y4d$~k)}HpXp-nRLJb+Yp>h6bJzp(cP8ay%(djo6_5tsDZ@4Yx^aZc(6Tjc> zqqe*By&j~#KVF8%0ucv?kNdudGkSY1+&-POw0zgV7!8efNUGZ6!CI;1D9Is#Z>QTZltz-Nf@0n4I8MWsrVWX={#8Mn-M0i;PY$P zrJ~yXf`;z-Ov5RI1^&x@52fj|BHUIO1&lRJ$$CtSsTEUe1LV$=#Y;W0OU*_jw;7}4?q|Nz zI98jq+KRKyE?gNv%%mH7h*EaajN^j680TBv*k;sY?w=ay!U`i|l5!+tn8QED_9~O7 zqVD<)a!ki%;ZYccJn|PQq4bsxzeih4T#cyI8P@{shge+>#Ro1xtZ{~Ba~x?fy&DtG z?XP+ZdF>I4Y!g&Jh5;`*pHG?C9M;X;MS@5V?|2*sGm6EkYcY%#qWm-RTr=x)D=PkI z`t8sa!H-N{VvpdnlHLq2`}whI?m8R84vD1PnE)w(w3^d8jdZqi=_lV>sgCBU;bP5z4k&+|!+Z+drLT8RK| zNh&RuFH99bsqv()pX~uXK$z!<--1-HI;LZ2dh8e}qR^Z>JQq32aNMF- zazw9KG#!FOi@-j}Ju|?3>4Qx93e69Ovrg?KffIc2*q}-GhWHP6R z_CWjSjQQaQC*LQ*(2KtdI%V%gc0Hs~m9!5q7Ev zGdHjE>Ge2cDzTgLfw$Qy+_qu zci#b(dZ3aHFt?v0^mgZi!2oTkEYh^2+XvDa*jfy|xw=Le6!=R}02}T;ou#auEUfLN zI!53~Ttj}W^quc#3$92f4*+R&v0^AmW1~lTRx+>+%p7IF3h5baRYx8d?y#kCZYcIc znd!5icA^3LW})5I*C2hJ>cgCRR7%@kRR|!(DI)hhbThCeKl?c@ywW2V{&N1XbyM511|3pjWCcm+8EUwsuOMT%zXL!-}P zyrYS9y(8EThdeTZFa}~Ho$32v9tmQiL*9Klcnk@kjBiZn zf>5teT?~{zdZaG#bO!}EJ5nmaQ-f0l1T@G3Or8`Tve7}R+Q5x-@Z%U-Q%0I;@wGnG z#PQpeB&p9QAAqd-I9&jQQgf>S@HWBkOK8&Dgj!)FMVB!($pk&L>?+=AuHKkl6K#Iu z`iol?yBA_G_B7dWI*E4idHsQo-rp(?y;#aoGncGfrNzi=$BNnPGwYO_p|L4i(447y z7aXlJd(=0mfjYBcL~sMvPnd48i%(*j zYp8Z2l4v|>wN$%;S(KFE?%VM2Mq4RGe1!IY;v`9}i{TR)g_DL~>^zdJw_zwo?j=z# z{WRnTLsgKjGT@)u%Ghdu9w0p(gcn5uWe0+pv!nFfW{dknk%}A)uqSzF_ciQV0LKzs zqw6~3HEJWL65I&`Q!z|&y;}-~CTD#|x8?_jO;g?>-U_%uuC^XbSO-K6h`2?0Sh%JqHB$`T$k?%rP!Q^cdxa`KhlOokco zttb-7amMHo>e1XwNnu*o#A?(tm+VEQW6{k!K!J>Smo9Ckwh)j{Otr}N=Z;tlT|wn$ znzq!bpPw@4F#kL`eh~;bC?x)@8#?Ao(^r0ZxElM7P0^b@(3=_kQ_O*mKA8b{9`Z0m zV70b!iO7qgeM~dOaHxYD#@&>1x?u))Fjo*fgT}q84eDcn~-WN@zAy`i=8*n*yox+dGLL5*|{PI9W^U7PE$Y6 z;!P}m;&t-$d#X$_r)GA#wamlx;N-@r?POUrUerX^c!2?$v}^h*w7jO}Pkc2Jr;*WP z+S;XVxYYwBmDkaujX9w?A%k0l#{-3UQjrqq1iR@Qy~^Zt@+bcOKXhs1 zbdV5gM>6Dj(JLsTnAvW6exv>Fp@z_8iDjd04^Exi zq2y9d5JTvd85bw~#lix}nt;0F&!(O9*xNffi8j4T$qnr)xG9?NlmQElJdIA&XRIXI zaz5WlR7hPQOx2H*z$IB5^G%JpiF8sW-Y{Me{{fxvz%*NeWRc z?LK@~z(lJ}HkEvnXU?pt!E=y)>dya16;K5QXv2ZX?7x(J0E*O$GRl)Xm|qh-9+gn7 zrbRtg`r<*Uq(mrv;;_};wT4u0P898i;AKjHYq0e*Q!Nsx_&q^0dUQOZicpz#;RqnK zsMXY?mJM5mCWc_r;n6kZr@-bWXv471M3#HQG_$~pM3wo(ziy{k_v&&F(8evTl3|CLM@qIiZ}M z9XN?XXsvrf)pn&J6t#mvTzUz$nh-O;>eg3&ApFc!Wd9|VK%xbsF-=e1@$Z0y)KwJD&pj0|qix`CAa!+uU2bHccrA-@#2~5Ua819~A!?tP zcs_ab6rjc5j8!9i+#y4%2!*Sff*fLpK2*q#snm0kI0 zSRaKg8x-Msh>=;U9t)qc3QWT}>?B+q!w9%kbG>}NPWTMkK90hA*>ik6Cd8Pp!ri$Ct$CEU$`jx4e=XO9~<%ll9lLp4*CR zo3U*Pv$tfj{EdT!*AfL;rYw+}l+x6WlZyTXiI+K*XJ+Vze{DZQ^9aFWVIC9gLaOPG z8ge%zVF=enhFzUykbNk*9VMOFFWraY@^mvzb{{gPa=}<-cxxf20c-O3aT%odwpU5UO0@s~Mb8(I+;5OzfVzn2-CBip6 zA#na|9NP~O6yq~3)5UAMF8_ok;>Z1)^%>ecf`-grO|&R*PZNHO`{3^6bz!6V!=bP4 zWDplEsw^WHhS{FFRZlPZrtDS#_l8+tP&6r#9G8|X9#d2UM^pUHzZ#_F63#tZp&$-R z;uB$P``$}HN!4IA$`7M@juCvf^iw-LVDP`g5)S zfMEL_Jch*^)03)t2NPCh-ektFJ)4T@j4~K?-*-4YzEks!s%MkLU0TcO9B<}}2i9>z zR~K&69|X>HxYPokEbZSYvv=(&NxIaa;>itHguPHPdJQCorUNi|3czsHA@;h-ByUbt20QVkuSA9&?*`gu3THL5GNV z2*6`{sSCH@;poZpiao0u<4}1N(%B;oMVM^`W)ZO&Q-|w+mvm|8zQZ?i@0+o9f{JW8 zUGpdcj7Nd`p5(>;q7(Lf3W0fwU}%Nz@O;I7pUx5erxZoU^Sl9DPU7yXI%Ox*^P;2% zemv$X8r)0GzGkL$Y_ST6@#y*Jba~OWkf5>2^K@qpW$=99W<^!#EfvA>2iHg-Y(-`; zLux5ebUQ%-P7YqtUmqpgKpu66beSVEbiyFN0{hSNRr?GN_i&$i2F0{L&-1-Z>|&Q= zJh<0PWDUH3UNEndpqr_0ND|Tv9MdN-pzaBgoV`& zUB*7!U3o!_L9;+-#T?+#08D?lPH~usmE1lM_BnXpsIHUM1qyn>%m&{xJ-Z$#cz>%C z0M*YNA?V1(_7DxuzB~1so8AxeL_tCB|4y_!&g}vg&b`^fOq(VZ!f9t&kI7IaZZK7vR}UNRWG{0W}=Pv#O!?@ndA-3hL1TzeQytywCx43i4UDs5#u zHbEzcsL>fL7qUgy8iOv1fw-{KTxf&JgA0@y&1^0U8ZzTttZX7H(B#1{fpY=VrIuh6 z?e=9T76k>7O^;I;5bF7UyF2lZtp`5n9Uo*g0$xj3EbCf2qd^vD zQwFdydBbH@Qky#nJ|85fYrq~Be{97u7Gvx%LCL2G$Wk}?OxT&|6Cw#mzDQ;fh;c?- z9UbJ5O6JJbZQYeVQMUS2!Ud{pJp**nPHGEf-2}lT(7s&W>)iTpFL|HOD#)8H&JDkO zeVe&|g?edJZGx&CdtvQ3aLG>x>&UY*t1DEh!Q1_RppXjA@q~B6Q@Wn8K5s=etK~jb#O)V(A=-0FMYP2pllPyBxa& z4rnhayon$zjs;?{DdjAKbt>8Em^PL%(FJFF2`x3LBJ$VJ&qhim{lsB2w6&^iSQCs| zOaew^iv#`l9f|HO)o|v2SpNDBO7@G-Ww@MDn`Agc02;!ZjN;s_?7Q=d{o zrVeeQ7-jCS(%Eb3qB04~7(78<&FVBeC<1&>_uH+-S+Z|g?#8eAIIV6mnj~>D1F!W-N zO2A?{idb}V%tkp!B5ti7%7uF4#WGVq#2U+I5PF7Dp=pFY6bp zcx@;7;I_ppUaiaR@QIeAO=E(yEttb07Zsrm0)ImxxYW?|iy= zQsi>BJOeGBQ9K1!HM!R92U)1>9Z>fUwMlvx8XG!UD&q1JokxuIAQ{(QZYJ}hOA{G3x5 zpcSXwv`~YkPI&%mX?a4g`#sHt<)pDVzEBz-Yv1o7=56@zq=qmg0ZG|db)i4t{b#y0 z;~>K!D{{{Vrj6ZO$stnMxcZJE|VJT@-L{YmHdXl$Dm{iMu+ zF!hyJsm=oLsD|&ScqvizLu@{)L@h)2jXm8624GdLZ+4glAKoyFKFz zW%a!>g9O6DjFy>YWM=R(+pr`fNq*PbtHz)*A73;lGeW}M0? zBwU{16irUU8Qy$^pf8($u?VBeyfg7LR`&k^dq9N0`cWK)6r|L4acDQRi=mOqV&bdd z0R|b`6jdl9?d&K_xQf&Hk9^Xk(MtUM2p$pn4OeF{zfGRgWvCugW z1uHiU=6M+fj6@)~J|XWQu|pEdH*7(tQ;$TO!^h#fsTZPb5#th0IGo>6ixo zR2F6-l(eAWwlW4BiuV;tRMX%qvw6No2xpgwfv4`hGKZ>YVY?2g3@ev7q(TEfP zH+hO8@FnbHX)K6eNEwjzo=<_@k}*PsPzm@KUwjdI{ph4glhC6_4}ARb$EKqWKm73Ru-uW0e!Ck2PVCH9wH4pKkB$Gi z8wH$?&!m<~sz(L=s|r9;uuKu%jS}`gi%f29?mN%Dpd-kr3m94Bt>Q*C6qK^iBB+^a z9eNnQ_nq~MsYz4k;B~Y2n~&fMvCE3nJgo36qzk=@-XKMOb1xezfecEdU~F;Zc=WvdH1n9I&cP#>8`v!P zi9ueZkteR^t3Z=zDN@noym1xHpX|IiMDbWmd{Z`~)JY$a|EO!GQP5K;a!ce^M;w6A5-&oV8I9EEqBj6-`%`kt z7SD zElSw`>4l88AP*^^_e;uTB>US-JakUeM(JGc8$}@>OLw~r7V#`81(7^gK;howrt^?_ z>m6uu=>^z$`@*UKmPb5rcRv-33?5f4jnpR z_3G6|z^_@e1|vp{_)CDRdiquhPA=P`;EJauR6?O$K%pH)AstPIq_v+h;c{T3n$R!1ehB45IVW`sm$?v*>KI7O1SK@ zJeJYtVn|*pdvqo8qjl3#ndIe>5+Hifn%pW{@-m4BpEDgTPxLL1+AU2?NJYsbw-9$O z+v0RcT3RkbZg?Kvf1b=8#W=UpwHxA2zZmJ4U5do$V#KiS?zm8Feds|%AASg`T6RX- zd$-`Hr5(^VG1pY7jFwpv8LSjI(MKqSv%CPa*0-mU7s1V$NIz_v-1hq>Y&O@W1gy)C zN5`-N3T?GF)VQS;GNtJ%(MapaVq@8frjki>2i$iy(#H5+II{kMCy_X61UxPGTpE#A zuZ#jr@sg3`BYB*bD5l#w)LV`y{`QcENIXigOW~5oNJ3G+r3^TRMk>(t>Pz7nchGJj z4^s%2sg^%=J-9goDvSBTqqKa)z3>Gp&l^EkH!b)coe(zTG8A2X0b*kLE(G;^EIm^b zCL=s08Ra1{X!+&8@ynu)=-4{L6sbIMA>8DOe8e5b)exi)o%?uxA9P8~!mnIgFQekO zt*PWAThOls>5>ZW>J2RrA4LxVX~dyYSwdPXryy^;%?r>nhO2K#ZzcIL#xv0U;eR2r zM>q4#$k;1r>_lPUm#)~WaRNKYB( zXX(P_U{pK8DU6qFPBj*~rWq3HexBB0i*doJI$GYMxwTCtd|Mr_N$H8_G8HX}k@zZN z8T%wjF+nZYhbCaBCz9=Tn(1+%pHJu~oP4P~A_=9uJ6-fHWKM^x#zs9#$G*SA*mE3`P@oo@EC-x{u<>)S%`|KoBRBS5xr$CDo7&|?6D*IAbj~8Z2e%S>Hn>T z(cE3^dqzuiMd!q9WA%%<%0e%tRj(vE51}Vw_R5aN@*a|y2{GZpEw<1arH0ESi*6%@ z`+5eN^@^85OomT)ssga&*^=wOU0fc*hL1$d{$sG>h6m98?4zoMd;X_0k@MCkXmR*% z6l$hsf9{{CIJ(?v98ljkA3ApsNvv`h{}2~VAeD@40(pS+fPyTh|`-t4U6qV_lP3%U4Z8OlT z#|EEUpO(Jz6cu=|XhmDI>*l1++yshBK`4cK2)EZRqgz8$NXbc54u?%dDN;;%kN$%FTx#cQ859vgc{4FvuW7rp-pn#c0HBO5yBzozd$+C{HtRGqgE zwru8Jx}y9O4ooT?dM&AY3}3V`<+7TLpM$*gTt-uuGN9*}QxWp^V;p>R zn-)Z3;l@@J-X)NgA11dd-DYC?+Pp%6Kd&z7X)K9cy4Ob}XJbxQk_nKaqZX-j*SDb( zvzftsiD4yZ9Zlte%?u^8(lVN8y3{l;*XqW9BC3CH{C332Xn)Dc=GmL>d5X)l_Cw1H zFEzmIss&%4YweGA(W~;6=M5uG_?S^)ZXB0A^37}9M_l35l6#|vaX$gNyvLmZ z9CTjwZB9-)X_U*0&O8)_R7~1-;ra*WRo`t~mts6r>+%xNF(C)B(e&1k7Ub$zM6;B} zcSs{6bUS?<5@wuf>e?J>WM}IXa@inyH#kKX#dY87IEIK} zZZ0uNDCIj2xQ8ZJVz_9&OR&@VWoV_ekY0`$@|XjT0gn26b$``9XtIl*1;yOj3&qDh z3(w*&Q2xcMrsxpTt@p@(a683ge}7aS4G7Y1#H|OzTR5bs!-KRK_1Fg}IQ=kg5O4q@+I1k)+1f+)%!EOpw zB_HE9heq=brPdwx_-x;adj2+9z%TzAVNaaT7hbR)3^j4n1?%B}3gr%KCDEM69yS>m za0syYa|(I}t+nXP4emK0$_f#F=QI>%#K0Xv*B}Q^#`;8La&9m=zL0LX5~OEv16pq2 zk(tMKa?W++zDxM7>W=tkQ(F^Jt))EL?M=&8lq3YSJ!))-7o%ElF&ekrdt&}d5@w0F zbNN}f9`JJaz0$egAfj_mcqZ1|jc#Wdr75(IKlKgFKSRKq>X1glZW%`FgF9 zmJnY;CPhhRCTjRaMNrz2gquqkjh)K3ja+4JukTNj1^nj^AbjS-d?^f-Q*O56rZVA4 z;G8>Yq%gJ%>ElqKKl|W^*BRQLLi!+$L_{)xEebj3pUs!16i^tI8-*ZuT|BmIO+@Rq zS%zkEw#1ng8=7m?(#v57EaA&^x?}d%)+X9sJ4CA0nyv|_rLVmKD6=?SQ-GeSSsW`I zJESqqvnnZX{6jCH^pa@^z4BgE+;%bCr~d;H`;mqNQgft{#?&e5y1sB|C`f>B`7PcE z^|)jj0`ZjU#wuWA4UO<8=_G_aq1bfqqdp#z+|>wq5(Xmfnnu1u9+&JTEpzSqO1@-=-lFJK@=7W% z5lNh`S{n~%k`EOZ>V0UN$)g%5w}Wy)7ffui6QfG1udkB-izMCGGLw=H~gC4*B* zf8r(LA(b($;Qr6sRHjEFjJ&J7n5#4{xE&$=_BG|{j}`FMP&Daa?-lU*TM%;XA&6*M zg2Hr0`W9$ASi0gF(d(kM8cOD=Koqem2|ImPT>Ko+u5W`tH(J0KY%v2Y`ko1V_c28~ zBXQ(4sG_SgERsx>!dB~u-5y%<)WS_7qcDjINeH#=$`a0P75S{QP`c(qIsaEmjeN_x zWFwptQn(on+fYiaS?;x#J+y3%0fTuSJof2GMuof0oV$Xqbeu>pg@@KhgsT*z`m8gI zDKk5c0r5pbUs*~xGN_elGL!lZ|eY&oLMho~t(nw4iqHf~rehGJ^EI`tx<~1eU z&2laB@DM7e)k#VRX~#txQ7YcTSN+g+ECwDD$q#8M>(^vM2MU(*#4xr%o&YjgDR}W+ zeVbGjtd7I$vj!oH(fX}vi7D!!fKxV_!qJpg0lh=xhH_mu? z3i6Q<@s9*5YIIPlzL~R<5E08b4DyXA^2*Q@2GlN&M@%~^zny#q70&hGldt=8=^Nj~ z$IYZP)uUL0814qBAkH4`Hla0nPH7Hf6e!4zaF@%Usp`59xY8!oSCDu~t+8VTybqeD z{-r3{OH*7Ls{Z>EN?tk+Nip+~vzFE}iPE8^;)!D5$4!fk+!8wCS@HMvpyf1ohXTIQ zXvU@?;j!*~=W{3$TXUX_QP^VGF3x|8L2Cf|E204+i%m&`q>3BkNU)dB_%|Y6ypo%C z(DJAEL2muXgAPKcdGDB@7~Sv9@wvoO2j;R&-yn~QEW#zHbB>k`TsNn!d5i*YQu=3L z{hT%^DCF*K+~ZuHj0n15!)T$I_0e?IyIXG?l(hzAqubxiZwODUL|#%)PTl;5oK>{U z$n_#yP~i7H1{DY2P^0z<4{PrNZYa|G_!{ST`3HqNHqN0X#$di=b|y)}XDD;y5x%fS z%v;O#6wFn@0K8BNaK*u^-;}DzoMS1lEAl9SIYlFdRf0d^46b6C`7FX(a(i1ZX^r>F z6A{y+$Pm3&ZzS}~#Tf&>G{2X9+{u(DuTa`PTd?SZ?&!l{y`o(189>EB7ODcVA{i54 zygg}cOnz{z1#^nu_zLnn4Mk$Yk0@A61uTkFT5NJopYz}hy0}KulV9$R?A33<>C}W6 zo*E?u{E%=jFGS*dljybKSY=2>PCN~TmLvf7rx=*AQ5XoX6(2emBE>^a25rg6Y;JlS zLb>iyJjKjCsd##cJbyb0k)PiOw}v~jipXL+<-=JbJZ5^I%U(YA<*nBcx`Pe zt*t3Zo0urzsnHvVEO{5M_s-^)rVL)YziU<@^JhxQOpXMO-sFB+!YLdZ*H?o8kW9Au|Z2VH+;JP1`Taq)?{7uizjIo0_^=PFu)4kPRH=#mx(2&aqBXxx0B7C+0Hbsu&K7q@nVdmyI`8c4EKn=;Sr zFES>kZcDhZkeYsDQh7mje}#o{`4Smfee2-sDmLtaRwzICS(H9|3io;E`wS@HoqdVH z*vo&<&S!+b)C*;Y(jqCNfZT@n?-_nS5}hjT^kzu^cO|=mJG#?Kbhr_NvBF5_iUqCA zreJ2DSMu1+0KgEwnXjtUXB}0NR#ud2>=_g-`@OhV`Z2x!o z{$Agzg5NXzek2|u`q)`I4S%7nPXNdGY_{^YhaqeWX|b5Jo=)Q6X*!)KWcdvCp;^1f z&T z(>e;MkB`)mHRw(?I|2Wv&B52vl~H$h=YZha;2xdf9L;s1rCYft=RI%++zMCL4@ms+ zG~~8A6i(|ysJU)NRXY-Xt<+c-ebTdhCdZeH8^}0fsQhm}{Ho#xGsdz~v@YjHD+;+L zJ(hdHQ~TBC6rs_S(o8OT9P;+N5pgqbFs?Qig}a+Oh-q6f7vHCt-Qfs0``m8w>QD0P zJ$y`?gHmofmj*pui`lIYN76iE!@TNuB7wwfeiUF8buxdaw@M~n9DY)?--Xo`?8Ar z!b^xt7Ms2$9fWvzodP*~)FVjz@@y&~{2jv#a@VqsrtjNMC!Jq!iq@axnN(tB?RiPu8-k2L03vgU@IXgONRy0z~wc=5~ zZ=buPy4Q6*`GY>F*u;6}4q?ddbS9i`wBR@Xmt%?oF>wSZwwEAj;Tg#3#Bmf(uUS+Z z(#r3`(qCqyT=cvt`Mq8&iwb^Hv>DrZ@#7JnJCi(&ix;((p5ECiq9DyUc~sC6sAOvW zBTpF`h+!vYazBNhDG1q`Z)n1a3insX7#=xkr^9JS`e90(Hv&!q6>!pptCaU?i)ijf z=tOyt8+`)eU%L&VqiH0p&0|@-LEg~OIM z{;I2j%s(^+9*(st3C7hcQ1az5NOVza<+~%ZyPgdvc{s8U`o&<8^7TMe{bLFs&<0+&P`XLLqBl*h# z2P4qxsLx$<#t+_DVul?#v?dpI|1nLsbWP%2tf z)IwVz>8k-$+&SGdh_Cid8qL0-aBgC%?9BZXBlrR+k_NYDU_a6O#|@F3m?)m3OMFc> zf0H2iA}nyJr6c;$izX=a9j=3S_(ryn@*L#0ybg&!Tu9GDESzZOC2fZ=Z+0>jz-_`^ zRm>SO$J8`_)kIWs{k%Jmt199Tg44mrYeGgphH~z65E8>SW#({Nh)a&6yvXkI_iEwp zT5=tno;R6t?4Lgd0c*k6!Zj@|jXQ*;qbmCwB+NVmA@O8{jA+ju{0t}Jht$fw?PtN_ zYAw9c7W^0eIk0K{NYF|mi+L+aXlrjvY2UK!Y2iyCi+MX+y+#3WaZ6B!zVjNVCf0K~ z%g|F0``+^me(~LtJ?sWr5Xbw%^{?KHSoT?0T49eP z;s2)5I;N7wZpaz(4z1me{;c(W@0114)e$Bzjin_1Fcdj04nbnU=e{!K5>;YdTomp` z081&POH~5dSXG;Ozs|*T@uS`vBpTa90W|U!B+tIaM>qN96gKz5X?3u#yjp)H;Hzk* z!+MDq8Z5-DMO4=>^ChH^(T-%9cEDA7mvS1$4e5@UHESnSBh6@@ zJ*UT0R0!)<=;PK;ruELH#%@maB%El$UT}CJX1V1ZCCzE zINJogYx5iApnvwSC%G+}Bcbh~kf0mQ%x7^POY3JHZDF~Egw3%h zH>pD=p?o2nS2LEmT);8ZzGFRP-X%z=z8|GxD;BbYDb^ke&( zawpN7!4&^3UGn+Md;-2~Et%(+v~Fp=L=j^qC#EAA=I=P0lMVe*)cLmLM6i#j#8t+T zfz#q+BpdsmLzjMe7a4YlH zC0;?2%A(~s$p4t_zN-@X=Ecoi0@s-|7I;MezCsJ;1mzm88 zI_4kksA=b0N)P`W=}RWVT0%DgCt^62#FUd&z9$Q_VabOU(ZtJ5G4C>K=u$|qDHw#) zqfEeBS_PTXZRK1JS6+vVf_r#BCwmTwN*g7TLk1Mt(&Ub^gGi)VEHum29rgk9uJauQ z&(f@S){gt=JIpA43gL=pQI`A`i3#gD&`Ymu;>HJLc9}>myp9p+^nG$XtW5SK;#n>& zdEl=*1*P&a3&}j6C9{1EVOn;=+!KQTVxfyPfCkjGWMUPa3GiFA+rhnBFVNbx<& z_!?S1$Q-R3qJngJ)+x+^eM6_YTn)} zGP8X4*=OjAxn=LQcE_8_hrN&R=-(PMRqBdIxDP#pN*KWw?wvzIW<#291uS3A2Dbg3 zX7zPD9&G1P*_e-wW**TNWz?9Z#Vc4P!rkq{Wb6u-Qs9e-vwUL4j4#tUuj@Vw_j0wR zMWQCSTuSEy(h(TWNlAZcTcvc;Vw&6MQTr#8Zd5GWUqER3N?_Uli=J)7+|$3NuP{)I zlCkfhJnKh%XFE-2?Y*y2JG#?hMgO-EIp|KRYKI{B;dXczRTynLm`zIv*C?fzz5^^j zpXS=XbNs0BbhKnsz)~cg7&uL>R+>B`GRIQD3=C$lRt>YzZ7rrbmVs|%947jj*CLF7 zlQ3W@^C7T-v^|xKe=rGseg>naZ`)-n%7@QG#%B~>rFk|gmVy^x8-6>m@+T-C_5qpu zjObMo?)3GS@R-)6-WPHgwIz+7+Qs31jw6+aEJ9=`8Fm6k?@ ziyGphR+T6qgDyb-R^m$!X5|~!6QO+4kDe#(vL%&${)@E2`-xmlX@RAXDR76~#Q2~a zQIY=!>mL`btNL@g{hlGM%ckc41I7Y;yUTYp+_0bHNJBq&)4^WT;7f^6H{Em-4nO>G zJo@OPxbMFE7zg6oP2Jdg)mRvL8e-NbC$~k7$aGarrpq9>ROeP|D-V)@KZLq5L|*%V z4mGNDGELz1B{MSjr@UM7_&=Jv5Y806wDK(Jpf&-tSM z{9fl!*dWv2MJYXZ)lPRrvX2Aip9p7UJ!-a)*r+ZN`1FmJ8h_uFUytM-ULm2&!Z&BN`2ONB^(sMl5^PfyJ zaZ{q)()&whuh{8y8m&a3qL;W|!CLq!yhIWQF@GtoQ3dz$UgBM#h)UfEl#N&r#gX=m ze|zrPsU_X-gr$({;1!|npl~kJ_!gSE%PJAhW~Rh4n(Zq-MqS~*8Pxh>hdUQ@9Vu4C zlXJgG{jEwAH>2$YA`D}<)_9|MLY{6b<(l^LN@L0ojP3_#@;21=%ICQf)Vfb)ATOD6 z8z%Z#1IvfJ8#`?HpSJmT@Rz-dl-e&)mVPSTS3_xudYOXEpD6S)W+n79WBp65egWmU zyy3Yv4-OC*4hdYVF*)!6dNoEnota?`2Xu zOQw{3GOYcsqamPcYe%u2!7!_DFxmzfOlSF!?ul~lD3wKRBho+WYwmj?C;t`_4aN?n zO^9}|k=3B9ZD>qO(zfFshz8^thK-W&}7W*;1b2q%Lhl%cD5 zkMzY5t76j)d1}>RKoF(L@SgbmhngE9(y5qv&UBr|Ty@ z>K_gC?-jk4G#B<>moUnn*~?@R>SVEeJep(AclEgn=zTsc^G6z2Q>bSqnfoNx$~n@H z^T4}?9p;?Mqd=k32wwXlj&!w6Vy>z~<6}zgcKW09qR0HUJlhKa=A^d|A&zLg%1J}G zG&RD&JS{o1Xa^hO8G4y8%(ff75A|}c$gVB zOWKd&$l@-QY)8BEHAHJ`@@@HGxCz3u^uCtXfH@6xL^xt4osHyh4rGyD)(}VhUP`Wq zHR-S3-&H(qjgB;F=zjWRuW9hxwr#`s@#75`rF|4|&*E4aK76>@T2#Nq)EXv6?1py! z*Q64`>k82l;gsfV2&ae09-E|WgKKpK6T&!nzz@x&GL36#idm1ud8#cWO{rN#^Y$Xt zB@=N|4klqcznwjZ-WDS;v3|I?gvA6inZ?e0kJcxXc!$2AId-@mT0R${+aQoRlP0e# zOq(?^Itxd&BBAGLz-L#$XaATcwnv%of<%F9Z0nM_(aDE@gLm>+Bz}Gdyknn+YyG9D zE1CpX)dJKdP2(hGJCer2;>qGB78^;t+IAI0d%g2_YZJ38{fgm7OnBP)t!HR}C#UijdZQ68==G$W$3AZ%N=Pi*1aW?o|hW>KXLUp2r|7e^VwDeWF9(NmEuJ zu<#&SuI@&yC6j`WlL8?3M^BxD#AOc>H*N>k{)3EaCR|&tL>=Q;TvczOE|W|veQGqQ zj3!s@hS=G%Cvc>zb4Nm?m{J3d$WjxdBfhn?=umlQ;G*1dQz7LkvgEL+PgwN3Js#1Fe_mrW7P3Bwf{HvfIU26A@%bG{b`pWVHxow{2)_k zZ-C49IvZn0T_y3tyMn?1U7o3vxwLKoEl*{ri=?%?@6B&)4M&>aw?F>w{LJbgG=wNI zqAH27v3Y*-4BXlJpuHh$F23{3V6a&p6HIYBfj zrKQztL56s9(kLq4!v4A{Kjap#@1vsdC4fs$+FP_lM#Lf34-F%m^@@NfvW|Y}m5{b7I3Vlfw+_Y?p{ZMJGAMI&~@YFZ#4J3Xw z4Yd_3;L9VyR)QZUXmFK1%{=5}90RY9zK20zD(+=(B4N#A2xt5o6|R}E_dJ@Lka)Su zV5q?@b5jSt_5_aXj=3ZH))H*fm!64m4#%QCo?7 zVB6EE*!m28_E209bZF4Cq!XvqClFXGj zB1J>>Gzco~dUMm8QkbT=YUl?@UU@Wpq9Z--ARUR)d*8@(Sb|KQojn^q{G3A21`5V~ zkxn{-jSLjF-;au1S`U-^QwaE!OF(-Qf%-LlK|6l6h9m8GwA8-4rs#kzIt z%$wG)UvEtGd*QXa^%YhI!38!^D~g#~MZ{I~j}uZFy(Uj|T{4g9FBhXv;}Sb;eZ<__ z=`S({ndvQ+)YNE741lQf9;}>bTFf@sMdHhJ}flgnyB0 zn(rB>5!%SMFis>=O#wsr+AI*N@$;QJ=F&g;*;6Z?K*qAmk-qE%S`8L6g8ruzbjBe4 z^GSpS=Y8#ZQ@u?3TK%E6rB#q|*}2+7IHG{7^7lH`gzofE*{B7mUCh+M+c_?bmoRuC z{2;T{v6ewvgd?IIq%(%$8%q#lIOH; zb3#yq+|8wY`1~d{rmZ@Lg#D!`VXk!tW@tmgPl7ctR90IlGypM(JOLH)VNqn74oe zR96bK)mdtZ2NK&!6fH#*0Q(a6lr$+rNpWc1srVn?v-@G+96yl4d9r*8$`0oHRLcHM zID8F7<(pEkt;rgK;-yA&L)x@xw7%BO3y1bo9I5;HQbZmc0cR>9k-&gi#?~lfrYt(f z0>eB8!jUj@URbI*W^#`af6Dq?WX#r40Cw`bN{Rw$QzDtCgbHpJV~TL3rxR(_Yfx56 z7o)~vcNgYPXdFyz=0@!XXcdtuC4Z+N=!xP;$#a}P6JZ(Dk8Mq)073!4O}y2I!a?fx zpP`~Z>5tNR#!IUZ*lP@4=DeG4zS)?aW0|~KZPh+}A$um%EzYC=GA)3_sf?r-feK1X zqCZ>=UP)nyxkh^vF|Vmb`MCSK-XkTqQL0J#&qN5g2?YE!<1vS{nWU2Td76}hOHls9 z;3@|0vU%0QVg17wWvRnj<9&RXPeHEB#q$`up}3s!(<)*geUYYGpte2 zp(c{#y^SXPdyr~b%>))twf^=-k@n^$tr6dkO8E~~A^mXr`qx@f{Zbjnf^HoWZY7-w ziGa$L!*%Pz5hJMSoHiclO4+`E41mE}jF^vTnVj&Bf&`cpDb$DA(vpauOp1f#gOIjn z4s2_S*$(3Co-C#Jaf#HcNDBVPti>0Op!5bLSKiL7i)-38$v1ZAP-8>cdwa5_d%bSU zeV-!phybc-bo0$Grb0j^fz(**;=|I|$#gB1T+SwQy~fd42D_%MW^m&yOCE7R8_TeS zWj&HYLS-Q|fHcHIYl3nsq)a4^oCoVh;x0&6_Fzda{UK6)Zy-6az$ghOL*tf95Oy;2 zotK(@^SmOB@uG3Nib+HEGdj|^d!0Sr>kPiL4c*tC%RZ=@u4fy3pEHQeq>Lr=l?JaZ z7PZEeQT8%{MWksf8o#SWn}x7Ml(9@HNy*r?fr$M674|VGmqeQ~)!bwKx`6NOXO4IK zSMAGu?~^niCL)xcMc*N{3kTc76qt$@_t-y!wX&N2!oO0ZT)gw^D?cM_XkF0Ku2{*K z9y{7^{+G;LhKzw;t}b98+TyBc;3YL!6DchXo5a)MJ$0mtf`oRFQ;?m623Z8T=Y_Sb3S~@jZPv4!U98v^U5lkM zt|LuRiH%A0SLeQin<@0ZN({O9|Pn1}- zzv`CntYw|5R~o#w38ODQ+@BezveS?nq#95^@oY+%F(Qlpw8LAjrweD3ioXX>p4SpO?gm1c8Jj(4z;n0j5x0aS8pt%bUJ2mT$WwdD)xR&~1K22o8&j zODU7dY+cl>Nx+%ktzrD2Ag5AlX?bVwo<2zi)Sd;>%v6Xg;enY54eddEp-@#{tOd-V zHh?&iH6?ax_x&%s6G=6HgD3oUbWRXYBih8IvMQQ=k4vHCVp3)`qn$3MaMPS=h@tCT zjF|7f*6njOd2*SdGJ#B2%$(z8;rE}ZKYFNJ4r^kkuyZRz!c-P3j{91`vn%R?nZ zxDw81&U#r_LJY90FSbo3sO)(bnSB4~nV8jWH;hSA`Q^0YJc8ufw^%o4g{&8Bi>;8^ z^{PlmbdC%@!u%rX^wHygXV$l>(LXL5v`9(V1MxT>`+{=N)I!G6^KuE%^h-tRlQpl`S+@sq+^9=^XjP8_yOZ`yH zLgRk;f3Owyg=37FRS6;_=_`G0B+rV_h$opxCC{`pFqI6ocpjW-!;s8%teq`dBBOT1 zmQzLR`86Um!&|g0P=qKH;HD-_$tt#G1RN3$ZTQS$B7k`%{hRX1-_+JfvH67p9dfoDQ;fK~3H*vca zFQ%rh+~#ya)Gzxo8;+34M`-C$iBM}*7Dy3xdvFVqS5Zrw@MN=>e0Mma{Fmf=uYfa4_o>8 zWujkIjlj|8B6-;Lu`bZnlYqq0S5Ww9HogsawC|uLJhf;gl4b*wc^NmAmXOMgMVZ4a zC)IDlLiEK-CCTMq0_*07fZ^9Rdui8jq*-PA<0W+G)CPz!0QV(8Nl@ZV5); zZ6>0GA@-Z3!U#FyW7^%ys!3W>gX--|D2)&3a8o2`wN$#&F9}XvT?a3w)}A&5)-bqi zQXRJ(rb(KxG=h=okOkE_v$@)mX6QiY#z_6p*u>Vs$KaH~Wt7S{ZX|=cX5Ldjc)>(Y}4_L)zZHI!c(oYZn91~>jk82of+*fiMGu1Mq^Y|KebeAEs;a6 zEG?H~+=$#c&Vr9nQnsyA+Ss1J5i!N~jBjgD5?mxiwx^DWpMqM?Fl-8hWJJ3}Koi~0 zqv|mC4d~c#tuPEKQn-B3~7OsRu;P8@YOqytZ^AgSWW7F={w2WyHrEYR!YM*dy<1ty1BL2{09oXepMo zL>6ljbMiCT&lFjFBmh!FD@~=D{s1+#I?}yx59NH;^0feQM8XeO#~Am-gq!Xd9MuW|7VYn0Tn1$5CdUWe2%;&`i~KI7D=RH0 z`aAyJAqd17e22hQe{<;?xU$IDE12)wLjo!WFKL)&*YXi}!JRaaQYf|UJyAF*%7)yC z$WdqQiQ0Err*%y!O7p*m$f39IbgvOUob0!R9VP8pTL~O}%1-w+oLKb&FoeW?e=J`= zhT75uxT%d;?G$?CPi2XScpr48G0oFNvuAo<8${_?W&%^--FHx|>&s9&;9}xPQz0hv z<>9cUL=*5>6a*-NxQO^N_1xB5x&FUEzY|-(-kqw-X>Ppi1c5k%-w7nUK9Ty&45nA4LYB-)X%+D%p<+aP>B0BH z(sR!eRYk&nm!)J@bAS4d)|5H*ykrJ{@^Iz%rKc{&;hre}V z&y{Tt^S#st|b3Ws5L-;?0V6h#cW7@W4Wc+&uN=N<}m~?rIbsoqk z_ZWlUvSkY@7=Wdcot!+}4Ko2k-4*Z^hu*;GR;F4^=4{Mi?&irCG<1dJ z{D3a835o@OK=O&dXc`;P7&0Z4x_u@4C39CdE7E5%GMbuMI&q};WJLP%cf1$~l$;SI z;#f!=ncfDDEPW9eHH%u_{t3G(ZMu^Xgg2cWe&9(=4mCB7A@vX_y@&$9^4A%(ybOs) z(Go=7(PDY~9+XahlCYcD;^hPVFjZx5*+giB5Q|~{3#20P`#N_wWVkHf+@sqUlWzvy#`)Mz` z(5>M!ko?J`tyl2h`{0`QMC;e%SFlGk_*ew`*=L_^G<7W-(SGoA=FBmB!0Y;=MT;8t zgYRzRVE^m`W+bzqGGRC{{*La}{JqlN%Bz+~ml`#W%&mWO(!$@P`smAm$(Qbxw(Rwn zeEb{&OoGG|Zm3K<5*T~UUT;FTc;SQ#nOToaz9k&_-$STA=|-c$cZe}T@sX?V?X%6{N*qB^2?~UcgG!fnB^U9w7Jzwu{FIh0i)F$cX2^m#TYHe_O zm~pB1B-ql^&8?xWt6}R&pE8RCn#OC`&B+dYX^D-N>U5?g=IO4EjozuXy=}Fj`la76d$ARY7f1V_-YA~mO^#5w2C9Y+xng1NULpXXD2njf^AzkQt{eDsPWt3Nese0U?N<^ z>D@^~VohzU4Y7M#`!5{Rrz_*D=S5FDyYyLYYY9&yKJJQl&lc_#A1`e|pz|D{S*`Qu z&&S(uzik-P)mLAQC!To1Ach$H(@#Hbh*6ATHNfJS2><{<07*naRNoI?JIm$dFsOt@ z*R)Q#Ger|qMeDaaTf~^PuD30Ov~d?XTaasj!x^xZaZTrShaz(H#c<5N+Dr&B#>Q*d zgGGg~XGiT4!(Ah|j@-&4|4HBpj#wtU>T%)vt>7Xi-xiLz{`?I>7mt87Y)6nOgCoR|+Uppg zd-gBjo_3ZQo91}h5gcg`p0SeJ3Fq#EDE9%Lg;w$;>DOfdp4FXU1}JAzkdA;(>URT6Y%Fh z{~41eO+rgs#%|xfz0<^3h@kE?X0GjQe#32fd3h)-EZn8`Z28#)1pL(IPPq)W6L*-` zG_i$Ly>oOWLEG*Z<#?eu_cD7Bc4MWzvfCseUf(THz)3a#ywFBInk4UQEY!GU6)*GniInq}{m` zT(|}hv6$%SSB)@*L~?t1H$#c{_Cfz{lku+Ot)}&GcDJ^4(Xmw8Ra@KT(H})cbTvja zJpPm@>Y<=MiQ}JJXS4M-)>`_wsaf~>V`r=(wb~Gd_`dWbwA~=`r7nT$-}^ZU*T#qh z)>*$|M;IfC+-;!OzJ^++0I19zrC;^VNTZ_3mF}wI|~aPYb`I|T;K=D5u(J1f&clk z#*e&aC-AbpnBzhJKd1bkbL)AD>m}J=w&(wP5d1#}=77I&d`68h{Yn3)i2uJVUqax^ zW8W;2Qg`5g{o4iD4#-`njN$zMTVaH#VScz!PXEolD7u5;|F#oYDM9#OLM^CWfccfj z0T7^l?UL3&&@vSN1O**~!&)|M4jvM% z6=OO$|5tHc0spB4R0uHn-|dn7Putz`TRgH4|Emumzz^X4uzo}t#Qkr#M2HsfiV)B2 zbsbg=Z~mYDWD5#tJ&sG~0?!f!9?2FZ|Kk0h4mdMMegP7SJGG(@r?>Ht*G|*M|HaDR z$lPRbIuHtcKBxe(@O#xwGa^jbL%?yq-tC_@5cG8jq>~Tb9ZxoR-kVn&^brDiz&OnW z4&7I~$kg=o!$5R#gV&>VNonc+%VGQ|9AkHY)8UBG#|uES#TsJ=2y+b)A<6N&sC4Ym z)oe0Hh~v4SZj!s#ap(yJ(rd4Gg`%EoK|m412l3$~&1dssrO1Q6KTZWRSb#*_k5Glp zHiyxz4(G&_l%-qU55w;;A>H6_#L>3)c5DN`R|>z6Ln1PEc8t27CtM(Q9Pr%tO#rla z=_J_zVr`pA?ns|V@0?D)2oTrweOhk!{zHER%>(a}B=j8G8%kCXu+jzq5!#2q4<{Gk zb`Xh-mltoA|2e1QXF&Ww5 zT*gg%C1CYN9C*P#^ugWkHO$P-i~PU8UJi-AEwOu6FWK9qL?@@Ghab)t3x@=0vkJf< z;h9DObzoqiWRh`W>gt$4W^;seG9^xQ+_E*hc9-KJuS1uplAU}XpzHdY*&##Zykt@Gp42``E zlQ`xOooO06I<}gPMziSosRvPTK7B+w=%K0FiqHI%fGybkk5lj-|yAzJ>T;i5S~Y;AiS#O)vJSa46ta2G7I$}dQ!FixTw9eq&GK4) z4{KRZGpa?805vr=y^HXoYBfoVXwsHcwK^vkf62=WYdmdl0}U3Z$lKMG6*ujOr5D;t zSz%#eo9WHt*R`b4+P%s70UZtwbbFIP!WQFEoH<%GTBn@{40 z{BNL;Z#CYLD=OLfl|+ofM-e2ICnr<8AOrO_&(~W@6?mR<~a%oGwHtX3ImR} zZJ@>O`7hXRZ3H^%7zJTs@1IlxfkZ~~OmN_AC?;4H5P(y(wrb4VSHy?*ytc^T_wSP97S@h?enaaA3xWHnG-&e|xt6BRx^-tVPbtQN8~v z*fBO;_!4`O_3(LbNXUE_-WnBYqi9!(_89l*{Ldocxrs z&21CJx7S)H5)y6ln;Yr6nLLGI_XkmEd+aP@K>Q&=8F@JX(J2L$j)be-*zWdqlvEK< zgd9I47dI~?z^-npd>E$UPA5XA`9pJ{UdK*W5hqn{ z?4y4vZ7>2n$g!lP=%T|SlE?^r;a;(;23lSwfy*p38Tz(9gMxl zMZT4?RWXrQ>qj!%e((~QQ3KqSys zoxHSp)O~tk6?X4vClJG-r7S>Ja5N;9A zFND8NRgZCCz))f7szZ~Lzqdc|T{kR!KHoIjUlOC4J~B{Fde=0Z(LNUs{X%|FnYzw_ zw6TY5)K7nWe~tD9H(~s%Z!#abgwh>!SE4o&sUDo=0Vj(m44Y>i9m!fL{LZx#y`uP4 zx2~*2S}>Cqmm%&e6$stxo4c|6q6Cy$+&m> z=bPL%u+`*(l=&E-A{w9L>ij7-bOl-Q?Il$BxXQ=&82WL9IJQrPch0|q%b&+-^Cp6_^KS?zr&qx&@SIEI_CT2i?oE-z4iBCt{F?~76Fx7JHAfIeBk zquv8F$egsEGcgtHgt@pqdL|ljHTZz6HLneI*!{-EK=l8$YC%s_&!G%jxa zDt^|8p+IagYvimS`F*Z^JdwV@{@VXpJ8(g@GZb-ev3EJTTd;>KEV65RM8pqC#wh4r zeu|r~`CR92ROrdg%!qb9rCMTcLA(Hug}2*Rb;ut`*3hxI()F3mG0^2h0ekbs@6bg2 zFNeFnGiQv)8&O23jr6Y#p1(IEDpEeQ#tomU;5Vb{vNBWos{*{|9;-rsUTUn`D1id* z0bBkL@oz(^7b8}p!99dHO@!L_PbRsOfoTTTaWu7jTly#8YZVrtK8T*uYeG_%LmF=B>iIvWQ3zz*(`&l63MI0ZBd z2br?62v2fI(5Zgp!E=F6i5z}(^F4#r*PpQ6mMZnXUBB6Fr7NZI+41-9luP1qHcKpz%BH?-bo`&)MCxLA~Ke zCTA)8Y?(ZY&9%^{-}`*JX`d!4FR^2Susb|rq(Tk^X|5S&OLzD zx;NdB>1760#e>=d@+akYSR7OagdOt?AKE_F%3QfzRzxr)ycoc4{z^NnGaV=yWeIWH z3?{@|kNctlVBF;1ao{uEa7`LbR?TMT9rY5^SB7#cnbJfMCyi)R!){RHTieo*)UGkD zOq8lc_&ol%_}c67!41f0Ob8V#4$Qf;TeCg;Kd)GoHIGOp)%&K7i;=_FB?2_)tc>?Baj}QYIe2)wOuK=R+_qV}P-2~KHt%NGqZ!mfIehhbIG5t@TGVuEs-X9(wUS@+Dn!?HM zJg7}7iQZ$1rm=+WDmwbOp17?q$%+KO3&XUt((88$3sF{9h!+Sz9vtUpuEOM zBd-#gYMp2sC6wbKlTyUaX2ZEoB-^`Qhg&xF$!sz=nWji5v75=H_I~0%kb<_Pt+Wl&V&{uFygC(7#x6T+dP! z`$IHIVm?Mq93TH}mJr6)(V=X})i#O4B&*IY6qjN15#3%1;u&f@JWK8q@_-`JlIgP? z{|KFy>c@Q9@!#y0e^{1>OW9HjN~)G|^M-Ei4>r79hErdF_Le{l8b%jdD_^>|ZEK%Li0hOSb*Dl)wZbE2vVb4C5b8>5n1krD61&I;|dg0?T)Fl=n zh8};!i!(C+8_tDJOKb{OOfr>oXGa0Qhq3tEbDQYfIy{4+7cG;9yHrN_-i)nv=h z_lqV%JTsqUFrO6!XjR7B9NjFJZnl+?hN5z$5qA}o$yhb^hDvfgrc1PP8WWfH~Q$3lqkO{NyU z{@{XNo>`DDraPvlT=z$yjRLOAO4%2+Z7AR57`uZ7n#wsx)b)|)ztE#_cR`Z)>` z$)QWVnU2S&gO^gFv9g<~Y0yv_1|hUniW(yON&gzm%$d&UBh1|SAsps@Wvt2OOI;?o z4p~lly}9{3E&bGV`6R>kS(#tE!*5X@kYZBpD=mD7KD;9F=d5zEFyD4`&nwnwjLg0umLaNmR z`MyxQwWANJ>4g8X%RaleD0w>~GaR1`w>hFlm5T4DpsFF0|9z?u$DQm8_O|UrZ~+?~ z$*cA9cJaCnYDc^ALH`6WhlV zMV5Ng9h-7K%Aty)+XLELCm`zhuKuzMWRFyd-!({r;C!CBk=c`b8=B;V((8)iSC-8k zhEpUmGr2*mYAe3}-L4>mXHzhCrrBRRoWGG2>|aokH}NMM>p7-W-SULH!HQEXAoBx{ z&~Rt!S zaF4a$7KNR1&hX*%KAe;x>=L(I!(^Hv&|yIQ{a8i8c7sNZ=fdo7&a1!I zq|nut!lw=AXN3~S%0-+cLEFn?AuxhXead^K?g4lmA}Z$(w~KQ=G$dl4wQV6WdxS_c z2D`|tQG<7)fraE=Q$2Y27sR#7K>-H)U(iXl66)b!&IgcX)rdmD@oqF=U>xqk2RUBJ z-+sQp&%V>NOVZhgY+2>ZGI+!tt+D?EzPdMUK27FthxPArzx;y7&ki;kjUCP)ni1+h zNcDIu5=?3k16vbg3i-HmhhrXcEb&}H=0xRYxBV!*_xrW2Bv_H!YYR8xbE60;^$J+F z0Xo5Rf(^#wM!v@TTec@hXv_Dp0rf>HyNrE3P|vaLs6gM{kY%`Dc5s_Dluzc%`FsxI zQJrK4F&f`H8y`aS<<6;hF=CaqRwWz^uJd)gMD-hm8r>I~0aH4wQ3V?heJFb7mm2pk z$j#liq#?Fnx~}=TQVa&U*wwOqndSJwMc>^>tHPp6Pp>?%WJ)8dl8~gN`Xkbma$8h= z*oRQREHO~-)!$XEJ@uLH5}~`srsz>nolzaOO^#iAw4PxZP$7>DbWUB#Rxz0Rs$L28 zR@t`)xpx%T_`pORdRDT=IHF|DzObN*)U#bIGcAVhM+JTXw}PQABIRmXL>>z8_Ke#kDr(k~E?` z>9SFOz6+PYRe{tv0$lI=_DT0m36O&1sfYTrYA<|(V#0L3GYRP5KgHpaLRKYKyU9dj zdQ0cUe(XfEDEcK*z)2wPN;twd$En~W*W|%WU5bCW>otHpxwoMf!VOWj!9yP7FtL^O zz6Wvk$J;>!z-vIl9tolndn@*@+5}!GBzP~AAMW_u3#S%ERI%$phb6nBfU>M=E%3Ji z=x3+jfY1t496wGI%9~~%c1ykq17(eK=e5(zlrk-|%QE@LlJAKY>fVpbnj^k3`C4Im zn6|0;ppI;HSeTGb1J}w5`rd$GqW!8+^E2eAZbDUMXk6K!^A%My%+Ks!7u0dKeCHk| zIV@mL!ej|9Q%=-^I-rFaaC+oJiO3YByb!6-?B@HwsnI2je+9rt0Z<4bq6r|VEWo3$Qm8nVz2@DHH>4UL4UdwZHWHCG+x29| z6b{gTI0QOxnXcf_)4%R1)nk5H+ys6vnn{iSF+y&58`p1)C4t2U8G${+Zt{=#+Z5mL zHP&BG{~1E%k@Or2s^q1tm;0k_GJb<6yiizvg{+eVWNjaQc~Al~+)`Q=GY;8*Y^df# zN{cB}BnKSCz$z$E$v6z@3zv#khEHm`sFeZk$L4W?q9Lr&&k+L+G*|am8=Qg+u}LEu zy{ZyX>C@@bK7Wff?gqlQwr${|x*!ZjQ}V2?~qN%!2cq;V*|?<6ZI`e)rx zJX(e+xvOMrGvV=6&f1_JiA>_9%+%!8W&k!wDK z7@#Ykj6ZSmS~ICkHpHP{q!?x#%c2xU_2jgZQ(qDmBl>St>6jGqy;5`SF!DHfD{nAQ zWJWJ&_rRnE$!MiC&gU5U4VkQ14p>O^lFI@I3lX#LK#`w(r>CBn0may%i&b~G2Dny; z_Q@v;>Tl*xbX2EI7gx@zg5eM)=x(Z5?Y!_9j@(HY7lBpjs1Ce|BaN?sV`qj?MqY${ zlXx*eO&bZl63|fyy^1Ig{4EO220;m+jt03;{Z^hB$mE#WD*=^+h668-{Wfm;Ve6pg zN#Wz*5X5*O)ESLC8s?x>Zx4pL?q+3d9QE~>E$66vGAB@mB@gRNi;|5Y?Q1#U;|?OC zVK7JjD^rn^Nsf|kWR@TNvu7+ z(mYvwnOR(_>m8e>pl|jDatCI#vy_3RqAJ_?dX8ChF&orHfBkuuLN?!c^{O2dHV)OW_EhZVbwF5Lg9<@0JBt? zFyxJK&z+qNabr8R6b00tEaoaD0u9Mksp(c<&(>x(GtsEk# z7x_bDA%nZ^32v$871w3lIqnVxHZIZ30EL6C?(~_(+-e$Z`X^P(Dihc-s${(F!W*=c z3U41IwIw<41=Cx&Bw15pS#5UBwHSD9S!#ftV&umjWP4nWQCzl9VguAFUHE&bfig=2 ziCusKHN;JSIT;|@KU1g1Zzg;mKBa{C(&Hvx*SG(zZK{}}xRbn_+a~GW@{|`j`q0-Duf`6V5dFFlnXI7+ztK0L@xSO1l0mQ9p4Ro+yc<^Af9}n zvy(3Hn$7xb>DKu^>TG}{Zi$oP@8vbPAnIcGNlaFTtc}E4kN26>r_EEe|F%SMyfE)c z)xF(X4C8E1Tr!nZ4!H@;0u**xiJbKzr4sc61xacQS)iY+oM9%MFZt2Yqp2T=HO!Es zysj04YmTh3&+=OWwh|Kavs~9DC_Il*__y=nM;%~Cfrw?u@@jao{_f_+@Jg+T`Qx2e z)-NfiFN+6m7uo2u`q{f~D{RQG$9US|-v5|eCGqaz9Rb&;|Ejp&%^Q>5Qm|3Ey(AKx zY2@uFjv%n1|f%2s(7XlgBt3i%+<8QBY+m4B1^M45q= zJZ6zxK-o=j43uxl0)p?`%W8br3X^M!d!9YXFN?J|*cdT1O zD_JP4Hn%M(Y(1*d+gG>EzU~nF1;P2~4?8MOCt(EEi5ETl6tQn*NNh;@zJD*l_#hN} zcjwV(e8WlFyOses*-alzRc$wd=$8-GXASSQ64TkmVVMybI|jXL)(5~JH*a@Y*zncD z5niyQU(CRHXMd_`FD$j}v&8ht9%h zf*=R(5s7!g)&(^2y(?ml&-7nJ6ZU-&>LY|lpXW}tr7bi!nOHGEU8i8plP0?_OB8Jd zbq*WYXYIBTNYwV?#kX3t5dlYGznDYMo#G-T3{_r?wnw-;1Q7UF5>5^NJ0gZ<&k=6eu&BsIMS7)^T-1QcOk!UtMx6nR8TZyvI-%NED2Hxc-JF5rpWl(q zb&ysxa{7|jxLkRwMtRG*9ket@fi0C?S98>;@P&CDs_7rmPWr<0ig@W@5W=3TEDcx6 zj&HTU@_DW5!tpQA-fkavPLnBx#s9px;u_XT)~+oe@G_F_+L3eTXHXweY$61a7x7`zo`f%-|oh@MPH zWr>(Rnq#t~Gq<)M!$ML;4V$*;)_sDo6lqZ;bgl0JJv_G&eA@OiU8CfK#0tqE-VV3X z{w4OXDJB7ZWSb!L?!7-4L(d4`1$p6=R7pO4N0cldEyyap4-rn=Zsdhd9YtWAJZ14` zz1)ayMWnjHknXUi9(h4ng|jjCzbRyAt9&JT7E0tZW-JH_Ik9C_^H4uBbn(k-#CFSn z^`wLUD4JTG_3R%$?NJ5gI@utad|!{LyT1J%dY<)d zzh4y+UEiFPKptAs6Fpab9T5nv^R^caS_MBD-=cmZa>UGt5V;IA-y7jMg>WlS;HOO@ z3FoGZAe_e9Vll+u>D8x)q;JbzVqi$(IZX&OJXFdfD~HXoArfzN~|OxKBUC(k9(Q^GmWKZiIb@wCUP zXOU^I+G>n9S&AA?gi3iitoIFhU#<$pw`PVp9{NG#NI!i;-hQ}cT<^-AECEKh%?`;nV zmh#r>hHNbMH*2{&`#Q)vA<~!bik>@{5DSB#lEss(=5+efKL{U=sI*nXKi1u!c88B8 zC5VxAVH8~1h3x2Ma}r)vf%3E)o?`JeZu3)OtLszkQcHj=#{#rYHU~oK@ z1$I;j=XLB#zZ;wu{ZbZC5V}kIrXa$AkIIZ0+_p%LyLjRv@XICAD!;yC4s@S94 zOB7yJO)-V;2ObqPvaNP%)#)yUUW>k17`;4nGQQzQb;D}Jo z|JD*!-r(N+=6}pr;Dc9jyHhAwV=rE_ge2^3x9lLKGCrBiWEVqncZ-P>c zUW@`|K5}q`*w}>!odgj&*kx|;hqHyrzq)VPMVBcg>2I>kVxNVj*hJ?M*@w?{B%a~D z!Tg?B=yY0f>NOjYH3s4!EL+f>&+tq!4%D-?99X7yv1Caih{p($^(9Dorc8BqtD|Ss z`BbDySyEVbT37hrjVm_B%p^iFSyy8j)n=62`e{)tkUC}_6YU(lZ$3({Nz9dh5Si(z zwu$9o5xiDr-7%M$tT`(;{xUmX+aBczwgoEIW;$h^k$5dEWvxY3sy%W5={8d<*goye z5jNFmcvFRer3QbQfl@d>ok;tjbh!Wx*&T3GW#S^@L$=;t>Z{=?HZCJ^wkAR4+97-} z<2x3s=j+ko1AJEHo*w{8*_@ z?t@=f>|v3A_|>(`j5pGu>prT(D(|!U30gw6GaW~04{AjMDWrmaF8(RXL_nibNf4S- zgm1E_rsGHY# zlH+x_@r-r--hr$!iSfn(KxDlf0=!-pn;zLU~I7h;785zS;?(^zz^T)MH^WF8{FUWwYUxk5%s?h4l@oVt>HsC=j z_Tk5KDtN!=-x+xp_LBcG5@qvjyaU6c`T6zQXBQY2c%1e_Y8rZ>Wbu5cRT_08X6bri zoVz|~RQWzEkVu3vZM%MW+Bbe9I2PDzdj6k}z$CsrZokjR)%o>lG4g+vQqIos zpY`O*gKY71567feI1)pxiu~Qd}|{b{h6N$E^o7npLI}NT4U|f#J*~>MFW5HGqh9}dNZmi zrEOV8GFtv{oO(+8qJk;Au|f!Rob@F={M;X2k}G3OP*Ww(!o*N5$q=gghcRAJc9NH< z7^XTPvC++@h6F*{FC-F6T7-rzeOYF;CRtcm5w(F;+{Vv3OAJyoa?5LP7ZB|5kB1!o zY*(UAran|46{M=GSuhD3J* zvykjYm?4^BGiygRiI?$(NMAueGpZ}9JcLFh5ig=ZjFpVunWxPZ=pY`i(ge{Ljjk^w z$-_b&g1qLqBN#iriG(Md=k!aHzRB;?E)#RLd)j^YZ`&)RrW54?a?l8vhFpnBss@BK zC9v`lil*)hbsC*yb4PKMr4F!Y#d^xksrVtWIwMD6*xZFBG!<*PY;sL-8r=!LYD+r< zPtcYnOXPB!Ck5ofL!S378MnQ$uojmt1g4vdu~qj#GK$kD@|k2|X<}m&i1H=Wc;E|iLHcNil%lppJ_c4H5Ftc?pnJEtFiX0cs>mS1IZuC z{&mlvg8kY(IBDWY^QF=xdhmHPv^Dtd)1Gs~h8b+x#<9$Hxu>HCN9kpR!Li)yoqwNy%pj461`j zvS2?(Osi+w6>@db{-&G;1-{dtMk!x8RWL-IQ|6!TAd(;1D@=GhLie(gy+AQj+|s<> z%{CdlK5q9^!9v>5UcTR(Ra4gjFqxLg+tK_pH7dh9MkyPO z;Kf>jvTH7Wq_{iA+y#|EkiuGy8bu^rHeu)*nc}xfM225*z}vLzbWRBek2O0Eh9O2_ zg|$XlJP25V&z7_lH$c@ko1Gw!byoaZ{2R&)`qH*RpM3-wfu9jnQQw%1Pi4+qu@GP) z9UYX>2dXKhTT(L`(Fs8NrL!t_d=J9n!AuHK8G#$w0Ob=Sbv&y%FV;A}+vobTDSFF|k5eaXY0RYv%- zR)#)EI5zZ7Jb#yp&qXI={JAux&9kWa_K0CnH0c)pzKotU8hu3cUXXeH^f4qFY&NV2 zsam#LndVm1U|7Y}Abz-Y8kVAL&XLwWA7SSno1r&iW7UvZvU%cwP(UHFflbD)(X$7K zhLJ%<|G;2K!6GLEXdtNs6i_g55=m!jQKFT2T2cMSf~1)$IrsBzzZu?{P~oKy=pqUO_~nAZGw96xo8%DSgA!kT+Q08;nj-OV zM)ahgVh7D#{7{q5_>PZgUt2_m2FR0(rZzbozQsvC(3zQTgZwQn5(XB^SW4zb#Kh88m|$ZsGi*OzB97t8z4qQ#ROV$5_%yz(zO)ck+y#`We<`50ZfWn zvU$mqIy0v4i>3d$EzPO3x3(d%(q+r^#L3Lsh{jn<%5V%}ntN>=FpatB3iVYA;jZXV z;Vo=Ecubl@WnEaV z$GeQPHnM|_m)+_p`>QruyS!~+dgl%*6ss>j@E5sv4<#AtJ%w8eqpY+g6V;9&7 zB?kvQcJ8!b1PVP!fqi-)8c1={JdupyyB>Fnumj=eqn+=uusqOPwg-0ICAp z$ic`IV&?Eb5+4i}OvZ=Gk}LhHmiM(+%zU_k(>iwYB)$_Oo$uQn!8>N$Ra6+VNC_I- ztaHpIEzLvnt5yV=KCJB)bb^T}vK0;K>}JwynB&Kn`(FJJX z($0esv$^!&qNJgp@CaMbNn>trWVK#hzc|J^Uh20*GRBK-Hv9`%lm&QP+2QK3`(2gG`J35b^EQ{r`Ly8OvrKl;+Jgjs)I8vt%zj5dRlz}1$5G3A&sZds*SMCvb*W~ymVbJm)ii!wo z5extV_a3NOezcCpBG~=Ja+j>UR)mT;z0bX1Bw5}vx$Kn&sJ_FlXXxOYK{<##j{}%$ z?Uo6q?hfZuk=JFQ+n_z2Zu=bgU@QUe6YqJa>zWwqfuLmiU4k%oW+dmc~l$(JZ1Vk2jtBLtDV~P2RRqj{twV8{*3#o1oE3Z3XB_XDiOGy|p2R#RN zS>0S@{~}{>bHQ?)1VHP)bN?OtE%vlmj*n2>ZaKBjkM%$iC&D4t86>cJ*L)U;JW~rn?gFQ4vYo*%#BHK3V zvr0ZW1o4ooxDmGg`2BX&obi%sey(wFwAz6LMN^U(+oj(f726r(ndtE$p^MQB z7mYA&a|5EnzML2`+dL&cpTvKBF8}t#Dh^jWB$8c=oCt;&na=z&?d8KSJ-imX$X+E; z99tG4i>$^I5SsYeRz%yy`O7;m_GmW$FzQEMxioE(G>L|6?)nG17^=|@T(sNtQ65HO zjex3OYRE(o-$S07sV>qA0>;$R@W1Aa7;>q}FcW+n4vjfY>#;4k_93}2xkvuov3*jX zk{%7Fe5pGip%;l$sPJuRGcd7f>>Fb2ruRS8JxZaEE(hsR?RrV!AV=f zpTKGSz5J>1>eI$|FIi@I4{Rx(cqUC|(zs4X$*6*0^T#wI3-c=rJ)44c+OI55zh6mY zL?|50*_l~0z6s#2zsj?&I_$u$?X_19nj+VAM{mrQn0?dx(dtO%b%m|k(6M>p_HTBf zOO8oAP9f?A25oe(h>h-H4-M+54FfjIG*Gk$yZ2@7GE)`)Nt=8Bnklqqu$YXnb~fhg zSH|nr+TQH`9@CO33W+$?(`wP|t4C@9Ah)KL6q$=69hIdOeczIjn=!HC%2nUhP#k+I zahq}km2V?b1;=?kD3~WGr*wp$2*#%%ILuEyi4xcONBdqOQeFCeQYhaL1x?VKUOz~B zo%24JzA5%>n~J$FBI|be_U(dz5CZKJQFb2uT_V5-?uWxcy*|EaJX@kxlQI8@>eXoaX+-kL6v{R~@GynR!loF| zR?4I3bw$cD>(wrHWBu*EuOZvC&NilrWZ`p<$ACs@UouCZ?n63fgG+~JP(loVQ*l2Z z61?w&YxSX`l^}$2U)GT__!giWsv2V7+`s-L3K`n6a)Yreh9Heyfij1JbJA)Gh2Igm zFAY8S61DNs{51D3vCt@5jmL3EF&AtfQvck!^Pp`E!zlI;XSfh>BlbU0r#;JI&5=oD zar+*FPkD3pxY3G$=fcBLKnOG&DxvOvF`q1V2RtfO1zJ70f3z6(gLc0hM0-4MyUP{4 zh$8WaB$7!U5PiRdJJHyPXB>=8WQcwP%f8%baaO}naVTSHN{^n+5aNNHea%Rv4J`BKq=z-{$hcb7Ny};t@&5$j zYr~K1^z;`W;6+mOKE6w@v=~^4&GZIK7>8DYoDWJ=!1fy#<0s#%?1<@=C$&!q%%%`7 zDW=taC8l7I3SAfPRNIJ;X=|F&!)X1x<=XiGRTU6lxvpv}BGLcuINh}+#yP2>uhfd2 zDD8g1p+Y_SDSbIy-9zprY#-WY3)>UC>Otp5XJy}@A-N}EITi7er)WUOR#e$kYA-z|#3LHt^8q5y{uNnjEc!6fnK zYM|FjGqvma=G90u;Y~7;aVxVY6+G{GzwWx(a-Quy72t=&=FW~u^1R5_mx+ghXosA! z@tw1+3=3096SmQXbU4qoA|bn_nMl`-6x;o+9cIlnI-Ww7orpc8`GbXe@reh!bJwgDE~ytlcxtgdzjFJ%1(r@8KV3wsKD0I||;L~JG@ zt%|;{$GXGDNru5B3Yn!DUk!cFQsbk>#lvpTd-Pxj^QG$)8kMEb-@AEqJrjG+N6{|N zTJyY__D>GQiUI+f{wqly%%~ee(p$PSQYuE*B}&HT$wD;2;7b7SLlOhXxbBv&_>1md zrpYg~v9phkO*%|PSVCe<<9J((5&>-anhL7hv>Lx5`Bl^1cxLgC(^8)!x0Q!7HaUV zDfbloBfo1hefxAXdN%f`_{=FiF&jYLA1Rx+iHV>pl#eR})I=OzI9b8ZB7>sy70*9{ zS0f-wS@wFhJAR?*rGnHVuxNio#>wy7?Kn9XAocyR zFjAC>?KLNDUhNgPyVQbgZg^D|a3}UH#3<5Y2CnyVzwDH#bKXHp)XZ2&3RwJIIY+;< z9YXLU*NpNr%zaf!CY$UKi=boeCYirX}r+W&VMuQt0q zDPVH{tsRVf3;u`^aTfT+`=Nzq_gTN~_uE9OIm^WFo0!dubhV@Vino`o>>J1M*f&6TUz{< zH~M;^saL|8Jl<}my!OeA#D-CYF!}OgZ~vf+!--)PDMf&ovlGj zao-yjAyQ|~aiqNBh0%)mkiWZ}A;?`qD?YHa4VUM6%bBL$DgmD{>91T6zZnvWlZ?g0 zR3_^(H@E*$qNMSBk@%Kn_1GTk?fJIJq8qj}b>wP&;z>vw%cu*tRbhCD;)fYLHA>Ji zkzjbzKZV5*pR)&bR^@ot88sNY!AZwHXFOxVnd}BzE$ARI>vY90QlpjjIxo*8+yP1F zg;Orc`Y1H*5M<^WW#aj*l%R8&Wjnq&bJWOvwo1n6dGgtotx=ZSNVLfz*NYKRD=(9j zt_&rGo_rW)Oxuy7(NWgQ_{ffHnoMV7b+4cjxg1;BWG#-QF3b6npGu36P^AQKI0yq< z9Nop(K6@v_uh}@>@DV+$30B$ATt`Qy6|H_HxxUhD(mCxf1}NOZ&^Nb41wM}iu#yj7 z<&QoVIck68X2UEJtIf&T?l+?`#Xc1uL-iCr4kB$sTkq6M+C>SsuH?5J(C;-kox8=~ z7jW1!4{&eKERjA7T9|4!AY{H}%Vlxi)cmehAxl{Hbnus(^xE zoI+Q!K8nIaaN#&%%dwyeIDm1?eoesJ;?0K0t`A@cd(wzyq0!o}2^ppAVB2LEG!No~W@(?l%W!T7A9P&Ms<wh?x__y(>x;|56EBW9+rr=4)wBxsEC-nXEJG`ToHw3Trl+b)j zcYLoB&zNEnl2Y3{VIX)`UZH^KknFp}SgfSXU>S>1LBs@wict2BTMqo-4w6#3Q9Y66 zgA@xHP{QK$i-nWJR~p61B@lv2^#gM6Z5_ImK}hnBg$ar8TOQc1XTCD~93^&1Xt#v3f1MXOflh~G=zw~H`tH=&e3sM zxcR!l5gp~)hjV!r5)g89dn?7jwO_(l%*uiC=*hxnD>?OR^~Vi>3VzlUpeEKcpJ%J@ zX`6F)9}T=rKQX8Qhr+NzX|pOI5nH@ex`0>%kB#-bYev86CFe_%qTH2;TESdNi2D+S{#HGm&?WRx37(E-|0ylY&PRW6An zt#@_JA&g%?NaS2r;hXxNbzv_lRWX#X^sN;_>R3qQ#tUbp!^Kv-IIW)1QMbWKBUnDE z0yBSU@MFPbG?L}{8>-P;e^1Wzf%jN1Op(pOgA!+!?lJCqJC2W2tY@x8e>r?XzA=qv zi^M7GD(*kBNCeywpP3*go3+>ldsG+3IG=QnF?l^3no(uScBG&`1*Lq5<0Tyaby$BG zow<*w`+C}7!|-K|`8F@u(Z~svWHy$wd{FVvVv%vW%)!A4k9*rLXeFx6fc|T;AeH3J z*p7rdU$+`5;LJ zKI9XP$EN6I#0-HwVOBbX6*srX;C@_$KO8Li!P#xSk@Yc;up#VCO!t91+EW%1ft1%* zh)E%*B$2{pjN=M%ya?Cx=ME;yanZJk{|!DCq6~7prS4#{bU#m|;#1aqy?erA+{AFA z%p7Oz36nSe&x<+1u`NqMkYC^S?0v^S2=TV4(k6`M1i^V&7Gur~HyAbFWM!D&NBDMu zCjE|<#~<_KTo#>@Ffl369)!xqza`x;lo%Ks;E?uCNQDf3ra174eJwynS*=c zf|J{()#mnqIjKyq{<|;Xc2bVpqx(!o`Iu$fCVA+3VtH4OHBK_o^b`2pe%S^m914GO zTFs|gtA@IXKG(ikTrs)WbfhKL{eUjo(w+szI&b>oWMpnfF^^{%bhQ$a%)1?Cb@sGd z`$-71iuH?a+Dmy>-3bAQfhyXFxA;0gV|`JvX!7!)fH7})UzSzUsjIX56x%J#R;i<;g3R7>kKMS@6lW%v>`uMAdokacc^A+ z)4Y$a(3C4+?kMXQq7W`oR&FAOeC(pCLv#DbEjG2oT|j7TzWBE_X@|F6&IMFeIJmH zY?CW<_~A5$y0F#i5s;seie-vK&J$)s)BKk}dLvq4y@WWiURmFm`C=v97!m_=NtU}Z zV=0w2!iZ7y*fLk*PDT?wPO*D2Z^mi@;U-){WB_Fk#X?nrKcwL(irUW$5X5z|RglHJ z+8ua56yd)M@tHbJa>7nZ8zDbXE*Ht<9uQ*Q`;w~dT-1Icijzk?CO8DPy!x^IGUc`a zWwos1meW>>JlOd6`213H&9}K-^R3rqlO=yg*K>Ne{x36w*ej}dS`L`_N8C=cEX7eN z8=i;1-OS{@nyxs#CGXEvJt?s6uJ!4~J#PVN$%n$#=m4yUF-x(1Ri}D~K1DQX02A3( zSW?Q->Mt0-cAfAXpLE!CMc-euOJ%)OwBs)h{TM#zTZP+(er2LJgh9}dA|nEc5Jd=1 zX~XOfUf*$xrO@0!^_bC>nir?{mP$fjYKC)GcZc(uW8#a{rMG@;A0-rRoDN{gDY1O&3 z$Y|q04s>Qp>qEgB3+vlCAHVtSks<>;JQa8HKwx_aZ5S`E0^2Q&-R0V&mCf(lP^MVu z8l6a5xMlk)1nvI^V{IJjhwoS$nntAb$=t|om8O!GFDlRYK(wWDI)(zog#A2XNXvxk ztZL{MaiK_5!En|=$)ho9FuDwI!$E$PFYnq$XCxapIP|OoliFY5NZ|EmO$_4ug?Oa& z{05Lc&}P&X`u=k^KG&%K*ip_=W98c(G#X3`$HY;ByOMw;Ji#a@e%m%3zSrs#rU7gK zYoqiM!R!2dNGcwj)3rQT>~r5;Vr~Lm-gp@2C*oW#z&4FXPKAy2t!y?4`24T*sal+z zw~)^%O|w{!_);W!1ih4+7cC z7f7iYMe3E~9ManCgM%XXi0PE(i_Zk#MXvz&q6=_B12bb3p3jH#4_V*&e5Ytp^Trur zYB(LAn@ocj?N1i9;McVGXeOkw(rY}@bdgV_l+Q_$W+kQZl*C!iPPAyZeBKnLVBLpGlrf-50_=;+r!vFHa4fX-Z`f0g+0!O+ur!Ud;$_li|KsIGPi%xAhNhnjGu4k8UM%vaEbDd@FQ zccwkzlyH~jjl*Fwzf*n()(}8_)3iV!MNt!F_0kM>e&rQqq4m3x4el(||FFksY(dhP zj*UOW8rY@%>pIn8lf+FFkt1Tb)g|})2nV~x<}Y*>jAq{0@>dA2iHa4^CB2h*s_y*j zoBk_m@i!Z82R7U|AEE$~Xg`hmkco4}mb5uAOzm_i(L+&u?pTVOLWhYnk09|VYqcj! z*@cAGA7tGh#ZcENNR>+2!$jH%kl&=aq}bQ~FYVxgrd@izr%QWdYx zz933J0q>8}G$e{ir1>HmnzxgSs>64lk}=#S@d9bkX!G`bo>HW?`DBPgvv?!n#5eZt`h&rXj{WX7&pZ9ChWewLez5Vx`&oMGx87@7L!lWKF~9}s z-e{g;e36!$pCUGWbV5`s&U@s(fyjvsDuh@ga^StTEor&E|6j(wKOCycx?#+24F}VU zY9bAq{6Lr;1sc^I`#_6G%;y5SgRq6M@e!`<)847%ERq#8nxDh~0tv~^guLw@peRCZ zj_xXePcFOZ7!wE~KIR&a;-Dp;(#6PFzQX%^3PD0aZRw^zBKhbk#Jdt(C-)IDVwQ}$iL_{&OapD z=xrRB*c`mis1KZE2AT=!O`=5-Kb>Jupf2wc3Mgp=lQJVa^RKDlbGz)t_L$rg!M;Dh z&9jS*)kgOCzK@$%wWyn1v$}VQ@UkCWq6Tpdl0qCQn5!KSL_CH1@4!L|UP_YqddM8V z|3Oey$$EW9k-K^@wlgRAyuR z1o_Rm7)ch*JWB|u?_egY!2bS?qY?AcVnTAi8G$5;zlwIUv2ve?8EZMs2A*D)EaB$iVfK7U6rD=)u23yz=&s zHfJU!2KpyoOFh4RhG?EyOMRj|zj_z1i_mP&1Uxib@H!Zu;B(3@%y7DL8xi${yAGuN z6s#`amDGo5)J{3?^tvL9XU;z|GtJbX2OvD4w-_(VVifKSLW;i<3+2}ZWU^;e1!Vc33=oZS zQ`PYp!k`Pv(x<%r$;JDIW1#mZ{swED8hr(2Rc=Vf*JY~f8PO*!AjFSs*FA5#2sw*} z-aXfu8yS}x2i?v7WGj6_r3Hs&W+XkBl9pZ%evdYFE1-vvWmeiW59D`;0di36YwmiW zzm%4%Hs=5Nnr_#}|BA4)U(HmtG3BowGa*M>!A0Z!o%CESz{QDLRN3gn)B^Vz0K*T% zj3$IlYMm6Qu)st>Y1f$=iXI* z*Ozv{=@q)df5P{_-F|4@)+^R42=mmSwp=nJ4=}!+jmz&LU&kJ_(1-D<<2F)REb`?^f08#17sWA?W!s~I!mu!rFM=xjb+?f3)HQhnVr7ZwIgWMe+%oroor z=_Vh9f0Rua(=ZgG*-Tz>BgMj^Mly(iy{++bfV|LL$l;0d#1MjR^~k95j%6%O?sivi zjmSZBEM7n*>fe5~uYnWvgGO)=4G-OgdD&94_OKfD9SUF>)D5HTS%A=7Ps+zKAHqrH zT+05EtYW-DaRer1dd6OIfR}Lzo~C{ReN$oGltr#YT48#c5-U;m*jb6;J@CqZgS%tUb%@NK z!1K0@7siqF_JU}Y8Qg{ZqLx$2HhnOB?X`96SL$kN>o>9uo=@2)N;S{mm)wb{TBH}# zFrKICJQ})US~8^kj!7%~Bd3m9YbVob?@c3kU%WJSNlktlp=@KMXBm{3&xd76a`mIB z;?Xt=7KNkNT%am*XJK-%8;s0hSQ8NVc&U~_O$i%R87(1yhY3@9Y21?ykzhaf59PIw zOOZ~?4^FyUTA#pKTx2TH}gnp=xVF~I$yvqe{^*01z>qUzRPf=O>c)ZI=r{6K} zT-$ji`gqC)fYH#_J%~%M&TLy#00L%?)igr%R0{Q6E<;9j$eo4S4yp8CSeiMp5+u*; zarjA|^(ejvEpl^IHW*>G)rk>%NWJuS0Y_|!Q~j82P?=U(`*LKs;3ccAkstzDa4vR^ z?&}HfeXx|3H}6PfVFpc~+2c$NF4#69}VAzt^M?A~( zI^#7_<44qdx~=iblw85q1TS4t?}@_bOr0fE_#hnZ>QUCv?YCM~$0Y;Lqd1k!^Vaqx zeu`A;S#&SCA%4EpGToPIbRjWUp}7StPdXV7HR8|7 zk{X)0oN#oz4(!FxO0LYl0Wnj4-VoMcoZAj(t%a`1P9kdR_%0j*GEKan@bX$&qi@oY z8Fc%ePFqjoF&p@5p>A84GJE_S&^#{btM-v&~5!}h7C2yXVlrQKSdUP^> z+Hu0xfYRyhEogH-7xEUKW_ol)^Q^%1V6E`Rk-h@@8;^pF^6kXv(2*$UAWPsEu)xaC z-~WOfsvu!D?UGfo(MPxGs&9irm!wl}O$LpIO(3Gk)&O;n(a2U~fCJ$2&wZ4XGEe}0 zGB<-9wUl@OnC6J1Lt-UP5G!o3(TASBRvAurAad+(ak%h)zrXW(U3-m32tM?YNxAy4 z!22AV=Z(Z5wk}@DH*q`kL|{)KRc#P_YF^+ZH~N^_&PVl<^Ebu&MtCg|A2QHrQ_^|9 z2`O;+@bHkpo^?%gaA@;&qA-FeF-qHBa7fBtBoboS0e`Xf8%NlSGm6_r0asHpygaMU z8?s6@tzU5K)qpYw8t!O4b<+f$(^$7uAN>-+@B$M(1N=l~0kKq)P1$*+$YMW=F%)lr zC?{wTfcdl#7w?^g^1e6jBpD5#3_Utp7C}yzlz1f9NEYLq zIK3nyois`&llMi?I1RYEt&~Z<Ej6sK z5Xs4DOsO~^c3>R${k;)`dV2@kYMf>{fl51V=@PmXt*|?SNTo31QvleHmeP1I;;dWm zuctg7_|mk#>en1SC+XgPmr|D8hc;_s(zD&Iv=_Iy71GbRRM{Q?VG8CkZXs}gyvKi+ zr7C}HzZKsinMc}gcuFbPt)fdr>S8;~5Br0ZlwV~MzbL`bNXM_X8;*PlpX+j{(Rvz8 z)d}~OSQx)|%h!FU2^$D*zQ_#^T$kAM3v;M7+)Eodvp3hp=I=t&HH|msW-V%BMxGV} z4Hs6-?8(8GwXZf;Jw}D7D6H@pD4Q$~tdxfm)L{)Sm4Zpm2H--7gm|d2rDm$Fna}=I z6-QY^a-euZ#}s~nQjXl_{3;QS9?ivT5Bkb);*yv07+8ctX@O$~xB4*1zHGGfNPh0r zeK%*?*z>ti%SJE1!2S$g^B3pmMn~2Z0Ar6o+USh*?*170q^7VRuNq~YBvzU#JK`&u z(oKjxB=&E~00qVuc8lom`3^|4KP5cpV_s%EbzPNsM90;un4oG^bKUEV#tn%ya_Jr6CIDtGE^>2G6lVsXB$o@r znq}#-7r=}Z?V)3F!y$jIFLfV17)0~aLSXdoTH`&`QAWnkuZR0>*@6ttt)5T#smc#+ zju%RLYd1-N3yu&<%GJhSLrU+DtAiq*$lwfAj;Nwl8_svjWV>gqJ@RMIMH+HqZwIJ< zFj0=WB zPa(r5)2kiBl~KLM?>`~ax*se!uB1_;m(;Kr$g_snb`Z*RSwh#1bxZhFw294}Ov z)Q!Vp;&GDE4#6ved(#J0-R#7S1&$Ct$%T2kw0420;&m~FlHTS*mS0)#Sp=)x@f$Xu zbnb`u`stL9S9EWb{8=o|rNU9JOvTitv$J0LnVz;7La=_NxLM#=I_LN`rPUj>+AAoAY6$GJ_7ezvtrDkKObaXQ=|+rj|q=bR^bK(H{q4 zPq&LRcG+O16cVkWB@RaxYHJ<0K21BJ9Z}HX8!{42nJGOIS7mq>^}y2K%?ljNP8v9D zPOIyjLegMQ2s7scH~@DFYXDJ;>Jw#J2Z6kSJ*^JdFy?)SHOCcd15K|h-6fmM^v}x* z!EHIT+Y(6g4&RhMl<5M=>lpXM51gdxQSeLcc@EWH`!~)4f$VlQRHT-eik6LJWa?N= zl!K6R7CLF8Z`o51@tVnja|3q5wdtD3yooMCl`DYeL^<|&&70B$cs*mq{YMbzTOH1B z(|ay;_SbRq%nza6&Qdsf>&&U_c|Zf{9uL{z#L6Na=(|Z$p#qXk( zdQzrxfft2V0!_S__z9$(G$E#*ve-V^XGKBMyBiKvdsz$zZC0p@TR$5x-BoWp2k<92 zQR7m)mfGb?uG`^r*Z6xmPS}8}0Xo5fTc^{&g_=TnFfF~R-#xiK{&(iPg?5_N8gU8x z0Aw`EJ(x89NXZ;hJg=!b0!I}CJEkk1Ie0ZzKtgKHbb=YVd!N+n;z%Lyx?n1DJ_XYw zgPVAE&<^Jo%j;NQ?)vB^6fD}M%9nJqX|joP2{Bh?}qN{tSaU(EJ&VNJ6EtyZk7Cpy=(6=CN;{5teB z5#G{PW@`xo)~L?QfJ?(F7z5x~)%f`QF`sf8o<%T%hjyF2H*_-_|2$5>_Hc%UCYl!> z$??hobPif-v!{Y;v34VB3AlZ-5nI^kiXeTsE2x=%szii zHZJ}ISaqkpXJ<_MCUhdzgA==bC6Q)9jJD@n2fq3czu#=P;Iab9>?adeZe?Iz@d*PP zBahs9^nPt{^&Jetjs(fA&TzCbeOJ&wdVjWFkCPk+z4BdlIeMZ(?fa-dYGl&&Y1OBnU#07 zG}i{&4U+XFTWM)cKfFhBAd2?a!D%{_JcJTH7u0_a!Y=HfTn6Micf(A*8;2qlq*pgFCldnW@8M zaO>;PIL4M_O}crcz_d%cD?=!cK5J3)gxLAL+(1ulQ@LaZ`=)F!e(BP(cUlWnQbg}& z6R$_(6kaaNncO4bd`sr43(o|!C9}~q{m*L7xIPgE5@h4RuRe^^hAkRv8-l{t$p3va zytL6<`JIJq>r9P5OA{SoB?@z8SV0vlA)q@q%`+jqzLmQCRHCKI^uY%?$;3Z^a052L zp)kC!NV~YhcffF25L$KccF$L!mQxj1b8e|#GwP+3P& z=`bgy^PZr8!287MpRT3uy2MO;{J~c%LIRs^^0BXK%MK2`q8)#9mo08i9{EHL!FiMf zG2ecAEh%#$D>sCUAIUTsIAdrx-_d|iW0_<8T6-*SM}W~jOzKU!++uu!v2L6DVf!}O z_wRt*fRuk=Qm9&o>JnN}Ht{8t!9DoJHult(qOE@B4PO}Z;5smhO8 znDvo}{T*|2+GjuQ>wAeonxfHJwF$$emYAZoomPLVC&e39M&%p zqg%SC4{vKZh|-y>1x@6L5Y5gZBV%^fy~6_9XB2r)GEZdD+o~U%i5Nkx!(si)3`(AF z$XLc;kHyIf8^@cP33)?u3^0D&^<&<}Zls!LeCDs4@71B*Pd-i-F-#@am^(klWK6_A zSh?Bz2?Qtr@y4oB7Bt$w$uw5Q4B6+f;K)a~Q2@KYx9!SNSV_2S4Fj%*#Vu1cx)91* z1&blarWMA}#|&43^a`TgN?BOtx^W7~|0)YTe&Sfb-Pi(6iYQ^l*e0Q-I;A=rM_{nK&WiS}j%Fri%aBdqlhLwOo4?XG$PXg1)ro}I$?H97kKjx+&r!mzud_;87uanZ(f8igWl%~W={+x z=$<+bf?wjiV@;23X?!5atfjJTVmhkn5I>92=rZ0(XiYBi62RIxNRB6sOeAC@&iJjQ z{L_hoUW(iUNFmdmK+~qzj>YLB_ZrIgu7-{iG@y#10FQgJt4sYdm!^AWNg^ph?h%W8 zDTK;05+zBrhB{@W)=WvRCuo;h6{YO3diPsPt04OieNt=;O+{8 zZX(@{gi)Qa{$yh?7uOT~tMR3iOEJn$>H*Z-Qq#}aaqMog5iy6Vba#w4+!!;X>_dP_ zG(A+Tf;IHToMJqtAue-*r;hSmc52m+VO=LHw#jQ-|BZZA6Kz-H$`UBA_PV2^6>z%? zOior(E>KzPS*2WSY+>qGwiB)Lzd_+mdopjH%E)Pg7-5Ydqd}c;565|^l63#EC0DRY zh;_(!FrV@?0vQFLE5#3>a2&Pd^kWNEe4FSOc!KEfji}zm? z`?{(I*p+3k_cTt|*_Dn;ZS!+wvaDjzT&ETSCQM?5SSOja3d{{Uh6 z@X{+fq$)KG6tUHbogN%q~3C+ii~ zi)Beqe~|KY<^>*rs-6QQCq+sIPWK>2O7&451AgMff7#x7Yr93OM%EUa$VlPMY+-?w z3;l7e3tuvRi`kZUMFRxzL&hk;A_&(C_ES{Ob!WM64a<`?a#}u&dbVj+GF&Jg{l%O&b^EzPKTdxsq&F9#)c~F3zWrwqC8n_P3de5cIAmzh& zBVnR2B$Ajm?kmb$UK4q+6zSda%o?l8@Cm{NZA~E6dWBu#R@VJ!Z+{|e^dT_O2dKje zGHbG+vStmp-jYgIYv#$Ndk8F36U1`9>I{gd^S!)9YI-l&DK9|=gsI~s&nawDmQbq|b~@``l#S45H3|W5`slvBbgcnP zdyn5pz3#h^asx{HhGB%tm1Sa*TSWKn^`7lsyKt_TqA1+gZ*{GGo@BkuYL70}@>n)p z+}p>ttlWJkrR~3tj~dv5#_fW`jRsCGP8;8tzm9uuwk_RG{ao#&;2mX9rZfL%W-i|fp^=AQfj|e?z`a!|1k;`UuTQql$M$B{B@$(W_d6aC z;&e^-k!qbL|6#Yn4vL58u|<%`n7&YgejM+T4nUzV4E=kT(OL7!x?Ac*1!rJG&_Zlj`6hJ(teL=PTQ=PF^06qC$!M!Jo2zZ%_r>1C{|`M zZ_@$ybBUS9r>BY4FT{z?#w}w_XOVyT+iEF1z{AM6%%$;m@7<~Bl65nCxJ8q8?X_)r zk&~!Yzj98WUDh=5_k}ImcB1nZ{=WQ|x4eUFxEn8E5w#4Y!8trOB@x`Pi<{eLBqKlU zd$?)^^yG7=qA^UKF%A6z+Bm&!RMtg~+m@o2v~k<^!a}ge-H~8yNV2ZcwN{gLF9@i$ zSXxsf_n^qm{{m9L!mdFS$ERJCdr_>hNGWSN@kMZm?#xIwD_UvvnuuSprRI8WeJ;e( z4O+ZnK1Ds@OHVd(nJp_v<$(izQDjR$P}BdIO$KrCECyi(>x=iRLX55?MJr3_dLZrb zzqS0x`}4(4QL=KxlS(S`opBXrKlbwtslnU+Z_>Em7`*#E9+5r;GE+X+fUHGF^zYI@ z^Olb<{cM-@?~kc3opO6yPX_AjL_>#m#D|rWs}i?o;>vh@N;;=BK zZk(kaQS`p`)D>nF%LRqRd;QJ#Wn8a9peCDdJ&kdOHBSogb7hP#N&cPP{y^o;(e6oV z8-96X`cMN=Y~E>AH!RWnsF`Wn54xPz_6H(YWB=mEm)Tfz5D2>A@tS60SFnKLEQ;@X z`}t+a_YM_Wc@;|YBNpPa8!uKq7s~dTkENVot6zTWZIYt7Mx0JgkEK!A4Cmqb>K&mZ z-{{GA_%WZb$hT45CeJE`zO)?Qm9EYzcAtjfsr^Y3o7ab1_p)`npm!X~Fa-SwepFQi zB{k=l*;IDKXcEhqW#KvSvyfQqLiQHBh?w!&TPE=Ef_>h zWN-jd_vOv)>3QFXW;@SGR&<^BwHfq>Rz0~M8rL#CPiAollP7h5T-g0bck6mxtTkM3 zvXM$klT%Ssqh%2(2?D8I{{m!3u9~+z;p9qLoGfbb-J1RE`Cyt;Bzdh%eK9Uc$o|85*?zt&EUypY@9! z8pS%XppfB<=fy}pa&$P-JSkd9@KW^+zMgAY&cO_UBVB zO)r$yY^{|`{{p=~^Qa6Gf;lsBeB^*whu+&WktWmx?eiG3>+WkMm7TAR9M`NEuyg$U z)oO2>Ywqdmx{N+W4`yoJ|FSRzfl3XIHDH{;x11Yyd^K%{5W`cmY=_Xfm5^QOgyOM! zMXj!4&|K;J%iYasWo^Y~e%H&S-QJboSNmx?)3e{_U0$Sx8LQVx2k8GuCVJobk-n~&_SL>I7^>Ph+dEqYcUGb z!4Z;H?64AueVz|wZ=LflS^ zfBi}5jW|%hsXoYls#yZ;x6pF0+OJ>4XljYoL`~iF{vUfri?RAKx|jV7AM~|izl*o) zyVRw$cw-jXdX!WWs#~j$gU#7lS)C(GHSDapXwI@ss$EI;X(x2{EV+-Y{++iH)L#70 zI$bcLB%W?<^Zr@Wrz`I*CfM>xB4I06IN9i5BfJIfgf3@z{!$T`ZTV}| zM9Qm3x1Ofw%LPK%38|Qzuhc!?&&xBLjG<%nyS|>}REdl&nP)li4ebn0GY}+wM?v`f zc-kI*InJw1Z#0K7wEX|Aj5OrTrI8EA$0e_69`R5nO_h%L+>Sz{zBG_LjeO)Z?!F&` zEjl}%LH$#;T^xJ0ksbzO{~Y77slDjD<#X~g^ZDm4KfIm6&YgR8YS-FLwMKnF;P}uO z&(3o7O9F4Mc60N}!@BF#*YPe?2h@|}ZZfF2K39@gIX#d+(%~+jJ1G{rN*jW+DV%w8 z>fE^;qFVOhyOGNljjQo? zu)l){P$brYGDS5YP_0ge>)Pd)FX*1m9cwOp20<)EbP|PN0TeJ%=yPS{9ZT$-aW*&_ zO~NOvv5n&H|8l3l`S=D8Pg<)gFXsOqiB9r|QBa^X0yr4s5Brl#<{q+fH6)8IbNDQ;6V6A=`VMIO87JXTax9z100x%B|@$LbC5KU={Pa(hM)4)NAm1e^Pz1?Ri%H)9jL_G<(johN_!Rr>$XU zLXvMa&rr(?2`r4z(|jq6QKO#x>}78>2nkFSpX+(3qunkWv_!ZjC&l^TXM^5Ch4(|fYleZz9SJ^>7!}$Na)@~sIi)+Ztf68x(5xS2KejwrM^#Gc@evkk6 zbZ(alT)fps7524wqq_eaHFOgD-@?Qx0DGe{xtPs%$bi%p9$pr+S`)QK5HVHP2Ke>3 zZdbYKZ`}WFwfA&ES$?ogapSW_{r?6i5}DJVgc#SmUI3xv@0-c8+-jl8znOfg{7XrN zBjf8^2 za11@n!}vj0zEADXA6I^H5olDVm6^+}az;;jejhFyZreW37j}M8WU-uJQJD07Bw_eU zGoL*k54YdCB_FwU+g)vznm3wkvg$L9JJoqL{x`lemBq8`JvtuOtX_b%?s}Ne zBadyANiYu&5AhiApuPt$yWLha$cxCdT!+_%NpNS9V|xJf@Bhf~10@NXVB+u{K9IvH zoo)yA$LoXe*XPF#s8iQ-_E52c4HJ#wr(1{rj2z!m25L!rHVR~0r!llbG(2{|OT)I9wy=91&2+8jHA_RUmONvK7{Cwu4XMzk zOHieIJOQH@r|JV(c^Y*ka`!!Xa$elN@9q;hJXnG7alE(C=gC5#U~U`i^aSu-|1(6x zfo5f6E7uq6-mZ;x?5e3j{LfCTMC!&JSx5k)D~|tD9kRVmo8dp(f@cu*6@wYeKAfq= zXc&>gS^Bz?&c+91*-B!YW5~rxOuY09<=nPq7b*k^RN_m4>1Eg3We_+g-+k&{P+X}Dqz|g+Bef?ETE?)_0jKBvKf+U&whTEo_wqS* z&Cg-}Plq^Q$BMcwG`ic(BtlluVI-X-hOD-sz6dQ^wN68Q>>-Fu+xwsQUq!`F(G?zD z#!sL<2{HWcNon5DMe}yehC3<*{S9v%@U_hI1hkefY%aOo<-_c8YwRM|;6D3KVcw?h ziWHCwT|bUdLw3(PU7|H&KD;LBq)Ms8l`UOPygPnEEIzY|*?O%~x$v^kZ|@ zOcnQO7kRa5Gm~pjVY05==hqTuV`E#D!d3J7or>rPv$8*)8Oz+kOLewH5?%dC4QRb7Rj@cSsos!YzFu7Zh zWtr4e+PJAQg5K3eXUNgj#d-dq)ddN$W;=x12s!!@Lt+!tvmsXt32|onv$AMg+9F*B zDJDB}J8YLk!Ux_I|Ce`h=f?pRzoMX9M%&wo3>zl`7Gix6-RXeAB0N)Swz zwT+Y>@PtVIVNJHUxcK9|9Ye3mj96hHAveIN4ue?o&XZ0q|5PzunQlk;bC0QQ_#p_|h7eTgmT~Q%g5CHohPt7_)`$NRsSpQRhm*NA?sT z^G@P@qvt5W7M%_Wfn-afzW($k>Y8SL_SP$EzMRhzmhhC6!0VI{HJs^3A*U8FH^qZz zXNh*jvqqyL8T6!q;>t)DV{IzL+^t?mUe`qehm3`Q`JEaL7zrs;Itm^<^fwt(>|8uF zZ1=(j13X5&LhXek-I&6r%`$lrLkNcTS_ah(!1CNFl?qJ`B$%d)xEp?aTdtx?hho8r zA;E}Y`KgO}a4nYwv-AmWaJo!XGFHL&&OSK&00ptv%Vd}jEtJ)SCSD*RHYb#@Y8n#2 zI-qSR`0|_|?-`+hZHnmiG4^n6R}of*TPI;{3izK-U)H7bnN>n>^Y=8SI~fblbHPkg)_)*XHB7t&g$rVRXi0pE zINDeh3a6CvhS&@=+Fz8D%2d)(=g z=N(7f1B5SVbb4(lM|Da1gz5Ck4s9F}Y_zMCtB`EdEww0Z#Sp2!J_ZJ3I}nYW%3&RI zjttkUxJ9o|!q+)&`Z%o6O^Stp+NF~^j~mk9RQfQW%g=MPAvet@{Z4GF*{w68XIfTR z=lrm*p}OM{H2FPps2Br0XJ5wV5dEfb(Mb69Y!SL%X5%rbpwwRv`-eU#D?<6iCS*ec zyMM%X8)n)B_H1wg-NNSQLTG$TZ zih{b*`wJ6;e%m~u7m48KLnt_h1pYEOYTHvc|rK#!rY;uTO=??R-qCruj;7gsSu^)E&?Qds$go;>h2o>ew{-si0s`o6l z#K+_n6q9b^6OhIEuUyx_3dX+Dd}pdy@)w>CTX2x+DM^P3UMBDp{V~8>Hv+-LNbJBn zR6E`a?}$;TYU{_m!+d;I`8Vp3^IB1h>tHn!3K9r!#^fMJQ%Vjy;=l0yJLLj~AGqcV z^%H1_!u={NDExQ4*oZj=uHP-&u7+jc^Lv5*NhQ8N?#n_?jl>Gi2b7UlHQ_#5{fKcF zP@e4(3SiQ1=gHHNNhm#{T5SPSSAgo?2n)6$#ri&Ru`7`XuJ3oZ)4$_5(M|fr`WIlF zu(HE9JqQ9P*@K^H=p%YwKD_h`Jbp=uALVi#V{`w?_?JVKQ*=6-2eFOkZ8smzTz$;# zOOxSAF7&h!F#YvF7afXS6&5Q#$zdltCNF5XvJ$(9w6YC~T>>!~N5aiunMG8*@m`JZ zx~X2s>8hSs_O*P+HG~jK3|Un_w;{3f63YN9y!{Ww&xbRV^$v`PFCb(de@L4EPJtu~ zOryrGSa6_0gRZ>@tMjP|`6YbiwDzRm9LV znUD`9MX$XMgM%C3W--BT>0BA13o$5zBG?NsbUrd$DvaX9;C+&*dOuEL!f6p4YM?30 zbSbY`$FViBvE~QjsCQvbuDkl*Vl#iUNB*(Zdhg1KL=-lQl@tA~nsuGfJ2NnCCmbp) z0#jfqX~KMQi88wF1Q5(&7j)ICridqHD4xwJwD$i1gFt-05uq`A88#AVfi-bj(QgJKG<*x6kP(;FB+0j2#dBi*zK3ii^)i z#f+n9&9Ze#h|JdR-a02+!Ndz?@M`q-{2T0Z48G%<-|m1!5`Tz)wzKt~(f8j%Px!cJ;wHWF|RVIkn0tZ4?X^E(4I_`8{sd#N!57e((< zGU3wUqiCXQzlK%(UJ_4`c@O&&i;-sMU5AFi!low?eD)FOu1W;{_)A(9G`PO}HQ0ua zgjQ0f8cR0NmrS#9k4T9d5<2@cB!FH1uBP)fbU1Q!rQ1}d$WUD8r?V?i%^RYDApd0|Kdgs32JZQgqiUV0rYhy zQ8J)ETocpT$XXla7x7JIVov0|{fMLC{O`QBRXY7H_X{j6%}wyX@*JX%KZxe21vZYe z`_}KH^tiTy;X2h;z=&!TitHOeUT$`Yd3C-1_$bRjIpB&?^N2G@DBVC59oz+;SUXML{z`A<|%?_L!biop!n#7Yo4=nLE3?fBOq_vF!W5 zN98F;qwYWNl3^Z(wLkn26K}c{L7LT_Vdk(-X(@Lg;V8nHbh_+cmQpjC+6CC-ls22zCiH*;@s5gJMnq(B(K zgzsI4%CYG=nXZ+_5Bc8qJtn{PQs#1(jzWI~Pa;c}Ah2u&yv(%_iqi66Okn7*e+mb) z)8_(b6nG)cZt;9ZC3CqY`HBUWEANkge(8L#B-JhySsY=I~tqnaKMDW^E$;^p9 z>aF=_%p_>svsat@9E_J=kNCrX0LD#0a_I*!oOlKd^IuR+#mV2|aV9*d8G`bQFN1aD zI2Z>EY4;fKCC6b$gB5k5GBi=@4kRpO^k$+eeP-0+&4xIt%>mRno6vvuWpJH;F&XWy zgiY2pOHfI!AS`|RT596W(4AFeusexo+s??AqP6FdF&uUj9N+kP>!sMMk08GAO{7*Y zhvA${pg;c@1qmIN66UGqQ57;V${3_7G){4X3!%{@e!xI;GhwGuWl4@c4u+L)(;i3j z;^jY}bYxe4#o&q+j89;iU1tgG3|LGKo`{6s3xlJQM1P2CzN>#ENGMy$i6fgf&}}hz zms?Wa9mJ8%WHjX{?K==Lqq)-{ySfWbP>f3&5|g(!M?dOA+Cr zREuI%MLo(*VYthp==a>4>RQJ?vcse7B9<#yP~S!zadSmVgakMXj>x!*FkL(I2;j&W zaNTrg>m!;U{2BDxP0-6+F!URQBn4UFFeVDT8vDpw)hB%esWc9~P@hI9YzE{??O z>d8zhcWE%TX(M7ZU7I{^xM|%;?+CF=wbm1#oHIhhOc?m9da@NL6~VC(&l3#b$W zcAjt~ysy2BK{s55Ex&(=xRgSKu#p&G&*5Xx@9dM{n!pW&I=DsNJLX($36)@d*g>t{ zhNfm?s|INypQyCOG0N763R@V5-FpkFPCUA`UlI=@3W)Sea3r%|L2HFJUs4TZzKx6% za#zAovFltD0Z`gm^@WpAHuG#$UH7%tyBmJ1_uj1MOU`q2${NrbYEOaDY__aBStELplw^b z`<@F&c6VRq`ocfIgqObiVCH9D$11v0Zd~}wyzVXJrhSgVOVnpJnIrPXD=?25)5;`- zv8UdA9C-SEB*h^`zn0mSfRQ$d;LsDGIm=HsfyqqGu8|FvvMEt1p z0arB)&;Ny51jP;Z-$;UOFj4R*i4$&&Cx{x62%BLpBL!kf(r;*?4>=yCh9&jNXci=l z#J|kffo4e|+(5y~6=R?ni4bEBQt`B;YO?NBJ5n5<7~74HI|^DK`j*iIU0`f*AjTMl z(yOy4;gDUHvXxxhp+?_%9hSqUQrJriP4SfqO$oM_?E_4BDp8 z5sR`>)-g_+0)5GQXbz|Stz|RMhkN$*t*_y~>_oa+XyKtCu-@;%_NW6vT785wnrNo4 zG5Ro&CVp3G6a)YDbXEaS8p|4;{P}xGe*7lP^Z%889tE-_$3vSq1sFP+{#?dkj6aTh zRKE(th)FQktw+3eJvecYq!tcWIrP$U7+>T&3%c`tMMIbQA>%Jaa3K{VahBI*`x>=5 zF+j^0o2;CF#HkdCw^+m!@1tNC3sUQ|$B7?l%~P&PF%W-57!bJ1{c-j+dH4yOPabNC zIte<*M6)pl#tzptUr*oE;cs_wB(!)jN*Q00DY0cABlPB6gkPOYVTmurVh{nhq7upR zhts573Y)_MqaIBMNs`H=!cmy|_GiB|Sjyd~|MNrYKA{O>jgd0+J2zwPUB6Pari|Kp z&DB?6_3Rs!5GU`J;Hw9T112)Qfj52$6&IYV?vp=Dzi^gLALrWr$Qn{wiAE<{r7P=g&=pPgZnO2hI1SNuS0>(r1i_^p<1XY-vFmYm2Sj;COg z!p808sEfLI&ZL5?hB|$i^x8A34urYA^{gUpqVk!~x;lNnJp<)|1r>l^ryITB-? z%r%pZD@tUb)tpJUBi0@%BIHGb76$W4n_<- z)KZfa2xR1f0S5n_aW0%++Lg(77f05feg>?=2hfdhp$c3K{rj&Br2V@xgU9&%Xq4kc zR|ENn0)hNViFuXoE@6aeu%v~zw5BR_gmuW+MNmmIp_chWASsvn-s8?E!?Ieu^;@8tVOwv!Eb7`ORk)+~m*tGf#n!0ljORJZPYAUK9+$xM{PdV$z(e zR6SwB$?ZEBcw0{kA(w!jcZE7Hf3h+7~sMo6yC{L%iJ(? zyd`j1DHoil0xvTK?s{Jtg@6QIPH~tC`%U%b@RT&eP8^6)=(CXy$y#(p^W=Vhnj;pD zQ%lGAXo)LuUNsASF1tu|rR|?wIMTLGXW!@l>18}K=kJ|W+3mGHqqxK0;$L)HPnNu% zeDcX^Ux~R4Wc{E2`5#P}FaZ}`bP>)z`)sxG)T^()x=ZTn&KgaNg`L&dN3J;@nXh`1 z+`1n6wsp`ZpG?AW6Ra=aM?RK-%|lW^+!Uq(GWLj%8mgTL8z%Xoq#P!5(TG%5H(GCt^LB7#W4-^z&Mo zyL8ab$a=5W!k{}!{bY_~W}kq{FU?kc@A${^>hBP3X5&+50D~p~pS=%^q&A)@8n}-MPE*HC?)dxH)%WOTPQ|G7*MD&Qphn^ zQUfR7HId*5K{k-6s3Hd|f6KetInf>b%}FG6RRobR2N8m7yv{b|BNW9_%GI5WClJD% zqE$d5gheA01|Y=QR>43<3J0R;$aOJy8!1!>GbyQVRsxiVzr)A2d1uw3{Qh_zdqdqQ zIKlxZj+}%f$JqMfFZfLQhn;*jYbYUw?b<;(+$bqttvgI2og1`{E6)%w0NY z<#>fSCUN4Ooxzur=bQ)UxwNpfEw(ZWC%-09BObDEIEGqF7E?RcEJkAKe3X9h4{{j; zN~=N?+ysaDp28AZXrSP}Fds|k6Pn)nZY(0eihw62PFPrJ0kd&_KncC-GzW~=d7m18 z5%ee|m3YER8&^VtuwbH-5bLzYPGMT%qs&9eJJ5{gI_9PzP8dj##e!nwC*rqJZXr&y zzw$ey?a5PZv|h*<*&OT(=cJ=Di1-(#w{)nm!?2fMQVqnHeWZ?7TH%tiJdyrhi8FDO z2~(orLCTn<@(>OSBS|R6$JLBvI1I?8`=msa20>_HJbZZ(0tEm`!cK(Tv?ia1tuQ9* z^dr#x^b;^9WJzV6idZN1z(Rk&%b}zH?cZ$oVs^r?ftH>m=}eU=gcI($0&Wujwna4U z#LteWz|J8%`ZScZz1Ze^^8LBWM{axle#-U4Nmny0gssd;!3hy&m4&8i08CuDk=p#R z!X>ks18hjRL}q;X$`vKFz!BHr+dv|~Ydoi}i_pf?Dbh3#tx#ei5Lk$4l7 zL})8LWdJFQ{7+lIclM>v$bNA3^{6Ukl|ocIFS3)Uq!gYxb0#KF zo{WbcdI%qV^pQ$KE$2i4c;%H>)b-9=+Ie-qVepwQ8$4BM6YTbNFh74EnG`3d5HC)? z5Cc@KWKe;6`hQDfXsl&Gn}^zuT3<}UOaR3KW-^`_i6D`SsAuB+bb=}qp&*<3Fmhfr z72N&`GW;y2SlEKD04*}&G)|x&oxJpDEJYH22g(P+3l{k z{gL|B`w-)OrkMZlD~R7YpFh(fb@uybA+Ws+F}G-#IzlzWfNP$E>o=oGm^rUxwvc!z z?MZ|ap{ZolAOkkA!=hQp+%wWAq1kzkuLLVU)JEDBnRL=jIpIL%O{aNT+N5=qg%{;M zwk-mb5)AlkrL_=Vrao*-+SACWKeH>>g^?3bN~F=M;2WoTUjNQxu>R(JMYzQr8>MMK zal#eASvRS=J^82A*WXk}9QlP3WMt`CD9ERfFo`yijB+U(&oNF3HZsIyobVw$#qA)# zFw&wy%U>EU6l?@{OvH<{`I)%HcaM)b5ysi~rn`PM{qih&?K)^r{fYG`RGo4b$}jpl zB8%sz>$LoJ{qsGTt~wkRYdy51&)Su_x75>ry;zN((9qUG&7S@NvC*qj_J^)Ta0hXu z)WA3j3N0fhB6``M;QTes(4rj+gBDzF!4+XPGG9a+PmzfzL5}Cl4r=1^{&J7tkQ8C; zEnn4dUNbx5$`WLzaHk3d5cLd!B}+!zSLX;LxxZ{cNL`aZ&09(l_FI(}CYAOJ z+~gmBsH}Ej#-7+|{lnCwkhCG50u%Sx!h3`*RjG(Wcx!M&Pq(nc$|K$%pwF)J1v)&p<4jQqNS7tpOpy%vY|l^vQCdiN19Y z{%jcZ(COSn@s&bExe4U9c6= zuv6xz?t{RO7XbJSqVb!v>3uR!9KSt};21QbJHOQ0_D@k9`7PSWx{oF8@85;+U~#$W zUs7K%9OAKS!lm3g2Bt$lajghMIslF&W63cZu4nIZNrMT(RmJ+`Uj&)`6Td!nqOmwm*d^?xKZ08In$131844q_PZ!9s&V8IWyG$>OSG$wUbnZkKR6J=gTNYs-m1Sl@3g-7v9 zLDYP^K5LFSZKGbrgGhlnVCgc#Cg%c`5phJV2&Qgz>rk%}ZMF31oO7IUnmEq;g?T)R zBjJVr5XY})N&{mPn6t=S)Asdras2fI^NP^o`I7v9KV-$iagu%U4Y<3CcYAf{d&fvk zr800}$-f|6OI;DlPWvF}9|D8k zQ~xUjTwq;|MW^8YhY2zq(DL4*=iZirR(RTSVQ&YYLqAyIB3Jy{+?kPIEscG~NXm{S z=66Fup2(`VB_*9UFxF~)F|HE&qHYxxUQN+2uBn^BjJN(qurWn7c)h6C_-Ik>-JDWl z089-2=s8XXu!JNr2lSpwpVMgQ#@fo&dbDz<6Eg(wSH_>taq_J5B>((t_`NHWUDG`1 z`~3)jBaW5yN8izk_e%+2{VUt*>Gr!Sy)}#jABrvyY_B~3{PXg}6HkZ+RzLXQgC;=y zo8SDVVd`g{b(YcCquDAIzci~~cS@ARcjuWd-FweH_n56K^=1tY&?OhQ-g>K?aKZ`l z&_fT&+_`fZWaT>DFD8fzGd-%8gf}df+M8i0m^7&nBx%OB=4$KjSSrq6j00&gNr9RP%ks`S<^CFdI zr!bip;lr!h$b`C2D~PSEc?U-HF6PQ6X?)=}k#9eNvZ1LmX| z35^h?#7l{~s!b4i$Fip+^u<4$|9>Ly{oMq6M(S4ph9%Pt-aUQ0ge#Vd%!+7p zt>53}j2JglH=>=6~ftaKxem;D}mV!b*AhufA?$eK9T> zPEgdsqu100U@SKL)G;;FhqMH-8BlH{&??tip&f(?=P&{%+>ns!6NM&1PIF z%_FY!fD+Z>bxvr}AXK#g*r2sqpUxl6C89!5Ri)Et;+m_$jm1V?HcCe`Fw55xZ=hC? z6#VYa+2kS_i=f)3SintjF?r-s%wguX()|5UwEw#FIi8|!%J#~P88c)O38OS-LY0mS zF1WyK9X@;ZY;*falBg|PwoE2YoG8neFPE7!XSP>Ohv#}E$W9x2!womcU3cAOG<9X} zy61VHK7Hh*lTMPyAAj7KBJ^0x_U+qEPHR2Z9O&BFj*2dI(_*FVIk=iZO0|^$(Vu&i zo$JJL?@WAwXq{+S4ScIsl93OhsWBlkCn4-iT_xV&ubP%n#L(pUFllR#xl&T*|1E;y zQNq_uT$^fnJ}R24iBeF87Xz5QF3yZ}vNuBtLC+*>gE)CP%+U>2>kg|1>^xK&P39^y^ z7f)j~j2^ROrW?%z0o=HPzzIv`QUx2wVThOdtX06N&n%K;(i-bE4bHPc-IQS(A_&lo z=6%);;+Xk8)2(*#w7m{DpL5A{rPs zM1?>OE%mP&ftRm3GmHpkT+p_&Uf;s1Wn2_mHRG+gW7>}}SGR)zDzv}KEm@M;hx`yc z7pj2);MUOljPR?1q-yUukp_i)Fh#CuaAwWmudq@9i^qg-w%|zet)ry&*zbw`s}b1n z#$BZoV%}XG(MqGZ5&hovqR5e27dy;-4jrlg#aHRC)2te(@}?ME$s}ii4GWsCK z7&}|60h1(o-p$f5W`?A${4axIUV_DvMj>!%z^t}QHD)cwr>+P5j>bc1Y>!&86ek*q zPf_h&U835*CSoy+ds9h`GC!?`FB6YLz4ev2z&KasPm>%>?;-r;bujT1eCHa-rvZ2o zEgz=NT+>qRb&4|wLW*@Dg&2XrxxXTlBME$%vvuU>X!y=#3157(q|S&iKl4x*{&a*R zU3k>o^4k5c%VR%$tgE-TdtdM2z2&!y?`ij1^yHIIJ}K8yYL&c=+LmqqleIyGI!OW-@x|{?yvQwQJYPRaadlufP7fi3A)vbf{<~pwH(s z(Sh2^TW+~U-hKC7)8Ln0dWj?}dou5?^hV7&?Go-*57+*P$ab`LBU*y=7W{x^+c10P z0Lq;*b`&@>IhC-5z&G{p8;yu-rZh{d;vOW9E9Xh$O4?qzLqbblAR>OQIQp?vO0heJ z(zxn%34ighSnFOhyjvY?+6FU$m}_cUH-ud4rrky}$8Tl|)&z0FlpM@DJ0F;@joj#A zCFB{bK~BNMUV=|S+g97$8D;kPhbljI8i`$fu}RrzS``FEG4WX5Zc1ZW3dw)!4Wl!{ zyTU|+wNf$hRl@+ukKMEx!DQ@rB=q*AscjR7W=(JH+9I2(jFm-KCGjlfrS+fA3RvP0H z)ZYe|sY0Kn4=N<6g+kjMguyGV)Md3ARH@5nRny(EE>CiMk%iBfW&$d;jwF2X8jxE_ zJdv)T(B;hP-U!rS)ls34dsJX-s7jVJH`+XTBGS(P9;XSgJohHr8Nrc#O-H&4$XD)r zUH*Q-W^WFnsuM z<5$omF0*D4ecYyWv<|+_ZSDSyX7=hRK}_@^=iS3dn#0WUfmskS^}}1aAQ4nf=bNF9 z&4f=0xFP0BNL2$;!j5)kiV{;kIu|@&d6vMZvBvtK5@%ey$vrvD2pCqHB|G2DmDD~J zXiA`a4wDScJGhle!T+QIyc`p}WD~@uM4Lll(~7V%d>DKR zZiu2nfc8<70#K}K&cXESmLQok=^9u9sM17gZ-R@6@-_Dm$fd9emcaBz!tL~VFO)x% z_f!U?euYD7u768p^=rf}%*22z@FvNCNNRY89`8mL+&v`kUj^PRpVDY@?Z5C_rucQ;zyfG4s&_u9mP?u*y{L^6SR&(5jfsKNx z3Wh$I`Vk&YTXMk1%Ak1izAkd+Jz_0=O2Yk5kqoljRjV)&W9bPTiN*zV)})Nzj55Jc z4&q80DpVuZq%f@1ARsnsqSvHAD)<@Z2l$MVfN-RY-uUSi?rO1PPBo4?PGrnkST)Wz zuk8w+cGf<%f@b{ziw{h?rLd0|OFDs)yf;Oc# z*aLMLg$S(FXVQAJ0h888QHzsW25QHhFBvPIlIodg@O{UNvv_pJ78Ubk=YKlFk3;%5H3bJ&^raTH77N~&M!Nii35NE)wG?J7=C#vaKM6a_x18b6g^HD9i zHWGy9J?A|MZ~RbX)VW=G^Iq?<-ufSiYAzopy;55Uto@4Vl3Di(`KKpI=EC{nz+|2@ zn1<3OPtiFd1*g(ZI+8m^T#p=0Tj)^KHmgiti8%iF5JHC*$LAX)RO}MlcE5xQSo`asnG&`=fk{}pdy2lR3hl*D zl=`(Vh_(LTlKt6S@gZ^A&cr0&#+PXtaghJf<$z?0m8R{`Gv#q~GsN#yg7hpk!{!1@ zO>Uq*Moi^NPVmOKLbw;SQMZmRU8)>?wuGnsR%FF=6$!p>%K1W>3NRFfJECfgDn#42cYN+U7@YX4w{JX{VC^#~d2CIcf1p)mA zw=I}Wm>3VW_9Xcry6k9YG2Y>PeALwq;{707T&EyF6w<#kBFKk9>CwWB_OB7b2$?2( zOC7L7C^F2w*$rgeM|I5t2h835IKl}q@*w$GeJ(#VaRjDVyECHM2AXLD7y(LPHN%W; zhi<6w#|$#Uo`%F2+~CVtT@@EJ8zABeAPew$1=Pl!LVAGda5?DmCo_rWBmI(ippFjtDi}V^Qp5uNf_S;$6F}@Pq zrYST$%nmpv7@1)Aex(lxm2qH&a7L+zWp)DcbIHTpFq+SS zD|FkC{&-rTF#W|-VU*ckyn%IvXWVk1{co5wyI`$CUST)@5R(>^+pp=m?%+$$*FecJ^NMi z-48bJa4nrH-V0wvD2V(vCl9edx{AU9(NX~r$Qsjp-8OjHT6pDf7$E1usu{z;ls+kr zSStLfP{^15t{QxxTJ{BVry8qf67syY#OTUe9>K?^S~|bQr)J279GO0f-q5$gzOT~12 zBMg~7q0*}WQ1Wh(WRMrZb-Z6DT)vv_vgRMS^mgI0)EpyJlUfM=89@i(hu`*I{_-)0Mef6-y+X8wsRnT}jxTETJ6oNINDnE0_{xPm5>B z)o9cgh_&*U;yL#Vh&FZ*Xjuj3*@PRN}e88+RZprLu{tI*?za;t4VJ554S<{r7T+kY(&IO5(N zN5TcuB$ST}CXMZ7bI&jWr?u_x;u!&B&p*kGzjyRM#T6opA2Ao2p3Sx$O{@sb+(o+6 z(L;^9CgmeC*_Dx5j+9l(Q1W;#~DpSaxdDB=>6wck13@?5mz*tvDv; ztRXd04UW`T5;T=vBRSLPchrJWj8I9Ad2b3)(0#6y+*MbIr)e@M5!MS z!Ru8nDI2%3YZthcf#gawRhYetEuuD+kdjS-B_C)eI>3E%Al{f4V`T2p{X>3?3=!fgGDdNjv2d^D( zOZ~V>61x6)Nqqy8-;iSRiesZ=?WCi0o7k$@?|BLN>=C8|=M(sK-xewV8)jJ6eg`$< zR5-;f|It8~aC0IDdn%K<6b8U#4!L3QYVKENPkw627-fjIH~(v5l{_Ok75AcHA^?q> z6Yb_9{p~${sbs%1QR>DI6Z@BI#VYlau!Sx;5sF}fYUQzP^%5qZJ=?Is6k+U6G}+8_ z@fKYkci-DGcdgLoCpeFwtuQ9@u!}EWRg(Pa8njSW7`)vesiT6DaZ$F^ z{HsAK9!){mQx%kevgT!74WH?zG4z$vNMtl2&S>)BO(y3vU?3U;V&h!KXsH<~|6{=i(~6m5!;8f6;ZESovf06;304CgRtv-6)smrZERAcZ zhRH!fl2oY9Cy6I; zld&ke7aqfWMu1CaspHAL$^Ka;|sBG-XTrBU}=JOpqA?8{#Ye3pg~QN5J4(bg=|5p9a~BKHRsL zA(SC@6bzH0EZwtM99zEwj+`nvJD-POvTt}A)+Xlw@r=4o+^gs@|?gr@p)cA9XlIFf3$crX-nQ&Jpz{lRjKDYtIex3 zKc6acQXffLi6Cuk(8yL;0>gT&f*_0&i5(#bg@JRPqhBTfwy;N%)l2CPJfpK`t+8~HO_OjR@Z}&Ys@xG;8ds}G)*ILJu|BLM z{D>^>$00fw&lhL;cQHNn7FoPjf`bZ~lpr9|ZjJL&Cgd(DGH30K9)Xipw?m}jSs3?| zQU`$z4;aJpGR&Nfs0T1?;}=KR2;nx!sr#6TmjiJ~k*x4GtPC)nD)s5Zlr>>TV=X}} z_|;R9o{#wl=Fn>-dF?u>n{*;(f2RZr*(!C&1f$i5SeBA{%OJ@lBE9-yOpKUYHTSn} z#*#f5GyTU|NZ$nE6hXYp{f4=#)*51su%$`a(fCaXVS3H`N{_(ifLBVQq1t{Ai_>?t z1oE>bWy22K9qAI%ZEUM6r6%JC2z;ltG}GWn5EsZkF1C7@E_H@s?t$SW&~gykQdxpn zU%^R;xeBJ>fSS^?18*}{5M;EZtR_tH^^3({%g$$mdPC^5_)T5{XAY^F^Q89F8DihI zPLfxwlVGo0`qs)R3L_O0K0EA`*sYH~Q+x7QO? zLJsu+dDFN1B$VfrU`mcS`&_YG6^-K-h_mGHOkOBlQu=P!TK~|t>psd|E&-3&Yo3w% zDVWy@+Dp>yIzf7SvP&Ah_|Mq)-ALi7c`P&X!`va7^brb9Ha>Rh>f4XWH=2OJkIgH? zO`6}EPZ&+I|1TxbOT}i)a{jGI?>_pPElD1Z**7|jw%^#ducZ9AQPN1QYiVWpoDE6%+>cE1d5x_}4(j;g3F?G)tXWrQ@x9Wky)2Vjbz2Jzh@7FeT z1y9Wj>en&GtE6t?G2jRUHZ=z=9736iEqLc*7)fL-n{x9FaW+~bt{G!_LSszNfElO# z7*qToB!p#11;=23XHrK=V9>Xuv8b9&Q2s7S<(t8$2;sJuZNc&bQ=n)dUavVCNQj{l z+_MFMA*n}`--B_pwmk{KCzOd5gJ3%wt0$5O%52O$6}Q(n%=2&s=FBca9yuBLdobci z_uAx?hRJNLy7DCAY7orV`$+@9N&>nU=y#1c3r=j^T{C~32wr0E%e+QV?4WcHPl?so z@uWEXYymrX0Q8Gguxy_ibilB|v*e8{jS`^8VaCbQxDl-4nuy3~Z@_uxU{WJJt1`DuMo|Gv0rcq$)-C3cfQkVL7nDqZJana^@#^Ed^?dnTBUn`B< z^RY(UWBh+gd7O>xH?0A9YF>sBsPDX~cL6d3k+dac(o~o$_T!N7@!Ok;->*0C;6WyG zwKY|w_m5c<^DnlG{2Hy{ebNl8Xycl{m4S5?4s9MaKQ*gid!^fTD)CU8VNwRXPqzfs zw8ar&roH<2I5+ga21hbRT`l2-Tg4vSCe;p@9orL|;(ZOGHB}sJH&$Q0o>O0 zfqOee@l;D!*TH9Q`k7P}%#sv$v2npzn(2sjN}<|vNn5@Q!VI%$HV3P9$3m+QsQ{pi zJc~8*SZ^Bq^CY=&Fz0A9`@dT(5wMbpGYP#aNwwfl!znQ9@0fOFY&w%~ggZ?2S`xdKZzQ^k-$NY zBeff7CUcMYnwapmn7%3$Qgt#0Y`aNjU^;BWxSLC4^g@W#U6t!m6vxueXp-6Gx!^ps)Z@Bf-)e=$lz zr7*xRUzWB5y5buwH{DsbVV=GSf_qr1BCXlv%>0%$?vfUjux$};48b;8M(0g-|oO+_a{65 z)m7NG)M8V4*6`S+XKhbwbzoX|n`VJ!Kgb0`nhy1`?nX)oow5*zP0xKtAjbRrq zO~;4^om9zqlT^y8LpbAH7=OEdQqn6)6?(B`dj6L*$Pd8iJWW zm_r88?CHC3r2nf1Ag-Oq(RLIbgxhe2Qz}z0Mwz%sa;l&qxG2JXp7ODiP%)1Q$!&LRFR%u(J2__QJfz(4N8mit={8h3VTZfm(OdeBr2 zfyBJ3CCmqA9I7khTPG9RC7L|b&P=SZ=G<3?4^s^i0j<}Q%B%3j5RV^3q+Gne?iah1dbf zLdv(5z93aYnwh)a<$D_eU|RNoYMp`ipB3@Ej0o zaK!U6mY#@q(=Lv5^UW51cavv<=P;}qP0%78vTDLM%}anLq)Q;pjwaxN-i7%GO&V(u z{#F|dLMZX)Bxp(Pd@EvXgADtSl(14m-X+=zt_96=Me{MF(ebU$_B zYH3r##2Z*x#MJL!nRf^EBPddQBj1&r)iYRe!uxUU+0@-*-;DO4{f`v)>RZKIjF8#u zqUfoE@;joz$H$-(L3RgBy>oPAU(oj(O)#--+xEns*tTs=l8J366Wg|J+qRufZvUR= zzVE&N^g658>E64}IaOz`T~*)D*euV?CJ}F}IBZ~^naE)Mif>qrbASgsuUMaHyqcBM z>#(b2zHz4Z)Zm$XIE#CZA`Fivrxf+hG@^-ESR>?A@B*7fj5`bU)S!y3Zo0t9W8$H? z(JB&L>&$hP0riTR6ku3KDhKg^e3UxPFW?nYLF{(azQwfMw`^EF{f(VstEl6e+Mj^_ zz;@1*6^Gsq88u$FOSF@K%#9N#3qvB$V}Lm zZCZb^6hw-o8>Eo7rwX#jqx1!cU(D5^x1<$Jem5RAmQD25!6I%O*ESgs$}1wYwSzI2Gx2@eJiU_GY_WZIyGu&V^fRBy1@Q^X zn(cN!Y@vn+oqfeLJqoW2>{RuG?LZ8f)~J}CjT3k685-VGP;31Us5 zAPcnI2rH`fX6_0?m3#BlfN>Ah-;8X|eY){f^6cXr1d!9(P{bs)8-5FMtJBJRbwt;x z8p%xtwRKcm8(z=h`VQ23*zyddT_!KLj_0D-?*%_{{z`N?vu!2FibufeguLBXagG__bd_n^8t28cY^L)((B_kmb4PQEY3pbPzwX2G|7ezSNiA8 zxqE1z7IXoznx94lZ#$XHOob+XV76#wFk}yTa_uDYfMWZGM0H@Kq=>cDa?Fn8Rvad; zP5enA<0=a_XAlLsWr+nK`amy!@#)0)4pdOm$0TByue5D#JC~?86gjGAYkEOqn)-Wj zM$TL}S6+M-Onz6g)h)n8t-%rr%vbK7deR%K^rC_aeux=#xL7J;+;APoqs&8y04&t% zaTaDM6-g8JN%vFqRrvzHM^#9)L%zI!2>eQFUHF!&kYcM_i)L7#Zn_fwkjVot51m#N zYRLJLGNHg_&}M9HT5h%?L-9uH_&gDwKs>!;(H?E5*I(LgtZ07)3u7hSTVPW$+k1Ph zz`VbeC$RaN`Lr4S=ek3>OC8_GWrNeh6z4>{>qQia7EkuY4<*=SMW9bDo-CS}-O`N$wKRMTmig&S=^q%G z;z_Tat4w(J#RE0O01+|G!*ZpftdOpiv0ufSY+|WFxB9*v2e{%xd*mPVE!hww+p?r} zcFTn3T~aBT0FP2cJVKUU*liF9yj89E<#8jM>#_reH0dc?$B}PghpvE9orjx9K7KmLV<=lr3i$O zIiLjY&e{o&$!zU=<~oL8i*&eds`l0^nwM%)HFl<%Xf~Uq5Lz}f{}s~a$jGdwn)7as z$4Q!UvWe_AF=xy#ue*o1?^{vx+j+(*!U&v9GB2bFd!i^y58&J>mEjzE(Z56V@okZC zUY;^KNcfhNf8ujkW9TN$>XQgK;6FBY+}lP@KsamtXESh#OU`?PUf>F=c>DF`+=mEe zXd?7j$Kd-R-YvnBcMzUT^bCddMr(L^$!+jJa%D*utp#7# zi`A*6Px)-*7OGvRr^8)zSt3N{=N;7|7wJ#Au*G`2$v4gFc>&Vx^!MzhH(`SVmlkOeva<7nvPl)U>6 z_Llhzaqa+J>4gC9H>+pzZ5P7Bdn);1g#Rz6Wq)OpHTMpH_|4zoeeOM0kucKr1afv` zeWQ6|J67S!?8`P?y{UOr9dJ5j*34a%J@YCvCnB`JA0{X_61S=p)&}8b95QG13Y*rv zDv>ppFZb7z*(Ev?FkjTKd4&wVSSz5#Zx(A(IEzy~6t+j-8BJZ?0Z6wH&auBFIw^gn zh?dCdH1DMrMvh)}VVpLmTWx7DH_opT8VsvV>_szmU3Di|bp;$)bEHd`$_xA>r_px~ z72sn^9V}Gy#u|iwqfEpmzLSR)d=LGh zchq? z2GIJQhSl982?hum(Gy5l2!tadC zH&Q!w)yY=My+}?s=NdSA2zOF(?M1va?cB)5Nm@V{&hJT7S>;MlAZ4Gj$)YjE0Zh%S#`qZMI&6rK9rV(K^q{HJg|+yek+ z<u6ClgW?$E(DAVI4hKpKMGF5&UF!?djbM-0yzY3eO zvXY(AO_heGx4)QF{W;(ii+-bOojQvS@WM_bL5lB*4TK|y7z6TAX`dI3kkt~Qh2>^-1aZ9Z7P$!hjy=iD7;~WZ zX{=q^Ef$@_dEkV3Fhq4b6D^9Y&JW`Rod>iDRmLHb#GT`_X@502vC+cSzBx39K}AL6 zzIZ9PK3?N!2MZ+?n)eD`s2_dJbH8up|PoLQ*$H9159Mdz?@FULFJBfIq`MYzFi6{bjvA{A2z-L1}j&{+Z`9~ zP!hCi)ffN^Y@W_lpBBIaP&0G_Re{ft!x)#-F3a#3_-TSVO`~Y4ai+=?rX*o$wC%Xv9?F};;; zRsEw_Xd>0%i(y_J%4Hw7JHkrd<;Yz|tN{RZULm6) zhHh{8#IJkGLHI&6gQ5JjUq2yAAsAW#n#b;sLX3X^H%SMkmUw_QgVEc<9TuaIxuE-A z<`52L?`qQ+V}bh%R}XWeS9dufVx@x2m(Cb;Yu1RF!Vo^kNGynQv?11q&~oq6%<$hIsBTg%=7e$vY}Z2 zE*Ygr#P(wQ!~WRvm=@*rknVJkau9Wz1LjY^jW`;GrkdA)6`i7TA2P&j#1Es7eH|FN zkmy z*H4}QUBGOJp`2mWoF+D(fD(pHQHu2I&xmh;WY0yx(&ZCxs?GsTpV&uyg&J74wPvSK zlLtjnQ6k!v>`RHl^}vU8=B+dGBLx!Jde)d)ot8u;Ij=X^nH^@G|0mkrwU9>NNGj>V zsHjOg3iz)61DZTXa~1{`}l{%Y`< z&V6@vwEyVvxB?9Fe~W|lC=If{BkpVY1Ze2je%jjzaLwyO;EhSHQ>gA!wAvWRPMrel zJKe8K9sc#Jdpe_a9q-4^BUkv;nIM*r)CYjnI5N;gQRkN~iOF5iv^JE*&c{1AM2;4J zz&LyhT7YsTxT9t~ue3u@4k-V|*?x#|J zUEeEAeV@9#J#~HGrq26uTC?u*ADz7aJ(f>|rGkd9w|n)D2g51kAX}D~0o^NhA_=6w zw&H6NV<9e9N>Xr)4j{2Il-ql$N zIFX(uUeC2ctvYW=OYAarc)~}NeN7Xv^eNE_mE(W+yx#l4H85bzoHYo0MQ04R@aM(?}J0l zj=#eCm6k<6Tnd=8d6Dm@39`d#JcoF%hG62I0iM!?R2-LC8ctfQMA}ttG@96(ILe4L zpd9l+adgPj2aL;m3PPEyrhp{YQl*QA2FD?_ z1`bR3w|lShRCiEO)0VIPOCmuuhmjbat5-VY^)D|2y6ezSzNzJbA zre@?|)7Qu2Moir3yz)#miTM|r&^viK_4eC@C=pGZF_VB2>(!^3I2+4T zC%o0$>Y^N> z)_0*N@!JhkCIdNe;O$xO(3slxu1gK6IGBFtQbQwg+=_xbN5gcdaFp^&L;{;f_XIv7 zXORdzW~$G7(`)xduV@@h@B`^1egUK*V*K{W|7o@ir3hEvzfEwX(0#G{ZAFqycH#8> zR{mLmgc79cpbp;d43UkL8i&N5;%L>4-5NNq=~y4Ba(iW z9gAiKQxwKalWfs~@27{kDYMZtaQ&st+iq>4;}rhum-fShWE8{dt%(LnT6fS!g&`=; zSkBNh6D_+xIKOp!ZEk>=GlQ4>vd}NA-Wre`qUagnA6yF?#OSH3Qm_dw!2>;fampXM z@41s)QFNA3Kt6enb%GYSu^CTZlfkM79~jcNzhCE4R(UM6I!3`rH}NE&7U^pCds25< z_vCMt34MZFu2dY%aW5Bvamo5hzjn!TfzZB`J$DM|>9iBWbDSodH)xJ~C!L9ZG5q-yV2y#4)wJAN~mZzl4eHX z4F&YbA_ENT?karRq4j4Piucf0zwUt&`tJyY8hivy9fir%`6A8wYe!CQ`&Gw^PL}>j zS8H{!w7>Xmbb=>cyFW#jlkyV}F5c_?B}{nqh}n^@RUm{+U})6NH?JN+*j z5*lEpJb@~d-Y0rF%~u{GPN_Py*XTPeZI`xmCk>uz5w>rPgK}2dnJ0+|*0ox?4WBZ+ zoj1R`;&}7LJ1?9~7WA<)s{~L`mikRd9r+9)dTOifN)0Z|ZwHxtTm4#3CtKSuyy8Ks ze6~v{{41jk;W4HSY0rV+0AQ2sq;6G=26R=`cU-0GOD$aMfhV52aXw-qE{XX_jTFR_ z#3`n80EI?**8;{%aU1k-(H!r~D@VW8gJ#9&0e|&P2dY)!3jW@~$7RQ}OII;qdbeY{ zG3aHw@IxT6Z{#wmitteC?Sszv7DYof)}#`J6IoRaJh3pI9&*j0U-E#vVEwM-R4`2}`G*-X?BLQfCv%U|h@RnVjxqqQ$< zxx7B!t6i`X{cFZi*ewH@h<&hro4#lMZ()uK2?>}9MV3E2QB{PAVk8phR-r4Kghk*! z%QFTyzUNzk)hMWPLI=!Q(7rV6w{tdO%}<@$*a8*2e5m?jM10YQ+K7@K`2GK^J3VWr zwdqr|cAmv7|2U?0Q&ne2fVW~!0E}2T_WPae#cF?x_aqbT6(L?eH!t5Hnn&BU9qT!n zPTX}1Kp!~4BZDKaNE|dE2pJZll2bqnl_oB%5i}4eYrz+*K}{m)r~gn?Wwk*~VI*(d zHWZa`cZN}sxPmcESz&*%%0N_gieidiZ_(p>21Q{IpuER|QTU|_XMHm|n1nCGG{lj) z$Xni8aiT6jc|GH2^j_qvoCR-9M4S@r5a&iNl9jZ!AU>r}=yPfl|KM)^c%51tZoXb{ zneS>dp*@fuq#c7;0M3^@imDX648Pe}nWk)3w>`=j@iLtW1d?@+;N(Qzo% zE5`i01wKEl6Zd1SAADf={DViMb}nq`hqNA&By$rPL7SIGbwe& zC=+|E-=G;qs)R9$Fj1{jHco1>Na(0W)eX~>u?q*|z(X#L`l0jn;$~K3HN*yT=%S;`zbq79t4Gh=YwcBDBA-Q8tXi&t zT>2@aEv3m0j~emmhFE8$V?#z86nBS)Mb45h_?7rmbCADAY1ORc2nM%F*PMSS*)&5L z;w^RYzTc=FgP9(@b|*iA4-AYG*p_O&b$=rFy(=0a1R-+7A^tmOmGZ~n(it|fVR+iv z#zB?MpSf`7vy531D+H`>yf*vkUlq4G7t^QgOBK)LX4ny?z1DAOuAY2ZjFXo|=N!ae`~H&;x%r*-Q#dX%8^#~=?E zXDE#Hr^Jx*P_l(%=Qk`&d9OqX{dNs`)DyKv?2n(Ivnj*exP;jZy(7(!u2O`LEN{3D zv|Gpje?J@NvDD^2GqGME zD~a=6NzTg*v!nSuS$T)XKdXuS4msj=CXmWj~Nia&Rw#2Sw~p zqyJ0y_lCi04T5vA9o2~Lg3_%spE{HvW+a0S7^N(O_UJ(qiBlm-r z1l7*kGj%`A5M(m3`mq40jpn?HpjNumI` zxWe_iR7s0lPx^ypYNB-=6+TrwVDq>&WgFi;)5yi@t0(jo_n?LfV(wJNgSFPSsyp(A zoCvs!djIml#xc7$0DEY`q8rk;w@;_mP;9=AQ*1*i^f&aDWIZ^Du4X?wdLa8hjVS?F zeG-Uai=k6!2@=MgkDYYZnYjFXvx(ttd;6Cdx@H{#q@#bvx8wiZ7o^)klTRC}iiQ~Y z?Iap3k4WcEUeqMkn(@Y*)LCJE2Qu}otKJu{D!t|iR|8y-@>R2Stt1}g)??i^gqHF^ z22tp%@^IwP=+{|~<(E@$-l{F|w><4Hym|ElOeFvj-V?R_tX*Zg2MOP8Uao~i!Che>LU7&1q29MdI)|Q z3XK{`gFSGp=`LSHTn?2-XQ~wFA^|jQzdsu~y0J|}7K!f}CX=yaD5WlG3Rh|Nky(!b z0!!VgnN(?C)t|-k33`u|EFbmX$muSIv7HqK(jpdr$Awh-t9g$;=5H$)3-?xXam8yU z^?o3AmBhPQX;&zGg06due=OPRt$)1@>{ZsFRgel9eNRCWzA6Tb{ap>C$kjck+`Y*1 zu#A1IKUQ-X49bKB%TZIIY{EpUW%Ka*pJ7yMf5R%LDNLQUgf*8vKM#qYmcIM~<~0nm zb-`NG7Ke-pn`!@57w{lXJmki~EA6QSvm=1khAWiP+;4f16u$|VJW94KvCnJBKk_l- zs%ic9F&7Mk@zMF8KhN~hAXe2BI(?Y=jC`%pH5Cxv^lj2+J~M`~x)(o=q(`^)KODnX zP3GExfk5Da?@nwcU`xe0;iu9pvzZ7p%Me|TAo4S>ltF2~yD_3A*eJM?eP00MC>Pqj znQL*;@idsucVp!EOdv`fstLccZ%L=~3-E%U)_E~oK61`;8AzSJ*rnc2V&$^pk)h3fQvYg>G<)}O zzdb65g%E>833eTL$IQ~gKoSo0@@~J!8+P#BAo%{c6$-;h9ik(mME)y_9KhU?2T_Dt zjw1bG-y2`dy*p|K{q_vM&r{`$=hz8o9j*9AYO^LVd}+-`C{Vf?!6~k`pyS7>LFum| zq11QBdSV)`j^b86e;v(4WVXa117zXyZn6?Ldc~9ZKNhns*2Ve;_T7Nq5*XhCk*C&c zU}~Hvv$1wIbxudp*vv+vsU)&57FWVf`QiVP*3a3>hWwL!`(4Jm-&2ALO`)V%DY7V@ zQWX-DOqP*kHy0*X8*LNWIv+9$J3mSb0dMe=e+Px|%*0YhmX?bWItCcl)OCo*%zZDI zE)27_gt3~p0QfME1a$L+{x+HOt!71q+y2;^L^Fv|wEpwQ=X-Yzpw2G*T=~dp(}eLJ z7K>7$5+l#5jPf5bqfH~y7Vky$!n0Ksc3O9B8ZUaZO(niE3Fa?R+Ko>i2tx-zliDo- zrHTb`vM!k#(Xw4n%i2eOQRSI72Bx!l-COXF5Xg5`-_}Y4AbFK>$W0&j%y~93jrV*G zb)`(je*JSTUq6m;_q(wgb5;)r*b`nxs^h!3LbTW?iQj`;h`Qhi$XoxOX}3k-0dc7l zUM9qh5K*sc3?eNO?38jc(P+%zxawB8fM|$ zvMIJL`(BDR%6*cP%J!ApkO|+JLOMl;B#ch$Jk5`cDz2Ucl$GQp00no1TsnBWs=ar_ zTe`J-{JPe@)ixGO6mqwgm)y(?UHGfTd(SCz@+U;{eJyGTbO}~g|Hh^lqPf9-r-#gQ zVn*{UeKiYUb}cX2>-M8v$*AXAdgnHi=5Sm_`nfEIfHL;1HMecO<16&!8!xQAx-DZ} zCB`V2+gfNfrJ?P&yD|ruK*XDB>`K$(g;(RoVk$Hd*ecMO>POY|6aSpiSpPQzR5c0G z^W|TrnR2e$+uDlYu~JsQm~&jijalq@g_xMR)M&Hu2_>TszjUo~Ap5zZai_9VLr%aY zdPlp=A-acNMfu*ryOX__c9DDIUQ$kazYT0I)^4#wXP*=Nyd9`_yV7bqFRv&pEEH8q zT*>#=Oif8?2Kfx9%!va+IcGop?#C#n-ltL`x434*+ZeGr*FXvqU##jevjqS*Zv}^0 zT*>SsOP7AF%1TghEU4P?EX!N|k4-#n?80Jva75BXJZIu1sgIt%J=G`CO~7kXT#s)w z!x+(|H8wpR^QJk3tlNW+X!CTG-9-G+No(?9@6YI#f{gIGA(H^7w^*%1GmUI4+fgvc znZsd$?>(?E{ikr|f^z%rikgoscqLa5w=gf*6`+JIei4U zQMYJ@w?^o(-ad7OFX1Tq;54Y!7?abx@Y}ZObR-9p7eBm7A#~o^MialJePeS2$njIy z_IZ$FP2=2hNtEi(!;VVoqg_}w0cSOzX8Y*7FniA6GX(PTynC%i5S)@nR>@4u-);E9 zu_GcPOire=v#oB6PI4&rkPn7Zw23^`{TYpZSzSxH7%eYfM;P1DRT#JrZ1TUa&xLPp z>Y!#}C$&d@r}i*n*{B3p;Iz;}5)S-mXL&<$&$QNBnbEkuvI_^{^` zHvL)OJ}_-iV26ptGoMV@tZ+ljieOm+E}eAo6p7n9JG0!8iqJ*o{HXR~%ze-mDk>`E z>NBx23<$Wf9Lcsh&R%J{7Vgd}J!S;cxh881_d_HFeP5CxuJ$aIHMs*F^~_b9br$aE zsi=^OO6o9{zM2T+%+RdEF%?vWerpT{mEh0CYkas+@wd#dc`Qv!#Nb&rf-UU|0v?sQ zf%ryv<|Ps&%T-MfWGZqr9Y#2}a1Bf0*uK&jh%4MRgcb zC(~IaFz7T4CRYwdIPF86G=ezi+8`iMkR*kOKm#Bk5a1x5v4iZleAp{CohImqRS4K6 z&Y%9b1Gy?!29J^`?vD@{7z{KS@SwLlKq!{!)nY-5^<{cmtmdpmTxa+^NWG6lE0jBI zFZNxGT}a$lp)SdH4)V$O;sYI{4kOwp`o$AJ)Z-%TlS-LRN?=3vPFPUU|-806373)>3iS-s{@VR(2$v&_SbBYI*45yidVwW z0sH&=ZrVlR2`J>Cpus|55-1+EoY25P7pP)+aH`W(EeE;{QAO7@~iUP}X!oN)Ca}-O9i=&zL-PGvl=q%31vS(WzEsHBF z6Fpx~jAhl;DGk#+GJ4)u>~mwhuIDOeD>eGD&6J97ec+(6Bcu~4^r(RCI^)pO<_Tee+F6o;y1(=N z)uQ9JW(rA&h6kj$2m1h3u*8WLt;xyB#T)d2HBdT^L+HmE=#iq_pTuznw@@BYs`Egz z6Qhp>Tuy)gmqVWGH=9f&_Vo0;FCYYr+Pq=SEXPB&MuxA9fCd0{Dr9Q(x=aSckn;u9 zmX>4qpEZJT8_cE>UUvNThoi8K9mK<%S1yvfeLsfph6f8mQ6Q4^@Z2{Y#Y=gg7M0}| zfXb5K1B-+nyP%51j&u29^(JE|+Rhmp31?d4an@R2HAtTi>U4QT|XY2qh&YH|shUd-8LwX1gt`NCBA6mfgJbNHixgNN1bL7b$w$TR`@NV*0m8<(G z{vc6Au!klC@{;+w8_Z`?fIwXJ>(&E=fz_oEziA*@&ZvsQJ3Fhquj^r&m;NsRgp>R3 z9UL08=^i3TSaI|9A@`f^zs#p)w3Ycy*Na|YA7O7DH&Ttjahh?|((!f2P0COtW+nxd zv3{*V05I;2v^ponTYtuA`9Ef{03e(NkqVl=cPx?Pkhi~Uu3n?9q<;qg!ryU7)3da( zNjf|{-15SNh8Wy)NOP86wB^XuNNL*O4}FM@0UPT6yq_3o+t5AN_I{l&f|df(fo@ zq|5me4QMeqrKz__@O4;$uYr0j7X1u`gxe+`4O7Y3#to=MIc>rqXpN^kR~}9D4ah zW5h=2D8OAb?gPspv*raCp!z>Dd3PO&rOVZ2fQ^WRZET6$_@c^d1n|AvoZ&*ToImKV zzgt$!5|i9UlVioZA5gSkHoXE2_?Qa3I6>fR6zKQp&C(LUp?@l{=ZaT~ZT#~uga;Rh2fzm)V+EF089pq;Y#Kbb$&C{99BfK!q_=NbvwSV|rLPzIY>>Dt!&J$d+c# z66xescoA^U<7iU&B)JtXEoN15Zu*oUw_jD7L}MQfah^E|HBVJ$6i&ZH+y#j)DX$l@ zxWXZgN@(7!{As$hPhXQ%uavvUZct?jA@Q0zNQupd?V}NUmbuAdRW}7mY zM*GDm#y{G5Wqd=&S|j>30u%`@GT-5+YGRlXGtM2A@Q-7sfb$g$`jzT`t{_=^TnRaPKQOeQ!aIo(|FN&S&9tzm=ne znA?PeT;ghBZ~yA9c7#-Cg0PH^bO#21|7f(Qs)RUFB6ayrWk`inS{cC|D&a5T5OQof zDZ{Kp;vr3+BqBuq_L|C1n+niS6eD;aMU}GS8g;9p5dSc+{Uo-r6zZQNv6*_zxIAXLH@)OtCoQcDz5bGS9j)R*6 z)DkRKO%?PRyGEWkZ>}$A`bz}kP3>#qr1W{kmFBM!7AQL;e#A|$JJssYLP^~BA_J-) z7o~;swAFm-)cpL`z*!vM9o}xU$x)cTaeCuShS^~Fq|7>%x$DPXQA0<~Z)(`1v>e6n z$UtmMQBRS-aT2VCFdE@POr#-OjZ!`Ry+YgR1jet$%yifk82~%5ybxpKCzxUU?3&{o zszfHg;*kU-{Cy+ZdXUA4+LB3T!)Dd%t-8>n=~M3MO<7(ZxsSUucfLJCpClL;iNk!} z&y6%W{G+pcw(sV#EaK`|#YGt@yI)8l5ZXmK+pX0qDZHL=FB-fb`0W7}O^Y7o=>kZa zY^5RPJZFNQrAakA)HOSIS?M~yl;{(~v7F=o&PYw){MGtf>B~YUcnxoNa$mqb_dmH& zdd2k62V=48rH~@F!UAjbTC||utB7BDih?>RC)wo9v?xR#ZTCrXrwVIg(AM`g- zi0q3}q{hksKZ|M*T;->9FZY%jU**-}(>hsk6yX*)fL6l+W!qdXM#OfH&_7D%ZSfr|#o2%bkdX zG-onvISICgS&V>Zl8^m*jp^f|aQ*!Oywf&($#{gq^27;~J)TIEFKVDcR~8`Jvi@|9 zoDcIjYF~78H|%Sf6p!$@TfCNXS4gThfPYs~S~&z6bm6VSgT*CIyBn|pYjWx+;s%}^ zV=pWmuoleZmDjvTtB~tg@d}PGR?9gyXg!l~r#>B}w|&5Cm2Yoh!L+hWuM>n}jIG6T z_`0>T@@~lZE2gD!UV}7)Cg?tt_KSwJ7%@Iyv8xEW=q%|W*4FpKZbZ9ITqRlTRBf-9 zPijIok?(I2RnE1WGp7H43aLJyaotz{ZH*@xO)W1c6Ll~WcuAdqrja#d-LGfQFl8G^ za==eE95(9vDsQ(RIiC6VL$AH>Ne?uNAYFlQs{V_Q74%KgVLEXdJ5BBw`6tNg)ofEy zKla`(OI_vuFa5{dtP2k-EwxpQ^F603HeY}LBkYLG)5XIP?)PWeV-Aa1%lorx+*S;t zU~)q6#Noro$yl28bjsa|*k72Lgr-4lFGV3+qZ<)n-#fHIAkpE}a_` zHI}idbDy%l>59xJ0h{;U*jnT1;Jx|)++5Oi)Pi3!94a67PxCz_eQY{ipPlH8R>=vN zHD&`^4)Bd4vUR^bjcan(#-(%VtArzrL??u{LF4@;cFDu@r1o>u`tZJfdN{vK*6O}) z6IPYlpFE*EHnL|4AJMXWFU10JF<+KnzZ2vD4|N>pgbLE?+G>)qh-et6$y85H#R89L`+xZH3_T z&8to8o*k=G;3MzNE2?REW<#7#t-LB0Z zx^*vQQ4c6%9j_M^+_;rKT@hv1ot>42{~t&F!vT zgh&v_chuc8UaTjcruXWSYvY~mkB|z1$v0|uK))XMfth;h^~BA>_VTp0F*pL2+14;( zy&hDw^UJWH0D*tj)Jw@~6l}x<)1fSPBrxY z@B9;6RXxcHxwdTuP;2Y4gOh`c{UnEqVGZwuMy_7MXzy2Ll zMHjs-6na--2|bp|U=ue^v}OP!8fG^L7<4uDY{!KcdILI~d%a0a61V$0);bVNLzL?)2 zR~XZE2220$&OK7nkItz269Q^;ctiM;qHfkm^FZ*S+P|)Jm1a*5`Eb+)!U-2(l{%$=4)Q|{ZbcRdi@@5f5|i3Yrhjx;CDILRF0HS8_oN zQN(8N)g&6FL1PtrykPP1+&@!M-1RbO(Jg7P^51XLhJQii9*+Bn+x9Gs>}w+_%lrF$ zba3To9J$Q2%t^%b#gcENW7OA)A@Um3mN(3+GE)x29ZQOeQZyb*%NUZ`$=Kb z`(LTMopt*+?xc1F5?_Xq@=r+gvJ=;&P5$Yq0RM|p;`?x|?3LPgz@)Mgz8NJacfj2HQ7LpA93x%R=qM_B%|*QbQ{q!ph0^;OQ* zI%^o`~T4buzQV>x#a{hyPwct}NHm zv5{U(yg!-|x8CHzBWxBM4O2AZLLga8c(3NC-r=r?q4U#$4}&ABmdF7vK3QPAc#BO- zs2~oQ;7M+5-t(138}CcqBY`eG9EtX8uDR_VfKenYA*bj%WEA{zG6^83)2hIvM!cM!`z!D!(qMkDaPC0BMk1wYkwf1UEzDbfROBvRHI zvZFgcAwDj%a5q_9H*@jI>*80k?6OPbEkNSZ&Gqe^1$E7wY3glF*=c6I$kOGbe_$I< z2oLRSsT)D@c_y18TIfwJ;RV!u-QrigUNos`#n0VVM=ky%CkBXpz&B1J7tr0D7F1o{ zNznVgII6whCSu6SHCTA1c)|d*T}D__HY+NY=yk4hFz3}2b4e3sFE-j({`|x>$~_)} zf!+aW^CK7DRQ2(RoR!H>O(NV+Cl7GBh*LVLwk|8am8CJRx}a&-H|Y;e5hbN_77r72 z&#{)$!SmTOTz+{4YyzSMQRpW{A-)#;1`o>~)_A`OOPL}}YK4d?b{NGBI=Z`ls@2BOJ zE#{WBJ#|7O#!t|Eh17=Iso#n>cTJ7k1H5ZVGR2xF@qjH)Umu6#+^a};%(cyX8|{Ic z_4f=`>^wYiT3U81fYQX};f%ff=qH=Ru1t>C^76K44?Wd{`z=HMCNY2Wjr%cH+#v(6 z<_ao8OVJCTnI*sX`nkIST7xrP`6yW0=FE-f$UUTcOOrmmGrmC>UJxloNzB*EugwZg zZNFO1fWpz(^DbyL*#TmRYCqV#3r#5pP`@hS+~gmIC?uGDq0zg!SxCl%e;6e`=i@Gw zcUj5T%%4UZ#)teS#(U|8@$jEtP;H2!onC_>qYSz+FM>1_DoosafuD@-g-W1wD z27UE$cDUBOgh`f#;(HxyV%vrbHx84z>1jm~haxn^=4S0(MPmcB)$@O?q^d^K z`g`4Bx@{$C+gvh}UjA`@skeUaoLeG&m>LcDwYg`c(9C7_-Rg=(5Zqw-c&TL+(6V~C zV8QAlGGT&LUyI6`^wDIqIWH5jnO~w@?8!S*cc$^$s(XxqvfVPCS^K>A;cNlLdSW^R1FLCKpyvZ+BQELxH*Z z9kn5Je?scUk4UJp;t{@FdmYxdf{;b~JhwK|2bsqANG-cFr9kBYB(#j!1=SFnSjjUZ z?%=%})~)cz5kpRtmZ80m3dSqGiRtgR8a=+9cEq!3?Ti#rruoO}tA~}?klr5VW3t6S zLnQUl_FUJ-BKI>3YdxQZ&s-na`V<^&mwqw{;?$v~KCYlN+M zjr?()&ZMd%INb%eKV7Ao8*voQ9C#$@OoHkos&1q{w7+4EUQUNI?7Qpl-M3l2Ke(;G z4{5L0UPnS8x~~D4RiA|4wdX=MtQm!57@=Y4kuoD=pFcD`mK#de^2LZG3B$%u-f749 zpdC>aG0u?#WN=qE$~9Yg)btOED6$U89%#A~u}P8H;me^td5jtND;;I>cW9PMU1dbD z2#La6J4MW8&b$@1kP0W$Cj#(Yu`G%vcm)3s2meqdT1EYoUs>1Pyf&W#`2nH_lVVOyYB^9zy zxgdbf%wzQX{{e46kiSwODltX?1`zmCyOVfEMQ{}R*676U)BSs&zqd{J#euf!vpM$C z>9;r-ku0ls?D6x-Hv0Uj?zu;Xo?)x&l5J%m%>s2k%Vz#|%C4}{7aeSaPL16YA!yg4i4lQ&r zr8YTcfN%Mpq|gE(V--1>g1+6c?oQ$#o*p3Ybn67EiXm&abR9z=qOX~d5hkB13Lx;B zuMsEhVf$WwSbaU~zgh|-SN8oCFcLNdbUXasbM605yUn^z7+_z+$dv&jb@WXIg`g{8 zI$1^MH1%?DmAOuE4kS4#6v-Wh8PKlzRz z{p!1zc+i4HYOLGE=ehIxXpX?Ixc3p8ar+xqQimHTFs^m0HVU@0li1kGt$D47hy{QJ z;Q=uKV%+0Q-a6K|#zDpT_3$08U*lqY^oNoI(?S#<0{IeXBs4a0t&U8W6^unHV=9~! zwRP!B7}rYPqKbXMSsl!FzSTxcty}F-cV5qA@lS56f*Osh7)m)V3w!4^3m{oYoh*Q?4njb1O!47p zk_@5~L8<^SgV7Wgcdhe;mlwQ%ycUEdpbCM-LLfUa3US0JlC{e%m)Te6UvK>{KOHBe zB-G82hd)88CZVt1x1=F^xP9Q|i%|LUBUUaO)hAC|C-`%?CwY>_u!KvgQDE%L%* zb_aJMxflkW*LN-23=wz{h$;~Zj`LGOmMKIEk(cDIc}W3Li{R(UX^5hCq~q+<_25|LZC1a>zuRchB?o)uZpDl@PL`UqW8AxeCHc*XRRGAm^m9 zCZr>vH@7=6~Y<9BhcFiz!o4n*}49XPH>kcg=sD){Gck z!4tn7VdC4(FW=JQ)OXh^7^5oIjF=uG`%DDT$FS*J_r#-3^gd{o`;*gY4Yd$x>h6g} z90aU`6*_0am}Dkj7(%^3)FPM#FytcaSuiGmclcU-elGmzcjA)=~gsB?5;o%rdZb*Mwq&DOI$Jq7T$>x1RWpGddbW z6@BZ8dsf_F=c1;^;$UY#a+ZDf(wEkA^iFp7IS)ZlF$Z3-x9$1MDSE_}_xCu#zF3=S z^DDD0-&bR&-*&WhojN{#xykqZ$y2S*%g;AC*O0n*+AghG^)0r>#UO)oxTgN7zq(fpj?Rg&^X2+mg}+h-0}-3| zI5yQd05gn`SkEMgy9l)0kZU%0orbNV<~5 znOw$A0$eT{uMA-2_{T4>PH3PuEQw%b!~3?!-#-W(y*-s;jKainw^3w4vDfhf}{yR2+TyJMATAP$U=T0Av=IqD$O8^TuSB4 zq5ZAjO;>L;=d<@a#1S*q)AfSWtzz*i>v7&G4fknbDS5}d{U%y%ZNz%Lv|dfua8sg# zRSPXr6R?7wJ6Ux~mermy+*Ys1r;Vt((ou<~*P8Dy&sfa`M?#$7eOXbmi3UZOC}KFm z{Ei*Rkhfc$;=1XpihG9V;si>>K3=4P7c(G9T}6vF0^-+L={d&;a9#*NrPeV-A|OJ> zVJky2&^0jtk|0Gm(jed+51wE>57^Dtyzr)#z5bzlRtRG7bN6BETyJu47aDyeT9}(7 z@G{@1-oWBzHvRbDn7N);#~V&96wabwT_! zARv-OrJa-3DVg=Bafz=ZhezDl(${)shi=)(!-v{QH#cSQSAMg^?mzM-$1L_5+sAg< ze~9bvuE(q=;PGgWH^v-mJx(~#dY^mTriNjoYr;eM5ba_H{_A~?vNct5SPfYQK0t+| zdYa870-zSjANZCgM=&i0N18z~eoktqKk>P*;k-1ff_!P|0720QZ=wL1b+GQdSU)~}juk>yyLl_1wTMKziO^j@oc>~Z(byeobO zBerqamwRA?k3#X}ZCtJ=Dhciw>F|o4z;3-yGZnmr{ zAL$+u3(;PBoFJwf+2p0Z7vChQSITE079n=fnROYnll6pQXg6YjW%cY#UV>u#=+Fy+ zHSTdRB1zX{y{GPGgMN3edtscwZ_ZOY-oD1)RVR&yq4QXWORuxg@bSz!w$A%+G0Ved zecwZtar}vv)_;&yzW86Ocz3#cROTAZxe#|8z6JL>j%g!e@SuC-WGRMM1UY_P5G4su z;1ZX|B;Cn>AworK>*QgA^bY)027R_JfE3Iydbuu%SBxULe5`X;glEjAU3--6d}z%1 zFb*S&Zhr^|&DR{E8~M<+_`Gzc#?6*T>MAy&IS9jpYWzJDKh zy}Pdabhk7{`=DOl?Yx+YCQjfR!>R7wl2Y~X9Tr@@&bl6QgjMz$;2tUY_Z?RG-{-NB zCtD_hf_LJ679b>Y-Mh0KoCa9eg4j5WI3`fAK>KwrZfaAXCEdI0G+f_W3z~nygJ4Lo zC6i7CupmZAW3x7Zc?hO10JUEQt_}i8ivL$QXaH!Fh9>~I$1Ty?V*@zn(KBtQ-TML$ z>!SfayY@l*?BUNW5Bz=DD}S=I4f1~^8kHIb$@W1@!FKy7EL2j&e+if@N z)vK5N_P4*aapT6>`|rPRH{EoTDQ+TaF##%7ydAEe0I{7gAKUv3os(b}`Q!l2rhpQsdWQ zuXB!h+#^OI11&+PN1nE%tZXO2x0t}ccDH$+yWOI@PPFj4C6<2GvsO3j1G7b6oA$-R=4+`aYB zRTIKhE4wli>jJARL*_D2gn#=tRm?>CXoqtV?yQM~kbI^2SzMjQIgm1NA!Z?^9=>X+vr`x1#P{uQL-5**ijpc~ulhbETy)qB`RBiTP8#{+C`M+9bx5>Uz9Q zI&NI5U-_?nPZY|^@(j#UQratoR+2B@;DjI~O9b8#NsTGTf}YrF1d}ipBaR$l^Pl~c zF%knHt)VcCgpG(5Ce>P>5nXNH`!7!jr;Xdw+;P>tHzEK$Z)vApWRcn5TKajHS@m;I zSjD|}TeL?n^9>jVp?|@_f?!$mC@oH~ey-J~xFal0bLV3k9+6`~vf2&o)W6&jdVcd? zVv;*6>0g?TatM4*a@h6JUyF7Gv&*U~m?G|~gviUHu6KyFkUC$Ieg7VXw%f>VwiDwp z{Ac^PwH6Qedw$dzPRr1b^TUWhszF1ShQsydN+KB9+;iK*^=(4n#dThI;e~ef)mJ-7 zUGeFUJo1QXlaL7$CfI`y5^LVQyF1n(zV+5yws`SkH=a|cPIa4LY&f_=)^#&Jw6wAN zZg{ETx8izL5^eNSapGWGyN3KxaEO6g02|3BFSicx0-b{cg$!d})F1%>U3PAL3#=u1 zSieCQV$npjFnG2W-6F16sCUUQhlwEnkb|uK`In*{;5ymFT2g}N_cuH4IENT-7R0Lf}Is&61La%cUL32HcwuE$E3yQ$!8YjtJNT&w%q-^v{))w%Mq{ee=sxz^DR$2FUmF{}2(*nS0LpX$ts%lfMAhX)3 z{zVjZzEf_wWv4^*_nl(xesQH^bd*#kv~G>neDQ8 zArQn(j&BvgjrylGqJDf|fr6cLYncBs-a8b5=OgM{OX(5{?PTN3|Gl!K3WPRHQ<>@Nr`0)i}}4Y zSG_cFg4;yplierT;&MU|MbH^05lXc3jG;_a%suN-{y-Xg5qOy`G|n1RF+5s-x+XJ+ zlQqCEdM=;rh&jGG+v}3UY`{6kZ4yoswatI*Fw4H-DXV<#X$$=KG4t()#^K(A?zW_$m*4nYpChA{B`nGZFY)_~~*4CuMeQkM^v6X2d$B)!C%$Pqslv zOmGablI^@U>}8Rg;at#lc~s|Od)kO^2F!1Dm--Kj(76Juc%75N~HHJ z7FIb6R0}%;b!Ap&$V#hX(o;SJ-3Rkf2Y0Tb=fpsWp-2O9my~5$;R#1s&d?#2HF|u* zZe@|`N+c!O09#hXxi?o@tQ~1oiI^{`wZ+IKDvPHKwRPobzz77;X?$X+EEI{Ec!cPr zn$}qJpLxfI4=lxG5jVVyi&Wa!@EM~HQ}?w_`%kd>7hlf(A?thVt(G}#H|mJNS)z6% zI$v>WKdYxI>yWbSHOvw zHxY03MF_kC;;m8@B&P&KUj$p>kHxj=R!+Sc^l2F(peo%`Ny5Syl}bwle93`QQeZXk zqu(NMB4!$&JQy55b&kFKIMOC}v<`cYGH)GnTS_WnuT}U>#56Ci;w}8x7BHgt@6By) zGIyWdY-tIbLa`R2FoR+U%V7v*;t6BgQRIrGbZL7u_F@4*CCq_B5@S-mi}>-t_@#tx z@L5DqoOpn}Iq789Y0xIV@t7sIE7&BQZfb~vGe5Cam!1I}qLCAP(4GKNw6u?!3u$h| z)XC8`PT1r1Y3&QV^(`%q2)qcsj@1{zNEu9^91H{CNa06$+^53eR-*k=NagZ?gdDUX zL_y?ozqC1}j8D5%oL2>7Fo!jaLzj8khN62Br+a$$%MdiXNyF?JX58|@%= zGE`ZGhIH$}NW8z>^Y=C(@IqYTfVKEU;2(bYVbji22OMyK_3z)`UViyyC*e+;Hf^J^ z-JFVkqX!zD*p!OC;kM;7E%N7+%mY!XDMQW1g7cw@P9;WN$W9*V;%H?*jKGD4Ae>1o zK%iKraK1tMQ1}=}jt4f<3#ZI;+MmobVqcz%IoY*}2+=l6Ayw%;Q?0fHa{^9NmFtwW zg8bDOuzV18ACi2qI>{>5WLZuJ(%GK=FSDgzS?cTmbn5#E?R5+Z?U!U1B+N#V9qZEd zD?SeDpH%H)7AjCV7IZAL%90Frz={!7jX?;{mJA%BgrLO?Xu*r1tNwxl?PLa_69YtD zD!~zxE&GJiEjs%X^9&em!CxP4$^U%WnN;HMZOL~c)mkDI{g%`%nA}{d+VELpt)!T- z!(Lf~(_uJFSdsiTKtMqx)d+}A{6UQI6XC=G5=m8Bpc*Iji>VUx1Ht4OnMcy_^v%BJ zR!iDxK&w^sWLdH3swL(@!nA9Svg$JYP?#q%T>+R@=n|S9au6^dblv(M_F{^M)%#nH?c#w?B zU5>d_eS#YicsXwsrByq1weFK+tF#N9j@;L}P8w{H@-j<8Bc?24HEg)j+OjQRB$0}~ zaU08yoyeXQzz2P*sKcxSj3|Ux#IO#WBIZcU4WrEH=&uex6*NDrAE~ZI^5yBED@hRf zPGkF-cjlKi;Ms@BTanRf6+PK{EK*u*Nqu&)$`f}7&!(H7HJuLQ?g1ccVFER;Dl*+^ zU5hEq{o{2O{N_umeEf0NeN37c!>6?`C%kI3d`_#${0esBjHBv_Gl8oy)j3C9#$+u_ zVo_?XV+^vqLBeU-LDAhyogBztLpdW9o+m#Bjhh^Gg#nStb{HBoo z6d04%mP9bp+WLM>&&5Qst=!^e%a+;apMP$L9d?*QrdlvPdi1b`3l};9zi81S8#89i zR(|W2RhNFp@x(+U?czL^npw*(UfNtH-3lP`l1P0BX+ln}fJc)dU_x>#$!UN*z+GDo zv7I=@yeIt8o!?p?-dm5fa0RMQIM$pZvQVG$s6*blj~;1dY2<+q%ryVpJSWL#w3!^h3D!Vnp*R%fwu6%0ml4GWIYLdHpiTnIXV<|7Zay(8*y=^+SUDxrHx zow{23-p5<`?AEYd;eZbf9`$@^&M%c3qLjgDz>XZ5=zggagLd_U%u}$vqcH_EWYZ`v^8iQI+08n z2Cx>5j^LiAyW)ttOgWqv+Pk7A9B{tK#g% z^f-@f;G}(4g{x1DK{kk9rkk9z&avDB546&wCpnE$?%kw&Eox6fmDs(p7W_CqJ(y%_ zqnSWKGW$~yrNcO^B`HloO10$y3(|5(6%9t=pENvmj013kppeHv$xkDMwA=TJb1ZN2 z-dnBH-rpTahBxMJ^nq4Y%4RnE?`1uIeg#gtS6S$tw=4q(=gLpMcLZ7*zwFF_r62z@ ztD5nZrFUchh>I?>PcOO0iZZIKNBd%!S(!6g<3fxSX?o;$BRCP!UyXPEyox-R^I~>I zrVY-mv|gDN)}8028IWnKj%OsDt4MnxhA)Tc8YS2fVOLy!IvT*j)PVK>!@1UJ(rBAG z30%m%1$*y-%#*>cn^IZrC@md#Zk!(TGwGeL>VnI>0RhF~$E15M?05nO?9>PiDSTBTw zxRh!hIo|=;$;X{$w)c6hYfoJz1i5*2byip28?3gPwQ#iOJPo!iGiyJ_$|hZluB!`S zEvU>Z&aqb+CchonS%&62ZU0Qgb+A+ePOaxJg7A7m~9gfy3j8Xxt31gTOb3fHVs zITf-(HxRATeYwd5jpK9(tq`8IQL^aNFo1wZcY`%FWos)rlo+;JhfH^bCZ)% z4g88}0(CnWVQd&ysqCeWjq;s}q?U5>ugo{GWj+U+8>i~yZnpe;e$IR|Pnd{2zj+jw zgOLL)?V5e)U4H{7a?$1Op4~tBkck^ zeF=7?!c`ID7KCwI0&D=JJXiVB@4kxhnnxDd(D6UgW@~bCn24XV|GOFVv50WGDVp( zk+N0dPP#sXADIOG<(c-usxHl zu%nWRA|i%>(F*n-+_UeP5trYj zY;1-r-m=PxN15&QYfJhyh|vkOhxdAxh($NCYu=`+i}bO_o`sSxGI z0Eq)(ne&_`Vge-UA#%bCftN$12cqXiHBwWJ3=i>7J>Y1wtxVkASoWQ0Y3)eDg13L> zz6aqv1rtbEM`aI)L|~a^Jad&*pZlz3{O29BcmHj{gHE;3Wj}Xjf{w#iTc`qmWr+Hs z>0Q}DF_o0Q6(ny8Tlsu)gJt6mMPIxyGt$5;`!>%ZWTi%KmseqHigWF&bsbzrL#4l! zn)dr*cKgC9tSc}R&!*VB+ZvELT8^(@H{Vf5S?;c5%y-MV7VX;sz*uFThi|aVgN`s? zmmWV>@Nn(Uy#GB*J#!S=KQcCwou>vyI)FBCZG~*pzzy0H`9+|NbEX<;Nu)hvOL*25 zIXixK%2p@tYFKh6TsRB9l69V(R%x{#zQWohgt$|M)%q7%#)GF>^|jxSWQfzR+-=$2 zIM3!-mH6OvEMn_ynRL)JtXfuJtJmgP@BS;uJzr;Qmgie;o|t|JG<^|~&t4gHs`$b* z!evpl&nqvmCHQ7!u^!q(_%jd=yxG_0x2m4{!aer5t_|&+RB}9f56PgKtZtwz&(HT!Y+rcG zL*Uao(m0wVZr^_rL?ny%qmjtHbA*+Rzl8U9GIru=7@IAzWj5U0%t0dC*|xU9$D5M% z*Z!C@AmD_`t)A0Pd=mR;2Q4#C8WIq;q*um+Lni@yB;7zD17{;ycZSnRP~uE)OCv4p zt4A#N?cZz2G379~*nKm5VwXp=RMvMN7(xE}9Yzw9htc>j7wrbd7|P@4Enr1fG4xaI92ek=$C>rs)kx}Z_VImY9f6Nd zJIAU?&9dbOA84Js7PH|}Op7`Hn=Y(>KXuR#=2T??jDO7I-e;r6&9T?t7-C5^7ueG5yRIiMD`er8&2tUe;C@^84u!YdY;t@z%8Uw&Y9 zZ@p`oH{9F607_WYSnSv?R-@nY@{=X-R=LXZo|s^s-su)u5U{9d7mE|^6bOp{+Id7& z9>|R%AbVg$OZI=tq6J9sn<%X%@C6U_v)W>4aeGPfAY6!sHja;qn%2mX4@x3kpA4N! z>x492lGWGplh_5TroH9YF0*JZnb>kkI)b;A@5>da=aJx-;N9GhgREp05-NL~vAla1 zYBgH$px|wL;hi;Q(qR&HI=dNlHnJ! zH|9BRBs|rtESeExHX092OAuw_=imF2dOoqU$AM#LGN-@F!XKUOo&T$d((uAZ9PbKU5{BOj3XD!kU0L z^na0KuY9;Gd?ulw5UVO|>hh{@pI%8^GtwS*n_;^zbT6wRd!!ga)g^*ZecM{r|_=0{qdDad+Gh(-G{pli7JsXl6E9 zT14Q*MCHVoh46X1u^l! zrARguX>h~{iV>OnQ4i;!*Rk(9e2)b1^dTTeQ_vIUK=td%XU5oK94`yNA=<}5%%A>> zP{qrMPhpt*?KTT-7pBMhs2-s);T!KSuC=70d$@Y#Ah;pZvxC6LhNiWjkhGs@LHhLN zc&#+=V9Oc6{@-7eqn=_cguEe?C8HjJSgx1C3f>(GpjPuOh!G4piB z>8~s6Fazf$2)U;UqMXX~DA}`;Rg0+e9}kz%T>faF7xZP-D@=J|ZBz4o8smWls?{sx`1!WQ3G zfNui!0_qI0&%GD#eX0DDI@3n2>l7vWpoBo&(migkW#3<0`8Sv|vd9egJ@#vGTuR3n z_4J?g1wUd)QQa?mte<&Szh}{I2W-{R@GJpFa#4r(M~kBEx-{_oMR5M}66FwqxH~NZ z8RYWnmNB=n*9%n15u|{o&pPtcEENv|gu_SvcUywz_3k*`bpj8by)I!s)Zqno2Tl-o0%8xDD zX-t#zZTgW)G{x!#=K1t`%kN%cx!Ag^vmv%<@gmHl7l%vvSqKn<zX+4a zpXRD6x3gvBtzR5~8|~+O7^gfWdEX7Ouf`@SR0rcZ%|-+*b5-H=!NvbiiRMjq{A@71~?r7;o2E%A$v23|}LLD!dXTE;9luVM*}r z{aQXE`YOzyCmo5Z|LK;p>^{UaF31xsmEf)RnHKDH1ak@_H|iEkexZ*A$3AVzA0N(x zFqzeG2WW~MHHRR$=P(0BmjgRl#JYb$W&@^h}}uBTv#S#7dB8f#Ppai_FK&cL?j3g_WReNxp_A zkG^$@c|W?}X=9Y_GCFXYd1n8gyCviY=8?L+Xk27gat_20a23ax;fLWx(-7Y8I`h4L zDf7tl)S-DyDk9`^@R{H~*4#vF<9Bzqx}&FC^4-Ioc1Um*LA&QPS%N!?w4k9CcsSv# zT0SS2P+THP+69RIK#K^&k(NtT4km-7-G*4wL04cZ7#e#p!RMCbB}nk7JDmuRZ0ecq zuFhgD>2X$kUG>pgX=$@$R%yO%Z#0U%qLMb2_3nH~AHQs_63wZ4l zvTy6>B;-n*+M@AxEV`X}I?)QgJ{!yyw$cg+f6nfVDdW^kX{n07@VkFlNw+DMUkK)O z&LOc%y_i{i)%?jR6xu369EAaKL><~IwY?{Yd4`y$tbG8j)O}X)0R%^>)p8NfDaos! z;#sneeFnoaVTL=Gp9`EQjtfxqgy8I8>hLzCKQNinDn$vO?3860gDWgtM&grBoU4F9 z=(ro{eh-X|mj@V$MmIfIKNJ`#e0gUp8OIKM*?khGs&#{t=;M@_hNAGrovrFi2r0B1 zO}T>+&yokwm=syTcb5PknAWlfGq9|=!qJRphh}SRk&2!g3T8vx3prrUqA+lNhhCP?i#^TX|4tD3h?c)POiX7za}es*(Lz~y*vXXqf`ai>k~J&D zLTpRx^RqylL6z%B=29_uU|=FrU*+LzQ&;~3q4+gR*h{P)+YA|GF zMR3V(wZ@uS-t9%ppE=$U?FfiQ@ADTylnSS~8}h!})9|RWNHRNEmj$eN=&hE&=wgcw zLIV&l2@q5K@(=18ugPcvZ9q%gnKXzrrtgq)bj=f1mse!@Ye3!*!;)?%TFLIy8>-9y zVhp>z4Z-ORi6{Y~Z@9Uc0}o6|RNkJHaF-l>Kj?#_++c7KdEOb3Uq*K%rPaU_r$yj} zK;4GjAYM-jzjI(7^I-U@u(g-H7em4zZKna!GkOdH@98`(27ml69sGeiU-01wN7Oyq zEd-{Zbl5ExEdp-PF6Vze4k9TixG@Rv+{-fZbJNRGd9&*~$ZzLnNxLyg<+pm_4P zTcz^iDc@S^qW)IB5Mkqu+sqqU4&(hVD=9kIiud}8$z-nNMVkb{e`S!Bb~%(eJT?X+ z%?J!z+9*$Z2(C170sM7@NFcPH4B&%PN#L<)DbhF$hn)NzI^kGh!Yb0x5zpqdJEa5e zu$<3N;vDd!ydQ!w;6={9*6%cTzdnlhpXrVZUmFZl2Miz>Dd%j-gy&$AdRyV!z&J zy``;w!bxNPcKyw>{6UNMxpMt$G6tG|ydPCE>Rb;*T0}f5DL#ZPtQh;3q-|vYgE5GtkznJUXRLV2->k3{Rh*3EwddtJ~P+y{{aO#;#WCEuTBay%45-T10QT(#y&YxuE z;c*u2_lJgaKb3>By=Pj{(M48!GdA(Lw-bRtCcr{qWbsWF?fu(^VJIE`al^4YXvEYt zy^!FSkaWC=vEz3n9S2Hqtyg){!PZeR15fO6HXU8-%n$z6s zr>%Ium#pC7eTfVJ%JNce-A=%Dmm}hD+W4D%%#oh?R@&>9Cd{nhCR#+I7qv(4{^A!F zodA)qFW!~^v1r*siw^jG{M1k8J9@!Fm$@_ew<7b-xdmQ~`ANZqhPE!+`x3?hic2Zk zf0p}h_}GN$ui>6V2h!fi2^WUWacVNb$nw-eX@uGebZuF`3x0QcM_|FTm-y|2Y+L&qJPWZ!H90v!ul-$y`JprXYeX*~{MXo;uWC#6pM5*tWLn4kW#FE9r`J zPrqy6sP{|Qn$i&;n|EEgmHQ?(A?}98qO9A)vFFebI2*lOUe`R`P*+)}e}WWP`Bk$U z&TVuMVR3H9#eej-=ASah$`Ab3ax+$2?$XE2*1guyV^8Uu=xEnV^bHrb@Surg!||f{tP18SnS&EPwt9=INSh zr9;lJz_1$#r5hisytz;6^Hh*OKIiBr#NC2x(O%I%sqy6p0y9_`T?Rb8+fYjcZBTCX zEh0b`HJsb%U^|DAvXj2E(rLiRq2F0f?o!K}{~y%Z-^PYP#H$#X@qe)XcLKkjjmE8+ z6VVLj8Gjs7!a-yq;DU!7G9G3DBQmX^kt5w4&bBb`+!rlmZKL4xwBs5CKPpBrC*5+t zpKG3v4@O!ifzMvQvdW_tK#4b@rL2hgX_R(FDsQaStHUJL<9xV37!S1pC*K197v`;` zzWNgFkZE}V#w1aJU)fRGHUc{c{AR|_Klnoc7gcrTJP6t>^Q?N5MR1PgeE$d3^kXb% z_GEq^zL{DQUoP+cx_Q?Yo41?|S*lTa^6e`tv*eX4Eooh``PP(}kLwvYG*S#srR+s@^ZaK9`Yb$PTIJeP(jCwzj;@=e{4YBoE$8cBSuqxRpW_J(wt>%v5bbOJYc0cgjargr==|U<0d7fl98X1R{j774o z>vJmaoDjROW-;vprb{Yd3}KEFm7frdlnF*~r1khe#i{pU%lrO7%bj;4+OP{O|HIuZ z@5{ZM7AVnBZSH)@xG%s@f)8Lr8XTN;qgiP9km?ng6H~Rr2y*Ng0ZIG4(ZF=hvv5~7 zwZX^6yR^)LIOG+S&38mO=W}58%in-+vJ$?&82^+=*Ib?l_8OOZEoF44pIQ0nof zibq`nUg;gXE3n8)c11HPhtoui@J|Rn8V}vpJpP{&csbBbpFX`!Nei}S=eM*j|Aa@)Bo}`q(`w zN?eww5-ES_Y7l%m2m(d`#OW*b$JDaa6rEAZG3s>A=aN6x3oa`WM`AcAoDsWyx@{V>b;t_UI^TQA=z6gD1>tH0>0b4Ca<{CL3 zd1~=mkE`z6gJ7|fd)N4ZOBlgwG(W|$NC`b7hA_Gu+iMNWooDlE7g(fEzSVU+7sS75 zMyzzmhrraU5RdwKR)vBQBvBD|n|HMdj;!l1bj20V%Eurug%&Buw!#Gu;EBH`cHt)u zBc;Gd-nu(+p6v>J;A0U`x?oHo%%8M#d21em5xfp32-aLHO0+{E_(OXFpaFEDwW#35 z^vTRp1jENaFFrLM9BT?1S>1I*v)cjj69Li{P(1Cz3&Y_$A2XX#W%2!AG6ZreDn9)0155jwjJS%ra;&h)L1Z&NQ6uzsAa%N2@D%{%Dm|NFo~aA z^_u$#GkiKe+*|gY+QUl5q8(TVqtI?D8OA!;x^?R;=c}=?=Rx99nJcs{g4V@@dR~mD zF97q0v>)E9rzOu?X2H(bg^~QF!nYnUrIPwKQ%ZMvZ=*Z%7N3Rcf3#)IdkBZr;i!Ly zVAuWL@>X5}aX?Fuy|X#E9@yy79Wa8UBEA`A?_1SpwU*i^1xGgQ-mA-C$k38tAI~!g zV(I@`9dY$G;O<6)xA{Z=F2L6=+_(05^LChKY3=VcWd_av1|ls#jSO&>qM}1Z9DZSX(GE{<`91T(UyE?vM;u_GzI^*}x$3BJ_Hv z?D2BW6DO{7)uf&sh*Ut|rLqkUdDBue3R#z%Uzmy7mHhc`yn}e}&Sw%Pc$Ou9IflMb zAMdRz*q3oRh#2SoNM~zl18pJ<$Wq!jsZL>wZE1tH7;dhVmv5jlZtkW8=LB2IQP9#* z%y@N@o)vb}5UQux=0@?%Den!o@G{ISU6Eh}k8(n)0Y;Sc1?1|H;!N(a001aWNkl3m42MW_^5F<&9$=n6 zza@-`y}PCEZ)Hh+sV{2z91Hfo7BB4mOfciEBF}hsmIVuc#<=vvehcvrEQ!4#XAtdU z?KCPsL>Osno0R7u4Z_`!UNx{1e9@_)*D3D~w$O6+Ht$Ykgx0hEFrCPkLH;#@8y3HX zdZ8ZgbbP~eEjic-PD|di)ahq5;1ESlDAGng9NvYc7VSu~9AHEyohZ9ghO-VgUylo% zwn%v+T3b>+9%`Y~KB)1}GAr88Qr{dDV?r?@)%8Xjn$`!r0Za&w)WK}#^x}7ihS#Yd zZH3cBc%0|Zk)eSF}B(ikrQukXEDni|wq8M}))zOv` zXB4a>gtZO?o|5gVi$dHZsIMd`J7TH@lAh`aoK)$~=}2Dh6>nJ5j8|ARr;_ZUXN(xO zut7o+t{+Kx&NJGB7piP$9yvA%fh(4|0s@~7@<#pY?Fv(Z#26j=5?jF%cE?z>b{y4I z=g5bbeNy?`5U7bdMIq}|ey*jic+os-2+JFE6Jt|go;hcuy%>S>S9|jo^=BcE2f1@h z#*4PJA@qMcy~VD3TW9;C;lB-YMWE)Db3ihA2RE_%KR9!n!4rV&o7 zCTnK;F057I48}}rT8?O9{xome-N=JhFlpt@7G3)c8nmO3zWZUrkKxajbSXX#o&^`8 zpa)d}dyc6P9)ZZqFu*rJpcE?T3Ol_ls2n@lV3!v!k?p z1X@Q)TmBvgED=e$6iKGylH=vrV~>p=I+apur3%$4gxA{V)rfSwkR>6;+v*w?D05$# z6{K10#R5bPF68Z`XDt$`JKY}$mW*)Xj9n>tz-{(YzT^?JKDWotZNaBh^y2;-`mx)m zR`AJ4-U;HCiXJZCn+}oh3PRvrUee1N>ig2pzeid^Ql!0YO(2px?rWFvE%__9t6lyo zw&cIE7`w3Ai!85dPhkoxOF_FKTU*~3PyGCR);hUs!2> z?9Q99^)@#wO7_uQDZ{a_wWXyAL^gbnkhkD$<2J2-X{<%q@Ixv|i9QS(|#;zT(fp_%a7tEh~ z7QfNa1G0vizu@EDEc|MPdG{=|=!$eJ%f8UE@;kAU8Pcn?K{$7|v}_9)Y3tgNmPkxw zQy7WCN8zixAk2dwtTRDj97Gf^@2QX4?N5JSGUxbZM|5_~lv0I2e)Sta{p_h3n8^qSYdBd8%ia zf9*VA{6XNeN38X}k5JVw0jCVW9Pu{Ci*XR1W}(+>%ns~ko&}d$S?|X!!z!%0@?)50 zU__e27M4UX(!y$fl(%bI|0ktKj~)$b_(h8rITii?cL z0s*j`pKyHg;Nav5;K(9r21Z8rz!QSI2KNPmTd<(Po#5`UI0OkS z!97554G>6hw}r(u=mH@)i!20pcYXW4_nmjnd+%Sk^J`Cc&(w5P%}jOG$K+Q#*6ZLT zgRsL6KT@{TdU#n?edBES*mW2SSq}qud zJBB8os9bRC*Z0NmHmc6AX?=X{5oomIccO?98f+mO5a&dd7J`}*t)LR zGzi#AZ{Iq&uA-*7T?A!-rvRW|FnHP-1x}%~lPL{K#N=?09s6PrJ8H-N1MgXv==@oF zZcG8|SBp!IyVO?&Q>1^xtwpTrRa3Etz-|gBEY?3KZujPvrri$ z)_V%D?tWYn9+B0?+Hoqr^@DdaJd!C?@XoF#My%?cz!kwEK7CfD?!~-Xm_m>mfih3g zTg|{H6O}d>{1(_QesX6F740VFU;GyPj@s5y4m#eNE41`hoo~HHKa2GrPYL_O7S_?W zcozF6DSv^yk@aMkY`4?;^uX9{b_q9(#)roApW;+{MpG(nwnZ)9%@|_3pS`wtI=|wR z48pNJqTLa4gmE}uida*syN#ozk^ZimZu9QPNb#kgX-Fn*VL&zO{@ECZ%zfYdrNgt# z;^;w6yIYh;#)Y-qI1A~O`Ub7lY6&4=%P4b_1`0wKV;gm+>>i4Y2SGDgqbxG?Wu8RS zxTSAk)Y|HUB)V%HUN5IN#VS@|e zMVC;y_LV_9s86_CH9T7Tsv00@mOT@$7ef5efYld+74t~g)8yf*>iK&YUhD}9zD%60 zKK&R`uCAHSYn?}n1`^Wsp8;VgEMr?V{$y)RM`BayUrkS21G`sdR{lzD)G)Nr6Z)+z zWdb;jD^_L7^ceZSq=3}e7_EDKiqI+ z#-7bOA&!2kM7&q&6Y`-+KRTESBx6m>{4vQ`8!O8fmnq6lOol;T%uz_mflZWSsLOwd zTp)xJ~&HiBl!e)W@JrT=+Y}LQ1F^ zjgqE&JfPL!vvR!3_HifI=Pz;j;@9ahRZs=3dHqNwC7D!IAV4bcX_qGYMFZTz? zahAEcJ|O1`j#STvZZw>2hUKs7{O;s$j|maIYP5z{RBsNeQk+h$y+s3Mc9J(l%@)>H z%B$Iw%%`*KXiYw<#W|hQfr}oe4K+e5nCB5!sctk85l`cCnPL~Z|Ja|BZu%H(D@%*4 zzUhw!*1m4HO*2*GkT@|!puPMpG-WPxp>CA%O&MX8K|%H~>V4N5}IQ`6zgZ;+bgb)r4z^@n=oYuQ19wbjUKa*C?PTYAseZVxiPVLOt zsm{B&eHIB>p^#@7^Z zb;y*xd5?USs%})<>mNHO9B#I-4s1TO=IlCrE6y#B zP!=6sOdfT)X{nP^x#jRq4Y7GT3ZU#-gYp)K{TX)Qa(b=L=|#b<5zv+|k_lRy%aS-v zdFn?$dQ(Ln@{xq_6LRPXkddJ|e&}a9i8~7s?j#1=r%q)B6Lc*F7x(}nmmRx$*&6KK zY?#^%(_2kN;-KG_%tFBRj9DpTKcnpl7ytEv1V7-qv;H{%D;9x8@{du73emJ8`iA>G z3^z&>0v^NTXj~m38XFLwE6lfVn+Tu(ORyL?dUtMY=|8J~^-JW8gs!G0dcwWv;j-2z zSl@`I%z|7fU!gAD;&1w4DuMlh4A>MOT_Sk>c}P+A{5y zOY9ltt0cR=_bPhdV^)}idCQm`qN7h9fOuhEM+FxLrYDm8uT9`+LFlO*Do z1(qecQB5d`|C{ORIvA(#3=x+`xYdcNs?h!fI}$;#VvE?0Vi~bRQ+t2-s2tGX>N<#z zGB98YHUux(J%0VPkbJA8Q*<|#zP-K=RM|sE_UFLqCHDkd=dRDM71)E?RUXwxG<`Nm z70McUP01^>`jo(RvVXN7PuYXtC`zYJWlHz#6+%-|@CQL^ZHh<@6lbXF7^C21 z!klM5!P9!=j6Qn-{e?+xUUev8bIYyEQO7&d1a5e;AOKA)eIbwcjYTCf1&ek(;Utgx z0%MzWvLCyp?Bk!MzV+4hL(XZzx?7M;ja0I}rLwY1vfM@)P0(C8d0n6sD0|fHAe!@u zI0qH|uOk(UsR8Dso>#C~A1l{_%L3t9V@i_RG{BA{rJ}83i9lr@&Myp*hT>BQ&I7bw&1Ein_I@ zCKnQ-?sN#hNsR2)OA(gy!Ova+Ku!vHbFNOJ9HwFpFTQQGl^){%2zOt=enJHNM25RD z1VF`?q{@~g-Um@iPpy2&ss1ra$@?P;96at*Vl59udG5Fc}|}_4(gbP>;CDT zx#%n8TV0wzu6kfS%+e6qNqg@murHW^vUI#{e9IYKp)D53;hrHwtlqYXj6!o-ORi3c zov*5L%JY7lf-KaT0mnP_bwW2T(#jfrtaxJ5>-ttGKqr-ha5g4}Y&=H%*}}neK>B1g zzUe(iniW4*QY3`O-qubn>W3irrfZmf8=FkOlCZywlm#CYw`qoHmX2 zhT-c4g-KYP%SB=2J|*=iXux^rC*^lIm-?vRVtIKTe@fR1V;8`-zCf1VJB{cg6?7S6 z49)66k1HOdy@XbD@NcHT&BxgIE^qcO%k!BC{d}Xe7kHVeRCk0F5fVo~L+|@@_;9}| zp73o>TiJ1j-6VWZZk}AbEo_Vv&$}t6-6k2o2+GtT@F=vu{E>x5_X2+)%)PF2`$tw3 zZ@O$(S}X*_=^uzcN`jj!qXF5e9cenF6g2;CM-F7$ZVuBuKY`)k5le`7$Aw^>_Z@6w zyx(XDe2ssdzc9}YUA8fkU40}$|inn_dl>iY~Hh(^h61-Z9zSJsUpQ2|hn1r&w)!y7iBSU9oEY zZCqVVfq^Z>Q<^Q?JZZ)LK;_LH1-CYExF2_dwgWvY9=2Z~J`sZZw1@Fli){8p)8W-Z z^j7v_5KY$HED*I@fxciF_W|8WRp!YpQz?vIH#HH_g!^?7rQ z*BUh71Ems{$Rw0J!%`$--PZC=?pp#e0yCUb<%s=X4IJls!}gOm-nlo7_O}qX{I{Bd z`?lxAzZ<@a2gSjVa9di=CW5}qvCymECykjt4(I*igSbG?Hb-0#gr6g~!-d8pCXbzO z5&@sHsr(>nPR4ppV?*m0Evk^cHDWCNunsip`Fc#qb=%@KWcs;ncCT1+#aTlpufwuT zAG@*KRO7AaRTl90wk{8wP@bGirH*3h?S@xNShJg00eQ{CFoR0x!VQug1Fg6nIbN=# z?m8Eb=<4LZI#e2}$YL@#(eWS<3)9qn0lzS)-@@u8yC~JuAE)-Q{$q9OSsFojMYnX1L&8nBF~ioeFIxW>1IFVoLg^$d{2o%uf00-;+Taa z>(L;+bGH4%+I`MFtxMgN%qCG_7EpPQzY7edx63??2=5Y4C$Cx4m)~kF{G#jCL-1+7 zf6K<>;G#ya?bsJ6gX?ha2bsf!M8`l6@%JV;q7M<$D@l_9JK~_B9^m{d z2neYkn74L0%ou2D{FzCC_vliNquZ1l8^)((_Ay8K`+WqH8~#y~z^abR2XrmtJ9=T4 zkq69yMwhCsmPRJ}uSlh4p4OiAXctkXapvHeGMxlFpGKdX47_-vMiBw>m& z4CVcCI%zs<+zxVN0-Asn^og4={61udCE0MvK1M(|c@o3hw z^K<|MGgm056jZX%g3_vKk@4F#PJB+s@od7Y_27xvPMw0ZPla7Rm{)1Ocbj&_>nrWM zWRh2?l_yWy;ntvi(=7YLfC=Bcev+{Lju`8Y9dJF`Yw@*ew^$`;FGRB@nhnn?CWXwD z_u(cxdn*qM)sHcyL%=1_Z#Ln&KLcK1O|+e>j85Kxk_{r@IyUozQPTMJhxf$9=K1mK6^JMD%*tll(LTi9m4;wtil-+(w-2e9GUWqOLZ)rr0vfqu zh*(l8GASGAaYPAj?GBe>4ti%{p@9e4ILT8LM1SV~CFrTOVArA(9Sa;4f(M!zyCjAb3yYpP7U1Ze)D z!0L8fKku7#SKc?gpz91EH^y(Ci2LgqAJTTEHlskF4u7SuFk{a$@ zAzHP}rGrnJL5k1bM@z7wZHJ;*Dv^=wIadC0L-#H>rQDqNNyNFs*Ek4J&d8@}OU2X#jv^B$JfZ2r3+v-A&^3@WS zXBu5OUmUCkm|si3@wLQoN52~s%aik@C-3?1;M`=a1*h6k3*0_bMfZmzhFPcWu%zJz z`a^fftF758<0qkRM9z4Y_u;}fYEeXNH-r1$x-x-Egl`6?h!+`O>cvasJtagxiLcBG zr#Lt`PY#I0w8Ck(g@&?1j&_coqF6)IrCwPHEF`k1(e!6A|PQ|KV_mQS^{-<358I}Yow|fuMqb)iT?l= za;Msmc(Hi4){kZE9t&M-9qJ(Qs2N7+mGN}$q1?>8Mgpy*Yq9$GJ;@>~rvfHhch28= zlE>yAv7T}KuGqdy3L7-J`*Stf20hWkT zDL)AVNkR~D1d{dQ?*A7thIp2S2$n!Q)ay`Fq_ksIYo3vQjtRyxgRLYuJE$c!eTYJJO7RUL%OpIQ)=3Y^* zRM&tNrV+`8oVj5<#OTh~?s6jhrQy@%o-WvFjw>j0R<}a$Tj1jzc?%6^*yYfw*xCHx z-b@7%h6->&rJ~B>RSb?ZuWGg+=Vf!~P5sk1p*%$SDLM6p)YPgmT`hHVtKe?ryyO)@Fi~ zuc;4#R?Kc)cpX+%=@3Ej%;YA)rydUQG2DpF$f?%&Je>W0aD z5HuLhLz6ue!BwR$wfz=|QO*5YmZIqH2a}mpDzmM?wP}X>)zUwy8qucQ{a*2t!%C*i zoDtKjh*p1gsyT{ZwJjg_7UWhEGf63sL#;_ zH!qZ@&QL7Obx~u}_vSN9!TDb9wXGPMn`Xw8k;gkFgo=$WQ|Ah^ywO;*%W{$HcZ==O zL!?1gWi0+*ahmUM3St=>YT+W(un`AB=4`9EuT7&7j7&S8fY@z?u+aEJMcr*O(8wqfO0OJ0o|ChD?pGG>Am%cjSCF)1ka48~mx*rC? z$TiL9=+yrJYXaN#C)p_n30lw30r-RT@h@} z+=5aJl$Xf$#B@D&Wg3g<4IeBJgi0U+cDaR6YG7|T25>A(;3OuGVXVb-Th-dS z09J1so1}fu@y|75dM9gO{o9ZZGF$coCy0e$IZ8!BCtomrrLat zuWGtRY#2P2za#Do{|!sG!NsOmsSKSR61REhTfR10EQIY`C8XjB?Nr`Hn?0b3ENe^eEzq4CB{r#{ZF_5hy-5>v4Z}yO8%cx{YNAS bk=$^<0jH>wA*IK>KpaYP>ax|+7NP$IhNrh4 literal 33938 zcmeGEWm{DJ`^F7Z(ka~{Dj?l3q#&T6AfO=K-Ce@~l9B?_-5?Uu9nw8?cMaVzzyR0c zJb&kXUoYW$@PELz4X|d`%v#?#_Rqc_^Zk>e93D0mHWCsN-uriNRgjR7;g3I<=)hm{ znIC+RkkIfgq@_PuNy|ywS=%|P+8Y>|$eGxhI9eE~$Vnj~2}MMF(J`m_LL#10U&;Dn z*nc8FKL-Dv|7Vr8%4onG?B1l(W`Ql%y6Vl3zWv2Ci&wnsh+GR6agsNL?S(6`D-T-j zObnLA2Vv~lRiCoa{F&j<8@a48a;&|2-pa<h-^^a|cJyx|gOeYp)*6_DVm=A%`pm z&ioeYf4*jdbWhqB+pNK!OUh@K1^^RMvx z&iN3GZN^JYGz_QX`AAXz!V;F}12TOA#mS0{P=U)N(ED*dwjVj8HG^vNQ!IV#fwp)jX<|g5 zWP5~$797i7h>TOS#>un2a;@)FGP<{61)oS_o_y*Omy&LSbI_1v96ph96 z*uPjCROV!B@T=XR&<`Ma*Sj}jnxShUHm>?4VyybEV(4G_tS@bduMRt9IA%C3`}XRr za5(BY>N(ImWyo1hcpULr9hT+%!QQe+P+rK8(wt!zWi}2J``hu?SV0L!8WezK!0G8K zSWFy2uG5I#Q*LKm?ETx9yvS+a_IKsfs>Em6cyuOk{`wIws-o?B0ONZJ%IASLjh+Dq z7x}Ib1+lp@ziy`!Ytbi$U_CIOIElnxdwg3(fj=qg` zL+mo1*JQYxZJEq_4X{R<(R}>s1oKU#axWgCzjp8M@5tvp@=TmE(1j38B3GI&-_F976_HMfgG!`AHsl|dV`vwyenc*2)fG;6435qJIJQWt><1d6LQj(Zo(TrE}Fo6gE z9D*Ip)|D6NV59RqYRJ}H-xOe}Z2skO~e~67sJhK_W3FQk{5z-58KI!61Rl!O_%A(@Jt>ThakpL`%_OLu&iK}hj?923*HV~ zUgK!Dxow9*Q1bi!!~Mz;0e^Hn%btGLvL?gQ`Yo!nQ91ggKr+qVcstR*i*Cy{wv7h@ zyaQ~Nxl?(+o!2coTg|%4x-l+nIzx!mwzpF3#0L~ahiaER2eiE}Cbwdh#JR&b8VZvv zUq=|M!C_v4($6g2K_)YHt#|THgWPgE1U_)-onFQ$Hk+2~t-K`DeFbIZ zxK~Q)+OZFM_ooRa4aw0)M87s2x=7V$5DD6jeH2|k%c2>ok80*Di$mRpz~!^1DYM`x zp|y}u>mYnu%Vn7eqb`wU4B%F{?)YKQl^Zjq+DloiM+ho@%%*}Ap^Zw9EjkXcA1tr5 z`?HT|S^tr_)-VQFyc4-N6EdakgLQr4Xd@NO}Fwe-aJPGVWH&59*;&wtVc<-RKeH65|+G(DsiRODn@6N{$;0w;x>Kzex4`fztNHA&-EXx(^Fvo)cr z#IO7$N}^_&kDYq)WYWZvE#`PgL-Cuo=^nG7D(E)TD}u0o{=_@j|6uGpxq zQyvi85(nv<*X<;j6zzgOUI*0)*N2TqY%EQ&~LJ z9-$vLXe*8&cYAs%1?ir@2LIx4Ht7$9@)%)%E21OMd_(R)d{nm{S<_T;&itKHRpH^v z=V3dh;?Q^uL$2R-h=023>yXG%lSz2-4#8>m)raOxH@l`2S>XeC0<~>jJL0mowOUo- zWc%kfaFkItzQr}S&}w89l`N~<#+N_iA|D#h4;SZ~uD4Ru=oxzDYg50jDX1Yd!Jm4H z2!;<@x~Z(b-apT=-6OtmnEaw%U9YU(hC)daAXzJuS$ScdjXoSXNAdDA&IysIt(NDW zvb6fzZJfHUM(AsIEH`>TA}}APPH6c19bhedUD9&1J9RPAcs3%j94VXaAt8bd-_v{0 z48`@f_#1%rr5UXb=0GajJqU>*W8mq|D{SYabzkv&Dfq2*JyOIvS#TNb^j#Us5KN<@ z>Ao7M5UpH+ki}DF+5P;p<>CHz?Cxq=FWI(XN51nV*V^9{hY_)>pG!Uu-UGMv4{*6# zj_W8Q(VX%$*SR7Rw{bbVG#3+|T}MWEVHRge^_1qzCW0u5dv}&y$*JEW2z!BgJoEPjeW#zHdpgPxYPy6MC*r*v^;o7{Lp3j{N3lFqLo8oTurIZ;ntM=qdkTx*ed~C!A*lSZ=$mOi)_6z?c)4k*l z1C?!#a(`DYJtlH#kcTnM3YlJx@D_d3LJZdZ{EM|X#54Mw*N?_pnAWG)*4SaX4EM z6`S0<6LE=TIq5y9E?m3r-Sj(+gfKNsXAt?FKY{pH+ppU1p+f7P`F^WW^)+=TncvnM z3jFN-g1|Wu0u>TP@Il~s_P>AdNKYi-E2w*p8#-0YrJW*F^X7b`90YQE;%R<8FoU|( zl=N;cs_0tY5T&G=>H0U56e)y z2@;bVZKI%nuiK#JWL)?~@!X68hKblw@^LgS%CJDE3+M8s&<-}^dtP>D%q1gGs7H+^pQl>C-I z4+3P<=^N?Llhzs77vZ-XS5@#yc%~C6dwex5-!6Tc=tky;RS~Mu+JUt)WwW$uCTyw9 z#^=x-?Q>-#!~7&usokXM)>7 zLRBIO<(bXG`LvE(+ILwoGF5WQrsqbsYl%W`X2wwKD);o!HQ8G>9y*Tit{ER#>sHi` za}71~GW{p0>O3aI5zGVbYo@_^$4uoY3xVe6w%PnxCbb;4 z3qp|I1C%4EpSiL50B)@Whn~7^wBMgb3~fYV$3}}LSo(t565PL2$9YoaP;a)Qv=PXy zj4@LhT0q0Bs@8ZLwAv9o&%%-Kv=qK@gpj2lRnmS?Hk(x>_~VbfpF`C89kl+X@;h$b zB(HOXg!Wmr6u)?OWQjomrYgtrb*;H&1TEw5c(c%N76tArZW9*YCC1zspe2Nf`IYa( zxWCITxTgQW{;02;Dj~JOQIm1v!*>|1AaLLN)^^)fYhp%x9Yw2qp+yk-4P8dL>XG&6YTEu!pln5ThqX;^2`7(Q9t) zuA`@SbJLCCN+Fu}oZseX^O_D)5Fbc|wAOV0;7ha%;*{DD=Ax)u8b!QjNGkA7JmIuk zFyH+P_3QX*;I6Yo*_SVFs+-)F%GVtsY4-dy^k=Q@%aht@o_iVF`%`KVmov02Y?vV} zPF>HtT04CMxrU?j%z#!>SL|CPyCDY{*y|6iu6fg4`R@#t=+*~rh~34mH)0P&T{hlW z^jHb6hI39}jp>VL5PER+&r95%?~IqKzV$fknG3M=izM2k&<=4!TddqL;}R{uDI>r<|;Ck%Z%xF7%Evn-L6U)Jut*EG3PR^Q$mzIHb%(X(8Vlc zTkpEr_3hbZs?i2_c&CAcP*}dUz7J=RuZ+|vxJbwPEu%c+n{DLv$WfzJ5#T!-@=K+y__^&ywx|DJsse*lS}1;vSAuV(;}emqvqEedeH{wzKR&KKSmY7 zKjpPSZ^J)m4E8c(>}RteTXC(Uv$5->{~@3@m(Jm;;^-WIw)Rk||BTGGcZ#G`c^9=?uffC=Op^N|BS~#3Vk8EE?mD1t#^h(o{ zqz6}84ugaf$HL#c`qM`rikBUn2pKDWHUVc{?>`|^pJs@-!9UchV!PJ*kIWU4X}!m< z^CGo@?eQ`eT>M1#!C7sQo?-%f5+0Hd#$6Jv&3qb#wZtNd=lrU$!~F(UsQf_hu|c$_ zQyf>YgyWa}9LjhT&bx2=;~?2mWz!^kIc}o zV{>jbVLI7V_wY~L=c5b1y?a6eyO9Jrj=pj$`V-N6{3Py!e={(3;fbi$>Y|RK8sbke zzn`LVkiDj;I~x`mX^7$O0$wk-TIx{6f7k2QGvwk6z` zLU|0UpV-`3+6Ycvc|j+LP+b0YID2Hul%saExMe?{^GWLlZs*R-qd z+aZw{Y2aN>A*f%V-V+9>4v~47=SCc{ZyGM%LS8t?ieEG2DLdki!+1CqdK8gU6?UDJ z)Ix5Z&p7P$a}05P<91kYebRa#S4?+xZ(%_kGNgBUsB(KKMVZ8QRMRBpLliK(-_EHu z7%ynHQu6bv4Ds@OP{4`8IqP-*IHQ@U#sR&C$yV3BAB4626%pFPnmor?>?xKKD`Hyt zlIb6-M)36(Ns$6-8f*!MQs(gvdH$@Dq=sVCjh{~OGC-3EVNcOpc#&V}{w36hkmL-* z2n5-3{zT$Cpe~O#G5b8Sb;%qexJTEg991<>sb@h*R@h%o_F84Hc?+tJgm7q0^UN5|m|P!{sp>+hK}{{is;$*0Ja@E6Z-*#8IGGm#$QdM4q^ zZ~ueqelJkcY@-)bM!Az(FbZD;jvX03YpZ`^;irm38i0iPPA(Utny_~)TGLs^eR&60 z^mf8zB`i~OC>EJknGj`?@JHllX}O~Y92Cbe>?l#a_I!l~oVvHot(>mV z?{EbLhB8aJfdXE91pIt~FADqM98rxb>1Zl_JYE4FYN;jyNZZt6?`ZR*m8jU}hj18twX zi}^*b#dbEJSGu=QBXaCIiLi zpf0?#O)6^!(;RL2eSbm_B3{e(58nAB9PwJ_&$)_I)9iEX_*OXpL>t9lOB4l zGNr2@+A1J4(4zM-fRe0hLBB2m6cMs;wq-lMf%TK|V-_dRMHSvsJpt9ll~CGGf|OQyVgFVEz(_sVKd%tz*<0G{w$g9y!(^;AtC>^8goa;xmQ)KuabvuT~VL^ z_cy}AK*_N>;#Lu=D@~!D=7p0*9Sq|Ykx!@sGy4AcgE|^G|4yH1BB((9^Mq1k;>VQ$ z)6X^xaNBCxJ+V0co#!&LnHFLDkM!eI-oEDeSWaKYEJNJ8|7`fZ{UV(`8QwJ-et>}k z)%*Y$B}^%C-1w-_&Notqt)-p4@T~bN-9v4|D6d(`7hl*1zKTK5LoN8Z8{kTPNSY+=c#SNNEUt-hHngukDa_mwIcL-XECxipU|3YmMe9L?P)X(R;<0qP*pF&xad#J zV}!{yTQGT)UZ$jR!g4qvE0TA(Sw=kp^Ygk9wHu9}XbmC=4;uS(S+aZ8zZJbazU6EP>?J~lBWGs+rz8~c9&d(=Y2~! z`2oT%#lHM>< zye`KK*^o2qbOVluIW@y435yr4K*&g;`iT_)b=LHhkA-k0i=Or}+N>foF?w<+JWF+*v#2pkHlgTFxHmO5zfFmt ze%SVmYhjdyNogBze0+JvPX^7ZqF~a~wZP59%JQ!nd-nI^1>tMPI9_9CvXQ7^bxp~8 z%OyWHT4aB=X8D00F@L7>+&DNxqn#NkWF0Pie+HJ4!yMg)il!7X_Nw5u(l0GSKP>O5 zWmn^5RX~F>6Byuuu$MRQL{#i(t(d?O^c%t87MH@D`K{lsxj}V-?u%TgBb(?svJn-w zSE%?xZINv|vqme6FDX&camxkibRG$HRv;OVRY`UHljs2g0B11X-l@0V#C>_TJjzZQ z8@i?-*OkjOXrt4D-0-8`%k$@XlQ%Ug)mwA$&L{f~+?|8qexcj_%6Wc@mNX(+-eE7^ z9vY`yGOW|!wczMWo6I(XyHi?|b}%!fci7|XVkH4vw_6(if-~4#wkouTZwY3?Z>0H# zL@cvZh2Y1iU?=y`7}3}Urrt84(tL1y4SuubONe`)lwuQZoC5&tYG|>S6=mdVhbEmn z3&I->7lP_xNoIPMMS1)0g7?_C=V(g4|IGy??jci}yy@Hjg9n8^I>b>cdXR#2T^m+qo7YU*x)5*B@EctlX>} z`s=C4g3u@Emqpu2gjonOkn&4xQ@r7O*bdYJ-=c67@*X*?jsKgRhJ%{xgQ`3}?KT$-xT^H};47|8-35x+*H25>-9A>!k{!Om*ZTZgOM z97gexgk^DXgAiyBAr0(jAe0|P!oHvSxO9}mt-7W@IdUVexwzYE22&g#NtTxUwK}=s zS93o5mlwN}15`&qosvkd>&`IQHjZRutu?8TYxvhFBrHAJ9Wzbq^SV~i&Kv1R%cpOwu<8mMXHCP)?ElB4O#qSq)H4KYq+<d)>c2$0qKL zax-I%h(TmB0%O1;!<#$s29y z&~Fi--L@G9gxW^q94Zm?imO&{i`@@kQfIhXIff1R@1ID2p=)Dp_g4EpcNjOo8lZlP zo#l^wdV%M0#%QBQqYb`FN)TK-BmXANOxsk=BN6<*_|zG_BML(`nK*!NE2r^-(>~ojg~xZM9LO74946jc+&{Gx#aMa4khp zPm31EY3*e91QJ(J@lT}ngkW456ziOq{2Z;<^OhTMAa|O=4CiYvo8-7rTMOR*{pG|4 zz7CIL{SwJZyP9pr_mwkW1N5yISih!rJ|Vaavp78GqCHOrvZywhf6Llchozqus&`w0 zRLDv*^{7l&VvAu8jb%-z{ZlWGJd@m(y=yfLzrVEZ*iV1ykQW@{(AKp^T*!R>)O#^- zqlZ3pgSwYB0AE)bq_>V?xh z9h~e#mLt8K##I};TFmTlINIrISyE!QPYXj;lXmlY90qRT^n_9dl1{P9Q}M7Rf!m*N z)I;XEP@~!%#a>cDsqLCZxqitJ0dAO8v)rLZVLqI_eh%uvFiLSO0v^f$kw#l~8(l1Nk~=3Kys(OPc-Wcb|n;5cVR@ALTZqtCJ^BOy^d z*J$Rj(VMY1>zPqjV>INJqCyYQFp7s+9-Hbg~(Dit?{KUApmaeYq6!Mqp`lg>k(+4Eg z-SpKt&i&&oMuzKW_R{O-tEG9{*mY{JDKzox6{22Pl+bQs~pk> zfo%(?oin|LKq(7u&?ZGb>wx##Wl%7ne?~cMf7d3ZcqfF@RfoMLgT5)$xteU&U_s;k z!0a;wF2OsHRiH6-rjHHDrTvDQ1dqIL=OoZm^X+W?1d4f6d%8kC@>Eya z`Kh?Hb3g@V-}nxMPPcWz^hc7z{Nj)^fDL7a!dO6S)TjArAIL%Fz(7c?p+iWWG9G=R zWT_mU6Ubo{tC?N=(ApPCw)BaT-NEmkf3R&@)3_((FoZF(ykK^;(liRJhUtJ>9|ZL_ z%}WCxo}T78?F5XyIZ~kRFCOUe1}&XIrlb>sUALrzYCE12;5nRjD)i4-f=&rm$49Tn zrdTuVAQ#6w=GVW;OdC%PZb8FZ2rn|5bRmnXEazNO`8|d0wZ;)X;a_6K!NUntU2YkZ z@X%JqmfJ81rCYjRj20H8I~pChU>XwaJU7GW#V6$2`XdF8{`(NH?wbKBjD^?zctt4b z4xhbLeVO-9R!;Daf*dD>rXDCUua-_q4pO)6t#f`ZFReD(NM!zRLC|y)8Bgglxi-GK zy_f94_dV1_`$WtP#p%C}cHFNy{xdUGQSC3COb=BW|{e8EI!52352l z*W*{ru!JB=xMtWszUZ-}(`q1jvfGkJ&-woBI9m&R%{2C-z@PGpPo3;z?Qu#`Lswh8 zvKl16?Che52xvopH0ESEfp1|wk2FAO_LSCdEG4izVVG92y-&A=;j=8+Q$U&)EJYxz ziXARpcx-?(;x;*$6T5dk9HHl>&JSM(w!uw+Yfuh&5a)6G$Lk35oZS&CR3z=1`+^88TwURYKe|Z0VU-o z9{CSnfy7YoQv8)TD%RO<02nbF`D>P{=N9lLha;DEP6q1SJQoT5|3{nxiOhkb3J-N* zv#;cJotyo8mjBYGgeXJOnMLR=9@eZTkMQXqT9!$L0%0ootnmKmzx*nupQ1mYq6=8C zxu5@ckOL;4bu=IzJ%KgO|58ZswNKu-2jN%OSrgSH58#5TX6zYUNlSvp?)n$h*Vt%J z-UmBr&Y;%=9{cSN7kBN56_F;)&i~;#XH&G&mK)16K$g3hlBs&c`Y8p<5c~)4D7@mX z@dOw2@9(c#Q@jrAd#vj>7bvHJZdXcl}nG-O#^Vybg~IL0^ZF>4ehHVE7v zqeOv?jXqk}nRa^`k=nd5%DSVL+x>Ps*5Bpd@{T5p)zt((dT^jFlYEUU{1+CIkop1X znThnde*T@*m41ghry>3Xv4x?&rpMffnJ7J<`45jr@MZJs(3@3!Gu!S-f4}tOyMew% z6MCwh<$`I?A>o%Z`{?rCrrnaR835On^WjnOH6OJx6HlMyiOIRVc%ky|ZGust0TAXo zvac>>qyPJF?a!OUwyk%rji>1fzv$doka_J_B3{YG!JDPU~#Q23nh0PbIvy0g<++BbTXx|yp*H$ATcd0lziCSyO^gfa&L zg`=hBvls!kblGD(|1k-MQcv)1QNbXv?OE7gFL>^iTvE+GDi`ZNU1T+*EvNmgHjGL} zN{mN`YL_D)Np!G~OD~%drvrGjq99jtZF|4T?*Qu>3_UsWd6-A668MyZ9F{z`DNDDT zfw6ed2-GuPdU^A4HlN4Lnk48ftj9z8+iFP;FO&Yjvw?MWE1Y+@ zJZNe0=~1`) zqY*#`1G)eNiChDGaUA+yCR8oaQC;iZ?WzZM%l`c$hlG0c7x=H)R)!CxF(OPkPl^J? zy)Wi$zglID?8~-J5os;u5is1)e+iE_0m*~|816K|vcmwe_&wa{wyzyKd=Rrw>v~`M zj+GDPB*-Ay0#f?xF;un++5*axCGf-Dm8%km1mLFO8jkHt;kyOPDxXq4cF9b;<(94d6kDF{44;-o%hd|Ria)`A7B=4o z293S1%UPY<4G9Xx5s+W$;)?6I7@)~|FPV{8xolC8hNdDYqhFL4&m%|c^7CTr95$Mh zk_|mE905`nv?Fgj-xM@*)HJ5aM6pK5dInLNmSeYrS#eAf6OInWj(+pzx{%%dtnnZ9 zY9i`!8DXFS;6Qj1kf0EeK^?b#mCM-8Q3wRD?go!nJJ=Vhm=>E4LiTjxBRkhgE*fQz zX|*fZ2JO3P)!;2qDV(BjuJ-lLf&1&-X_0F{+QU#tJExK2s`Qg=$;t_Uka&Q31QBMX zyy79jyWwGx4{r68(t0auQXnl>1Rt|RI|@r&tHt&Eon9+@%+C5vF(cYJcbr@~m=^$l z9+WB8={&JRcOE$f-B!F#iA6*BMMufkpBUk$*~L}=vj-Fyx$5~wKQMc%C*a!T2PZY4 zUjB9gp+sPKdNr#>I0ki&M0-_1uiB+TdKlFIoh=($To0 zT1^Y-3N@bf2fC@hI+yG&G4h`*{h92rxq25Cdl~K_w^hlcn3{MAI-}I0gnhO*@U_!# z0VCiiEyh8yxnG}c&PN;E67$(kIxmG=?6(DrdP^6Er;ZE~MV#E#d7S36eSPtny?i<4 z^t3CBb+t#{1E0kL9bz$~GHly!Hh25mY(m)n4&cR=*}3Auk!eW1FzQp-i{d_=+x1vT zde!)t6+dLZC*2}H$(mMSy2C<#o*!>a^8@BLj0I~HGC6rKP>F+T?PM3dJlgDt!Q%;K;G(!b5-~#fhOTr7r4&)ST|?E8APtHso+8oO13=l zAf?mOIPTB2Z9gMR?I2wAJ$yjLlMwGZ@59MAzTnZ21mAn$&2w>mrP)ZR)VLT%B>~%j zu6`J(q_QZqRUWQl1o)ytVYoBy*xZ)o=?T6ysKTZ+pRwA#_9%x4Y_TR-pKU7h`r{&Z z52|2STVpio)kbyz^E!~ZGay*|Y7+NlP@c79qSV2ZZ!0`)4~vPqhEvURV(|X_SAI`Q zLCVS5Ll%nMTF%?|4WS|5F*@CRzN_>51dT=8H&^i|g~`}^oa|83lyK6XNSmKQ>x97F z9R#e1St|HWPbzRNPexAEH;*D~5YKwZ6QXVh->5`Bjmcod&%(=cxIURB;^{scIa`$L z&K1pTk5;DVU-;mnWxO$6D$3c$bnv2#p(;}1D(M67UTxTsc;#B2Sn#WW$SNuGtQ~n9 zrzfVduM&$O$5+SQ;}$9TEy4(QP4VTFiqLx?;wI1$gva~1ZHu}4gIkWCZesqgURe^^6^D)X*?;J4xA9YC0wwb)IC0fkwlX4gC3vhE$Ly2!-J zRbzIJ5A7d$_1loVI!F`D%coOPB4dz2TcO@MO1V*u#Zw3y9*HdgQ$8xcKH#b{vYrjL z_+4NEy1-=CDmo$Ed&C_SQ@W#h{u6baaASvB%4FjOQ{;lnQfkw+3fbXb^x+XjoZb-@ z9{>l^mwGR=;6Ik1Th7ua(yq1-r~E2_S}z~)?EZ-j*a;({31G!_Eb$hrugAL%!}oIZ z-akK7Y#j*!phN081H5azwC^386f>ks!<~ImjO5RYV#pJT!wUNzP4$RWcgol6G){w~ zV>L+vIJ$d}a`7EX@s0fZ$;qgL) z6A+=9#o?*@8$%=_NU5BpVH~Vt_;noRoSBnP9GU8M7$+^?#*PAp9mBP7(#mx0$twvM zSX!?C-I6#1L4MZe<~g=!2H`I)pe9OZ(}ngC(qfI8aAB?T{~X?t!7TH*#w}sZ5><|D zsp?%j=TRUSOP40rBsg757_6n!l|J3aq>Sa6Uygm1T;tm{aZ)uWKS_??vo3Jjm_b?+ z!`tkBkI5(hn3ryreDZQ5-3faS@caY_#Nn9+fpS zDXWUXxzzAaxyY#HY;W>h%zm9$pX zapM8T!=lQG^W0oRonI7=wDf4Bo1F+?p8-g_+y6@2K^X8TJJO~Az~hjbi=Y)`u$@qA zfH^z~v}TY-mWJ8q@Wic)*M5A{pH|+Dz62(xg6tcc8EypOYaotbxOY8W(*zpiS(psYF4(17zNDr}Q5i7ey z7@EO5@i_i)61{hRFnyNIe+o#*aSp-k$7RT)zt(2$1@EMLt4(H~bAe^b5Aa0HG9Gn% zPkoon2y(+{fanIrunyuoz&%@pND3CpUv}e78PRy19`;UmV8TYlavT|a$>0#8F z1Id{6yyjtFr(TH*%GI=oe*v~AeB9l3PUjay*^I{{G{ttk z{(73pP$El%3>j((atU_Dxk}SLV`d1$<`+)L@NH6%>J;y(wMkn3(x@=A<9uqU%fyLI z7JCC^|7=Wo8_KB{Mcs|XsnmP{ zsN$8@rK&SSNm1GHEILBjq85Nz2WCWt<2J2S7FPrA!;2_{&0zb(*Nm`cn>lN*nnwnA zX0Y;v(``(AYn7W-5x^0S(X{i6k4`SDc<7rBp2~0GOGFsJd1#~vrQ%yq;tax{pgal{w zw<&3L)j5B?+&e2ZKu;$^@?Ap{WPKlfGjlf7>W+}hJ!R%!oo~8{& z8J&T)U89|@kGM#I&HEl%Y9l)c160c$lWlA zMw_v>jJab?5{;d@1WHLmCQz4G{@*}0XpOv|_+l)93>T`fTcG4yItjwckg-cq9ng2I zdS}0zQ9!LA(UeS8vbI_!*6(a%v!gmZ^H%%(v3T_WG{nC1Mdlm-*D=`MKWt5;Rd2uJ zZ+4{h_0n|ZVRX~&14~j{B!(UbY4^M%?7bk1qp{poKe|Fb!^ zwF0HD98{;t1AGg#YFJ$L|AUK9q8a6q)pb3(Aj^Q>#$Hy) zRk1?LD6OOz)698xJdP<&)5<3wu~Lxvbl1Tz(zPu9@YSCJqf8?3(>Rt^?nA`2A-0RT zaK0mtg(F|WhTC@y84&T<&L6K-%1Qu^&b^@z#^UGU0}7)r=j1xh${wV5ZGNZ+mvuU> zvt9Q6NxX-c{xRd`tp6~O25OWR-JruDrQiV(7EO#ZY2%GOEQ$QGyhqeO=+HxJhS5CJ z1|*B?(zRckQ=6`w{m$;`wF7kW)=yQ%KWAr%SJn+X`6k`=L$zagFUY+qZzediI27t( z1#Og}8BW!=0{4*|)m+7*Kf_vDPGiEvwd$n`ltd!J=;p;47A4IT(%gBu)99M(H)0g_ zCwOWKN3#sj#p^@GJwCH2ak*uUjkuY3CQ~tVD%doy_irnJzi;#-|r&V zV~c`mgakjozP!xLN`UQ+IXeS&w2;^!AqZ~Vxgj$4P5s-E=M#9qtH*_Im6+0dfKds8 zFQG@%MgZyUV3M3Bf-CC|wQ+uQ-9S~>qxE~Gl=Sk<*j|`e1)m zI3Z}OP}=<>&rfigq6z@GL+iUuR&5~D-by#(MRfO)NiJdx1Q^wXb`9GJKFW22Zf>z6 zB}Ipb+1YC6eBWUQ!>lf^jeh!&iDwbO5+w?{&UkPOyB>m2$2kp!S)^ADe7`?`X*Xx# zEV>sC&pV;Yj)h6Uox5wUzY&)S`hd*MH71~rY)pg?JS;rN#JgH(OKMEssk9kK?2QEX zfXBiISh86F3~~D~k}igK`yeoD9E+_h0_0R}#ofs4AKk)$h6ZPPut4FXKPNU!^E3B$ zWt=;FJ%Nt#j-~rY5y7(e0>uv0`?!GsBH#1cnO;<`d{-Rq>>XJLWU@Jqb(LlW zsau8ilhY~X@6JvSy2HK_gm%9Lys7OKvMrgSW3ZdtWW{%%i9%&le>{QmQU=^xpxMYu zO~>U6P^|lQzsq`!qbiMrBysfkT>zi|Q5bvji~)59 zjPR<#*zPnTo4=H=3#tbP5*15bTV~G=a9+bs%=sMq+7^cxqF~m5RM=#Z z!l%Liz9r$^8~xLbqQL;HqI{m0t~WU~-*-4}dgy%?A{S1=%j&n1FS+V~+qxnO~tujfDQOD_kunw5SXZ0#&BM*C&&t0X|RPUsdlTufvws$zZ(MDk4)lLLs?796FO6YitRC-^o!-k^9{KbfbI#fnIZt~xX<(xaDTpg z0BO}TrtHK(X{}F}T3=)wg&`k%9?UUo5(h9lTA4+@X05s@Q%Z34+q&33#@byLvA-otz$D*MRiJ~8M ze25ixiea>2L!iISyO`;N>&2Tp7R*)X$d_`jo$b(OV)|FffBPAH?k*H7VQ_z?*?Sf& zfoLD(9TBZDI9e)n;oM28>?-l_uw7+oRTHsN@k~B?KMuEjZA&4@kr2Ys)-u6kC*TGGZv;KfwT3EU5-mljgQkwxT0oPQ(h1|cE5{zGc=0o z%7uZzO?oj549kga9{}6Y+}${jK_V zsv&}M*ZWq#BB_5u^F_jY#CX{EQMJZM%p#7PNd4T#t-fB`>7;Ljm@@j2!dqMbX~TI* zt|KU^5BO+1=qdtooqeO8+gL70c+|f|(t&|Cg}+%gAMtqV3ISPYKVM2vD%C zlKFk?lFxzcb@~6ach-MR_Y2sU25C@wAnX=UO1eW3kPr+6X^_rI*O-6^A}s?Pji1 z@Tu<|aq*4Sbe3Ass(dKE!`@QCmLbGJe7ug>Vu2cGNjQHJ> zOmNK4ZajPQ4jR7Ul_jRreG_=PwX+0WCu4~9#KcS`Cu~)$Vyi9&6n`2=4CR2ttcIp>cIKV^Jx}s9yp3=?0GyS6hudRRD9GOkaP&dq=Jg(H^}Be(f7lg-_^YL3mW;x^EN;yI z^ibK_$X57Z3qK`(ol@`kJ(%bvyDC|>f!;jw0gP`sjXKBY_15r8Q+N zqwCkt{&7-{qkQ9jRBmLPFs)^mgsM-t_uDATSNgWZsdTJEc0kkc1E8R2$=hRkuCz+F zZ0X(n`lAIhw}%!QBBRIDDZ4?Rj zS`CpKKn3)AXO^2J*WDj6n)2L>(IK|^Hsgft45h)U z-I7<+bcT2IYp45Tn!pLe$I7xf32~MUElt~*iBQbWjNvUKSN8Y{p+voQr;khbsO%a3F37kT>1F-ib4SazY)?9`!JI=vd68|MUS-ZliFRfZo zK0w*TDHD?o(=J9SxEv%K#^uN@0i35|N*s-WSSMx`!E!1WmKi%Eo9rL6iJh>SSd?0v zb`z0~y8O5BG}3KVH)${SGosW2akO)k*E3%fZ2Sb*)|V0deg~Uooig>HnJU6#$ZP2e z^KFl9E|>8w3b2o75tPo>APNMG;1s3U-CKKKG(yYp%muJzO-_I&Zd7Wep3tlAE191k zs=BDAfkKUUw_PvonA@U<3)t->fUkImw|~q6j}E+`9`pS#@`?!5+qMVk`H#{A_mON_ ze~U|!(5$-7QdRUZ?TtZhg-{}h-g>Zew)3&bl;8xXZO11#5s<}EY}cWrjbl)(MkNq7 z^BE?)`R0Rh%9!5R_}7-YFNL$a80QdZAIzROZ0duTND873AOz6eQ;B-$dWKhAz~0yO zo#qXY1(I^V7noIFz9iAx+#&w%-WK2#Gac5cY%fMNXMDqx4Zx7Mmzwim7NdX$8Hvi+ zGZy$stlpMvq|4S`)6ulx_WsPMP3HC@Ca%3^X#X~AODCTUYtfL*jM@{_7%g^#|9qk9 zp;(v`=T6cpgSMtccmn##YWB)i-1KT9+yV?sl}S!2%&L^}+_le4ZzE9VwB`Z+YI_!Jd&*FNkHYvUes~RKl((uRVeT zOE#`FS&WB$M63~5ERg41?vLgZG_#5&(w|$JAoMg<4_Qq#mcfK+zhx^vqSw8JqHJpk zP)^!3JevimaKM9o)N7`%ZhGClu((f|GIlnPrnb!nc#kM=;Lmh)2FgvgIIgU3_$`jYpm-u5wDdas0M8aTA`YdcG7nMCCIy68e!@nTu84Inlhq%}Wx}1y$A@`}JtuPL$DeaKsvk zm(wJ?#@VVA&fAy4%>n2^&G-Ldcw=((DapI!=Z6?122Z74#Pv%n`*%FQ1ZI!JaNHq9 zf2LO60^_@9e@jKQ|B;ILU9cW9Yi)FOam|0v9G+0F+S4s^iGXgwv_b*-`SaU+FvLbS ztTWwL%zQ)jK&=VxK`tbMrAY>Zf&X(-SGdn)Rbu0hQK(J184iM}ENtjM5^Pn=)}H2H z)?3;%l#-m@qID4}w>gvn+hO^W#(BgU>kOLz?Z0D*{V$tW9PiDBYayO}$rohw67JO* z9y>z<*|48nv1+biTBMvEM8qWbTvyf;*w;2et4relgCVX5rZjrr(9y?>> z$$6!Nu@}n8gB@3Vja11kaTc%BZsG7c?G0si={-#jkMP<1kyZdbDKZaf&q#qiX`f1s z({3l>Z45nEWg1Jc?7Y}@7xxZ|m&R=3#-y8FN=P&%+;b=g;p}j%A9e_PM(PMCRQL?Z z9i;#ui3ut4*$C}aI8HKcvUgUb$+5n)yd5wWoxT4}^7Gyc-)I`!#OXB&NZhHUz3Lfq zU^w?-uvFqQO704{h1P+`nK%ywj^1m98IRlJATHQDKk&pDjr@*PlQ^4IV)8!1cjK=A z{2V7nK|+t4a_}8y_IGpwi{EkCX`G7ajX`Xj$|ecap)+d|fChVl;TXveEG)uH+_sW~ zF@MQi6(Me-D+h3#m{ttCJNvn?JI;ST8V}liFE?aEOL&a4Ww95R0A&Opa4kE)o@s;|lIu824W6H-$v zI?mIR2ZZBD|v)?k5LvHdEPsC=m@L4zx6u*`6Y zxo%d-fG-D%4QzfFmCD+LA>O)vbmcn{Q>rL%^IF_$dRyb88TF?XdoWt*5f*Z@eQIhP zPu^KXg6Kp^^qeP$bGwjT>Ez85A%d;^&Wioe?WxTg=MPTN`slJ zsb=N%A>r+ue#3YwR2uET`Z%iwEpzKSZ@b9%pKNswDK7~*8%PJ0Uo2-4&f4MoDqK zhQl<93ICx>MEh(<0N!YXbDiVm`}O&+Araag9Ow92te_146EFu%?+e!E-E2dh5>M#d z+6*T2=D*k3<>_v_p2X$R#aQ4avs&Pn3_kcTwX#ZH)2BHK1{1yEaj05Af%{X7xdC0U z%@0Nc@zoX)YE!)6t)EB2^$Si&n%D$pI)21PD(r&tVK=k#jga=mY-!646Z68wM0oU! zRN-R0zW+;o(OtJj2cOcRo>VPu!6uWmS1MD`nwLrlE(PIJAR~>;#bH2mOO1 zo0neDr|fS~*{u(x#&xSNujoY13`PtN(Ot>gzddZd?6Q!v{Kt@QA;USdjsW~q-X#0r z+K^kPX#^gZXBl1UI#^O#i~>`fD!L~+JE<@Det)>(YLwDi-~P)7F!5>X>E`xzON&gZ zL?F%E*&|L>*~64h*EXN2Dd=~zDjxU6OQ_n}-n!F(>0`7|J7iGWG+61{uY0h6qX|-N z!J2!QwTI$+qb_U9*`31n&fSR*RoY61x@d#;AA}lDdIN;IVs^uQx2jMuM&+@Y z*`*I<2Wp`o1RK5kZ)59v%s0aaMN@Sm+gEpoKOJeoe}QG}LCe)}BmavzHUL_g`qXu_ zS;%FOZz-TW%o`_ypaGGo!7>xLT^Flrq<}=YaAo}m`2~hoeBJ?Ui!w?p>)oQi6n4)H zgMQbAftUGSK5r&aqydo~Ijw-IayMVMfRb_z2dO9~E8gX+PYX8LJczsb^ z2=8x~Jp7ZD#J6Yl;_b(N#S^oULj7zBgc!47frk5n+FFb$>zfEipAUY*-KmyqkJ9Oz zOQ9&22*I&oS0=<5+Vu!&-*vmLPa8SL^022&e)O4PO`leM9`{4rg>Cjw&Bk8aav>Z@ zF>=AYH~-|3*1*tMUCMggh{;O#WNCPCfQPXe2$G}z5xMUYv)L?Q{OC}x>j6^QKHJ=# z#^oySK(~u5%?Hym4W~OFQ_o_q-CR3~@aGQ2UF7Z7q3s9%u*d@RZ^X#_zT$>Do)>$*pGE7(=0>d(|79mMu% zD1!f0AK;(~v`(e$(Ee9f_j!DR@ddCwMf|RRB)(gxKHLmmIYOw~vnt24W zAP8(Hdcjt3$8QgYm&Uu{E4X3MgaQ2Rl)4*_#G5qaMO9#JH?n;A_)kG6W#B23Nd(inpVbod^(M* zOB+qmYwDNVeuK~R3v1{zIsmq`JhHju^S6s@&zUW5;2BPn%3g=e{$>ZyPt5-y_9ihZ zABE&zyME%@>h`&>K^8iqRFsMBa{3GuPUKgRN!!`0keo0ZiKb=s7pc8u{P*9pj*)Ok z)SB0YIEy*5ixrBM2#l!}UtxI~=Se#o%uAFV@j2@sN8<(E8;;lozH!;GY?-lmA8XdS zGhNa~;UA`&y@ZtWl!_)DnV!J*c?ViAfC5bwnJZX1s0!)R{(=_qQ1CzH2z0-x1M!-T z`CX;;_3Hia8r(MkIOGMghf>#N3qbp{3IV+p*)XV-Ggs-7GtA#0P3Y88&gpN86GgGL z_!aN{2f<){qnW-CTTwb#p`Y~ zh{l0j($sd!SN)KpWT5maRU8iMqyuGkR^fCb&mP}V034yuVE=E_3l`fBDPS#USpKPA zjxIEk3-Ln%_(#4)mtCJ2U>WrltT{p3O9fB{lH(QZV3Hk?dE&+0hMmzDY95cTKQ5al zN=O~Mr4YNo7*ct<4r=~jL5(-2x%3ncZXwlCpz5L8;n?dIH}nLQLrfapX7hNy_w2&n zI8eSvs5oQ>du7)%{>bt(uiA6dORA^3@%Xc^j}WDY``1+_%HE?1OBg;dut#)XI`y?c zEv$Bt6oW5J*dluJ$5-xsBU-K2iTp!o?0{V2)e6uQGrd2h@y61FS5x>@D=C*A4tbiy z=hI7WL8|mrR{AQh;w~P|j!2YWr>&SsyvK3|1xSK>t0c0w!E1qFLhZV@2r-_B5XYDO zA%32+u03Kcp=Oil+-m1dcYVwWN8JQ95#%;b^ zGf@tCn(@^dnGc3G{sIj5@){`Wlx)KF!FEyv0mc4HPSyVFhCJcX zqpXTPsq~U?cq8b*h|t&A0=`5+No9s-CDh&dt_dZX?@ZoPaw;fcv#+n{ann&PlLhq zDqN25()wG}n*am%=mtyXB4QRStLsE$X775I(%DfDQ1E3~6`nW>+}Ocy{w2?;E`cTY z4J0B`Dtt&`PGz2PsE)hRF0oLsyl9}Uf1?SiYC2l6{U&`wJije@^jS;f;U47tT{p?j+p-Vv^uY#l`PV;=fsbjxF*pv{bdu>J{xbv*IdCOY8 zXE?FmGuwA6%^tW_1MG^D7EK79w;s#yGjy`qapJ^JT;M7F)yD&J+k#PiCAe!u^K2Q((f{&$ZxW|G z$}L+g6Cf4p*?U>QoAuAAJgNdJVMtX1|6Nrhz%vLUT&}ps^TO6y0c&5L!q+dADg~d~ zT9^%7GZUm)-0{h7=8y#2pv@mP{f7Ao&$!+#r*O?TJK1tP`u0sWyE#KaqA{8-M@

@V%e9zH+0IB|oJF2h?Gi<6J@|R7y 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 literal 61787 zcmb^YbyOSS8a)aVG`KqjiWUzp#oeJmai_SuyL*8af`%4~6xTv=cPs9}DN@|+hTpyC zobOxr-@D!w$Qr`TJI_42_fD+3svIU785$fM9HxT2v<4g;;P&+eM1~zHdiN3x2ZxAd zD0)MKDQD?q>1J!8Atwn3Cyi)I)>t8o7)`ykqa)6lC$c1u&VVX@# zxM#w?TB8s|iHAYddGlM;-uDhU)SGxc4RAUndDy456PYPoF(xvs?|vpc_b$hv?9pE9 zBciyUE++}|mQ*m&jK~b}m1U{YPPc_W1UJg8+V?Jpt0mWg0twa;nyxdL-O@LraUdVJ zS3F{>*lp|ja9%8%ZBfr?;fz{ZBi+!>M0+hh`nOW-dzAj=GXC z|0n&}z-f|$<{6}sgRzTE2?yO|W~=tQp{1-=v1N`KNz}378#s@-ZQ3QWf)D)1W^F4p zKPmXbDo%p+U;NfNu6D6#uTE)RhUAk8+b@ECdXXsO91M>^kmuvoy_ZgICU7%VkQkjT zfu2LV;Y@NcSf_!p5XYp^BRF|;Wl&`~Z5ROQfROE|r%|OH8;bT4f)j_tyCQs#2tlU! z(x0iZZ37HU3yRUm_HDlH|FHRXI}1Hp?`FDthWn*u_dIyGKLwI3dZ9g?{MmhC^O3d{ zBgogL%ySae%7u1@Q-MPvHT;%>CT$x;`nG^Nm2pV(Q^KbyAw?|Sfpi-8PZ!NoGrj;? z4G4dHYy7^qME|q(Cor^rqE8XRkFzkbFkwIZb>7KXD9}kKzC~6W(lY1%*MrWQ%#O`t zaA_vjZQ`ZdWN*IOWRG7T;~6CgA^31v`xoya&!{$9;BRMxUbzbq)lZ^7*giU#)fIf# z0ry79^Z1!mZS|b}gZr==vrP>eOq*5^iZ>?>MZj8G_+#s&&A%jLxb~h6@6IUvC zh@9Pw?+K6nzp8>7v|Zbb4=WH!{RKARcb_6fx_i1mDXHxfMn#~Sark-hm*FQ88?_)0 zR6Bnv3oH*IE_FY0DzBT{5Yv)PM`jEt+B)GzP<7ghpj8kfrHOQG@ryXVD)I_a5?QJW z?RP(O5JoZ&FbUuhB@pX&2`62TZ~t&~HskiUb_8oP!8W(PA?qNnXJ~uN9Ic9rnFwR2 zGymP;@BJ2vsUoa~44WOeYJV<)ZfAw(C*oz_AC~SAWPwM<_c!{Dg4obUNb9>=3N+)y7(=E zMsJjS&D#>{m`es~p!@}m>9^PrLx~T#{v0RAFOTQO<0C@~T&3I(4z=wkIc+z}40?4M z+GE4;1w>hBU*Z3^@MS{fRA!cEGD-(|i86G@k#O_xL)Vud1^9hzv$=QcB#`U!HHW$(@?M`7VwaTLnCSi>9~I7( z`#`|Iql09}qraUtZN{;X^_Qs5Km2Q{((_uhM3Fe0GjMh!nNVVDn5n-wt&4Ch>%{J>fmU^YjaD1iJm#AJ(QM(b;&GY>RVcQ7C<&HWy?3R3djn zYLpG=mEylFm8D;jpC3A2TJWC;wRO!7n#a2pVFo|`&ao8ySIOk3@R^v2+WTW3SLefu zUwN(^my#osa{k8+89qnFVo#+dH&idT(KT6KuA~k4eLfRjHB~p&4bH#Yr)0?!*Ite3 zWZ5>ywLEob^5SQa%O*wD21Vi^Y3QD@nGm_5sQ9(!XZ{#?T?gS!ziDn-w8~C2emc-e z7Clc%_DM8=2sv6-Ht%LlX&X4wKkts`vh1~m!cv={9*FANnDUFk=&^i`K#^Nv7lIZhpFIK$J23v_7ur+?FhT(FDf5s z=m!>z1in>|>8bJeC&KzJT}X2CCc#fLPbz$ipXz(@loA@(gC3@~VE2e?uTR_yonm$= z&~~A0+rV_j39hK+@w?rKF6Ol?^Va`%-ys+YmVjEy~VJ!`lwl-}~Ps4<2D3nqmF5;-*=W6LkNVo9=IEcBqL{$J6yLXEM{WN?@xT z)E?XT@dEM^a51dYu3;mFM_SJHaQw?;n*GaI0o9X@@8Sc#{ZJPQ)k=LBd>a zp6?N`emCx&HQ)BnbBxqFhf^gyzQTWS?;eaTdJ?^Zomxt zw9Ryd=|bzF(TUw{eT7VoPwT_#iIcuryKSU#sA$LQ9?*oFP0Mr$Dqn<{K-1&Pck*}e ztcB4OZi76#s%6f8)7e>SLFZ|h;UA-^o=>CAO-&W`{r>*QPE!@K)lWGIx@qYSh`RHO ze&c2Hd^;c(_waHz5lq%f0RCfO`>V_2?|WB+p+?(=+R`rh$eDOs`*2J?@SLb}a1SQG zgMOKG-JHHXFE}Rz^76Phc2HKe)~OD<+LATxZcInrfWKXuZ)ZThGgv!MFTDp%TeSBZ zK6YUTxg7j{bi10>;b*C8J?9ZR8+};25!L&&WIgB)MeZzosxKC)(1ZCtxpEgCd)uYP zhA5OW9yK2R5=ob0AD`%JvFKIln9yPQ^h)r{)A@%JHJ#vQ8wG^m=L<+Sf5+X}SRLfa zA(Rom5Hnvaa8X~WD6VsXlpGo&nC@Bx?^zcDU(u(K@Nx8eMHHP)WOl6R0?e~z-c-5{ zY%baHj@9K|m0PWP&O5f>jXB5pajHq_+~oyPgq(i$i-4e|5g3sbjR-i;RiL@>s_oQs7LXwXIo9FGI zn1?9#h!+|67UC!V2QFj5CPLXRUG=MW^JD1-PJ+jL3AwzO{g~9B&sD*PfG)6|G=D%-A?ie{n3$~zS@6?Z*U&(z@dcc!<*;RCNvw5Wkj8Q+KWg4iUW zrZe8k;fhSXBtw}1bZ~`W>_8l7rrJw!3_lx?)Ldf(lmidmuCc=xq{k+JUf{s{21=d# zu&^bE8NjH(OA>Wj?56!Rk|RMM(`)8FRQ5PbRA@gxJVNjAHG|7LhSxHiF7+SHvbSz( zuGwdTLB7XrH*2)E-<=t6N{o19t@C_$_hE(TE2#Mw`cTQ$S+dW>97J@7qF&~_nh zXg9fYKj7XLDZx%NIm{q`+U4&cZ9uOBVK!pOPQKAJ9)Xh!etB4ztC$n8+d`JsBQtRA zBaBqQ$?3`!?ToO2&xl={HDTBPgT-*5JxJDoep5255rIBv^}U!~89Z4-$SU`m*yO-y z^x%G3mXg>r>CBxBlb{Hg#nk04ZCMOs))SEScl@yX%|^83sBSw^5OXJl4p~D{wve(U zTC~&NH0aNj%#K=vt>}}^>j-aqbN;OARX%S&83b4O+`Jao0_`pQqNPOsHQfX$LrZXJ zXd(=ctAiu&yCdU%_K0tE{uKri5Ip4*hpq2;)dmISHuQ*SXx zC@RXuH{p0hsPm5zTgO4`o#IakKzPu}To|=e7f5$O3wfeYBa>9rV-r>1 z(cI28;;+1}W5cZM09A17?U4C--c74qKnA*P+3L`DbMxWa)Gl}Y4$f!pe9Z5-7@H<9 z_Zhbp&*;9`o75%vyWWvs_FbRv_TrT) zZ%iMd8PYhP;nHLU5K&xG14AZd^>Tej_HOGreRP5q_0RL*BuOtM|6s4&stD>4b#x%^ zn%H}iaS|B{^guJ0@qYKG2vJEsbY8XV7QkmaQaO4fj{**LyCg`(F**sm%6My^# z$S<%+6139ieg`a1G{Ol(@oboT_l+)Kmm5M_GcNVs1tFO5(r?!PswEfRGPlK1EmCs1 zt9!zIgzXm(8v;(U#Zr38_^tg?pQC=mG5mDBvTK%!Mjeft_M=WkI;%F#a9sU(m zvztTl6RY?`$PgyAlg*1y`&XaHzeH(FMc&Hu(p8E!q)9FugX`d4lZ&i*;B--I6qAnR z$YZuwXo{G1fI0HlkRcOZ+L1%>CFj#Gd>Jr3CskcqCvy8qs2~x39^wiacq#9)kde2- zYpot$e3~n~i124GR=8Kn7a8)aH@;Y!-tTTNGnSGH=`A8eEm6V{`w?4slsien8=Hu3 z?TbHyh|hy6=2q$@6p99ljO-ioY&&MDDsQOGUp`j(&DNJ#egAjTyhnM4H45+~Mmj-n zZ=#e8akV{E)5ESL3RxwEV`mNF#1NlO4~?(sYfXjAoe+I+Fbn&UfN4F9-^JEtO)*p} z3bCVVS|d*L7%}Z-Cp4snCYzAxq@t3%XV=MFWB(_ET6A|JWqsE=!RXF_y6?})Dx4tZkO|M9QwSDgQ1a$0wzqBKY2!*A2 z#Mn84ex>7|QQWW;es~Q$)UxgA^rK9-svTz@T% zPv;P|JZswsx5!2hD)-_K`_cH)a&$rY#q8UcV4!S8<6J#MSJ7;L#0jBQct|*hvE`}I z+FPD<-TTXoHLQtExgwMNmWVkc+78tRM2;|qZ@GvE+ahQ9_}4YijQXM6@oP<64(0+GaG$=6{4!;xD$fr4`s>nbs1 zYm_G0X|6&S6n5O-+tnFBPYt5+2mzo?5`e;S@{xKYZhD5IW9L~K z(Ul}!h501U`Egk+yXuf%wdcZH3_vBWMogY-fy{mb@7LZEeX4i-ZjGvH9y)hZ*K@n* zuKF2>5y^#^hLb}FV3^Ocl@V7sd?Aov!mzpyqY=-Ssn*5qMVTz(Fts(Ec>EyuhQ3hk zNf6$2;XzrQINr;?kqABd=h^R8<&rm(nNnlIz18oi z5ZRE(a6hws*3YbDHlmXayfX2TToFmkL6_(NfdeYfzH8!m(yqj9RcdblS(}P~bY_8T zLnSUJmR{kcscr}k!PJ4NAux9Re(o3IQUX7?lA~!20UhUQOxRRe(%Ho<;g8oL1I|`% zP10_kFefUnQB%`>-J#xepw06AP@e#!I#!}Ovey0P3UAWP9nKO;)oKR6^Ecl zQLx4S&uIqB=R?oC=P0v__CHJgs%R1H^%fzVQtEV1NMnEBhn@PE%wg^#^GNvIpGJ$Z z?qU%seqkyvJ+DHCunWhmSSP~gKc&b~GWFLtslU)`cCzI$>QLzbipc8m8tEFI%aH5v ztk}RPsg%2%A0N6$XYNyFv`P}xtt1?t)--{gy-f4>SlM12=UQJxQtB|g>Uoj5Q+{B4 zqSKo75crs~fsT==FiMkLCXQ0iOH)##Y#Itpu5|z$nWM2@vwi_-kW2kpPV3+t`BejF z{%6p>asrkz;wab>gG^mzq!`i2rr%^yu|^+ zG8BE!y55D2j=rl2rVV>*F@gxTS8xa~LjWL~ey}j)5)F~U7SXct1)opdy3pT+*{{3> zhp}9)!J5}TAKSn$lGRUtGTQ09LdC6@EDaAm&ilG%Ax2w&W{`J-l*fRK4@Y$qGhTBz zIW4aRWRhCy9u@|ZX};HSI<1lpf>Na7o#v{AlEaV5j^r6=3SZY?4?6DIRP|g`L(tAW zo~OdZ7~}v3+2d=|gmCr+j@|>cbm8?(Eb`H@`}qa97`wtxfDDA^>ZYOEQm4OU_H4PE zh(`J3lZ?_5b!@{kijXVTK7Y|(^eaTz{Rk!sFDIB3-DO`w1&l_3#eY!E+~}2)fww`w zGS?P=QMOSuQ9EX@A*f`O`~SRC3l<$X`SMI-6@pYX!peLm4TR?U$f86@@&q($_k|pa zkW4sI7m!T&t?I%}HU^jjF0HTDE1zdZvVv$asD+jE7i`GG>g*~0UPv?^F2fwpb86-C z-`jcfypz9Y z|3h@ZS1>>)XwKU#@V|(TVrb^;F$R@`um1sg6hrmYUjOy~b-Egh)1y-QMSud!j9Beb zB;1hPr#Xi8y+JFP?nnx8K8Ewm2RKxEfdv|r`eO4~DU*`;gy6#Ba&@Nvdz}szbS`lE z{D$jSCgQtF4p+89|6CJ`z#=ch;x5tRB3EKFk>X8w)-G4+!}S8#?qIZZi2To<Lhs5HCI4a*$;lH#ujV&-$)H% zUQy8C+h`ygWfrv!oS$B$>+cyDw#B>_E&Pwz*yn8qix%4dy_DgR^kq4A zmI?%mpBe@P(1c$>jSv1|b0s33W;1!5Y?TegG>Q6YwGPxv_s|m6{kx?vOdgoJzYmsd^ijuX(%2} z)bAIy!~Tprzw~(b+WCJB@%D#Cc77u?lx0gJI^!NTRwZv>EKhW5+KBov@$5!;O4Pm1tmYZ|6*^Z5iB_fzA^~-sU{C3zWxa)@<|9QBJYN0j4 zDoL8H0;noTSlIx9)UVUfckWw>{Bia+e{v*y0gO4}Yg}Tka4}7PZwK6M_9)PY^wx8f zFkI}&o#1^HiTCIrf!B+Y;k%d2^}(w2QkruBmY#5I(S=cnn8~9VfSN;izz?3Kvgx}( zP27pi=6NAk5W*`Q(dVCHM|9Y$!oSMnIm6;(Zc9yXGqRt3HE&|l1n@~JuyG8ra%LWR zZ}t&7!!+zdBL82H9Ln$179)_py<2wk&n-R`Z&?@(YaNS#m5Ly{es`u?45f~&qAOcP;Mstd*i+GAz)A6-p+}={nor4%?cO}8zDNIcPjpx zJZ=ZLf!`$%zFai#<*`(5CGYO5hSaT|`4{}yVjR%uY)exUZ5G^0;LZ}cS*dG2svSYB z(^-}<6|a-MkYm}c;(bCl>)ov?7KtFx!zO}@h{snIkf;xYfmi6EQEtqq;}yPv2WvTk z?hzeE6-w#+UmcAoC4sgo7c}f4b*;EL%>NAzWTbwL@BxPk$nj`82Uw`crv4KNPmy1e zbR@2c_o}D40Z9Vh7+Inre5i*_@5SyI{vHiS+vT54qFt|g-2*dw%1~$V!(ierZ^W|= zG^p@4ZL)B!gi@4VUhwl>*alU=Y1i~pGc*i6qF>b|2k`*OIc!D1bp){jVr;Vqq^NK< z0R^1)9f*ssuX?YGY;nRPEXJWE!L9ppgq<%5gxc=aWDlEL+H8?Vd=0s-;W52~IykO1 z!;S)E5kozl4s(LkC2*gJBQ*Pq8Msb__E2iCf*496VcE8p43Lj z!M8nB5hHMbE+m^(XzVU~XpBE1#gm?<-Z|1Kz;_(HuXDBS@ZSe1|{jY1rz=*#v6x~3t|9yNKjYsvVX;S1@be7h^1 z0k1%GRw4=G5&Q{z6Uj%^-!Q^aozhgm zj0=y>I{Eo`n%0*sWGJsHTtx_@$X|u6h;)*}geupb_!`k9pPGNwstM$6ls8QSya_e1 zgF$qbmrWZoRFZYB2t(nwqnK`(e-7EYKki>{CB3g)v`7}odb(LRslR)jQ1oE%R^QDl zSus`>{B+1$3vD?WCszCWhxh(mY}Lz=~upT@5&bFi~Fs-s+m9in>J z`j4wg>u+8uCK)WcxHtB!?|gV3+q@7;W14h@Fj^jg&mo zW2LOcY+eOps3MUNUe<2f8CA);Pulmt$MfB+dP6z^iBGSr4JyR1;=i7kuR)D~6lZgK zyLg9i+E4|1&XQ>_FmQWq#ia)`?CzBVBAu-I_@DIm`WyUCJ))}&GZ)5=Z8C)% z=Rq5+vr`UzMaUC>OIZ?iD9W_Kwn`la|FugFr$SVN2}J&`(~Bch+>Q@w;93s5+Mp6F zQ(XM1o6}|j@exp?4mIs?h6of^Goa21Fnl1(9xsd0Li>~tBLzugbjwNzNaWC96v&J1 zEjd3mFR$|REA!X%P5Z1Amch`pki|Z%>X{U2KwsXSP6R)@vtoPxhT(=;NW_NK%`j(r z#$LRCH6HbQSPW07{((h8r;j@H^`jRz9WQNnupc6nzy@8M+kv6fW#^8-*B&7W)0i+t zF;wA|noL_LyUJxo(nlLa$PK#4UQfUjd8L!AU=R{cv25zBTaF=+f7L_N9R@Kb?V!e4 zOotMt=*hfxyC1zjequp-WO6xayNT;QpMDu~qc=OHK!ueTC4LID^Kh!id_xNWuRG3M z`@_Fw3ao4q(VgJjFKEJ|4d|ybb^H3{o)lu z-W_JCa`-<6EOHM@+)Ba=`$QRc}WHsKH_64h>Rbyhl96Plf^YQKODsi;c`_7gb&$jN%aNyN1x{a`r)AUmL z?SJdCr60S%!+l%}epp`Lo{$hlz4RZmH=Y*W<$Q7XyS6K<;NuGv1WMQy;7h^m$ymg4 z7>^+VAlcJUVxtfE1!5kZl;Fe*}&_!p+?BP$nwzl zT_J?9n|^gg$gzm-8Pykf9Ya@{x-MjLV1L8E--mpUlz6AMFXtH@1n|*u1H0MIYlcC0 zI|o1RpMsgh+e3(9bcN=nPZzo|_2cOl4ml`N>q&zNM*_Ab+8AxBQi2fpTgS86SH3rl z+Q6Yk#(mK;12d~NlH$ZctS6%!-pZP55YyI7Trve*cR`{E(}5b zDFC##nGcoTzuii9P7*pOkr?>e`y*(a{WZ{9?#s;I%Mvu*ZpM?7?72f83`1w*SSsIv zdp<9hS9U!6;bK;%{jEt3EC)?v$1cObYn_^T!#+$Z;rVDpjXP0TZiGmNc1rJG!P2<> z!IHWOP+9nDMlkPaqGjV*SGrLTvDlS?t#_hdU zTnB8MV8A`rD`C!ktZyQ=uyzF_#FT+=iulfYCbIb_Jjyccp}$VM(beqZ*I#L^Vxz+c zl)r9f`^=~Q6mGZpTW1G49r|=AoBpuA8wYk{RFW0?Ug~H8FgnYj{koxwml38T$oH8P zD7s@5J&WZAGwt5{|7(^zI{8PgaQ(XnqjLnYtg7Ab0!HaJb>ApC+5nU-N%l>n*b}bolBmU>-@59MxxcG?Nzb+bh!}^<8T@&+;`S(mfYw361K7 z!|IJ;Ja3#{OnCNy8N^?GuVXX=(USgCfy-3pZfu;n4j!rVN7Nu9Kn zNjcj z|NmDExyuyZfP*|zqQM3-2#-x3pExjdN~4mabF>ZSzZ0ffeh*UM-kl+@+83>y1wJ{V z=4|J7y|$I*o4boWbTbua96(Y?-?tE8(CEeOI=yLI_pC&LJ&x}g5WVKat%;8i#d3Ki zbdEN(L)WG5Hm0Oou;e$|RV+TP)6RQGa4I*6iZ_c!@+VnD#xBDNZCvzItua>PBgj@# znw2$TZ&3{^MnKKbz}sXs0I8Fy;;Q{=86v&Hn;^{x`Iqt5E#(+kDb?xV-FG%L7rUQI z_9Gsr#Kp)%Jxl-9DkE)%O)5~348mgYoz7mHIqG&1^G_1>@hJ$1A& z7fGsvL{mHU>6GyX)8@qJIrwz$qB5g5O#tbskk7zB5CV;|s=QBC@o}Z9s8$P!&1(Fo zKmjZ~;#Sva9LWUO^Z`YLK97VP1tTtFqE05U1w3L(&@Q+1$m1G6G$Jparp$|7m8$W= zv;#VIu)2Jm73;o9Dr_ZCI7ZxY+b6k6;b%UGwU-ty0cx&U_uTi$#p56mLT5Ah18#*0 zNwQmc2N{(g^(OqZFJOa}v;G4(GnR~s#*yvAxsk0hF5La6)B4%SG&<_t5q9Em*6jNs zQFrAcE|ZQ5(fa-Nn_T=yYqaV#0XH>d;IMsQK&>oiqvKX|gTuZj#xHaO_B-<7VY35t zFB0lb(aTAxqUCTSshWr(3*RHnp&TFN2~i#8R74`&Lf*?>bvcqz`!p3kTpv!een8A* zACH1LX8rCrS}#ufnv+#T!@Zz&xNtcOFNyiU`8v)UlCAc3b&|>|K`~_FE7I%K?CZ=j z%UjXjc6TEEj6>7XAL)4APLO{XHla%4jgFln!x%`wD&TXWj1^Xr)Fh-3Ns=av)FJ?Q znAa=yBs~;?jXT|C0tw_l!=OZc{J{}en$HiBlHazo9yy`AHpQXwNSLO3J8-|!?2eRG z<-dBE^{P9-+mR5}lXt+#dzzN|WNFdumD%&a7jE&pul^80*LG&>LttJkTTg)0))D;h zWp3{0$hn3Fb!KGN@j!UVDf4(XE5}rSDSBjhrgAGpkIi642Do?}?LV$?$`?(1>ibcJ zDT?T)&;TH73RIi4RWY~sgcaoGPl%98o#1*p0ZT?yq}&v!;!$&7-g1Y&2l=>}Ab|gJ zK44jf6;zo*`H+*5Lw9=SdDx7Zd&G!%o?P(S^pmKLxp59MCjyEV?((<3y+joO;lG?9 z{C-@)L#byslxo)o-WeV-F1>N$WJO^Q$-Hi+4oBB7VLMHJ;DEIle%{uTm532R5y5cw zL{`>wiLP+x6415$_4`q}zkc2yKbK>y$&|+UgM9v4)9Mqatq9nhDFfY<5RM#WhRO9$ zsWBPIFw+oB&r_YBV4@5Bj)&)H+32c;BFl|=8Rn?iOVr!1kn=Ca0@<+E4#{6+k3#4c zu~dP|(u7PnaBKLUF*YVjO6+DfgY`LqYI(>Xud1E+)6$RR%avO^D$(WvzPWE9n#Xg- z{>P=e^Lo~~HG+S!l;GJDTw^ppBX$$^3c!^49!>nM!G;I!E1ILDs7ZuKdW%G_7@c?**;PZ@;hXC`UllL4? zkmt){(&FS&fwNp`{y^J;`skq<#z>}wZyd+D0*DbjOs3(*=%&dx2x`+8!<6qv zX8RRFq?$!Tkw_93kydW5Vp|T*+M>m~d`{qZ5iB3zN-e!)CY20Ln*!gQ!iVe3BgKY4 zFY<>+D{!_Ok_kV_CCEXxl>Y3z!T)6(#xNr$J!L^uUF%B!pwt3=>=^wpF$pL7uh!%|xay5v5n9Q`OZQ zLi_Lm6M?WjtIY6kVDoHcigspnjl^74wxTq}(@9v(}= z(=H2hndQIwg|mBZf!3WhP30ZW_tQVO+g@qsS1ILz2s-{P4!+C&w`kQKg=cXgYi!1c z>-Ezp{=pF$F|#EwO$(OiH;gQ*9ar}+$jbJt?MBL}NF-^3WYRj~##lKm0YkNz%?NM| z8e}dXBAO8LS%{)UT`VYJn$f&mI@5q}-|*I{$I5fD=?OweOW0)$K7#X^mUp^qMX20! z8)D)3G~K8*}fVpeL@gh*JaAJTLZqv1Wd#^*Ls%d%!7Q>3KM}5;niMN zMb2bvq*FZEoHX`u)4h4rlq?~LN0PL(`Zz=VqxWp4YtF{A8e)#K^_qiy!x_s ziW@!MSAmtm)1t$o1YW=4^W3j?Ub(bfPiV3E$Qn$TxWPKod)H0eJ{jeyHf9e3bLC98h-^xUk+62rF2kZdsY=d92ly;~ zY)ez8KnJ#7u9*f*mA*vBa*)rilR_CvLJCHzC_L_MO;o23tWT99Ts>OH{ZrX`KD?X2 zJ-%O_%^3{C*HO9K$VR5`Og{lMbhwjtt_3uCdrxu#&WFsO{)Bs~?6@0C-FB+v>(AkQ ziO~re!siDef}92utKheCd}HA4gw*BP4j)#nuE^eFuH8ib9`2&1resp_G==b|J-*6n zgUa?#s)DY{Xxww{DyPV|Z)HaLZ+(>z!e*>RFEV#mPlA5wKnVped{J02=mAAB`O$@k z2)!R&Y~-n;C#ZcNHtFd-A>Q(AJ;nx9R*IyLt${~VjB=rW-)S$mm|vNmvES6^l^_Ot`I0oacZD;g>`iC35`D zA-*4#(!TZP1U$9<0Go4ml}zscQ0pDLAXzY3J?@{v6v@W#{O_+;IvCTtXdC{9I;8rr zx*>|>tK1;ja7zz)=Ry+Z_^rn&y5yC%ykPhXnu-&QA-J)Ndm3d;fIJ;pw+#;v(ExEB zLy&riVH#b{jkQxYD$OL+kuEY(2CV}|@y`WLoQGeLi3HP}wVX2?h3FKS-q^%_4dGKJ z;(5b(#cx67t;E#n7_v)%rxZ3BD%i2@2QUWNlcaJS!AKAqx3*86L^UWVZ#>l9VS}Gn ze@_VidncE@H!ht3;})TS^;vB!`r}ur?M3@d+k{P5_oleCNSyMz_$a)6OkBKZ7AVVS16hql8khQ&am~(()+U4=*MEW=E04PFtxt0c+6`=p- zl^WE=ZUA|9i9Q@nk7o0$f!L>?X6y@3WN^@U&v55M*4M1dbXk)?l;x7`3g)04{EMl9 zP!St&`{)<9OEU%WE!wE=3~fB(`xJRc$Q!_U=4Z8X3mYxbe;5sGZ@d;Hbm!cfuxI`5 zRH3x&Tmk)}l34+i5}1d}axh&r&7AxSeYs52HcozEs3(?0qBU-u61 zj&K4)qU1EO>9N^f%Fs_Ztll#mYK6>HPzna631>vZ9X<8C4@WjJfk&&-w0*3@A3{aN z5&3R|H}N6w7(xPIBO8H!0vl#IrkZj%_~0ygi+dCk%*5#!eP5w)99ti>n`yl(Yx}c( zgrmdo({=W5=vkz42pt+T>Jd@s+k06pizS&D=B{!dH4=n`8KTcS-;uJoLTj4B+z|A+ zhH`+&=ty(uUqbN$W4#nQ3A^3j;gp5T;4viUe@0(m3yXv^i?L9Z0#s1NQ@tn5_eT|% zkU%xht(QreX1AY1Wz3;wP5yyoaFpJw1v8!$*UQdgT`{zTZA17>{^lOwt72mqXnAqB?Vna@PO z(PNOz$~cHd{>0Y!=n#CxhLKIG^$WF$eR0n$NXgH^Y+rr~7p)Okjr3aJQF_jN=ysT% z6;0&;&`GD@x8;$WPC~;8D9C)r!@@43PvRYk-YzE^o=CW19Q0a-*s>5U6osFlkC6)P z!V$eMCkEe|ha9=~3RO$N@5$9)RMl8L9 zQw{~5YpRKS)O9snN`@&RNf9-Yuq^{h7sqF~jMh01@mWIh#l_1<@a8{ew5kyZZ~|W2 zxq>tEoUQwQKqFhparPjU#S7Cn_#vT8d;y2qXtfT!cstwab6IGh>5 z#jieTe~2>@ao-!Cb)L9QMEY8TT16f7mT2F3S~!yglhPI(Is|`o7#{%!r=FVN>1C6D zX6HOKi;D&DV2*mp=L&{#e*VX~v!RB;J9c>6)0EFI3MwZk4bf7e0^Mnt!r*11GXQAT zFa#B|;}rHqmg^E`PSm=qn%+vx@^`Gg-xRW|Swqyu33`u|->PHe%p5CnO4D*602D_j zv?{)|ErRD%hjc$lag1h0&WPNWTg`ue32<*|vT zsM8+qcR2K3$;t`H6Vejo)~={2v%%&m=fnp7TL_&?>wV-G_2i+L?z1Y(jzG1!|f=<@h1~mO0KRI(|kY_3@ z9fQ(acnmA^UF-yOOfEu_EeF@`gMshLt@85JZ#}}A3oLtVNUEAcJh73Y?;@Hh@vD>5 z;~rv~2Mqf!#~z0;Cn;BS!+}0hsOWmdU3)O>l=uQTqN!+d9;7>sGq>$deIu4 z9w||{(4=O(o3?tt+A30*H^rBs!M_$qJ+JddloXt^=6-Gzyc zYvl{cl{Y%+%$m3s1Pj-PO%=mAF&QeJ=HvVdb-)h|Z+bUJHdj7b!&!ro=lDVS6N74u ztudZ<5Em0rv`0-2M}yTg)p|1Dain#y#&c-z)UsP1bxGU;XjBgFwHZA3)pJf#BYJPE znAnAROof>U{hORNwUasewrdW&`Q;Pz&@^Si1d%T3ZbrfRf6ni*Nc$5 zz2PTbUa|?V34=4oXINy8jYOyrnZqLpBX76brFUGa*BU*idW51xhQwqF>^;_PpwXI- zny0k>6j|;bU{-JdzymG>QQR|{x?;@A69~&yYg|=<5THUiK9g{a57HOB2=DbboaaUk zFqPE<6t%>{Y{{W+Y`aA^u)74r!L<)6?uW;SXEg)95d^q1hXd1S0YYy>E=SD2Xtro9 z%fZXCeB+RO{2^bCIBFU=WTvR&YTmhZQ6OfX_WM*+S%}09t1~(o9VlkbYN~4ap}+j! z;huX#ByyxD{50q8G){gME}0&MMWe=DV`LP@*yQ$9m{CY|7^u^*pV-l&sZvPtUrm19 zJ6dYob#t;8-L=U}RG#o}S4g@uK(9{}JrN$A6xe}o%}1B_jvblVP#FjGdUwDglOAn# z_x7iMwJN*(k~o3*X;KK0NkNQ*oSuO)onh<_W-1#J=c~6lvlw|p%5meB$G`*hmUfHr zuuyZmScSZLoe-2sZ!>mm+InD%S~^rwJ@XQ)JV z=T~H!1T$%nVr^L_+}Im4qNvaQ#F3>UzKJu_O@a$A&ck5YPw(|Te&W$Aqu)uxg%bIt z5*w!4^xqyRm47r6sMVg#=#>RW(B#R1zE8Ny^f@>lbxW)*$EYMK0M9^Xk-vLV_N1P8qNS%hhp!3k|7kiJl47 zJEIOWvKNAbh;_n2=Xh2|ggRarAZxUOw+0JB#sZib{3JLTbshbuG>&xSlOf( z-2*^|6rOHj^8jZ~j6)aDSR!GPDh$4M+U+I8=V{knxSJ~;NQ{5=bn0BEdp6+X1;8BxdT>fqRQk32+d!k{&dRHzj0Z}h#c!#L)A6`t2G^kV z;(k$VD{HiPP+h(krcLVc-2YlpxiTMnjzWxYig`KqZ0jewO$G=l$A3#CuR8as^{Xyp zOlJ3=jNeGU+FU+7(i*D$h258bJx1veyFaTf6E7$w@8aM~{9TS>MR5`pC37+NCzfNl zM!GEvtheMr(;*wkxy1|4w+A)ePyMX2+X5+~+nogLy(h;iI0ZZgfV2W4f3R^%M@w-i zkMlw6#YR)5z&W^1)$)Jqdk!|^h<>#x{X2x_7h6RFTriH*#g~QfB}vR~dM4qpiX40C z2)Y$B@lGl3opfUY)Czl3qo{9SXf=I3Y1KK(5(M=!tnJAAp^#F&p08tYn+1KUiY*)GEX+SB43qbW_<2=F?+-*XctR0bt)HqsA+-~+v-h|TE*ynntewYlNn%<$&I2%Y&E)^f z$aDFh8QNv+xtwGhtjThi{nUmvea$OZo9{8ji{fUp15$?|C7fZUy?cYpz8+s;a`}x7 zjCtHvRm1M8A%==JQ#bh5kk$wMy>Hf9DR@Ao_+)-SMVb}J34iGi5iduP_~ZxAq5Ma8 zQgTJQ`K-TJ1SSeC7(r!mT<;356@lC(OX{RHOW7aXeAqU8;)2;bZNaN1BNq zz>jRPz*qz9&QWWIxet#OI{c>&7u)-$wa5jMzzHsRlrw?1@0AT5dsn17O*a@3AXp9s zlH5mW-^@d$1?WDOqsD}q4TL6(JNb$3klE8?P*Nz12j5q=742D6PEqPNQ&yS&jBiEx zv1&P!yn}0R%{r=xJTbB~8eJ0s5|JZs*T>IHF~2d$Uh*<3cmuhNLsYqwmTp->Ym@Uw z{Ok#MX6Mqp17EZpxUI@{nq}j)TT+?2r76U*nbL>e2Nr}Yq^6NM;GeUDXq12PvAw}0 z1Xz}Ia(=(@WXrq>PwA@mI2PSr)f`S`$c_+WC?o9_h>aZ_gC4Rgc11S8P;v*UhUV@; z6Y;d|L4cIEgH|> z#r$?^?fpq>9ngu1o&q+|Qx!OWCaYmcsAwN;xpg4DX{=G(Bz-J8D)>h(|9{bR7Hm;{ zZx<$qZlt?&n4!C+LjjeRZj^42?gnA#29Zwb2I+24hA!y_;rAZ@*Y$pa*>lc5JDz8) zd*O}YQlvP^|3wR`{&RRnDU249|GxQR1tCTFX|uPR--Ozn`-sqCqoX(3XO>D!hi^UN52douYT}$)VF6>JX#{!X+ zMzYRN-VPkt)l3iqWqriCBP53S3^>!qA+nNqr~7=<|t(D91hJqrGNQ<7Qjwvf(qxH z=MZo2o950_`Q^OzT=pQ0CQUk9qH&`;_hVrbOKD$j#~}IP6+mhw_RFh9z=UBur3>H> z2y}2Fz}68T)B3f98N?ZhA4=^N=6D?I1`ACZobG2$fyJ`8^1(4v+W?%n9p zXU=1p3Ta+$49MH!pVcGu&L%Uamxa(YlyPNPj^m4@_8R(|HHU^c2y^CXnK9!x3~mv5 z-*iVaBk45;C3aRP4MbT|655YF>L@vov$Vyn3;Kp>;1@|Wu6t+|#x`mF5%=^7@l8FN z5o3|BBwDc_k+^8ss06>%N2BSByAE1&mOmN}doC)#@IFCk>Eu{!qgAn};lW?=5Xbi` zy$vmQY7Q8iqdG9zb>USqwJisJdk ziB{{Gm4gi3A0;XdJ4@>+PL_UrL-v(sz{)Pg@E$TNxvtfyi9j9fxOA&KK8a4#wL+tQ zM&g1aMC3ZlTEx;vv6z&c$?l$lF+q%F;=?oB*yk1XjvZ&5HP}fVO6;?SQcyTv*PIF( z!qQXnM{E$01!rKXBD$CDVP<^ArU|ZxZz6NiyE7P>`(Q7?p{;$j=TB(}<10#Wl6&63 zO-bAktwc@b{HBN;p}VHjX<3tbFM; zw#JSrsA1Y`!krm7FHdx1hwD(laD{QSNyRMP-pcu!^C5W<#D-fk$xSIf{h#hM@6lsLPxC z(vDwM-jo|$SaFB2&VaP6m3S#Ap*P3aZ1sbK@;u3OiW)whzvnm5af|z~2eI;agVDU( zR1x&4-qz^8GYgCw^uB3rHYO06YC+d?bM!Lb`uR8dP!u(Bh#)`~%d8gw<4*-kQWDOq$J#U<&6?0NoGY zZ+nVbuY%kBX4QUfsrfh#Mb+eGdFX1BB}kUHnqTyBME8+>$EN$Xnaf_6gJ)0chG}%{ zPBE?zN|=udPh+I-Rw3pm1GTcNeBicziqEJHCD9Cgm1*!nrxJ&U$&E$QV9o^z3lm$C z*_z+CI)jVeJ0G|@ne`y;Q_>xNk9k4)F)#6?^k_kZ)#P;0viT)kqt%=P@=U}QZ7YPL z8~O-23vVlpy!@GZrqW7znOj=_N27NYEd&p75gfdxQe5*oQU2ImBMjlin*W%vkI^eX z$b6SkIOXmRbr0)3eE9SA}2eB zN}m9*IeljT$xL`JU;B;&&NtYXn2Ca-j+keIYsImFafj^PV2-%K=*CK}g)3b@b@k?685(%l5lWdrM$Io|=mJHkdaLF#q}@Xt3BqgYQ~Epd zdt{US57o%wm6Zn3j%ut%W*gNa$Y0M_ysqng_k4W zt@{)^!@qnTKAA5TSK}{?SV_pk>cKH(A&K0x>MhQt3baVzWG8j)aSRE3WltRprJGJu zf(M@m)lkp_wUkMfozkATpDnDz5D;*gD%mHNoc_D)lUW~7ClKeHI42ugf}E|T5nlA) zTbFCOa5Ed8yiMv1RrX_2dtQd2X;Ab6@xS|b7>toXn^~g~mCWyZlib$eKF~Z*qZ$XvovRC#H=jJln+)7X zqUMHSls;})K5=oh$h$ah^vljS-KaG?J`Kc1vrF7b`m0US8+5t-#WytZYYh@D7em#h z^^5nvbwn;;blXob7Sd-_B;V$lN{S{!MH8ZlD$+tI$eAP7Uh40#)aI8Rq{h>Ex7=*ygmNg0Ud*AyG!^8c z^t8+h$~rtC)Kr8)`b>c=Hb|`DZ__-VLIi7J-{Z}lfIcjEGR!DcvpE3v0zJ%p)Qj9! zP4t0Z$@T9d)l6ceh!H2`Nw@5^8e-|`cHHa}RTVrg>81CapftXJ>KIt)1QgIZ zbT#Xu_wdDQ^`WfVs0`=9d+68>O{%Diz9`{_5J0`6lM5TwYSzl{+@DRh+=qCP#oCP5 zNjs@H>~vJAGnq0?5=*TCVsUCm!KTgETDkLlofq!=l4I0+fh4q8;;Q){G*}X(q!ut4 zH_&L!;_neqDyXV?qe%1aZ?!eznGoW;4Gkd7pU`pY_Pq7b*mFeia=LX){0RD!GauBp z>c+tB{H#C7_x%#a(x%GuuBnev4ntfKt`+bnHeHfp`6J%NiN4AF#)n$FXf`uKAi;A1 zLkA9`_!AVzLS_Z>3<*)^siFM-gjBLQb>w$FF=6b2HbbFAOUn_efo6ZwMEpiu(HOio z7nOd!3|_TXQo~V9$W@}gB$5wmajE?mGVNyUc#3B6Mv7k!kiMTi9(P^!x)}=*1(nu!pVnq5|SImhRh0w~L$z@&7ByI4Z)?sn8 zCP@$R>-aV&o@68;R>ob4I;1k)Xs=utLf&@syUdm@P3(}e?G@e#5GkgTF;M4iqNyO$ z&(qKKS&^eI>Vzhaq@@;0d~f--5oHh=H!vigkQk`S$l3$b&LElEw>no_C1#QPkA8RG z;{4D2aMD27i8Z=!0l`sefc0jm?JmlZsvdtYa|HZb7ZHWf^=KWwxjz$#;T5`MQFV4t zvp!cA(=G;TD_Ny-O~U=a1g z=~ZIij~eUz-4O}aR-^9U8Zp7NEQN?N^vP*!WI92Nl41gHM4`TQ!V<>>!|%+gfI~=Cc+X2UD(Cl#@1}goZ;>LNW^JLk!|we-Tu> z@VtR5cCsUAl*c>`+`DW}==wB-!*(7CS3XYQF16v!y0 zLXQJ;Xhb~!8}=O7Nm%0@YLixz9!8X@pQxUSGCQ|nbTf=}L)+#qi2EKIk;JPkn_NO? znU+aMD1;I@-5dE|^u7vWQhlAlZX`%k`O?(4Y#t8v8`hO{!L)}|Qt2~YAUfozSq65{ z2Fsp$5ge($s&?8a$$VI-lQEjlK*n!`hLxeL(z`K|?GuX5-vLF=*Bu;mas2vRD(V_R z?+2r*#!={g#_BaQGobf!sz}E+k!)tV3wS~V&OXHU@~x0JDzy_P9x34`aU_jBs^!t^ zvxhQ6YEr$8w|<)Sq`?v;YTSg+vFW!N0I!O$^EpO&>Z MU}h( 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 z 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 From bd5c03d4d44a7ffd4ac774ce877f33f39b686536 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 30 Mar 2024 13:28:25 +0800 Subject: [PATCH 006/127] Update codemeta.json --- codemeta.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/codemeta.json b/codemeta.json index 23cbc52..3e1db57 100644 --- a/codemeta.json +++ b/codemeta.json @@ -4,7 +4,7 @@ "identifier": "getCRUCLdata", "description": "Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 climatology data, facilitates the calculation of minimum temperature and maximum temperature and formats the data into a data frame or a list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a gridded climatology of 1961-1990 monthly means released in 2002 and cover all land areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) resolution. For more information see the description of the data provided by the University of East Anglia Climate Research Unit, .", "name": "getCRUCLdata: 'CRU' 'CL' v. 2.0 Climatology Client", - "codeRepository": "https://docs.ropensci.org/getCRUCLdata/", + "codeRepository": "https://github.com/ropensci/getCRUCLdata", "issueTracker": "https://github.com/ropensci/getCRUCLdata/issues", "license": "https://spdx.org/licenses/MIT", "version": "0.3.3", @@ -13,7 +13,7 @@ "name": "R", "url": "https://r-project.org" }, - "runtimePlatform": "R version 4.2.1 (2022-06-23)", + "runtimePlatform": "R version 4.3.3 (2024-02-29)", "author": [ { "@type": "Person", @@ -194,8 +194,8 @@ }, "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", - "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost"], - "fileSize": "909.71KB", + "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], + "fileSize": "909.619KB", "citation": [ { "@type": "ScholarlyArticle", @@ -223,7 +223,10 @@ } } ], - "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions", "https://app.codecov.io/gh/ropensci/getCRUCLdata?branch=main"], + "relatedLink": "https://docs.ropensci.org/getCRUCLdata/", + "releaseNotes": "https://github.com/ropensci/getCRUCLdata/blob/master/NEWS.md", + "readme": "https://github.com/ropensci/getCRUCLdata/blob/main/README.md", + "contIntegration": ["https://app.codecov.io/gh/ropensci/getCRUCLdata?branch=main", "https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml"], "developmentStatus": "https://www.repostatus.org/", "review": { "@type": "Review", From b6be5997287833014212642983833af5a5063088 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 4 Aug 2024 12:28:06 +0800 Subject: [PATCH 007/127] Update github actions workflows --- .github/workflows/R-CMD-check.yaml | 50 ---------------------------- .github/workflows/test-coverage.yaml | 50 ---------------------------- README.md | 4 +++ 3 files changed, 4 insertions(+), 100 deletions(-) delete mode 100644 .github/workflows/R-CMD-check.yaml delete mode 100644 .github/workflows/test-coverage.yaml diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml deleted file mode 100644 index 14159b7..0000000 --- a/.github/workflows/R-CMD-check.yaml +++ /dev/null @@ -1,50 +0,0 @@ -# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples -# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help -on: - push: - branches: [main, master] - pull_request: - branches: [main, master] - -name: R-CMD-check - -jobs: - R-CMD-check: - runs-on: ${{ matrix.config.os }} - - name: ${{ matrix.config.os }} (${{ matrix.config.r }}) - - strategy: - fail-fast: false - matrix: - config: - - {os: macos-latest, r: 'release'} - - {os: windows-latest, r: 'release'} - - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} - - {os: ubuntu-latest, r: 'release'} - - {os: ubuntu-latest, r: 'oldrel-1'} - - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - R_KEEP_PKG_SOURCE: yes - - steps: - - uses: actions/checkout@v4 - - - uses: r-lib/actions/setup-pandoc@v2 - - - uses: r-lib/actions/setup-r@v2 - with: - r-version: ${{ matrix.config.r }} - http-user-agent: ${{ matrix.config.http-user-agent }} - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - extra-packages: any::rcmdcheck - needs: check - - - uses: r-lib/actions/check-r-package@v2 - with: - upload-snapshots: true - build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml deleted file mode 100644 index 21b8a93..0000000 --- a/.github/workflows/test-coverage.yaml +++ /dev/null @@ -1,50 +0,0 @@ -# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples -# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help -on: - push: - branches: [main, master] - pull_request: - branches: [main, master] - -name: test-coverage - -jobs: - test-coverage: - runs-on: ubuntu-latest - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - - steps: - - uses: actions/checkout@v4 - - - uses: r-lib/actions/setup-r@v2 - with: - use-public-rspm: true - - - uses: r-lib/actions/setup-r-dependencies@v2 - with: - extra-packages: any::covr - needs: coverage - - - name: Test coverage - run: | - covr::codecov( - quiet = FALSE, - clean = FALSE, - install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") - ) - shell: Rscript {0} - - - name: Show testthat output - if: always() - run: | - ## -------------------------------------------------------------------- - find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true - shell: bash - - - name: Upload test results - if: failure() - uses: actions/upload-artifact@v4 - with: - name: coverage-test-failures - path: ${{ runner.temp }}/package diff --git a/README.md b/README.md index f7851ca..0b73547 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) [![R-CMD-check](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml) +<<<<<<< HEAD +======= +[![Codecov test coverage](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg)](https://app.codecov.io/gh/ropensci/getCRUCLdata) +>>>>>>> 82efe3f (Update github actions workflows) Author/Maintainer: Adam Sparks From 9d61e01a0b8aeeaba7f3c9fd9bc86a4501ca48e9 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 4 Aug 2024 12:28:46 +0800 Subject: [PATCH 008/127] Setup new GitHub Actions --- .github/workflows/R-CMD-check.yaml | 52 ++++++++++++++++++++++++ .github/workflows/test-coverage.yaml | 61 ++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 .github/workflows/R-CMD-check.yaml create mode 100644 .github/workflows/test-coverage.yaml diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..d46a617 --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,52 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: R-CMD-check.yaml + +permissions: read-all + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + + strategy: + fail-fast: false + matrix: + config: + - {os: macos-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml new file mode 100644 index 0000000..9882260 --- /dev/null +++ b/.github/workflows/test-coverage.yaml @@ -0,0 +1,61 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +name: test-coverage.yaml + +permissions: read-all + +jobs: + test-coverage: + runs-on: ubuntu-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::covr, any::xml2 + needs: coverage + + - name: Test coverage + run: | + cov <- covr::package_coverage( + quiet = FALSE, + clean = FALSE, + install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") + ) + covr::to_cobertura(cov) + shell: Rscript {0} + + - uses: codecov/codecov-action@v4 + with: + fail_ci_if_error: ${{ github.event_name != 'pull_request' && true || false }} + file: ./cobertura.xml + plugin: noop + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Show testthat output + if: always() + run: | + ## -------------------------------------------------------------------- + find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true + shell: bash + + - name: Upload test results + if: failure() + uses: actions/upload-artifact@v4 + with: + name: coverage-test-failures + path: ${{ runner.temp }}/package From 443ce9b674330d03bd1904f5413885ea06c77479 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 4 Aug 2024 12:29:18 +0800 Subject: [PATCH 009/127] Update README badges --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 0b73547..1c65b45 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,13 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R ================ -[![Codecov test coverage](https://codecov.io/gh/ropensci/getCRUCLdata/branch/main/graph/badge.svg)](https://app.codecov.io/gh/ropensci/getCRUCLdata?branch=main) +nsci/getCRUCLdata?branch=main) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) [![CRAN\_Status\_Badge](http://www.r-pkg.org/badges/version/getCRUCLdata)](https://cran.r-project.org/package=getCRUCLdata) [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) -[![R-CMD-check](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml) -<<<<<<< HEAD -======= [![Codecov test coverage](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg)](https://app.codecov.io/gh/ropensci/getCRUCLdata) ->>>>>>> 82efe3f (Update github actions workflows) Author/Maintainer: Adam Sparks From 24127bf078012c19a4556ef519a5a3600fd69db9 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 19:44:25 +0800 Subject: [PATCH 010/127] Style package --- R/create_CRU_df.R | 87 +- R/create_CRU_stack.R | 39 +- R/get_CRU.R | 7 +- R/get_CRU_df.R | 36 +- R/get_CRU_stack.R | 38 +- R/internal_functions.R | 90 +- R/manage_cached_files.R | 1 - R/zzz.R | 3 +- tests/spelling.R | 9 +- tests/testthat/test-create_CRU_df.R | 13 +- tests/testthat/test-create_CRU_stack.R | 65 +- tests/testthat/test-create_df.R | 1711 ++++++++++++------------ tests/testthat/test-create_stack.R | 144 +- tests/testthat/test-get_CRU.R | 1 - tests/testthat/test-get_CRU_df.R | 57 +- tests/testthat/test-get_CRU_stack.R | 55 +- tests/testthat/test-validate_dsn.R | 1 - tests/testthat/test_caching.R | 13 +- tests/testthat/test_get_local.R | 46 +- tests/testthat/test_set_cache.R | 1 - vignettes/Advanced_use.Rmd | 8 +- 21 files changed, 1238 insertions(+), 1187 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 45137e7..bffacfb 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -1,29 +1,28 @@ - #' @title Create a data of climatology variables from local disk files #' -#'@description Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology +#' @description Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a tidy data frame of the data. If requested, minimum and #' maximum temperature may also be automatically calculated as described in the #' data readme.txt file. This function can be useful if you have network #' connection issues that mean automated downloading of the files using \R #' does not work properly. #' -#'Nomenclature and units from readme.txt: -#'\describe{ -#'\item{pre}{precipitation (millimetres/month)} +#' Nomenclature and units from readme.txt: +#' \describe{ +#' \item{pre}{precipitation (millimetres/month)} #' \describe{ #' \item{cv}{cv of precipitation (percent)} #' } -#'\item{rd0}{wet-days (number days with >0.1mm rain per month)} -#'\item{tmp}{mean temperature (degrees Celsius)} -#'\item{dtr}{mean diurnal temperature range (degrees Celsius)} -#'\item{reh}{relative humidity (percent)} -#'\item{sunp}{sunshine (percent of maximum possible (percent of day length))} -#'\item{frs}{ground-frost (number of days with ground-frost per month)} -#'\item{wnd}{10 metre windspeed (metres/second)} -#'\item{elv}{elevation (automatically converted to metres)} -#'} -#'For more information see the description of the data provided by +#' \item{rd0}{wet-days (number days with >0.1mm rain per month)} +#' \item{tmp}{mean temperature (degrees Celsius)} +#' \item{dtr}{mean diurnal temperature range (degrees Celsius)} +#' \item{reh}{relative humidity (percent)} +#' \item{sunp}{sunshine (percent of maximum possible (percent of day length))} +#' \item{frs}{ground-frost (number of days with ground-frost per month)} +#' \item{wnd}{10 metre windspeed (metres/second)} +#' \item{elv}{elevation (automatically converted to metres)} +#' } +#' For more information see the description of the data provided by #' \acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} #' #' @param pre Logical. Fetch precipitation (millimetres/month) from server and @@ -81,41 +80,43 @@ #' metres. #' @export create_CRU_df -create_CRU_df <- function(pre = FALSE, - pre_cv = FALSE, - rd0 = FALSE, - tmp = FALSE, - dtr = FALSE, - reh = FALSE, - tmn = FALSE, - tmx = FALSE, - sunp = FALSE, - frs = FALSE, - wnd = FALSE, - elv = FALSE, - dsn = "") { +create_CRU_df <- function(pre = FALSE, + pre_cv = FALSE, + rd0 = FALSE, + tmp = FALSE, + dtr = FALSE, + reh = FALSE, + tmn = FALSE, + tmx = FALSE, + sunp = FALSE, + frs = FALSE, + wnd = FALSE, + elv = FALSE, + dsn = "") { if (!isTRUE(pre) & !isTRUE(pre_cv) & !isTRUE(rd0) & !isTRUE(tmp) & - !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & - !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { + !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & + !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { stop("\nYou must select at least one element for importing.\n", - call. = FALSE) + call. = FALSE + ) } .validate_dsn(dsn) files <- .get_local(pre, - pre_cv, - rd0, - tmp, - dtr, - reh, - tmn, - tmx, - sunp, - frs, - wnd, - elv, - cache_dir = dsn) + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir = dsn + ) if (length(files) == 0) { stop( diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index dbac4ff..d64edc6 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -1,7 +1,6 @@ - #' @title Create a list of terra rast objects from local disk files #' -#'@description Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology +#' @description Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a \code{\link{terra}} \code{\link[terra]{rast}} of the #' data. If requested, minimum and maximum temperature may also be #' automatically calculated as described in the data readme.txt file. This @@ -22,8 +21,8 @@ #' \item{frs}{ground-frost (number of days with ground-frost per month)} #' \item{wnd}{10 metre windspeed (metres/second)} #' \item{elv}{elevation (automatically converted to metres)} -#'} -#'For more information see the description of the data provided by +#' } +#' For more information see the description of the data provided by #' \acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} #' #' @param pre Logical. Fetch precipitation (millimetres/month) from server and @@ -101,27 +100,29 @@ create_CRU_stack <- function(pre = FALSE, elv = FALSE, dsn = "") { if (!isTRUE(pre) & !isTRUE(pre_cv) & !isTRUE(rd0) & !isTRUE(tmp) & - !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & - !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { + !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & + !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { stop("\nYou must select at least one element for importing.\n", - call. = FALSE) + call. = FALSE + ) } .validate_dsn(dsn) files <- .get_local(pre, - pre_cv, - rd0, - tmp, - dtr, - reh, - tmn, - tmx, - sunp, - frs, - wnd, - elv, - cache_dir = dsn) + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir = dsn + ) if (length(files) == 0) { stop( diff --git a/R/get_CRU.R b/R/get_CRU.R index d497cdd..ed03e54 100644 --- a/R/get_CRU.R +++ b/R/get_CRU.R @@ -1,4 +1,3 @@ - #' @noRd .get_CRU <- function(pre, @@ -75,7 +74,6 @@ # download files ----------------------------------------------------------- if (length(dl_files) > 0) { - CRU_url <- "https://crudata.uea.ac.uk/cru/data/hrg/tmc/" dl_files <- as.list(paste0(CRU_url, dl_files)) @@ -98,7 +96,8 @@ # filter files from cache directory in case there are local files for which # we do not want data cache_dir_contents <- as.list(list.files(cache_dir, - pattern = ".dat.gz$")) + pattern = ".dat.gz$" + )) files <- cache_dir_contents[cache_dir_contents %in% files] @@ -109,4 +108,4 @@ files <- gsub(" ", "\\ ", files, fixed = TRUE) return(files) - } + } diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 085be8f..8a0f88a 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -1,4 +1,3 @@ - #' @title Download and create a data frame of climatology parameters #' #' @description This function automates downloading and importing \acronym{CRU} @@ -94,27 +93,30 @@ get_CRU_df <- function(pre = FALSE, elv = FALSE, cache = FALSE) { if (!isTRUE(pre) & !isTRUE(pre_cv) & !isTRUE(rd0) & !isTRUE(tmp) & - !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & - !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { + !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & + !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { stop("\nYou must select at least one element for download.\n", - call. = FALSE) + call. = FALSE + ) } cache_dir <- .set_cache(cache) - files <- .get_CRU(pre, - pre_cv, - rd0, - tmp, - dtr, - reh, - tmn, - tmx, - sunp, - frs, - wnd, - elv, - cache_dir) + files <- .get_CRU( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir + ) return(.create_df(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files)) } diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 4287743..402157e 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -1,7 +1,6 @@ - #' @title Download and create a list of terra rast objects of climatology parameters #' -#'@description This function automates downloading and importing CRU CL v. 2.0 +#' @description This function automates downloading and importing CRU CL v. 2.0 #' climatology data into \R and creates a list of \code{\link{terra}} #' \code{\link[terra]{rast}} of the data. If requested, minimum and maximum #' temperature may also be automatically calculated as described in the data @@ -101,27 +100,30 @@ get_CRU_stack <- elv = FALSE, cache = FALSE) { if (!isTRUE(pre) & !isTRUE(pre_cv) & !isTRUE(rd0) & !isTRUE(tmp) & - !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & - !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { + !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & + !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { stop("\nYou must select at least one element for download.\n", - call. = FALSE) + call. = FALSE + ) } cache_dir <- .set_cache(cache) - files <- .get_CRU(pre, - pre_cv, - rd0, - tmp, - dtr, - reh, - tmn, - tmx, - sunp, - frs, - wnd, - elv, - cache_dir) + files <- .get_CRU( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir + ) if (isTRUE(pre_cv)) { pre <- TRUE diff --git a/R/internal_functions.R b/R/internal_functions.R index d9a9ef7..a66fbaa 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -16,14 +16,15 @@ if (substr(dsn, nchar(dsn) - 1, nchar(dsn)) == "//") { p <- substr(dsn, 1, nchar(dsn) - 2) } else if (substr(dsn, nchar(dsn), nchar(dsn)) == "/" | - substr(dsn, nchar(dsn), nchar(dsn)) == "\\") { + substr(dsn, nchar(dsn), nchar(dsn)) == "\\") { p <- substr(dsn, 1, nchar(dsn) - 1) } else { p <- dsn } if (!file.exists(p) & !file.exists(dsn)) { stop("\nFile directory does not exist: ", dsn, ".\n", - call. = FALSE) + call. = FALSE + ) } } } @@ -94,9 +95,11 @@ .tidy_df <- function(pre_cv, elv, tmn, tmx, .files) { # create list of tidied data frames ---------------------------------------- CRU_list <- - lapply(X = .files, - FUN = .read_cache, - .pre_cv = pre_cv) + lapply( + X = .files, + FUN = .read_cache, + .pre_cv = pre_cv + ) # name the items in the list for the data that they contain ---------------- names(CRU_list) <- substr(basename(.files), 12, 14) @@ -111,17 +114,17 @@ # lastly merge the data frames into one tidy (large) data frame -------------- if (!isTRUE(elv)) { - CRU_df <- Reduce(function(...) - merge(..., by = c("lat", "lon", "month")), CRU_list) - + CRU_df <- Reduce(function(...) { + merge(..., by = c("lat", "lon", "month")) + }, CRU_list) } else if (isTRUE(elv) & length(CRU_list) > 1) { elv_df <- CRU_list[which(names(CRU_list) %in% "elv")] CRU_list[which(names(CRU_list) %in% "elv")] <- NULL - CRU_df <- Reduce(function(...) - merge(..., by = c("lat", "lon", "month")), CRU_list) + CRU_df <- Reduce(function(...) { + merge(..., by = c("lat", "lon", "month")) + }, CRU_list) CRU_df <- CRU_df[elv_df$elv, on = c("lat", "lon")] - } else if (isTRUE(elv)) { CRU_df <- CRU_list["elv"] } @@ -135,7 +138,8 @@ .read_cache <- function(.files, .pre_cv) { pre_cv <- i.pre_cv <- elv <- NULL month_names <- - c("jan", + c( + "jan", "feb", "mar", "apr", @@ -146,20 +150,24 @@ "sep", "oct", "nov", - "dec") + "dec" + ) x <- - data.table::fread(cmd = paste0("gzip -dc ", .files), - header = FALSE) + data.table::fread( + cmd = paste0("gzip -dc ", .files), + header = FALSE + ) if (ncol(x) == 14) { data.table::setnames(x, c("lat", "lon", month_names)) x_df <- - data.table::melt(data = x, - measure.vars = month_names, - variable.name = "month") + data.table::melt( + data = x, + measure.vars = month_names, + variable.name = "month" + ) data.table::setnames(x_df, c("lat", "lon", "month", "wvar")) - } else if (ncol(x) == 26) { if (isTRUE(.pre_cv)) { x_df <- x[, c(1:14)] @@ -186,7 +194,6 @@ data.table::setkeyv(x_df, cols = keycols) data.table::setkeyv(x_df2, cols = keycols) x_df[x_df2, on = c("lat", "lon", "month"), pre_cv := i.pre_cv] - } else { x_df <- x[, c(1:14)] names(x_df) <- c("lat", "lon", month_names) @@ -198,7 +205,7 @@ ) data.table::setnames(x_df, c("lat", "lon", "month", "pre")) } - } else if (ncol(x) == 3) { + } else if (ncol(x) == 3) { x_df <- x data.table::setnames(x_df, c("lat", "lon", "elv")) x_df[, elv := (elv * 1000)] @@ -222,7 +229,8 @@ wrld[] <- NA month_names <- - c("jan", + c( + "jan", "feb", "mar", "apr", @@ -233,7 +241,8 @@ "sep", "oct", "nov", - "dec") + "dec" + ) # Create terra objects using cellFromXY and generate a terra rast # create.stack takes pre, tmp, tmn and tmx and creates a terra rast @@ -279,16 +288,19 @@ pre, pre_cv) { wvar <- - data.frame(data.table::fread(cmd = paste0("gzip -dc ", files[[1]]), - header = FALSE)) + data.frame(data.table::fread( + cmd = paste0("gzip -dc ", files[[1]]), + header = FALSE + )) cells <- terra::cellFromXY(wrld, wvar[, c(2, 1)]) if (ncol(wvar) == 14) { for (j in 3:14) { wrld[cells] <- wvar[, j] if (j == 3) { y <- wrld - } else + } else { y <- c(y, wrld) + } } names(y) <- month_names } else if (ncol(wvar) == 26) { @@ -297,8 +309,9 @@ wrld[cells] <- wvar[, k] if (k == 3) { y <- wrld - } else + } else { y <- c(y, wrld) + } } names(y) <- c(month_names, paste0("pre_cv_", month_names)) } else if (isTRUE(pre)) { @@ -306,8 +319,9 @@ wrld[cells] <- wvar[, k] if (k == 3) { y <- wrld - } else + } else { y <- c(y, wrld) + } } names(y) <- month_names } else if (isTRUE(pre_cv)) { @@ -315,22 +329,24 @@ wrld[cells] <- wvar[, k] if (k == 15) { y <- wrld - } else + } else { y <- c(y, wrld) + } } names(y) <- paste0("pre_cv_", month_names) } - } else if (ncol(wvar) == 3) { wrld[cells] <- wvar[, 3] * 1000 y <- wrld names(y) <- "elv" } - y <- terra::crop(y, terra::ext(-180, - 180, - -60, - 85)) + y <- terra::crop(y, terra::ext( + -180, + 180, + -60, + 85 + )) return(y) } @@ -415,13 +431,15 @@ # filter files from cache directory in case there are local files for which # we do not want data cache_dir_contents <- as.list(list.files(cache_dir, - pattern = ".dat.gz$")) + pattern = ".dat.gz$" + )) files <- cache_dir_contents[cache_dir_contents %in% files] if (length(files) < 0) { stop("\nThere are no CRU CL v. 2.0 data files available in this directory.\n", - call. = FALSE) + call. = FALSE + ) } # add full file path to the files diff --git a/R/manage_cached_files.R b/R/manage_cached_files.R index 1e9533d..615e5fc 100644 --- a/R/manage_cached_files.R +++ b/R/manage_cached_files.R @@ -1,4 +1,3 @@ - #' @title Manage locally cached CRU CL v. 2.0 files #' #' @description Manage cached \CRANpkg{getCRUCLdata} files with \CRANpkg{hoardr} diff --git a/R/zzz.R b/R/zzz.R index 590a49b..db3e76e 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,4 +1,3 @@ - manage_cache <- NULL # nocov start .onLoad <- @@ -12,7 +11,7 @@ manage_cache <- NULL # nocov start x$cache_path_set(path = "getCRUCLdata", type = "user_cache_dir") manage_cache <<- x } - } + } #' @import data.table NULL diff --git a/tests/spelling.R b/tests/spelling.R index 6713838..13f77d9 100644 --- a/tests/spelling.R +++ b/tests/spelling.R @@ -1,3 +1,6 @@ -if(requireNamespace('spelling', quietly = TRUE)) - spelling::spell_check_test(vignettes = TRUE, error = FALSE, - skip_on_cran = TRUE) +if (requireNamespace("spelling", quietly = TRUE)) { + spelling::spell_check_test( + vignettes = TRUE, error = FALSE, + skip_on_cran = TRUE + ) +} diff --git a/tests/testthat/test-create_CRU_df.R b/tests/testthat/test-create_CRU_df.R index d8f9645..ff9ee8c 100644 --- a/tests/testthat/test-create_CRU_df.R +++ b/tests/testthat/test-create_CRU_df.R @@ -1,16 +1,19 @@ - # Test that create_CRU_df fails if no parameters are TRUE ---------------------- test_that("create_CRU_df fails if no parameters are TRUE", { - expect_error(create_CRU_df(dsn = "~/"), - "You must select at least one element for import.") + expect_error( + create_CRU_df(dsn = "~/"), + "You must select at least one element for import." + ) }) # Test that create_CRU_df fails if no dsn is specified ------------------------- test_that("create_CRU_df fails if no dsn is specified", { - expect_error(create_CRU_df(pre = TRUE), - "File directory does not exist: .") + expect_error( + create_CRU_df(pre = TRUE), + "File directory does not exist: ." + ) }) # Test that create_CRU_df fails if dsn does not contain CRU files -------------- diff --git a/tests/testthat/test-create_CRU_stack.R b/tests/testthat/test-create_CRU_stack.R index 6d84618..6abd3d6 100644 --- a/tests/testthat/test-create_CRU_stack.R +++ b/tests/testthat/test-create_CRU_stack.R @@ -1,16 +1,19 @@ - # Test that create_CRU_stack fails if no dsn is specified ---------------------- test_that("create_CRU_stack fails if no dsn is specified", { - expect_error(create_CRU_stack(pre = TRUE), - "File directory does not exist: .") + expect_error( + create_CRU_stack(pre = TRUE), + "File directory does not exist: ." + ) }) # Test that create_CRU_stack fails if no parameters are TRUE ------------------- test_that("create_CRU_stack fails if no parameters are TRUE", { - expect_error(create_CRU_stack(dsn = "~/"), - "You must select at least one element for importing") + expect_error( + create_CRU_stack(dsn = "~/"), + "You must select at least one element for importing" + ) }) # Test that create_CRU_stack fails if dsn does not contain CRU files ----------- @@ -22,7 +25,6 @@ test_that("create_CRU_stack fails if dsn does not contain CRU files", { # Test that create_CRU_stack returns a list of terra objects ------------------- test_that("create_CRU_stack returns a list of terra rast objects", { - skip_on_cran() unlink(list.files( @@ -478,16 +480,18 @@ test_that("create_CRU_stack returns a list of terra rast objects", { ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") utils::write.table(pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) dsn <- tempdir() @@ -502,8 +506,7 @@ test_that("create_CRU_stack returns a list of terra rast objects", { pattern = ".dat.gz$", full.names = TRUE )) - - }) +}) # Test that create_stack creates tmx if requested ------------------------------ @@ -835,16 +838,18 @@ test_that("Test that create_stack creates tmx if requested", { ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_dtr.dat.gz"), "w") utils::write.table(dtr_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) pre_cv <- FALSE @@ -864,7 +869,8 @@ test_that("Test that create_stack creates tmx if requested", { expect_named(CRU_stack_list, c("tmx")) expect_equal(terra::minmax(CRU_stack_list[[1]])[[2]][[1]], 12.9, - tolerance = 0.1) + tolerance = 0.1 + ) unlink(list.files( path = tempdir(), pattern = ".dat.gz$", @@ -1201,16 +1207,18 @@ test_that("Test that create_stack creates tmn if requested", { ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_dtr.dat.gz"), "w") utils::write.table(dtr_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) pre_cv <- FALSE @@ -1230,7 +1238,8 @@ test_that("Test that create_stack creates tmn if requested", { expect_named(CRU_stack_list, c("tmn")) expect_equal(terra::minmax(CRU_stack_list[[1]])[[2]][[1]], 4.3, - tolerance = 0.1) + tolerance = 0.1 + ) unlink(list.files( path = tempdir(), pattern = ".dat.gz$", diff --git a/tests/testthat/test-create_df.R b/tests/testthat/test-create_df.R index 7ddc6e6..93cbf7d 100644 --- a/tests/testthat/test-create_df.R +++ b/tests/testthat/test-create_df.R @@ -1,509 +1,506 @@ - # Test that create_df creates a tidy dataframe of pre, pre_cv and tmp --------- test_that("Test that .create_df() creates a tidy df of pre, pre_cv and tmp", { - unlink(list.files( path = tempdir(), pattern = ".dat.gz$", full.names = TRUE )) -# create files for testing, these data are the first 10 lines of pre and tmp -# from the CRU CL v. 2.0 data -pre_data <- rbind( - c( - -59.083, - -26.583, - 105.4, - 121.3, - 141.3, - 146.7, - 159.6, - 162.4, - 141.5, - 151.1, - 141.6, - 124.9, - 110.0, - 93.9, - 35.2, - 38.7, - 38.4, - 27.5, - 49.5, - 40.8, - 50.8, - 33.5, - 42.2, - 56.6, - 35.5, - 43.4 - ), - c( - -58.417, - -26.250, - 106.3, - 121.3, - 141.6, - 147.4, - 160.3, - 163.5, - 142.1, - 151.7, - 142.1, - 125.5, - 110.5, - 94.4, - 36.2, - 39.8, - 38.6, - 27.8, - 49.6, - 40.8, - 51.0, - 33.3, - 43.1, - 57.2, - 35.8, - 44.2 - ), - c( - -58.417, - -26.417, - 106.6, - 121.9, - 142.1, - 147.5, - 160.3, - 163.4, - 142.0, - 151.7, - 142.1, - 125.5, - 110.5, - 94.5, - 36.2, - 39.7, - 38.6, - 27.8, - 49.7, - 40.9, - 51.0, - 33.3, - 43.1, - 57.2, - 35.9, - 44.2 - ), - c( - -55.917, - -67.250, - 73.1, - 78.7, - 81.5, - 81.2, - 68.5, - 67.9, - 62.5, - 60.2, - 60.4, - 55.0, - 59.9, - 71.2, - 44.1, - 54.2, - 51.1, - 54.2, - 59.0, - 47.2, - 62.0, - 65.6, - 58.9, - 47.8, - 50.9, - 47.0 - ), - c( - -55.750, - -67.250, - 68.7, - 73.8, - 76.6, - 76.9, - 65.3, - 64.4, - 58.6, - 56.9, - 56.7, - 51.5, - 56.4, - 67.1, - 44.7, - 55.0, - 51.9, - 54.4, - 59.6, - 48.2, - 63.0, - 66.5, - 60.3, - 48.8, - 51.7, - 47.6 - ), - c( - -55.750, - -67.417, - 70.2, - 75.7, - 78.8, - 78.6, - 66.5, - 66.2, - 59.8, - 58.7, - 58.1, - 52.7, - 57.2, - 68.4, - 44.6, - 55.0, - 51.9, - 54.8, - 59.8, - 48.2, - 62.9, - 66.4, - 60.1, - 48.5, - 51.9, - 47.6 - ), - c( - -55.750, - -67.583, - 71.7, - 77.4, - 80.6, - 81.0, - 68.6, - 67.8, - 61.8, - 60.3, - 59.8, - 54.2, - 58.5, - 70.0, - 44.6, - 55.1, - 51.9, - 55.1, - 59.9, - 48.3, - 62.6, - 66.4, - 59.9, - 48.2, - 52.0, - 47.6 - ), - c( - -55.583, - -67.417, - 65.3, - 70.3, - 73.4, - 74.0, - 63.3, - 62.4, - 55.8, - 55.1, - 54.3, - 49.1, - 53.6, - 64.0, - 45.3, - 55.9, - 52.8, - 55.0, - 60.4, - 49.3, - 63.9, - 67.4, - 61.6, - 49.5, - 52.7, - 48.3 - ), - c( - -55.583, - -67.583, - 66.5, - 71.6, - 75.0, - 76.0, - 65.1, - 63.8, - 57.5, - 56.6, - 55.8, - 50.4, - 54.5, - 65.2, - 45.3, - 56.0, - 53.0, - 55.3, - 60.6, - 49.5, - 63.7, - 67.4, - 61.4, - 49.2, - 52.9, - 48.4 - ), - c( - -55.583, - -68.083, - 71.6, - 78.0, - 82.6, - 82.0, - 69.6, - 69.7, - 61.8, - 62.6, - 60.8, - 54.7, - 57.9, - 69.8, - 45.4, - 55.9, - 52.7, - 56.3, - 61.0, - 49.6, - 63.3, - 66.9, - 60.7, - 48.4, - 53.4, - 48.6 + # create files for testing, these data are the first 10 lines of pre and tmp + # from the CRU CL v. 2.0 data + pre_data <- rbind( + c( + -59.083, + -26.583, + 105.4, + 121.3, + 141.3, + 146.7, + 159.6, + 162.4, + 141.5, + 151.1, + 141.6, + 124.9, + 110.0, + 93.9, + 35.2, + 38.7, + 38.4, + 27.5, + 49.5, + 40.8, + 50.8, + 33.5, + 42.2, + 56.6, + 35.5, + 43.4 + ), + c( + -58.417, + -26.250, + 106.3, + 121.3, + 141.6, + 147.4, + 160.3, + 163.5, + 142.1, + 151.7, + 142.1, + 125.5, + 110.5, + 94.4, + 36.2, + 39.8, + 38.6, + 27.8, + 49.6, + 40.8, + 51.0, + 33.3, + 43.1, + 57.2, + 35.8, + 44.2 + ), + c( + -58.417, + -26.417, + 106.6, + 121.9, + 142.1, + 147.5, + 160.3, + 163.4, + 142.0, + 151.7, + 142.1, + 125.5, + 110.5, + 94.5, + 36.2, + 39.7, + 38.6, + 27.8, + 49.7, + 40.9, + 51.0, + 33.3, + 43.1, + 57.2, + 35.9, + 44.2 + ), + c( + -55.917, + -67.250, + 73.1, + 78.7, + 81.5, + 81.2, + 68.5, + 67.9, + 62.5, + 60.2, + 60.4, + 55.0, + 59.9, + 71.2, + 44.1, + 54.2, + 51.1, + 54.2, + 59.0, + 47.2, + 62.0, + 65.6, + 58.9, + 47.8, + 50.9, + 47.0 + ), + c( + -55.750, + -67.250, + 68.7, + 73.8, + 76.6, + 76.9, + 65.3, + 64.4, + 58.6, + 56.9, + 56.7, + 51.5, + 56.4, + 67.1, + 44.7, + 55.0, + 51.9, + 54.4, + 59.6, + 48.2, + 63.0, + 66.5, + 60.3, + 48.8, + 51.7, + 47.6 + ), + c( + -55.750, + -67.417, + 70.2, + 75.7, + 78.8, + 78.6, + 66.5, + 66.2, + 59.8, + 58.7, + 58.1, + 52.7, + 57.2, + 68.4, + 44.6, + 55.0, + 51.9, + 54.8, + 59.8, + 48.2, + 62.9, + 66.4, + 60.1, + 48.5, + 51.9, + 47.6 + ), + c( + -55.750, + -67.583, + 71.7, + 77.4, + 80.6, + 81.0, + 68.6, + 67.8, + 61.8, + 60.3, + 59.8, + 54.2, + 58.5, + 70.0, + 44.6, + 55.1, + 51.9, + 55.1, + 59.9, + 48.3, + 62.6, + 66.4, + 59.9, + 48.2, + 52.0, + 47.6 + ), + c( + -55.583, + -67.417, + 65.3, + 70.3, + 73.4, + 74.0, + 63.3, + 62.4, + 55.8, + 55.1, + 54.3, + 49.1, + 53.6, + 64.0, + 45.3, + 55.9, + 52.8, + 55.0, + 60.4, + 49.3, + 63.9, + 67.4, + 61.6, + 49.5, + 52.7, + 48.3 + ), + c( + -55.583, + -67.583, + 66.5, + 71.6, + 75.0, + 76.0, + 65.1, + 63.8, + 57.5, + 56.6, + 55.8, + 50.4, + 54.5, + 65.2, + 45.3, + 56.0, + 53.0, + 55.3, + 60.6, + 49.5, + 63.7, + 67.4, + 61.4, + 49.2, + 52.9, + 48.4 + ), + c( + -55.583, + -68.083, + 71.6, + 78.0, + 82.6, + 82.0, + 69.6, + 69.7, + 61.8, + 62.6, + 60.8, + 54.7, + 57.9, + 69.8, + 45.4, + 55.9, + 52.7, + 56.3, + 61.0, + 49.6, + 63.3, + 66.9, + 60.7, + 48.4, + 53.4, + 48.6 + ) ) -) -tmp_data <- rbind( - c( - -59.083, - -26.583, - 0.2, - 0.3, - 0.2, - -1.9, - -6.0, - -9.8, - -13.6, - -9.2, - -8.1, - -5.3, - -2.3, - -1.1 - ), - c( - -58.417, - -26.250, - 0.6, - 0.8, - 0.7, - -1.4, - -5.4, - -9.1, - -12.9, - -8.6, - -7.5, - -4.7, - -1.8, - -0.7 - ), - c( - -58.417, - -26.417, - 0.4, - 0.5, - 0.5, - -1.6, - -5.6, - -9.3, - -13.1, - -8.8, - -7.7, - -4.9, - -2.1, - -0.9 - ), - c( - -55.917, - -67.250, - 8.0, - 8.0, - 6.8, - 5.2, - 3.1, - 1.7, - 1.2, - 1.8, - 3.1, - 4.8, - 6.1, - 7.3 - ), - c( - -55.750, - -67.250, - 8.2, - 8.2, - 6.9, - 5.2, - 3.1, - 1.7, - 1.1, - 1.8, - 3.1, - 4.9, - 6.3, - 7.5 - ), - c( - -55.750, - -67.417, - 8.0, - 8.0, - 6.7, - 5.1, - 3.0, - 1.6, - 1.0, - 1.8, - 3.1, - 4.8, - 6.1, - 7.3 - ), - c( - -55.750, - -67.583, - 8.4, - 8.4, - 7.1, - 5.5, - 3.4, - 2.0, - 1.5, - 2.2, - 3.5, - 5.2, - 6.5, - 7.7 - ), - c( - -55.583, - -67.417, - 8.3, - 8.3, - 7.0, - 5.3, - 3.0, - 1.6, - 1.1, - 1.9, - 3.2, - 5.0, - 6.4, - 7.7 - ), - c( - -55.583, - -67.583, - 8.6, - 8.6, - 7.3, - 5.6, - 3.4, - 1.9, - 1.4, - 2.2, - 3.6, - 5.4, - 6.7, - 8.0 - ), - c( - -55.583, - -68.083, - 8.2, - 8.2, - 6.9, - 5.3, - 3.1, - 1.8, - 1.3, - 2.0, - 3.4, - 5.1, - 6.4, - 7.6 + tmp_data <- rbind( + c( + -59.083, + -26.583, + 0.2, + 0.3, + 0.2, + -1.9, + -6.0, + -9.8, + -13.6, + -9.2, + -8.1, + -5.3, + -2.3, + -1.1 + ), + c( + -58.417, + -26.250, + 0.6, + 0.8, + 0.7, + -1.4, + -5.4, + -9.1, + -12.9, + -8.6, + -7.5, + -4.7, + -1.8, + -0.7 + ), + c( + -58.417, + -26.417, + 0.4, + 0.5, + 0.5, + -1.6, + -5.6, + -9.3, + -13.1, + -8.8, + -7.7, + -4.9, + -2.1, + -0.9 + ), + c( + -55.917, + -67.250, + 8.0, + 8.0, + 6.8, + 5.2, + 3.1, + 1.7, + 1.2, + 1.8, + 3.1, + 4.8, + 6.1, + 7.3 + ), + c( + -55.750, + -67.250, + 8.2, + 8.2, + 6.9, + 5.2, + 3.1, + 1.7, + 1.1, + 1.8, + 3.1, + 4.9, + 6.3, + 7.5 + ), + c( + -55.750, + -67.417, + 8.0, + 8.0, + 6.7, + 5.1, + 3.0, + 1.6, + 1.0, + 1.8, + 3.1, + 4.8, + 6.1, + 7.3 + ), + c( + -55.750, + -67.583, + 8.4, + 8.4, + 7.1, + 5.5, + 3.4, + 2.0, + 1.5, + 2.2, + 3.5, + 5.2, + 6.5, + 7.7 + ), + c( + -55.583, + -67.417, + 8.3, + 8.3, + 7.0, + 5.3, + 3.0, + 1.6, + 1.1, + 1.9, + 3.2, + 5.0, + 6.4, + 7.7 + ), + c( + -55.583, + -67.583, + 8.6, + 8.6, + 7.3, + 5.6, + 3.4, + 1.9, + 1.4, + 2.2, + 3.6, + 5.4, + 6.7, + 8.0 + ), + c( + -55.583, + -68.083, + 8.2, + 8.2, + 6.9, + 5.3, + 3.1, + 1.8, + 1.3, + 2.0, + 3.4, + 5.1, + 6.4, + 7.6 + ) + ) + gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") + utils::write.table( + pre_data, + file = gz1, + col.names = FALSE, + row.names = FALSE ) -) -gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") -utils::write.table( - pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE -) -close(gz1) + close(gz1) -gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") -utils::write.table( - tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE -) -close(gz1) + gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") + utils::write.table( + tmp_data, + file = gz1, + col.names = FALSE, + row.names = FALSE + ) + close(gz1) -pre_cv <- TRUE -pre <- TRUE -tmn <- FALSE -tmx <- FALSE -elv <- FALSE -rd0 <- FALSE -tmp <- FALSE -dtr <- FALSE -reh <- FALSE -sunp <- FALSE -frs <- FALSE -wnd <- FALSE + pre_cv <- TRUE + pre <- TRUE + tmn <- FALSE + tmx <- FALSE + elv <- FALSE + rd0 <- FALSE + tmp <- FALSE + dtr <- FALSE + reh <- FALSE + sunp <- FALSE + frs <- FALSE + wnd <- FALSE -files <- - list.files(tempdir(), pattern = ".dat.gz$", full.names = TRUE) + files <- + list.files(tempdir(), pattern = ".dat.gz$", full.names = TRUE) -CRU_df <- - .create_df(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files) + CRU_df <- + .create_df(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files) -expect_true(is.data.frame(CRU_df)) -expect_named(CRU_df, c("lat", "lon", "month", "pre", "pre_cv", "tmp")) -expect_is(CRU_df$lat, "numeric") -expect_is(CRU_df$lon, "numeric") -expect_is(CRU_df$month, "factor") -expect_is(CRU_df$pre, "numeric") -expect_is(CRU_df$pre_cv, "numeric") -expect_is(CRU_df$tmp, "numeric") + expect_true(is.data.frame(CRU_df)) + expect_named(CRU_df, c("lat", "lon", "month", "pre", "pre_cv", "tmp")) + expect_is(CRU_df$lat, "numeric") + expect_is(CRU_df$lon, "numeric") + expect_is(CRU_df$month, "factor") + expect_is(CRU_df$pre, "numeric") + expect_is(CRU_df$pre_cv, "numeric") + expect_is(CRU_df$tmp, "numeric") }) test_that("Test that .create_df() creates a tidy dataframe of pre, tmp, elv", { - # These data are taken from the raw elevation data file elv_data <- cbind( c( @@ -588,7 +585,6 @@ unlink(list.files( # Test that create_df creates tmn if requested --------------------------------- test_that("Test that .create_df() creates a tidy dataframe of pre, tmp, elv", { - dtr_data <- rbind( c( -59.083, @@ -964,374 +960,373 @@ unlink(list.files( # Test that create_df creates tmx if requested --------------------------------- test_that("Test that .create_df() creates tmx if requested", { - -dtr_data <- rbind( - c( - -59.083, - -26.583, - 0.2, - 0.3, - 0.2, - -1.9, - -6.0, - -9.8, - -13.6, - -9.2, - -8.1, - -5.3, - -2.3, - -1.1 - ), - c( - -58.417, - -26.250, - 0.6, - 0.8, - 0.7, - -1.4, - -5.4, - -9.1, - -12.9, - -8.6, - -7.5, - -4.7, - -1.8, - -0.7 - ), - c( - -58.417, - -26.417, - 0.4, - 0.5, - 0.5, - -1.6, - -5.6, - -9.3, - -13.1, - -8.8, - -7.7, - -4.9, - -2.1, - -0.9 - ), - c( - -55.917, - -67.250, - 8.0, - 8.0, - 6.8, - 5.2, - 3.1, - 1.7, - 1.2, - 1.8, - 3.1, - 4.8, - 6.1, - 7.3 - ), - c( - -55.750, - -67.250, - 8.2, - 8.2, - 6.9, - 5.2, - 3.1, - 1.7, - 1.1, - 1.8, - 3.1, - 4.9, - 6.3, - 7.5 - ), - c( - -55.750, - -67.417, - 8.0, - 8.0, - 6.7, - 5.1, - 3.0, - 1.6, - 1.0, - 1.8, - 3.1, - 4.8, - 6.1, - 7.3 - ), - c( - -55.750, - -67.583, - 8.4, - 8.4, - 7.1, - 5.5, - 3.4, - 2.0, - 1.5, - 2.2, - 3.5, - 5.2, - 6.5, - 7.7 - ), - c( - -55.583, - -67.417, - 8.3, - 8.3, - 7.0, - 5.3, - 3.0, - 1.6, - 1.1, - 1.9, - 3.2, - 5.0, - 6.4, - 7.7 - ), - c( - -55.583, - -67.583, - 8.6, - 8.6, - 7.3, - 5.6, - 3.4, - 1.9, - 1.4, - 2.2, - 3.6, - 5.4, - 6.7, - 8.0 - ), - c( - -55.583, - -68.083, - 8.2, - 8.2, - 6.9, - 5.3, - 3.1, - 1.8, - 1.3, - 2.0, - 3.4, - 5.1, - 6.4, - 7.6 - ) -) - -tmp_data <- rbind( - c( - -59.083, - -26.583, - 0.2, - 0.3, - 0.2, - -1.9, - -6.0, - -9.8, - -13.6, - -9.2, - -8.1, - -5.3, - -2.3, - -1.1 - ), - c( - -58.417, - -26.250, - 0.6, - 0.8, - 0.7, - -1.4, - -5.4, - -9.1, - -12.9, - -8.6, - -7.5, - -4.7, - -1.8, - -0.7 - ), - c( - -58.417, - -26.417, - 0.4, - 0.5, - 0.5, - -1.6, - -5.6, - -9.3, - -13.1, - -8.8, - -7.7, - -4.9, - -2.1, - -0.9 - ), - c( - -55.917, - -67.250, - 8.0, - 8.0, - 6.8, - 5.2, - 3.1, - 1.7, - 1.2, - 1.8, - 3.1, - 4.8, - 6.1, - 7.3 - ), - c( - -55.750, - -67.250, - 8.2, - 8.2, - 6.9, - 5.2, - 3.1, - 1.7, - 1.1, - 1.8, - 3.1, - 4.9, - 6.3, - 7.5 - ), - c( - -55.750, - -67.417, - 8.0, - 8.0, - 6.7, - 5.1, - 3.0, - 1.6, - 1.0, - 1.8, - 3.1, - 4.8, - 6.1, - 7.3 - ), - c( - -55.750, - -67.583, - 8.4, - 8.4, - 7.1, - 5.5, - 3.4, - 2.0, - 1.5, - 2.2, - 3.5, - 5.2, - 6.5, - 7.7 - ), - c( - -55.583, - -67.417, - 8.3, - 8.3, - 7.0, - 5.3, - 3.0, - 1.6, - 1.1, - 1.9, - 3.2, - 5.0, - 6.4, - 7.7 - ), - c( - -55.583, - -67.583, - 8.6, - 8.6, - 7.3, - 5.6, - 3.4, - 1.9, - 1.4, - 2.2, - 3.6, - 5.4, - 6.7, - 8.0 - ), - c( - -55.583, - -68.083, - 8.2, - 8.2, - 6.9, - 5.3, - 3.1, - 1.8, - 1.3, - 2.0, - 3.4, - 5.1, - 6.4, - 7.6 - ) -) -gz1 <- gzfile(file.path(tempdir(), "grid_10min_dtr.dat.gz"), "w") -utils::write.table( - dtr_data, - file = gz1, - col.names = FALSE, - row.names = FALSE -) -close(gz1) - -gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") -utils::write.table( - tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE -) -close(gz1) - -pre_cv <- FALSE -pre <- FALSE -tmn <- FALSE -tmx <- TRUE -elv <- FALSE -rd0 <- FALSE -tmp <- FALSE -dtr <- FALSE -reh <- FALSE -sunp <- FALSE -frs <- FALSE -wnd <- FALSE - -files <- - list.files(tempdir(), pattern = ".dat.gz$", full.names = TRUE) - -CRU_df <- - .create_df(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files) - -expect_named(CRU_df, c("lat", "lon", "month", "tmx")) -expect_equal(CRU_df$tmx[1], 0.3) -unlink(list.files( - path = tempdir(), - pattern = ".dat.gz$", - full.names = TRUE -)) + dtr_data <- rbind( + c( + -59.083, + -26.583, + 0.2, + 0.3, + 0.2, + -1.9, + -6.0, + -9.8, + -13.6, + -9.2, + -8.1, + -5.3, + -2.3, + -1.1 + ), + c( + -58.417, + -26.250, + 0.6, + 0.8, + 0.7, + -1.4, + -5.4, + -9.1, + -12.9, + -8.6, + -7.5, + -4.7, + -1.8, + -0.7 + ), + c( + -58.417, + -26.417, + 0.4, + 0.5, + 0.5, + -1.6, + -5.6, + -9.3, + -13.1, + -8.8, + -7.7, + -4.9, + -2.1, + -0.9 + ), + c( + -55.917, + -67.250, + 8.0, + 8.0, + 6.8, + 5.2, + 3.1, + 1.7, + 1.2, + 1.8, + 3.1, + 4.8, + 6.1, + 7.3 + ), + c( + -55.750, + -67.250, + 8.2, + 8.2, + 6.9, + 5.2, + 3.1, + 1.7, + 1.1, + 1.8, + 3.1, + 4.9, + 6.3, + 7.5 + ), + c( + -55.750, + -67.417, + 8.0, + 8.0, + 6.7, + 5.1, + 3.0, + 1.6, + 1.0, + 1.8, + 3.1, + 4.8, + 6.1, + 7.3 + ), + c( + -55.750, + -67.583, + 8.4, + 8.4, + 7.1, + 5.5, + 3.4, + 2.0, + 1.5, + 2.2, + 3.5, + 5.2, + 6.5, + 7.7 + ), + c( + -55.583, + -67.417, + 8.3, + 8.3, + 7.0, + 5.3, + 3.0, + 1.6, + 1.1, + 1.9, + 3.2, + 5.0, + 6.4, + 7.7 + ), + c( + -55.583, + -67.583, + 8.6, + 8.6, + 7.3, + 5.6, + 3.4, + 1.9, + 1.4, + 2.2, + 3.6, + 5.4, + 6.7, + 8.0 + ), + c( + -55.583, + -68.083, + 8.2, + 8.2, + 6.9, + 5.3, + 3.1, + 1.8, + 1.3, + 2.0, + 3.4, + 5.1, + 6.4, + 7.6 + ) + ) + + tmp_data <- rbind( + c( + -59.083, + -26.583, + 0.2, + 0.3, + 0.2, + -1.9, + -6.0, + -9.8, + -13.6, + -9.2, + -8.1, + -5.3, + -2.3, + -1.1 + ), + c( + -58.417, + -26.250, + 0.6, + 0.8, + 0.7, + -1.4, + -5.4, + -9.1, + -12.9, + -8.6, + -7.5, + -4.7, + -1.8, + -0.7 + ), + c( + -58.417, + -26.417, + 0.4, + 0.5, + 0.5, + -1.6, + -5.6, + -9.3, + -13.1, + -8.8, + -7.7, + -4.9, + -2.1, + -0.9 + ), + c( + -55.917, + -67.250, + 8.0, + 8.0, + 6.8, + 5.2, + 3.1, + 1.7, + 1.2, + 1.8, + 3.1, + 4.8, + 6.1, + 7.3 + ), + c( + -55.750, + -67.250, + 8.2, + 8.2, + 6.9, + 5.2, + 3.1, + 1.7, + 1.1, + 1.8, + 3.1, + 4.9, + 6.3, + 7.5 + ), + c( + -55.750, + -67.417, + 8.0, + 8.0, + 6.7, + 5.1, + 3.0, + 1.6, + 1.0, + 1.8, + 3.1, + 4.8, + 6.1, + 7.3 + ), + c( + -55.750, + -67.583, + 8.4, + 8.4, + 7.1, + 5.5, + 3.4, + 2.0, + 1.5, + 2.2, + 3.5, + 5.2, + 6.5, + 7.7 + ), + c( + -55.583, + -67.417, + 8.3, + 8.3, + 7.0, + 5.3, + 3.0, + 1.6, + 1.1, + 1.9, + 3.2, + 5.0, + 6.4, + 7.7 + ), + c( + -55.583, + -67.583, + 8.6, + 8.6, + 7.3, + 5.6, + 3.4, + 1.9, + 1.4, + 2.2, + 3.6, + 5.4, + 6.7, + 8.0 + ), + c( + -55.583, + -68.083, + 8.2, + 8.2, + 6.9, + 5.3, + 3.1, + 1.8, + 1.3, + 2.0, + 3.4, + 5.1, + 6.4, + 7.6 + ) + ) + gz1 <- gzfile(file.path(tempdir(), "grid_10min_dtr.dat.gz"), "w") + utils::write.table( + dtr_data, + file = gz1, + col.names = FALSE, + row.names = FALSE + ) + close(gz1) + + gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") + utils::write.table( + tmp_data, + file = gz1, + col.names = FALSE, + row.names = FALSE + ) + close(gz1) + + pre_cv <- FALSE + pre <- FALSE + tmn <- FALSE + tmx <- TRUE + elv <- FALSE + rd0 <- FALSE + tmp <- FALSE + dtr <- FALSE + reh <- FALSE + sunp <- FALSE + frs <- FALSE + wnd <- FALSE + + files <- + list.files(tempdir(), pattern = ".dat.gz$", full.names = TRUE) + + CRU_df <- + .create_df(tmn, tmx, tmp, dtr, pre, pre_cv, elv, files) + + expect_named(CRU_df, c("lat", "lon", "month", "tmx")) + expect_equal(CRU_df$tmx[1], 0.3) + unlink(list.files( + path = tempdir(), + pattern = ".dat.gz$", + full.names = TRUE + )) }) diff --git a/tests/testthat/test-create_stack.R b/tests/testthat/test-create_stack.R index c2e073e..67f79dd 100644 --- a/tests/testthat/test-create_stack.R +++ b/tests/testthat/test-create_stack.R @@ -1,5 +1,3 @@ - - unlink(list.files( path = tempdir(), pattern = ".dat.gz$", @@ -23,7 +21,8 @@ test_that("create_CRU_stack creates a list of terra rast of pre and tmp", { wrld[] <- NA month_names <- - c("jan", + c( + "jan", "feb", "mar", "apr", @@ -34,7 +33,8 @@ test_that("create_CRU_stack creates a list of terra rast of pre and tmp", { "sep", "oct", "nov", - "dec") + "dec" + ) # create files for testing, these data are the first 10 lines of pre and tmp # from the CRU CL v. 2.0 data @@ -485,16 +485,18 @@ test_that("create_CRU_stack creates a list of terra rast of pre and tmp", { ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") utils::write.table(pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) pre_cv <- TRUE @@ -510,12 +512,14 @@ test_that("create_CRU_stack creates a list of terra rast of pre and tmp", { pre_cv <- FALSE stacks <- - lapply(FUN = .create_stack, - X = files, - wrld, - month_names, - pre, - pre_cv) + lapply( + FUN = .create_stack, + X = files, + wrld, + month_names, + pre, + pre_cv + ) expect_true(is.list(stacks)) expect_named( @@ -620,25 +624,30 @@ test_that("create_CRU_stack creates a list containing only elv", { gz1 <- gzfile(file.path(tempdir(), "grid_10min_elv.dat.gz"), "w") utils::write.table(elv_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) - files <- list.files(path = tempdir(), - pattern = ".dat.gz$", - full.names = TRUE) + files <- list.files( + path = tempdir(), + pattern = ".dat.gz$", + full.names = TRUE + ) pre_cv <- FALSE stacks <- - lapply(FUN = .create_stack, - X = files, - wrld, - month_names, - pre, - pre_cv) + lapply( + FUN = .create_stack, + X = files, + wrld, + month_names, + pre, + pre_cv + ) expect_named(stacks[[1]], "elv") expect_equal(terra::minmax(stacks[[1]])[[2]], 239, tolerance = 0.1) @@ -651,34 +660,34 @@ test_that("create_CRU_stack creates a list containing only elv", { # Test that wrld raster object resolution and extent are appropriate ----------- -test_that("Test that wrld raster object resolution and extent are appropriate", - { - skip_on_cran() +test_that("Test that wrld raster object resolution and extent are appropriate", { + skip_on_cran() - wrld <- terra::rast( - nrows = 930, - ncols = 2160, - ymin = -65, - ymax = 90, - xmin = -180, - xmax = 180 - ) + wrld <- terra::rast( + nrows = 930, + ncols = 2160, + ymin = -65, + ymax = 90, + xmin = -180, + xmax = 180 + ) - wrld[] <- NA + wrld[] <- NA - expect_type(wrld, "S4") - expect_equal(as.numeric(terra::ext(wrld)[1]), -180) - expect_equal(as.numeric(terra::ext(wrld)[2]), 180) - expect_equal(as.numeric(terra::ext(wrld)[3]), -65) - expect_equal(as.numeric(terra::ext(wrld)[4]), 90) - expect_equal(ncol(wrld), 2160) - expect_equal(nrow(wrld), 930) - }) + expect_type(wrld, "S4") + expect_equal(as.numeric(terra::ext(wrld)[1]), -180) + expect_equal(as.numeric(terra::ext(wrld)[2]), 180) + expect_equal(as.numeric(terra::ext(wrld)[3]), -65) + expect_equal(as.numeric(terra::ext(wrld)[4]), 90) + expect_equal(ncol(wrld), 2160) + expect_equal(nrow(wrld), 930) +}) test_that("month names are appropriate", { month_names <- - c("jan", + c( + "jan", "feb", "mar", "apr", @@ -689,7 +698,8 @@ test_that("month names are appropriate", { "sep", "oct", "nov", - "dec") + "dec" + ) expect_equal( month_names, @@ -1168,16 +1178,18 @@ test_that("CRU_stack_list returns list of raster stacks with proper names", { ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") utils::write.table(pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) files <- @@ -1195,7 +1207,8 @@ test_that("CRU_stack_list returns list of raster stacks with proper names", { wrld[] <- NA month_names <- - c("jan", + c( + "jan", "feb", "mar", "apr", @@ -1206,18 +1219,21 @@ test_that("CRU_stack_list returns list of raster stacks with proper names", { "sep", "oct", "nov", - "dec") + "dec" + ) pre <- TRUE pre_cv <- TRUE CRU_stack_list <- - lapply(FUN = .create_stack, - X = files, - wrld, - month_names, - pre, - pre_cv) + lapply( + FUN = .create_stack, + X = files, + wrld, + month_names, + pre, + pre_cv + ) names(CRU_stack_list) <- substr(basename(files), 12, 14) diff --git a/tests/testthat/test-get_CRU.R b/tests/testthat/test-get_CRU.R index 3d64bc7..bb16939 100644 --- a/tests/testthat/test-get_CRU.R +++ b/tests/testthat/test-get_CRU.R @@ -1,4 +1,3 @@ - # Test that get_CRU will retrieve only precipitation file when pre_cv TRUE ----- test_that("get_CRU will retrieve only precipitation file when pre_cv TRUE", { unlink(list.files( diff --git a/tests/testthat/test-get_CRU_df.R b/tests/testthat/test-get_CRU_df.R index 076db81..426cad3 100644 --- a/tests/testthat/test-get_CRU_df.R +++ b/tests/testthat/test-get_CRU_df.R @@ -1,9 +1,10 @@ - # Test that get_CRU_df fails if no parameters are TRUE ------------------------- test_that("get_CRU_df fails if no parameters are TRUE", { - expect_error(get_CRU_df(), - "You must select at least one element for download.") + expect_error( + get_CRU_df(), + "You must select at least one element for download." + ) }) # Test that get_CRU_df will retrieve files from CRU server @@ -501,38 +502,36 @@ test_that("get_CRU_df lists only .dat.gz files in the given dsn", { # Test that get_CRU_df sets the cache directory properly when cache is TRUE ---- test_that("get_CRU_df sets the cache directory properly when cache is TRUE", { - skip_on_cran() - - cache <- TRUE + skip_on_cran() - if (isTRUE(cache)) { - cache_dir <- rappdirs::user_config_dir("getCRUCLdata") - if (!file.exists(cache_dir)) { - dir.create(cache_dir) - } - } else { - cache_dir <- tempdir() - } + cache <- TRUE - expect_equal(cache_dir, rappdirs::user_config_dir("getCRUCLdata")) + if (isTRUE(cache)) { + cache_dir <- rappdirs::user_config_dir("getCRUCLdata") + if (!file.exists(cache_dir)) { + dir.create(cache_dir) + } + } else { + cache_dir <- tempdir() + } - }) + expect_equal(cache_dir, rappdirs::user_config_dir("getCRUCLdata")) +}) # Test that get_CRU_df sets the cache dir properly when cache is FALSE --------- test_that("get_CRU_df sets the cache directory properly when cache is FALSE", { + skip_on_cran() + cache <- FALSE - skip_on_cran() - cache <- FALSE - - if (isTRUE(cache)) { - cache_dir <- rappdirs::user_config_dir("getCRUCLdata") - if (!file.exists(cache_dir)) { - dir.create(cache_dir) - } - } else { - cache_dir <- tempdir() - } + if (isTRUE(cache)) { + cache_dir <- rappdirs::user_config_dir("getCRUCLdata") + if (!file.exists(cache_dir)) { + dir.create(cache_dir) + } + } else { + cache_dir <- tempdir() + } - expect_equal(cache_dir, tempdir()) - }) + expect_equal(cache_dir, tempdir()) +}) diff --git a/tests/testthat/test-get_CRU_stack.R b/tests/testthat/test-get_CRU_stack.R index 295031c..24f8591 100644 --- a/tests/testthat/test-get_CRU_stack.R +++ b/tests/testthat/test-get_CRU_stack.R @@ -1,4 +1,3 @@ - # Test that get_CRU_stack will retrieve files from CRU server -------------- test_that("get_CRU_stack will retrieve files from CRU server", { skip_on_cran() @@ -10,8 +9,10 @@ test_that("get_CRU_stack will retrieve files from CRU server", { # Test that get_CRU_stack fails if no parameters are TRUE ---------------------- test_that("get_CRU_stack fails if no parameters are TRUE", { - expect_error(get_CRU_stack(), - "You must select at least one element for download.") + expect_error( + get_CRU_stack(), + "You must select at least one element for download." + ) }) test_that("create_CRU_df lists only .dat.gz files in the given dsn", { @@ -499,35 +500,35 @@ test_that("create_CRU_df lists only .dat.gz files in the given dsn", { # Test that get_CRU_stack sets the cache dir properly when cache is TRUE ------- test_that("get_CRU_stack sets the cache dir properly when cache is TRUE", { - skip_on_cran() - cache <- TRUE + skip_on_cran() + cache <- TRUE - if (isTRUE(cache)) { - cache_dir <- rappdirs::user_config_dir("getCRUCLdata") - if (!file.exists(cache_dir)) { - dir.create(cache_dir) - } - } else { - cache_dir <- tempdir() - } + if (isTRUE(cache)) { + cache_dir <- rappdirs::user_config_dir("getCRUCLdata") + if (!file.exists(cache_dir)) { + dir.create(cache_dir) + } + } else { + cache_dir <- tempdir() + } - expect_equal(cache_dir, rappdirs::user_config_dir("getCRUCLdata")) - }) + expect_equal(cache_dir, rappdirs::user_config_dir("getCRUCLdata")) +}) # Test that get_CRU_stack sets the cache dir properly when cache is FALSE ------ test_that("get_CRU_stack sets the cache dir properly when cache is FALSE", { - skip_on_cran() - cache <- FALSE + skip_on_cran() + cache <- FALSE - if (isTRUE(cache)) { - cache_dir <- rappdirs::user_config_dir("getCRUCLdata") - if (!file.exists(cache_dir)) { - dir.create(cache_dir) - } - } else { - cache_dir <- tempdir() - } + if (isTRUE(cache)) { + cache_dir <- rappdirs::user_config_dir("getCRUCLdata") + if (!file.exists(cache_dir)) { + dir.create(cache_dir) + } + } else { + cache_dir <- tempdir() + } - expect_equal(cache_dir, tempdir()) - }) + expect_equal(cache_dir, tempdir()) +}) diff --git a/tests/testthat/test-validate_dsn.R b/tests/testthat/test-validate_dsn.R index 6c3eceb..6beb0df 100644 --- a/tests/testthat/test-validate_dsn.R +++ b/tests/testthat/test-validate_dsn.R @@ -1,4 +1,3 @@ - # Test that .validate_dsn stops if the dsn is not provided --------------------- test_that(".validate_dsn stops if the dsn is not provided", { diff --git a/tests/testthat/test_caching.R b/tests/testthat/test_caching.R index 64cab36..3a0a704 100644 --- a/tests/testthat/test_caching.R +++ b/tests/testthat/test_caching.R @@ -1,4 +1,3 @@ - # test that .set_cache creates a cache directory if none exists ---------------- test_that("test that set_cache creates a cache directory if none exists", { skip_on_cran() @@ -21,7 +20,8 @@ test_that("test that set_cache does not create a dir if cache == FALSE", { test_that("cache directory is created if necessary", { # if cache directory exists during testing, remove it unlink(manage_cache$cache_path_get(), - recursive = TRUE) + recursive = TRUE + ) cache <- TRUE cache_dir <- .set_cache(cache) expect_true(dir.exists(manage_cache$cache_path_get())) @@ -30,7 +30,8 @@ test_that("cache directory is created if necessary", { test_that("caching utils list files in cache and delete when asked", { skip_on_cran() unlink(list.files(manage_cache$cache_path_get()), - recursive = TRUE) + recursive = TRUE + ) cache <- TRUE cache_dir <- .set_cache(cache) f <- @@ -52,6 +53,8 @@ test_that("caching utils list files in cache and delete when asked", { # test delete all manage_cache$delete_all() - expect_equal(list.files(manage_cache$list()), - character(0)) + expect_equal( + list.files(manage_cache$list()), + character(0) + ) }) diff --git a/tests/testthat/test_get_local.R b/tests/testthat/test_get_local.R index e5ca337..e912576 100644 --- a/tests/testthat/test_get_local.R +++ b/tests/testthat/test_get_local.R @@ -1,8 +1,6 @@ - # Test that .get_local lists local files --------------------------------------- -test_that("Test that .get_local lists local files", - { +test_that("Test that .get_local lists local files", { skip_on_cran() # create files for testing, these data are the first 10 lines of pre and tmp @@ -461,16 +459,18 @@ test_that("Test that .get_local lists local files", ) gz1 <- gzfile(file.path(tempdir(), "grid_10min_pre.dat.gz"), "w") utils::write.table(pre_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) gz1 <- gzfile(file.path(tempdir(), "grid_10min_tmp.dat.gz"), "w") utils::write.table(tmp_data, - file = gz1, - col.names = FALSE, - row.names = FALSE) + file = gz1, + col.names = FALSE, + row.names = FALSE + ) close(gz1) pre <- TRUE @@ -487,19 +487,21 @@ test_that("Test that .get_local lists local files", elv <- FALSE cache_dir <- tempdir() - files <- .get_local(pre, - pre_cv, - rd0, - tmp, - dtr, - reh, - tmn, - tmx, - sunp, - frs, - wnd, - elv, - cache_dir) + files <- .get_local( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv, + cache_dir + ) expect_equal(length(files), 1) expect_equal(basename(files[1]), "grid_10min_pre.dat.gz") diff --git a/tests/testthat/test_set_cache.R b/tests/testthat/test_set_cache.R index a9aa036..1180753 100644 --- a/tests/testthat/test_set_cache.R +++ b/tests/testthat/test_set_cache.R @@ -1,4 +1,3 @@ - # test that .set_cache creates a cache directory if none exists ---------------- test_that("test that .set_cache creates a cache directory if none exists", { diff --git a/vignettes/Advanced_use.Rmd b/vignettes/Advanced_use.Rmd index c6a6a17..7643474 100644 --- a/vignettes/Advanced_use.Rmd +++ b/vignettes/Advanced_use.Rmd @@ -30,9 +30,11 @@ Create a list of raster stacks of maximum and minimum temperature. To take advantage of the previously cached files and save time by not downloading files, specify `cache = TRUE`. ```{r, eval=FALSE} -tmn_tmx <- get_CRU_stack(tmn = TRUE, - tmx = TRUE, - cache = TRUE) +tmn_tmx <- get_CRU_stack( + tmn = TRUE, + tmx = TRUE, + cache = TRUE +) ``` ## Handling files downloaded outside of R From 486cdf9a619f705fe2d442912bd4de013e6380f3 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 19:46:12 +0800 Subject: [PATCH 011/127] Optimised file --- R/internal_functions.R | 2 -- 1 file changed, 2 deletions(-) diff --git a/R/internal_functions.R b/R/internal_functions.R index a66fbaa..6678fbc 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -130,8 +130,6 @@ } return(CRU_df) - # cleanup before we go ----------------------------------------------------- - rm(c(CRU_list)) } #' @noRd From 2798fc7215b4b8e9945b5981d36e0d9e86e011b0 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 19:52:56 +0800 Subject: [PATCH 012/127] setup flint --- .Rbuildignore | 4 + flint/cache_file_state.rds | Bin 0 -> 44 bytes flint/config.yml | 49 +++++++ flint/rules/builtin/T_and_F_symbol.yml | 97 ++++++++++++++ flint/rules/builtin/absolute_path.yml | 13 ++ flint/rules/builtin/any_duplicated.yml | 91 +++++++++++++ flint/rules/builtin/any_is_na.yml | 7 + flint/rules/builtin/class_equals.yml | 42 ++++++ flint/rules/builtin/condition_message.yml | 23 ++++ flint/rules/builtin/double_assignment.yml | 23 ++++ flint/rules/builtin/duplicate_argument.yml | 46 +++++++ flint/rules/builtin/empty_assignment.yml | 15 +++ flint/rules/builtin/equal_assignment.yml | 10 ++ flint/rules/builtin/equals_na.yml | 37 ++++++ flint/rules/builtin/expect_comparison.yml | 37 ++++++ flint/rules/builtin/expect_identical.yml | 42 ++++++ flint/rules/builtin/expect_length.yml | 12 ++ flint/rules/builtin/expect_named.yml | 79 ++++++++++++ flint/rules/builtin/expect_not.yml | 23 ++++ flint/rules/builtin/expect_null.yml | 22 ++++ flint/rules/builtin/expect_true_false.yml | 28 ++++ flint/rules/builtin/expect_type.yml | 51 ++++++++ flint/rules/builtin/for_loop_index.yml | 27 ++++ flint/rules/builtin/function_return.yml | 11 ++ flint/rules/builtin/implicit_assignment.yml | 69 ++++++++++ flint/rules/builtin/is_numeric.yml | 25 ++++ flint/rules/builtin/length_levels.yml | 7 + flint/rules/builtin/length_test.yml | 59 +++++++++ flint/rules/builtin/lengths.yml | 59 +++++++++ flint/rules/builtin/library_call.yml | 26 ++++ flint/rules/builtin/literal_coercion.yml | 89 +++++++++++++ flint/rules/builtin/matrix_apply.yml | 110 ++++++++++++++++ flint/rules/builtin/missing_argument.yml | 44 +++++++ flint/rules/builtin/nested_ifelse.yml | 29 +++++ flint/rules/builtin/numeric_leading_zero.yml | 11 ++ flint/rules/builtin/outer_negation.yml | 29 +++++ flint/rules/builtin/package_hooks.yml | 127 +++++++++++++++++++ flint/rules/builtin/paste.yml | 75 +++++++++++ flint/rules/builtin/redundant_equals.yml | 29 +++++ flint/rules/builtin/redundant_ifelse.yml | 67 ++++++++++ flint/rules/builtin/rep_len.yml | 7 + flint/rules/builtin/right_assignment.yml | 10 ++ flint/rules/builtin/sample_int.yml | 43 +++++++ flint/rules/builtin/semicolon.yml | 10 ++ flint/rules/builtin/seq.yml | 121 ++++++++++++++++++ flint/rules/builtin/sort.yml | 85 +++++++++++++ flint/rules/builtin/todo_comment.yml | 7 + flint/rules/builtin/undesirable_function.yml | 13 ++ flint/rules/builtin/undesirable_operator.yml | 29 +++++ flint/rules/builtin/unnecessary_nesting.yml | 36 ++++++ flint/rules/builtin/unreachable_code.yml | 64 ++++++++++ flint/rules/builtin/which_grepl.yml | 7 + 52 files changed, 2076 insertions(+) create mode 100644 flint/cache_file_state.rds create mode 100644 flint/config.yml create mode 100644 flint/rules/builtin/T_and_F_symbol.yml create mode 100644 flint/rules/builtin/absolute_path.yml create mode 100644 flint/rules/builtin/any_duplicated.yml create mode 100644 flint/rules/builtin/any_is_na.yml create mode 100644 flint/rules/builtin/class_equals.yml create mode 100644 flint/rules/builtin/condition_message.yml create mode 100644 flint/rules/builtin/double_assignment.yml create mode 100644 flint/rules/builtin/duplicate_argument.yml create mode 100644 flint/rules/builtin/empty_assignment.yml create mode 100644 flint/rules/builtin/equal_assignment.yml create mode 100644 flint/rules/builtin/equals_na.yml create mode 100644 flint/rules/builtin/expect_comparison.yml create mode 100644 flint/rules/builtin/expect_identical.yml create mode 100644 flint/rules/builtin/expect_length.yml create mode 100644 flint/rules/builtin/expect_named.yml create mode 100644 flint/rules/builtin/expect_not.yml create mode 100644 flint/rules/builtin/expect_null.yml create mode 100644 flint/rules/builtin/expect_true_false.yml create mode 100644 flint/rules/builtin/expect_type.yml create mode 100644 flint/rules/builtin/for_loop_index.yml create mode 100644 flint/rules/builtin/function_return.yml create mode 100644 flint/rules/builtin/implicit_assignment.yml create mode 100644 flint/rules/builtin/is_numeric.yml create mode 100644 flint/rules/builtin/length_levels.yml create mode 100644 flint/rules/builtin/length_test.yml create mode 100644 flint/rules/builtin/lengths.yml create mode 100644 flint/rules/builtin/library_call.yml create mode 100644 flint/rules/builtin/literal_coercion.yml create mode 100644 flint/rules/builtin/matrix_apply.yml create mode 100644 flint/rules/builtin/missing_argument.yml create mode 100644 flint/rules/builtin/nested_ifelse.yml create mode 100644 flint/rules/builtin/numeric_leading_zero.yml create mode 100644 flint/rules/builtin/outer_negation.yml create mode 100644 flint/rules/builtin/package_hooks.yml create mode 100644 flint/rules/builtin/paste.yml create mode 100644 flint/rules/builtin/redundant_equals.yml create mode 100644 flint/rules/builtin/redundant_ifelse.yml create mode 100644 flint/rules/builtin/rep_len.yml create mode 100644 flint/rules/builtin/right_assignment.yml create mode 100644 flint/rules/builtin/sample_int.yml create mode 100644 flint/rules/builtin/semicolon.yml create mode 100644 flint/rules/builtin/seq.yml create mode 100644 flint/rules/builtin/sort.yml create mode 100644 flint/rules/builtin/todo_comment.yml create mode 100644 flint/rules/builtin/undesirable_function.yml create mode 100644 flint/rules/builtin/undesirable_operator.yml create mode 100644 flint/rules/builtin/unnecessary_nesting.yml create mode 100644 flint/rules/builtin/unreachable_code.yml create mode 100644 flint/rules/builtin/which_grepl.yml diff --git a/.Rbuildignore b/.Rbuildignore index bf4e77f..43d8729 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -17,3 +17,7 @@ ^tic\.R$ ^doc$ ^Meta$ + + +# flint files +^flint$ diff --git a/flint/cache_file_state.rds b/flint/cache_file_state.rds new file mode 100644 index 0000000000000000000000000000000000000000..43a826ec5eb6bb190d263604b83cea4ea12b6198 GIT binary patch literal 44 vcmb2|=3oE==I#ec2?+^l35khG32CfGk`d0%cS>{{dg>Wu8^rfY0~G-P1G5Yj literal 0 HcmV?d00001 diff --git a/flint/config.yml b/flint/config.yml new file mode 100644 index 0000000..1340d58 --- /dev/null +++ b/flint/config.yml @@ -0,0 +1,49 @@ +keep: + - any_duplicated + - any_is_na + - class_equals + - condition_message + - double_assignment + - duplicate_argument + - empty_assignment + - equal_assignment + - equals_na + - expect_comparison + - expect_identical + - expect_length + - expect_named + - expect_not + - expect_null + - expect_true_false + - expect_type + - for_loop_index + - function_return + - implicit_assignment + - is_numeric + - length_levels + - length_test + - lengths + - library_call + - literal_coercion + - matrix_apply + - missing_argument + - nested_ifelse + - numeric_leading_zero + - outer_negation + - package_hooks + - paste + - redundant_equals + - redundant_ifelse + - rep_len + - right_assignment + - sample_int + - semicolon + - seq + - sort + - T_and_F_symbol + - todo_comment + - undesirable_function + - undesirable_operator + - unnecessary_nesting + - unreachable_code + - which_grepl diff --git a/flint/rules/builtin/T_and_F_symbol.yml b/flint/rules/builtin/T_and_F_symbol.yml new file mode 100644 index 0000000..ebe54ba --- /dev/null +++ b/flint/rules/builtin/T_and_F_symbol.yml @@ -0,0 +1,97 @@ +id: true_false_symbol +language: r +severity: warning +rule: + pattern: T + kind: identifier + not: + any: + - precedes: + any: + - pattern: <- + - pattern: = + - regex: ^~$ + - follows: + any: + - pattern: $ + - regex: ^~$ + - inside: + any: + - kind: parameter + - kind: call + - kind: binary_operator + follows: + regex: ^~$ + stopBy: end + stopBy: + kind: + argument +fix: TRUE +message: Use TRUE instead of the symbol T. + +--- + +id: true_false_symbol-2 +language: r +severity: warning +rule: + pattern: F + kind: identifier + not: + any: + - precedes: + any: + - pattern: <- + - pattern: = + - regex: ^~$ + - follows: + any: + - pattern: $ + - regex: ^~$ + - inside: + any: + - kind: parameter + - kind: call + - kind: binary_operator + follows: + regex: ^~$ + stopBy: end + stopBy: + kind: + argument +fix: FALSE +message: Use FALSE instead of the symbol F. + +--- + +id: true_false_symbol-3 +language: r +severity: warning +rule: + pattern: T + kind: identifier + precedes: + any: + - pattern: <- + - pattern: = + not: + inside: + kind: argument +message: Don't use T as a variable name, as it can break code relying on T being TRUE. + +--- + +id: true_false_symbol-4 +language: r +severity: warning +rule: + pattern: F + kind: identifier + precedes: + any: + - pattern: <- + - pattern: = + not: + inside: + kind: argument +message: Don't use F as a variable name, as it can break code relying on F being FALSE. diff --git a/flint/rules/builtin/absolute_path.yml b/flint/rules/builtin/absolute_path.yml new file mode 100644 index 0000000..2c5bb3d --- /dev/null +++ b/flint/rules/builtin/absolute_path.yml @@ -0,0 +1,13 @@ +# id: absolute_path-1 +# language: r +# severity: warning +# rule: +# kind: string_content +# any: +# - regex: '^~[[:alpha:]]' +# - regex: '^~/[[:alpha:]]' +# - regex: '^[[:alpha:]]:' +# - regex: '^(/|~)$' +# - regex: '^/[[:alpha:]]' +# - regex: '^\\' +# message: Do not use absolute paths. diff --git a/flint/rules/builtin/any_duplicated.yml b/flint/rules/builtin/any_duplicated.yml new file mode 100644 index 0000000..514b028 --- /dev/null +++ b/flint/rules/builtin/any_duplicated.yml @@ -0,0 +1,91 @@ +id: any_duplicated-1 +language: r +severity: warning +rule: + pattern: any($$$ duplicated($MYVAR) $$$) +fix: anyDuplicated(~~MYVAR~~) > 0 +message: anyDuplicated(x, ...) > 0 is better than any(duplicated(x), ...). + +--- + +id: any_duplicated-2 +language: r +severity: warning +rule: + any: + - pattern: length(unique($MYVAR)) == length($MYVAR) + - pattern: length($MYVAR) == length(unique($MYVAR)) +fix: anyDuplicated(~~MYVAR~~) == 0L +message: anyDuplicated(x) == 0L is better than length(unique(x)) == length(x). + +--- + +id: any_duplicated-3 +language: r +severity: warning +rule: + pattern: length(unique($MYVAR)) != length($MYVAR) +fix: anyDuplicated(~~MYVAR~~) != 0L +message: | + Use anyDuplicated(x) != 0L (or > or <) instead of length(unique(x)) != length(x) + (or > or <). + +--- + +id: any_duplicated-4 +language: r +severity: warning +rule: + any: + - pattern: nrow($DATA) != length(unique($DATA$µCOL)) + - pattern: length(unique($DATA$µCOL)) != nrow($DATA) +fix: anyDuplicated(~~DATA~~$~~COL~~) != 0L +message: | + anyDuplicated(DF$col) != 0L is better than length(unique(DF$col)) != nrow(DF) + +--- + +# id: any_duplicated-5 +# language: r +# severity: warning +# rule: +# any: +# - pattern: +# context: nrow($DATA) != length(unique($DATA[["µCOL"]])) +# strictness: ast +# - pattern: +# context: length(unique($DATA[["µCOL"]])) != nrow($DATA) +# strictness: ast +# fix: anyDuplicated(~~DATA~~[["~~COL~~"]]) != 0L +# message: | +# anyDuplicated(DF[["col"]]) != 0L is better than length(unique(DF[["col"]])) != nrow(DF) +# +# --- + +id: any_duplicated-6 +language: r +severity: warning +rule: + any: + - pattern: nrow($DATA) == length(unique($DATA$µCOL)) + - pattern: length(unique($DATA$µCOL)) == nrow($DATA) +fix: anyDuplicated(~~DATA~~$~~COL~~) == 0L +message: | + anyDuplicated(DF$col) == 0L is better than length(unique(DF$col)) == nrow(DF) + +# --- +# +# id: any_duplicated-7 +# language: r +# severity: warning +# rule: +# any: +# - pattern: +# context: nrow($DATA) == length(unique($DATA[["µCOL"]])) +# strictness: ast +# - pattern: +# context: length(unique($DATA[["µCOL"]])) == nrow($DATA) +# strictness: ast +# fix: anyDuplicated(~~DATA~~[["~~COL~~"]]) == 0L +# message: | +# anyDuplicated(DF[["col"]]) == 0L is better than length(unique(DF[["col"]])) == nrow(DF) diff --git a/flint/rules/builtin/any_is_na.yml b/flint/rules/builtin/any_is_na.yml new file mode 100644 index 0000000..7b05a75 --- /dev/null +++ b/flint/rules/builtin/any_is_na.yml @@ -0,0 +1,7 @@ +id: any_na-1 +language: r +severity: warning +rule: + pattern: any($$$ is.na($MYVAR) $$$) +fix: anyNA(~~MYVAR~~) +message: anyNA(x) is better than any(is.na(x)). diff --git a/flint/rules/builtin/class_equals.yml b/flint/rules/builtin/class_equals.yml new file mode 100644 index 0000000..2b7eb4c --- /dev/null +++ b/flint/rules/builtin/class_equals.yml @@ -0,0 +1,42 @@ +id: class_equals-1 +language: r +severity: warning +rule: + any: + - pattern: class($VAR) == $CLASSNAME + - pattern: $CLASSNAME == class($VAR) + not: + inside: + kind: argument +fix: inherits(~~VAR~~, ~~CLASSNAME~~) +message: Instead of comparing class(x) with ==, use inherits(x, 'class-name') or is. or is(x, 'class') + +--- + +id: class_equals-2 +language: r +severity: warning +rule: + any: + - pattern: class($VAR) != $CLASSNAME + - pattern: $CLASSNAME != class($VAR) + not: + inside: + kind: argument +fix: "!inherits(~~VAR~~, ~~CLASSNAME~~)" +message: "Instead of comparing class(x) with !=, use !inherits(x, 'class-name') or is. or is(x, 'class')" + +--- + +id: class_equals-3 +language: r +severity: warning +rule: + any: + - pattern: $CLASSNAME %in% class($VAR) + - pattern: class($VAR) %in% $CLASSNAME +constraints: + CLASSNAME: + kind: string +fix: inherits(~~VAR~~, ~~CLASSNAME~~) +message: Instead of comparing class(x) with %in%, use inherits(x, 'class-name') or is. or is(x, 'class') diff --git a/flint/rules/builtin/condition_message.yml b/flint/rules/builtin/condition_message.yml new file mode 100644 index 0000000..eb32466 --- /dev/null +++ b/flint/rules/builtin/condition_message.yml @@ -0,0 +1,23 @@ +id: condition_message-1 +language: r +severity: warning +rule: + pattern: $FUN($$$ paste0($$$MSG) $$$) + kind: call + not: + any: + - has: + kind: extract_operator + - has: + stopBy: end + kind: argument + has: + field: name + regex: "^collapse|recycle0$" + stopBy: end +constraints: + FUN: + regex: "^(packageStartupMessage|stop|warning)$" +fix: ~~FUN~~(~~MSG~~) +message: | + ~~FUN~~(paste0(...)) can be rewritten as ~~FUN~~(...). diff --git a/flint/rules/builtin/double_assignment.yml b/flint/rules/builtin/double_assignment.yml new file mode 100644 index 0000000..60a04e2 --- /dev/null +++ b/flint/rules/builtin/double_assignment.yml @@ -0,0 +1,23 @@ +id: right_double_assignment +language: r +severity: hint +rule: + pattern: $RHS ->> $LHS + has: + field: rhs + kind: identifier +message: ->> can have hard-to-predict behavior; prefer assigning to a + specific environment instead (with assign() or <-). + +--- + +id: left_double_assignment +language: r +severity: hint +rule: + pattern: $LHS <<- $RHS + has: + field: lhs + kind: identifier +message: <<- can have hard-to-predict behavior; prefer assigning to a + specific environment instead (with assign() or <-). diff --git a/flint/rules/builtin/duplicate_argument.yml b/flint/rules/builtin/duplicate_argument.yml new file mode 100644 index 0000000..415b9ff --- /dev/null +++ b/flint/rules/builtin/duplicate_argument.yml @@ -0,0 +1,46 @@ +id: duplicate_argument-1 +language: r +severity: warning +rule: + # Look for a function argument... + kind: argument + any: + - has: + kind: identifier + field: name + pattern: $OBJ + - has: + kind: string_content + pattern: $OBJ + stopBy: end + + # ... that follows other argument(s) with the same name... + follows: + kind: argument + stopBy: end + has: + stopBy: end + kind: identifier + field: name + pattern: $OBJ + + # ... inside a function call (or a subset environment for data.table)... + inside: + kind: arguments + follows: + any: + - kind: identifier + pattern: $FUN + - kind: string + inside: + any: + - kind: call + - kind: subset + +# ... that is not a function listed below. +constraints: + FUN: + not: + regex: ^(mutate|transmute)$ + +message: Avoid duplicate arguments in function calls. diff --git a/flint/rules/builtin/empty_assignment.yml b/flint/rules/builtin/empty_assignment.yml new file mode 100644 index 0000000..ccc995f --- /dev/null +++ b/flint/rules/builtin/empty_assignment.yml @@ -0,0 +1,15 @@ +id: empty_assignment-1 +language: r +severity: warning +rule: + any: + - pattern: $OBJ <- {} + - pattern: $OBJ <- {$CONTENT} + - pattern: $OBJ = {} + - pattern: $OBJ = {$CONTENT} +constraints: + CONTENT: + regex: ^\s+$ +message: | + Assign NULL explicitly or, whenever possible, allocate the empty object with + the right type and size. diff --git a/flint/rules/builtin/equal_assignment.yml b/flint/rules/builtin/equal_assignment.yml new file mode 100644 index 0000000..77074fe --- /dev/null +++ b/flint/rules/builtin/equal_assignment.yml @@ -0,0 +1,10 @@ +id: equal_assignment +language: r +severity: hint +rule: + pattern: $LHS = $RHS + has: + field: lhs + kind: identifier +fix: ~~LHS~~ <- ~~RHS~~ +message: Use <-, not =, for assignment. diff --git a/flint/rules/builtin/equals_na.yml b/flint/rules/builtin/equals_na.yml new file mode 100644 index 0000000..64e7454 --- /dev/null +++ b/flint/rules/builtin/equals_na.yml @@ -0,0 +1,37 @@ +id: equals_na +language: r +severity: warning +rule: + any: + - pattern: $MYVAR == NA + - pattern: $MYVAR == NA_integer_ + - pattern: $MYVAR == NA_real_ + - pattern: $MYVAR == NA_complex_ + - pattern: $MYVAR == NA_character_ + - pattern: NA == $MYVAR + - pattern: NA_integer_ == $MYVAR + - pattern: NA_real_ == $MYVAR + - pattern: NA_complex_ == $MYVAR + - pattern: NA_character_ == $MYVAR +fix: is.na(~~MYVAR~~) +message: Use is.na for comparisons to NA (not == or !=). + +--- + +id: equals_na-2 +language: r +severity: warning +rule: + any: + - pattern: $MYVAR != NA + - pattern: $MYVAR != NA_integer_ + - pattern: $MYVAR != NA_real_ + - pattern: $MYVAR != NA_complex_ + - pattern: $MYVAR != NA_character_ + - pattern: NA != $MYVAR + - pattern: NA_integer_ != $MYVAR + - pattern: NA_real_ != $MYVAR + - pattern: NA_complex_ != $MYVAR + - pattern: NA_character_ != $MYVAR +fix: is.na(~~MYVAR~~) +message: Use is.na for comparisons to NA (not == or !=). diff --git a/flint/rules/builtin/expect_comparison.yml b/flint/rules/builtin/expect_comparison.yml new file mode 100644 index 0000000..6af9bb1 --- /dev/null +++ b/flint/rules/builtin/expect_comparison.yml @@ -0,0 +1,37 @@ +id: expect_comparison-1 +language: r +severity: warning +rule: + pattern: expect_true($X > $Y) +fix: expect_gt(~~X~~, ~~Y~~) +message: expect_gt(x, y) is better than expect_true(x > y). + +--- + +id: expect_comparison-2 +language: r +severity: warning +rule: + pattern: expect_true($X >= $Y) +fix: expect_gte(~~X~~, ~~Y~~) +message: expect_gte(x, y) is better than expect_true(x >= y). + +--- + +id: expect_comparison-3 +language: r +severity: warning +rule: + pattern: expect_true($X < $Y) +fix: expect_lt(~~X~~, ~~Y~~) +message: expect_lt(x, y) is better than expect_true(x < y). + +--- + +id: expect_comparison-4 +language: r +severity: warning +rule: + pattern: expect_true($X <= $Y) +fix: expect_lte(~~X~~, ~~Y~~) +message: expect_lte(x, y) is better than expect_true(x <= y). diff --git a/flint/rules/builtin/expect_identical.yml b/flint/rules/builtin/expect_identical.yml new file mode 100644 index 0000000..3af5a85 --- /dev/null +++ b/flint/rules/builtin/expect_identical.yml @@ -0,0 +1,42 @@ +id: expect_identical-1 +language: r +severity: warning +rule: + pattern: expect_true(identical($VAL1, $VAL2)) +fix: expect_identical(~~VAL1~~, ~~VAL2~~) +message: Use expect_identical(x, y) instead of expect_true(identical(x, y)). + +--- + +id: expect_identical-2 +language: r +severity: warning +rule: + pattern: expect_equal($VAL1, $VAL2) +fix: expect_identical(~~VAL1~~, ~~VAL2~~) +constraints: + VAL1: + all: + - not: + has: + stopBy: end + kind: float + regex: \. + - not: + regex: ^typeof + - not: + pattern: NULL + VAL2: + all: + - not: + has: + stopBy: end + kind: float + regex: \. + - not: + regex: ^typeof + - not: + pattern: NULL +message: | + Use expect_identical(x, y) by default; resort to expect_equal() only when + needed, e.g. when setting ignore_attr= or tolerance=. diff --git a/flint/rules/builtin/expect_length.yml b/flint/rules/builtin/expect_length.yml new file mode 100644 index 0000000..cd5f2db --- /dev/null +++ b/flint/rules/builtin/expect_length.yml @@ -0,0 +1,12 @@ +id: expect_length-1 +language: r +severity: warning +rule: + any: + - pattern: $FUN(length($OBJ), $VALUE) + - pattern: $FUN($VALUE, length($OBJ)) +constraints: + FUN: + regex: ^(expect_identical|expect_equal)$ +fix: expect_length(~~OBJ~~, ~~VALUE~~) +message: expect_length(x, n) is better than ~~FUN~~(length(x), n). diff --git a/flint/rules/builtin/expect_named.yml b/flint/rules/builtin/expect_named.yml new file mode 100644 index 0000000..bf88f36 --- /dev/null +++ b/flint/rules/builtin/expect_named.yml @@ -0,0 +1,79 @@ +id: expect_named-1 +language: r +severity: warning +rule: + any: + - pattern: + context: expect_identical(names($OBJ), $VALUES) + strictness: ast + - pattern: + context: expect_identical($VALUES, names($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: colnames|rownames|dimnames|NULL + has: + kind: null +fix: expect_named(~~OBJ~~, ~~VALUES~~) +message: expect_named(x, n) is better than expect_identical(names(x), n). + +--- + +id: expect_named-2 +language: r +severity: warning +rule: + any: + - pattern: + context: expect_equal(names($OBJ), $VALUES) + strictness: ast + - pattern: + context: expect_equal($VALUES, names($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: colnames|rownames|dimnames|NULL +fix: expect_named(~~OBJ~~, ~~VALUES~~) +message: expect_named(x, n) is better than expect_equal(names(x), n). + +--- + +id: expect_named-3 +language: r +severity: warning +rule: + any: + - pattern: + context: testthat::expect_identical(names($OBJ), $VALUES) + strictness: ast + - pattern: + context: testthat::expect_identical($VALUES, names($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: colnames|rownames|dimnames|NULL +fix: testthat::expect_named(~~OBJ~~, ~~VALUES~~) +message: expect_named(x, n) is better than expect_identical(names(x), n). + +--- + +id: expect_named-4 +language: r +severity: warning +rule: + any: + - pattern: + context: testthat::expect_equal(names($OBJ), $VALUES) + strictness: ast + - pattern: + context: testthat::expect_equal($VALUES, names($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: colnames|rownames|dimnames|NULL +fix: testthat::expect_named(~~OBJ~~, ~~VALUES~~) +message: expect_named(x, n) is better than expect_equal(names(x), n). diff --git a/flint/rules/builtin/expect_not.yml b/flint/rules/builtin/expect_not.yml new file mode 100644 index 0000000..3a23e9f --- /dev/null +++ b/flint/rules/builtin/expect_not.yml @@ -0,0 +1,23 @@ +id: expect_not-1 +language: r +severity: warning +rule: + all: + - pattern: expect_true(!$COND) + - not: + regex: '^expect_true\(!!' +fix: expect_false(~~COND~~) +message: expect_false(x) is better than expect_true(!x), and vice versa. + +--- + +id: expect_not-2 +language: r +severity: warning +rule: + all: + - pattern: expect_false(!$COND) + - not: + regex: '^expect_false\(!!' +fix: expect_true(~~COND~~) +message: expect_false(x) is better than expect_true(!x), and vice versa. diff --git a/flint/rules/builtin/expect_null.yml b/flint/rules/builtin/expect_null.yml new file mode 100644 index 0000000..7888fdb --- /dev/null +++ b/flint/rules/builtin/expect_null.yml @@ -0,0 +1,22 @@ +id: expect_null-1 +language: r +severity: warning +rule: + any: + - pattern: $FUN(NULL, $VALUES) + - pattern: $FUN($VALUES, NULL) +constraints: + FUN: + regex: ^(expect_identical|expect_equal)$ +fix: expect_null(~~VALUES~~) +message: expect_null(x) is better than ~~FUN~~(x, NULL). + +--- + +id: expect_null-2 +language: r +severity: warning +rule: + pattern: expect_true(is.null($VALUES)) +fix: expect_null(~~VALUES~~) +message: expect_null(x) is better than expect_true(is.null(x)). diff --git a/flint/rules/builtin/expect_true_false.yml b/flint/rules/builtin/expect_true_false.yml new file mode 100644 index 0000000..784843d --- /dev/null +++ b/flint/rules/builtin/expect_true_false.yml @@ -0,0 +1,28 @@ +id: expect_true_false-1 +language: r +severity: warning +rule: + any: + - pattern: $FUN(TRUE, $VALUES) + - pattern: $FUN($VALUES, TRUE) +constraints: + FUN: + regex: ^(expect_identical|expect_equal)$ +fix: expect_true(~~VALUES~~) +message: expect_true(x) is better than ~~FUN~~(x, TRUE). + +--- + +id: expect_true_false-2 +language: r +severity: warning +rule: + any: + - pattern: $FUN(FALSE, $VALUES) + - pattern: $FUN($VALUES, FALSE) +constraints: + FUN: + regex: ^(expect_identical|expect_equal)$ +fix: expect_false(~~VALUES~~) +message: expect_false(x) is better than ~~FUN~~(x, FALSE). + diff --git a/flint/rules/builtin/expect_type.yml b/flint/rules/builtin/expect_type.yml new file mode 100644 index 0000000..1ab20ec --- /dev/null +++ b/flint/rules/builtin/expect_type.yml @@ -0,0 +1,51 @@ +id: expect_type-1 +language: r +severity: warning +rule: + any: + - pattern: + context: expect_identical(typeof($OBJ), $VALUES) + strictness: ast + - pattern: + context: expect_identical($VALUES, typeof($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: typeof +fix: expect_type(~~OBJ~~, ~~VALUES~~) +message: expect_type(x, t) is better than expect_identical(typeof(x), t). + +--- + +id: expect_type-2 +language: r +severity: warning +rule: + any: + - pattern: + context: expect_equal(typeof($OBJ), $VALUES) + strictness: ast + - pattern: + context: expect_equal($VALUES, typeof($OBJ)) + strictness: ast +constraints: + VALUES: + not: + regex: typeof +fix: expect_type(~~OBJ~~, ~~VALUES~~) +message: expect_type(x, t) is better than expect_equal(typeof(x), t). + +--- + +id: expect_type-3 +language: r +severity: warning +rule: + pattern: expect_true($FUN($OBJ)) +constraints: + FUN: + regex: ^is\. + not: + regex: data\.frame$ +message: expect_type(x, t) is better than expect_true(is.(x)). diff --git a/flint/rules/builtin/for_loop_index.yml b/flint/rules/builtin/for_loop_index.yml new file mode 100644 index 0000000..e5b28b4 --- /dev/null +++ b/flint/rules/builtin/for_loop_index.yml @@ -0,0 +1,27 @@ +id: for_loop_index-1 +language: r +severity: warning +rule: + pattern: for ($IDX in $IDX) +message: Don't re-use any sequence symbols as the index symbol in a for loop. + +--- + +id: for_loop_index-2 +language: r +severity: warning +rule: + pattern: for ($IDX in $SEQ) +constraints: + SEQ: + kind: call + has: + kind: arguments + has: + kind: argument + stopBy: end + has: + kind: identifier + field: value + pattern: $IDX +message: Don't re-use any sequence symbols as the index symbol in a for loop. diff --git a/flint/rules/builtin/function_return.yml b/flint/rules/builtin/function_return.yml new file mode 100644 index 0000000..31ba46b --- /dev/null +++ b/flint/rules/builtin/function_return.yml @@ -0,0 +1,11 @@ +id: function_return-1 +language: r +severity: warning +rule: + any: + - pattern: return($OBJ <- $VAL) + - pattern: return($OBJ <<- $VAL) + - pattern: return($VAL -> $OBJ) + - pattern: return($VAL ->> $OBJ) +message: | + Move the assignment outside of the return() clause, or skip assignment altogether. diff --git a/flint/rules/builtin/implicit_assignment.yml b/flint/rules/builtin/implicit_assignment.yml new file mode 100644 index 0000000..133a40e --- /dev/null +++ b/flint/rules/builtin/implicit_assignment.yml @@ -0,0 +1,69 @@ +id: implicit_assignment-1 +language: r +severity: warning +rule: + any: + - pattern: $RECEIVER <- $VALUE + - pattern: $RECEIVER <<- $VALUE + - pattern: $VALUE -> $RECEIVER + - pattern: $VALUE ->> $RECEIVER + inside: + any: + - kind: if_statement + - kind: while_statement + field: condition + stopBy: end + strictness: cst +message: | + Avoid implicit assignments in function calls. For example, instead of + `if (x <- 1L) { ... }`, write `x <- 1L; if (x) { ... }`. + +--- + +id: implicit_assignment-2 +language: r +severity: warning +rule: + any: + - pattern: $RECEIVER <- $VALUE + - pattern: $RECEIVER <<- $VALUE + - pattern: $VALUE -> $RECEIVER + - pattern: $VALUE ->> $RECEIVER + inside: + kind: for_statement + field: sequence + stopBy: end + strictness: cst +message: | + Avoid implicit assignments in function calls. For example, instead of + `if (x <- 1L) { ... }`, write `x <- 1L; if (x) { ... }`. + +# --- +# +# id: implicit_assignment-3 +# language: r +# severity: warning +# rule: +# any: +# - pattern: $RECEIVER <- $VALUE +# - pattern: $RECEIVER <<- $VALUE +# - pattern: $VALUE -> $RECEIVER +# - pattern: $VALUE ->> $RECEIVER +# inside: +# kind: argument +# field: value +# strictness: cst +# stopBy: end +# not: +# inside: +# kind: call +# field: function +# has: +# kind: identifier +# regex: ^(lapply)$ +# stopBy: end +# strictness: cst +# message: | +# Avoid implicit assignments in function calls. For example, instead of +# `if (x <- 1L) { ... }`, write `x <- 1L; if (x) { ... }`. + diff --git a/flint/rules/builtin/is_numeric.yml b/flint/rules/builtin/is_numeric.yml new file mode 100644 index 0000000..0a76b08 --- /dev/null +++ b/flint/rules/builtin/is_numeric.yml @@ -0,0 +1,25 @@ +id: is_numeric-1 +language: r +severity: warning +rule: + any: + - pattern: is.numeric($VAR) || is.integer($VAR) + - pattern: is.integer($VAR) || is.numeric($VAR) +message: is.numeric(x) || is.integer(x) can be simplified to is.numeric(x). Use + is.double(x) to test for objects stored as 64-bit floating point. + +--- + +id: is_numeric-2 +language: r +severity: warning +rule: + any: + - pattern: + context: class($VAR) %in% c("numeric", "integer") + strictness: ast + - pattern: + context: class($VAR) %in% c("integer", "numeric") + strictness: ast +message: class(x) %in% c("numeric", "integer") can be simplified to is.numeric(x). Use + is.double(x) to test for objects stored as 64-bit floating point. diff --git a/flint/rules/builtin/length_levels.yml b/flint/rules/builtin/length_levels.yml new file mode 100644 index 0000000..8e02978 --- /dev/null +++ b/flint/rules/builtin/length_levels.yml @@ -0,0 +1,7 @@ +id: length_levels-1 +language: r +severity: warning +rule: + pattern: length(levels($VAR)) +fix: nlevels(~~VAR~~) +message: nlevels(x) is better than length(levels(x)). df diff --git a/flint/rules/builtin/length_test.yml b/flint/rules/builtin/length_test.yml new file mode 100644 index 0000000..f9ba9ed --- /dev/null +++ b/flint/rules/builtin/length_test.yml @@ -0,0 +1,59 @@ +# Strangely, having something like pattern: length($VAR $OP $VAR2) doesn't work + +id: length_test-1 +language: r +severity: warning +rule: + pattern: length($VAR == $VAR2) +fix: length(~~VAR~~) == ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-2 +language: r +severity: warning +rule: + pattern: length($VAR != $VAR2) +fix: length(~~VAR~~) != ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-3 +language: r +severity: warning +rule: + pattern: length($VAR > $VAR2) +fix: length(~~VAR~~) > ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-4 +language: r +severity: warning +rule: + pattern: length($VAR >= $VAR2) +fix: length(~~VAR~~) >= ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-5 +language: r +severity: warning +rule: + pattern: length($VAR < $VAR2) +fix: length(~~VAR~~) < ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. + +--- + +id: length_test-6 +language: r +severity: warning +rule: + pattern: length($VAR <= $VAR2) +fix: length(~~VAR~~) <= ~~VAR2~~ +message: Checking the length of a logical vector is likely a mistake. diff --git a/flint/rules/builtin/lengths.yml b/flint/rules/builtin/lengths.yml new file mode 100644 index 0000000..a416440 --- /dev/null +++ b/flint/rules/builtin/lengths.yml @@ -0,0 +1,59 @@ +id: sapply_lengths-1 +language: r +severity: warning +rule: + any: + - pattern: sapply($MYVAR, length) + - pattern: sapply(FUN = length, $MYVAR) + - pattern: sapply($MYVAR, FUN = length) + - pattern: vapply($MYVAR, length $$$) + + - pattern: map_dbl($MYVAR, length) + - pattern: map_dbl($MYVAR, .f = length) + - pattern: map_dbl(.f = length, $MYVAR) + - pattern: map_int($MYVAR, length) + - pattern: map_int($MYVAR, .f = length) + - pattern: map_int(.f = length, $MYVAR) + + - pattern: purrr::map_dbl($MYVAR, length) + - pattern: purrr::map_dbl($MYVAR, .f = length) + - pattern: purrr::map_dbl(.f = length, $MYVAR) + - pattern: purrr::map_int($MYVAR, length) + - pattern: purrr::map_int($MYVAR, .f = length) + - pattern: purrr::map_int(.f = length, $MYVAR) +fix: lengths(~~MYVAR~~) +message: Use lengths() to find the length of each element in a list. + +--- + +id: sapply_lengths-2 +language: r +severity: warning +rule: + any: + - pattern: $MYVAR |> sapply(length) + - pattern: $MYVAR |> sapply(FUN = length) + - pattern: $MYVAR |> vapply(length $$$) + - pattern: $MYVAR |> map_int(length) + - pattern: $MYVAR |> map_int(length $$$) + - pattern: $MYVAR |> purrr::map_int(length) + - pattern: $MYVAR |> purrr::map_int(length $$$) +fix: ~~MYVAR~~ |> lengths() +message: Use lengths() to find the length of each element in a list. + +--- + +id: sapply_lengths-3 +language: r +severity: warning +rule: + any: + - pattern: $MYVAR %>% sapply(length) + - pattern: $MYVAR %>% sapply(FUN = length) + - pattern: $MYVAR %>% vapply(length $$$) + - pattern: $MYVAR %>% map_int(length) + - pattern: $MYVAR %>% map_int(length $$$) + - pattern: $MYVAR %>% purrr::map_int(length) + - pattern: $MYVAR %>% purrr::map_int(length $$$) +fix: ~~MYVAR~~ %>% lengths() +message: Use lengths() to find the length of each element in a list. diff --git a/flint/rules/builtin/library_call.yml b/flint/rules/builtin/library_call.yml new file mode 100644 index 0000000..ef14d54 --- /dev/null +++ b/flint/rules/builtin/library_call.yml @@ -0,0 +1,26 @@ +id: library_call +language: r +severity: warning +rule: + kind: call + has: + regex: ^library|require$ + kind: identifier + follows: + not: + any: + - kind: call + has: + regex: ^library|require$ + kind: identifier + - kind: comment + not: + inside: + any: + - kind: function_definition + - kind: call + has: + pattern: suppressPackageStartupMessages + kind: identifier +message: Move all library/require calls to the top of the script. + diff --git a/flint/rules/builtin/literal_coercion.yml b/flint/rules/builtin/literal_coercion.yml new file mode 100644 index 0000000..e61fb24 --- /dev/null +++ b/flint/rules/builtin/literal_coercion.yml @@ -0,0 +1,89 @@ +id: literal_coercion-1 +language: r +severity: warning +rule: + pattern: $FUN($VALUE) +constraints: + VALUE: + kind: argument + has: + kind: float + not: + regex: 'e' + FUN: + regex: ^(int|as\.integer)$ +fix: ~~VALUE~~L +message: | + Use ~~VALUE~~L instead of ~~FUN~~(~~VALUE~~), i.e., use literals directly + where possible, instead of coercion. + +--- + +id: literal_coercion-2 +language: r +severity: warning +rule: + pattern: as.character(NA) +fix: NA_character_ +message: | + Use NA_character_ instead of as.character(NA), i.e., use literals directly + where possible, instead of coercion. + +--- + +id: literal_coercion-3 +language: r +severity: warning +rule: + pattern: as.logical($VAR) +constraints: + VAR: + kind: argument + has: + any: + - regex: ^1L$ + - regex: ^1$ + - regex: 'true' +fix: TRUE +message: Use TRUE instead of as.logical(~~VAR~~). + +--- + +id: literal_coercion-4 +language: r +severity: warning +rule: + pattern: $FUN($VAR) +constraints: + VAR: + kind: argument + has: + kind: float + FUN: + regex: ^(as\.numeric|as\.double)$ +fix: ~~VAR~~ +message: Use ~~VAR~~ instead of ~~FUN~~(~~VAR~~). + +--- + +id: literal_coercion-5 +language: r +severity: warning +rule: + pattern: as.integer(NA) +fix: NA_integer_ +message: Use NA_integer_ instead of as.integer(NA). + +--- + +id: literal_coercion-6 +language: r +severity: warning +rule: + pattern: $FUN(NA) +constraints: + FUN: + regex: ^(as\.numeric|as\.double)$ +fix: NA_real_ +message: Use NA_real_ instead of ~~FUN~~(NA). + diff --git a/flint/rules/builtin/matrix_apply.yml b/flint/rules/builtin/matrix_apply.yml new file mode 100644 index 0000000..bbc6850 --- /dev/null +++ b/flint/rules/builtin/matrix_apply.yml @@ -0,0 +1,110 @@ +id: matrix_apply-1 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, 2, sum) + - pattern: apply($INPUT, MARGIN = 2, sum) + - pattern: apply($INPUT, 2, FUN = sum) + - pattern: apply($INPUT, MARGIN = 2, FUN = sum) +fix: colSums(~~INPUT~~) +message: Use colSums(x) rather than apply(x, 1, sum) + +--- + +id: matrix_apply-2 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, 2, sum, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = 2, sum, na.rm = $NARM) + - pattern: apply($INPUT, 2, FUN = sum, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = 2, FUN = sum, na.rm = $NARM) +fix: colSums(~~INPUT~~, na.rm = ~~NARM~~) +message: Use colSums(x, na.rm = ~~NARM~~) rather than apply(x, 2, sum, na.rm = ~~NARM~~). + +--- + +id: matrix_apply-3 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, 1, sum) + - pattern: apply($INPUT, MARGIN = 1, sum) + - pattern: apply($INPUT, 1, FUN = sum) + - pattern: apply($INPUT, MARGIN = 1, FUN = sum) +fix: rowSums(~~INPUT~~) +message: Use rowSums(x) rather than apply(x, 1, sum) + +--- + +id: matrix_apply-4 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, 1, sum, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = 1, sum, na.rm = $NARM) + - pattern: apply($INPUT, 1, FUN = sum, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = 1, FUN = sum, na.rm = $NARM) +fix: rowSums(~~INPUT~~, na.rm = ~~NARM~~) +message: Use rowSums(x, na.rm = ~~NARM~~) rather than apply(x, 1, sum, na.rm = ~~NARM~~). + +--- + +id: matrix_apply-5 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, 1, mean) + - pattern: apply($INPUT, MARGIN = 1, mean) + - pattern: apply($INPUT, 1, FUN = mean) + - pattern: apply($INPUT, MARGIN = 1, FUN = mean) +fix: rowMeans(~~INPUT~~) +message: Use rowMeans(x) rather than apply(x, 1, mean). + +--- + +id: matrix_apply-6 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, 1, mean, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = 1, mean, na.rm = $NARM) + - pattern: apply($INPUT, 1, FUN = mean, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = 1, FUN = mean, na.rm = $NARM) +fix: rowMeans(~~INPUT~~, na.rm = ~~NARM~~) +message: Use rowMeans(x, na.rm = ~~NARM~~) rather than apply(x, 1, mean, na.rm = ~~NARM~~). + +--- + +id: matrix_apply-7 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, 2, mean) + - pattern: apply($INPUT, MARGIN = 2, mean) + - pattern: apply($INPUT, 2, FUN = mean) + - pattern: apply($INPUT, MARGIN = 2, FUN = mean) +fix: colMeans(~~INPUT~~) +message: Use colMeans(x) rather than apply(x, 2, mean). + +--- + +id: matrix_apply-8 +language: r +severity: warning +rule: + any: + - pattern: apply($INPUT, 2, mean, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = 2, mean, na.rm = $NARM) + - pattern: apply($INPUT, 2, FUN = mean, na.rm = $NARM) + - pattern: apply($INPUT, MARGIN = 2, FUN = mean, na.rm = $NARM) +fix: colMeans(~~INPUT~~, na.rm = ~~NARM~~) +message: Use colMeans(x, na.rm = ~~NARM~~) rather than apply(x, 2, mean, na.rm = ~~NARM~~). + diff --git a/flint/rules/builtin/missing_argument.yml b/flint/rules/builtin/missing_argument.yml new file mode 100644 index 0000000..9f47d17 --- /dev/null +++ b/flint/rules/builtin/missing_argument.yml @@ -0,0 +1,44 @@ +id: missing_argument-1 +language: r +severity: warning +rule: + kind: arguments + has: + kind: comma + any: + - precedes: + stopBy: neighbor + any: + - regex: '^\)$' + - kind: comma + - follows: + any: + - regex: '^\($' + - kind: argument + regex: '=$' + follows: + kind: identifier + not: + regex: '^(quote|switch|alist)$' + inside: + kind: call +message: Missing argument in function call. + +--- + +id: missing_argument-2 +language: r +severity: warning +rule: + kind: arguments + regex: '=(\s+|)\)$' + follows: + any: + - kind: identifier + - kind: extract_operator + - kind: namespace_operator + not: + regex: '^(quote|switch|alist)$' + inside: + kind: call +message: Missing argument in function call. diff --git a/flint/rules/builtin/nested_ifelse.yml b/flint/rules/builtin/nested_ifelse.yml new file mode 100644 index 0000000..64dcb08 --- /dev/null +++ b/flint/rules/builtin/nested_ifelse.yml @@ -0,0 +1,29 @@ +id: nested_ifelse-1 +language: r +severity: warning +rule: + pattern: $FUN($COND, $TRUE, $FALSE) +constraints: + FALSE: + regex: ^(ifelse|if_else|fifelse) + FUN: + regex: ^(ifelse|if_else|fifelse) +message: | + Don't use nested ~~FUN~~() calls; instead, try (1) data.table::fcase; + (2) dplyr::case_when; or (3) using a lookup table. + +--- + +id: nested_ifelse-2 +language: r +severity: warning +rule: + pattern: $FUN($COND, $TRUE, $FALSE) +constraints: + TRUE: + regex: ^(ifelse|if_else|fifelse) + FUN: + regex: ^(ifelse|if_else|fifelse) +message: | + Don't use nested ~~FUN~~() calls; instead, try (1) data.table::fcase; + (2) dplyr::case_when; or (3) using a lookup table. diff --git a/flint/rules/builtin/numeric_leading_zero.yml b/flint/rules/builtin/numeric_leading_zero.yml new file mode 100644 index 0000000..1d6762d --- /dev/null +++ b/flint/rules/builtin/numeric_leading_zero.yml @@ -0,0 +1,11 @@ +id: numeric_leading_zero-1 +language: r +severity: warning +rule: + pattern: $VALUE + any: + - kind: float + - kind: identifier + regex: ^\.[0-9] +fix: 0~~VALUE~~ +message: Include the leading zero for fractional numeric constants. diff --git a/flint/rules/builtin/outer_negation.yml b/flint/rules/builtin/outer_negation.yml new file mode 100644 index 0000000..ca377de --- /dev/null +++ b/flint/rules/builtin/outer_negation.yml @@ -0,0 +1,29 @@ +id: outer_negation-1 +language: r +severity: warning +rule: + pattern: all(!$VAR) +constraints: + VAR: + not: + regex: '^!' +fix: '!any(~~VAR~~)' +message: | + !any(x) is better than all(!x). The former applies negation only once after + aggregation instead of many times for each element of x. + +--- + +id: outer_negation-2 +language: r +severity: warning +rule: + pattern: any(! $VAR) +constraints: + VAR: + not: + regex: '^!' +fix: '!all(~~VAR~~)' +message: | + !all(x) is better than any(!x). The former applies negation only once after + aggregation instead of many times for each element of x. diff --git a/flint/rules/builtin/package_hooks.yml b/flint/rules/builtin/package_hooks.yml new file mode 100644 index 0000000..f4dfa75 --- /dev/null +++ b/flint/rules/builtin/package_hooks.yml @@ -0,0 +1,127 @@ +id: package_hooks-1 +language: r +severity: warning +rule: + pattern: packageStartupMessage($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: .onLoad +message: Put packageStartupMessage() calls in .onAttach(), not .onLoad(). + +--- + +id: package_hooks-2 +language: r +severity: warning +rule: + pattern: library.dynam($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: .onAttach +message: Put library.dynam() calls in .onLoad(), not .onAttach(). + +--- + +id: package_hooks-3 +language: r +severity: warning +rule: + pattern: $FN($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: .onLoad +constraints: + FN: + regex: '^(cat|installed.packages|message|packageStartupMessage|print|writeLines)$' +message: Don't use ~~FN~~() in .onLoad(). + +--- + +id: package_hooks-4 +language: r +severity: warning +rule: + pattern: $FN($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: .onAttach +constraints: + FN: + # library.dynam already has its own linter + regex: '^(cat|installed.packages|message|print|writeLines)$' +message: Don't use ~~FN~~() in .onAttach(). + +--- + +id: package_hooks-5 +language: r +severity: warning +rule: + pattern: $FN($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: $LOAD +constraints: + LOAD: + regex: '^(\.onAttach|\.onLoad)$' + FN: + regex: '^(require|library)$' +message: Don't alter the search() path in ~~LOAD~~() by calling ~~FN~~(). + +--- + +id: package_hooks-6 +language: r +severity: warning +rule: + pattern: installed.packages($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: $LOAD +constraints: + LOAD: + regex: '^(\.onAttach|\.onLoad)$' +message: Don't slow down package load by running installed.packages() in ~~LOAD~~(). + +--- + +id: package_hooks-7 +language: r +severity: warning +rule: + pattern: library.dynam.unload($$$) + inside: + stopBy: end + kind: binary_operator + has: + stopBy: end + field: lhs + pattern: $LOAD +constraints: + LOAD: + regex: '^(\.onDetach|\.Last\.lib)$' +message: Use library.dynam.unload() calls in .onUnload(), not ~~LOAD~~(). diff --git a/flint/rules/builtin/paste.yml b/flint/rules/builtin/paste.yml new file mode 100644 index 0000000..800b676 --- /dev/null +++ b/flint/rules/builtin/paste.yml @@ -0,0 +1,75 @@ +id: paste-1 +language: r +severity: warning +rule: + pattern: + context: paste($$$CONTENT sep = "" $$$CONTENT2) + strictness: ast +# fix: paste0($$$CONTENT) +message: paste0(...) is better than paste(..., sep = ""). + +--- + +id: paste-2 +language: r +severity: warning +rule: + any: + - pattern: + context: paste($CONTENT, collapse = ", ") + strictness: ast + - pattern: + context: paste(collapse = ", ", $CONTENT) + strictness: ast +# fix: paste0($$$CONTENT) +message: toString(.) is more expressive than paste(., collapse = ", "). + +--- + +id: paste-3 +language: r +severity: warning +rule: + pattern: + context: paste0($$$CONTENT sep = $USELESS $$$CONTENT2) + strictness: ast +# fix: paste0($$$CONTENT) +message: | + sep= is not a formal argument to paste0(); did you mean to use paste(), or + collapse=? + +--- + +id: paste-4 +language: r +severity: warning +rule: + any: + - pattern: + context: paste0($CONTENT, collapse = $FOO) + strictness: ast + - pattern: + context: paste0(collapse = $FOO, $CONTENT) + strictness: ast + not: + has: + regex: sep + kind: argument +# fix: paste0($$$CONTENT) +message: | + Use paste(), not paste0(), to collapse a character vector when sep= is not used. + +# --- +# +# id: paste-5 +# language: r +# severity: warning +# rule: +# pattern: +# context: paste0(rep($VAR, $TIMES), collapse = "") +# strictness: ast +# constraints: +# VAR: +# kind: string +# fix: strrep(~~VAR~~, ~~TIMES~~) +# message: strrep(x, times) is better than paste0(rep(x, times), collapse = ""). diff --git a/flint/rules/builtin/redundant_equals.yml b/flint/rules/builtin/redundant_equals.yml new file mode 100644 index 0000000..79a6abc --- /dev/null +++ b/flint/rules/builtin/redundant_equals.yml @@ -0,0 +1,29 @@ +id: redundant_equals-1 +language: r +severity: warning +rule: + any: + - pattern: $VAR == TRUE + - pattern: TRUE == $VAR + - pattern: $VAR == FALSE + - pattern: FALSE == $VAR +message: | + Using == on a logical vector is redundant. Well-named logical vectors can be + used directly in filtering. For data.table's `i` argument, wrap the column + name in (), like `DT[(is_treatment)]`. + +--- + +id: redundant_equals-2 +language: r +severity: warning +rule: + any: + - pattern: $VAR != TRUE + - pattern: TRUE != $VAR + - pattern: $VAR != FALSE + - pattern: FALSE != $VAR +message: | + Using != on a logical vector is redundant. Well-named logical vectors can be + used directly in filtering. For data.table's `i` argument, wrap the column + name in (), like `DT[(is_treatment)]`. diff --git a/flint/rules/builtin/redundant_ifelse.yml b/flint/rules/builtin/redundant_ifelse.yml new file mode 100644 index 0000000..8f252e6 --- /dev/null +++ b/flint/rules/builtin/redundant_ifelse.yml @@ -0,0 +1,67 @@ +id: redundant_ifelse-1 +language: r +severity: warning +rule: + pattern: $FUN($COND, $VAL1, $VAL2) +constraints: + VAL1: + regex: ^TRUE$ + VAL2: + regex: ^FALSE$ + FUN: + regex: ^(ifelse|fifelse|if_else)$ +fix: ~~COND~~ +message: | + Use ~~COND~~ directly instead of calling ~~FUN~~(~~COND~~, TRUE, FALSE). + +--- + +id: redundant_ifelse-2 +language: r +severity: warning +rule: + pattern: $FUN($COND, $VAL1, $VAL2) +constraints: + VAL1: + regex: ^FALSE$ + VAL2: + regex: ^TRUE$ + FUN: + regex: ^(ifelse|fifelse|if_else)$ +fix: '!(~~COND~~)' +message: | + Use !(~~COND~~) directly instead of calling ~~FUN~~(~~COND~~, FALSE, TRUE). + +--- + +id: redundant_ifelse-3 +language: r +severity: warning +rule: + pattern: $FUN($COND, $VAL1, $VAL2) +constraints: + VAL1: + regex: ^(1|1L)$ + VAL2: + regex: ^(0|0L)$ + FUN: + regex: ^(ifelse|fifelse|if_else)$ +fix: as.integer(~~COND~~) +message: Prefer as.integer(~~COND~~) to ~~FUN~~(~~COND~~, ~~VAL1~~, ~~VAL2~~). + +--- + +id: redundant_ifelse-4 +language: r +severity: warning +rule: + pattern: $FUN($COND, $VAL1, $VAL2) +constraints: + VAL1: + regex: ^(0|0L)$ + VAL2: + regex: ^(1|1L)$ + FUN: + regex: ^(ifelse|fifelse|if_else)$ +fix: as.integer(!(~~COND~~)) +message: Prefer as.integer(!(~~COND~~)) to ~~FUN~~(~~COND~~, ~~VAL1~~, ~~VAL2~~). diff --git a/flint/rules/builtin/rep_len.yml b/flint/rules/builtin/rep_len.yml new file mode 100644 index 0000000..d4d78e5 --- /dev/null +++ b/flint/rules/builtin/rep_len.yml @@ -0,0 +1,7 @@ +id: rep_len-1 +language: r +severity: warning +rule: + pattern: rep($OBJ, length.out = $LEN) +fix: rep_len(~~OBJ~~, ~~LEN~~) +message: Use rep_len(x, n) instead of rep(x, length.out = n). diff --git a/flint/rules/builtin/right_assignment.yml b/flint/rules/builtin/right_assignment.yml new file mode 100644 index 0000000..76b736e --- /dev/null +++ b/flint/rules/builtin/right_assignment.yml @@ -0,0 +1,10 @@ +id: right_assignment +language: r +severity: hint +rule: + pattern: $RHS -> $LHS + has: + field: rhs + kind: identifier +fix: ~~LHS~~<- ~~RHS~~ +message: Use <-, not ->, for assignment. diff --git a/flint/rules/builtin/sample_int.yml b/flint/rules/builtin/sample_int.yml new file mode 100644 index 0000000..091825c --- /dev/null +++ b/flint/rules/builtin/sample_int.yml @@ -0,0 +1,43 @@ +id: sample_int-1 +language: r +severity: warning +rule: + any: + - pattern: sample(1:$N, $$$OTHER) + - pattern: sample(1L:$N, $$$OTHER) +fix: sample.int(~~N~~, ~~OTHER~~) +message: sample.int(n, m, ...) is preferable to sample(1:n, m, ...). + +--- + +id: sample_int-2 +language: r +severity: warning +rule: + pattern: sample(seq($N), $$$OTHER) +fix: sample.int(~~N~~, ~~OTHER~~) +message: sample.int(n, m, ...) is preferable to sample(seq(n), m, ...). + +--- + +id: sample_int-3 +language: r +severity: warning +rule: + pattern: sample(seq_len($N), $$$OTHER) +fix: sample.int(~~N~~, ~~OTHER~~) +message: sample.int(n, m, ...) is preferable to sample(seq_len(n), m, ...). + +--- + +# Strangely this panicks if I rename FIRST to N +id: sample_int-4 +language: r +severity: warning +rule: + pattern: sample($FIRST, $$$OTHER) +constraints: + FIRST: + regex: ^\d+(L|)$ +fix: sample.int(~~N~~, ~~OTHER~~) +message: sample.int(n, m, ...) is preferable to sample(n, m, ...). diff --git a/flint/rules/builtin/semicolon.yml b/flint/rules/builtin/semicolon.yml new file mode 100644 index 0000000..fb5dd75 --- /dev/null +++ b/flint/rules/builtin/semicolon.yml @@ -0,0 +1,10 @@ +id: semicolon-1 +language: r +severity: warning +rule: + regex: ;\s+$ + not: + inside: + kind: string + stopBy: end +message: Trailing semicolons are not needed. diff --git a/flint/rules/builtin/seq.yml b/flint/rules/builtin/seq.yml new file mode 100644 index 0000000..c199c5d --- /dev/null +++ b/flint/rules/builtin/seq.yml @@ -0,0 +1,121 @@ +id: seq-1 +language: r +severity: warning +rule: + pattern: seq(length($VAR)) +fix: seq_along(~~VAR~~) +message: | + seq(length(...)) is likely to be wrong in the empty edge case. Use seq_along(...) instead. + +--- + +id: seq-2 +language: r +severity: warning +rule: + any: + - pattern: 1:nrow($VAR) + - pattern: 1L:nrow($VAR) + regex: ^1 +fix: seq_len(nrow(~~VAR~~)) +message: | + 1:nrow(...) is likely to be wrong in the empty edge case. Use seq_len(nrow(...)) instead. + +--- + +id: seq-3 +language: r +severity: warning +rule: + any: + - pattern: 1:n() + - pattern: 1L:n() + regex: ^1 +fix: seq_len(n()) +message: | + 1:n() is likely to be wrong in the empty edge case. Use seq_len(n()) instead. + +--- + +id: seq-4 +language: r +severity: warning +rule: + pattern: seq(nrow($VAR)) +fix: seq_len(nrow(~~VAR~~)) +message: | + seq(nrow(...)) is likely to be wrong in the empty edge case. Use seq_len(nrow(...)) instead. + +--- + +id: seq-5 +language: r +severity: warning +rule: + any: + - pattern: 1:length($VAR) + - pattern: 1L:length($VAR) + regex: ^1 +fix: seq_along(~~VAR~~) +message: | + 1:length(...) is likely to be wrong in the empty edge case. Use seq_along(...) instead. + +--- + +id: seq-6 +language: r +severity: warning +rule: + any: + - pattern: 1:ncol($VAR) + - pattern: 1L:ncol($VAR) + regex: ^1 +fix: seq_len(ncol(~~VAR~~)) +message: | + 1:ncol(...) is likely to be wrong in the empty edge case. Use seq_len(ncol(...)) instead. + +--- + +id: seq-7 +language: r +severity: warning +rule: + any: + - pattern: 1:NCOL($VAR) + - pattern: 1L:NCOL($VAR) + regex: ^1 +fix: seq_len(NCOL(~~VAR~~)) +message: | + 1:NCOL(...) is likely to be wrong in the empty edge case. Use seq_len(NCOL(...)) instead. + +--- + +id: seq-8 +language: r +severity: warning +rule: + any: + - pattern: 1:NROW($VAR) + - pattern: 1L:NROW($VAR) + regex: ^1 +fix: seq_len(NROW(~~VAR~~)) +message: | + 1:NROW(...) is likely to be wrong in the empty edge case. Use seq_len(NROW(...)) instead. + + +--- + +id: seq-9 +language: r +severity: warning +rule: + pattern: seq(1, $VAL) + not: + pattern: seq(1, 0) +constraints: + VAL: + regex: ^\d+(|L)$ +fix: seq_len(~~VAL~~) +message: seq_len(~~VAL~~) is more efficient than seq(1, ~~VAL~~). + + diff --git a/flint/rules/builtin/sort.yml b/flint/rules/builtin/sort.yml new file mode 100644 index 0000000..930f5c6 --- /dev/null +++ b/flint/rules/builtin/sort.yml @@ -0,0 +1,85 @@ +id: sort-1 +language: r +severity: warning +rule: + pattern: $OBJ[order($OBJ)] +fix: sort(~~OBJ~~, na.last = TRUE) +message: sort(~~OBJ~~, na.last = TRUE) is better than ~~OBJ~~[order(~~OBJ~~)]. + +--- + +id: sort-2 +language: r +severity: warning +rule: + any: + - pattern: $OBJ[order($OBJ, decreasing = $DECREASING)] + - pattern: $OBJ[order(decreasing = $DECREASING, $OBJ)] +constraints: + DECREASING: + regex: ^(TRUE|FALSE)$ +fix: sort(~~OBJ~~, decreasing = ~~DECREASING~~, na.last = TRUE) +message: | + sort(~~OBJ~~, decreasing = ~~DECREASING~~, na.last = TRUE) is better than + ~~OBJ~~[order(~~OBJ~~, decreasing = ~~DECREASING~~)]. + +--- + +id: sort-3 +language: r +severity: warning +rule: + any: + - pattern: $OBJ[order($OBJ, na.last = $NALAST)] + - pattern: $OBJ[order(na.last = $NALAST, $OBJ)] +constraints: + NALAST: + regex: ^(TRUE|FALSE)$ +fix: sort(~~OBJ~~, na.last = ~~NALAST~~, na.last = TRUE) +message: | + sort(~~OBJ~~, na.last = ~~NALAST~~, na.last = TRUE) is better than + ~~OBJ~~[order(~~OBJ~~, na.last = ~~NALAST~~)]. + +--- + +id: sort-4 +language: r +severity: warning +rule: + any: + - pattern: $OBJ[order($OBJ, decreasing = TRUE, na.last = FALSE)] + - pattern: $OBJ[order($OBJ, na.last = FALSE, decreasing = TRUE)] + - pattern: $OBJ[order(decreasing = TRUE, $OBJ, na.last = FALSE)] + - pattern: $OBJ[order(decreasing = TRUE, na.last = FALSE, $OBJ)] + - pattern: $OBJ[order(na.last = FALSE, decreasing = TRUE, $OBJ)] + - pattern: $OBJ[order(na.last = FALSE, $OBJ, decreasing = TRUE)] +fix: sort(~~OBJ~~, decreasing = TRUE, na.last = FALSE) +message: | + sort(~~OBJ~~, decreasing = TRUE, na.last = FALSE) is better than + ~~OBJ~~[order(~~OBJ~~, na.last = FALSE, decreasing = TRUE)]. + +--- + +id: sort-5 +language: r +severity: warning +rule: + any: + - pattern: sort($OBJ) == $OBJ + - pattern: $OBJ == sort($OBJ) +fix: !is.unsorted(~~OBJ~~) +message: | + Use !is.unsorted(~~OBJ~~) to test the sortedness of a vector. + +--- + +id: sort-6 +language: r +severity: warning +rule: + any: + - pattern: sort($OBJ) != $OBJ + - pattern: $OBJ != sort($OBJ) +fix: is.unsorted(~~OBJ~~) +message: | + Use is.unsorted(~~OBJ~~) to test the unsortedness of a vector. diff --git a/flint/rules/builtin/todo_comment.yml b/flint/rules/builtin/todo_comment.yml new file mode 100644 index 0000000..83d86ed --- /dev/null +++ b/flint/rules/builtin/todo_comment.yml @@ -0,0 +1,7 @@ +id: todo_comment-1 +language: r +severity: warning +rule: + kind: comment + regex: '(?i)#(|\s+)\b(todo|fixme)\b' +message: Remove TODO comments. diff --git a/flint/rules/builtin/undesirable_function.yml b/flint/rules/builtin/undesirable_function.yml new file mode 100644 index 0000000..c9b1756 --- /dev/null +++ b/flint/rules/builtin/undesirable_function.yml @@ -0,0 +1,13 @@ +id: undesirable_function-1 +language: r +severity: warning +rule: + pattern: $FUN + kind: identifier + not: + inside: + kind: argument +constraints: + FUN: + regex: ^(\.libPaths|attach|browser|debug|debugcall|debugonce|detach|par|setwd|structure|Sys\.setenv|Sys\.setlocale|trace|undebug|untrace)$ +message: Function "~~FUN~~()" is undesirable. diff --git a/flint/rules/builtin/undesirable_operator.yml b/flint/rules/builtin/undesirable_operator.yml new file mode 100644 index 0000000..7d63513 --- /dev/null +++ b/flint/rules/builtin/undesirable_operator.yml @@ -0,0 +1,29 @@ +id: undesirable_operator-1 +language: r +severity: warning +rule: + any: + - pattern: $X <<- $Y + - pattern: $X ->> $Y +message: | + Avoid undesirable operators `<<-` and `->>`. They assign outside the current + environment in a way that can be hard to reason about. Prefer fully-encapsulated + functions wherever possible, or, if necessary, assign to a specific environment + with assign(). Recall that you can create an environment at the desired scope + with new.env(). + +--- + +id: undesirable_operator-2 +language: r +severity: warning +rule: + kind: namespace_operator + has: + pattern: ':::' +message: | + Operator `:::` is undesirable. It accesses non-exported functions inside + packages. Code relying on these is likely to break in future versions of the + package because the functions are not part of the public interface and may be + changed or removed by the maintainers without notice. Use public functions + via :: instead. diff --git a/flint/rules/builtin/unnecessary_nesting.yml b/flint/rules/builtin/unnecessary_nesting.yml new file mode 100644 index 0000000..b56b467 --- /dev/null +++ b/flint/rules/builtin/unnecessary_nesting.yml @@ -0,0 +1,36 @@ +id: unnecessary_nesting-1 +language: r +severity: warning +rule: + kind: if_statement + any: + - has: + kind: 'braced_expression' + field: consequence + has: + kind: if_statement + stopBy: neighbor + not: + has: + kind: 'braced_expression' + field: alternative + stopBy: end + not: + any: + - has: + nthChild: 2 + - precedes: + regex: "^else$" + - has: + kind: if_statement + field: consequence + stopBy: neighbor + # Can be in if(), but not else if() + not: + inside: + field: alternative + kind: if_statement +message: | + Don't use nested `if` statements, where a single `if` with the combined + conditional expression will do. For example, instead of `if (x) { if (y) { ... }}`, + use `if (x && y) { ... }`. diff --git a/flint/rules/builtin/unreachable_code.yml b/flint/rules/builtin/unreachable_code.yml new file mode 100644 index 0000000..56eb497 --- /dev/null +++ b/flint/rules/builtin/unreachable_code.yml @@ -0,0 +1,64 @@ +id: unreachable_code-1 +language: r +severity: warning +rule: + regex: '[^}]+' + not: + regex: 'else' + follows: + any: + - pattern: return($$$A) + - pattern: stop($$$A) + not: + precedes: + regex: 'else' + stopBy: end +message: Code and comments coming after a return() or stop() should be removed. + +--- + +id: unreachable_code-2 +language: r +severity: warning +rule: + regex: '[^}]+' + not: + regex: 'else' + follows: + any: + - pattern: next + - pattern: break + stopBy: end +message: Remove code and comments coming after `next` or `break` + +--- + +id: unreachable_code-3 +language: r +severity: warning +rule: + inside: + any: + - kind: if_statement + pattern: if (FALSE) + - kind: while_statement + pattern: while (FALSE) + stopBy: end +message: Remove code inside a conditional loop with a deterministically false condition. + +--- + +id: unreachable_code-4 +language: r +severity: warning +rule: + inside: + any: + - kind: if_statement + pattern: if (TRUE) + - kind: while_statement + pattern: while (TRUE) + stopBy: end +message: | + One branch has a a deterministically true condition. The other branches can + be removed. diff --git a/flint/rules/builtin/which_grepl.yml b/flint/rules/builtin/which_grepl.yml new file mode 100644 index 0000000..81e30f2 --- /dev/null +++ b/flint/rules/builtin/which_grepl.yml @@ -0,0 +1,7 @@ +id: which_grepl-1 +language: r +severity: warning +rule: + pattern: which(grepl($$$ARGS)) +fix: grep(~~ARGS~~) +message: grep(pattern, x) is better than which(grepl(pattern, x)). From 82f87b96f0f238c35ce672eb0b6ff322152259d1 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 19:53:24 +0800 Subject: [PATCH 013/127] lint files --- tests/testthat/test-create_CRU_stack.R | 4 +-- tests/testthat/test-create_stack.R | 35 ++++++++++++-------------- tests/testthat/test-get_CRU.R | 6 ++--- tests/testthat/test-get_CRU_df.R | 6 ++--- tests/testthat/test-get_CRU_stack.R | 6 ++--- tests/testthat/test_caching.R | 9 +++---- tests/testthat/test_get_local.R | 4 +-- 7 files changed, 32 insertions(+), 38 deletions(-) diff --git a/tests/testthat/test-create_CRU_stack.R b/tests/testthat/test-create_CRU_stack.R index 6abd3d6..f1d30d9 100644 --- a/tests/testthat/test-create_CRU_stack.R +++ b/tests/testthat/test-create_CRU_stack.R @@ -498,8 +498,8 @@ test_that("create_CRU_stack returns a list of terra rast objects", { CRU_stack <- create_CRU_stack(pre = TRUE, dsn = dsn) expect_named(CRU_stack, "pre") - expect_equal(terra::nlyr(CRU_stack$pre), 12) - expect_equal(length(CRU_stack), 1) + expect_identical(terra::nlyr(CRU_stack$pre), 12) + expeexpect_length(CRU_stack, 1) unlink(list.files( path = tempdir(), diff --git a/tests/testthat/test-create_stack.R b/tests/testthat/test-create_stack.R index 67f79dd..e4d93ff 100644 --- a/tests/testthat/test-create_stack.R +++ b/tests/testthat/test-create_stack.R @@ -652,10 +652,10 @@ test_that("create_CRU_stack creates a list containing only elv", { expect_named(stacks[[1]], "elv") expect_equal(terra::minmax(stacks[[1]])[[2]], 239, tolerance = 0.1) expect_equal(terra::minmax(stacks[[1]])[[1]], 19, tolerance = 0.1) - expect_equal(as.numeric(terra::ext(stacks[[1]])[1]), -180) - expect_equal(as.numeric(terra::ext(stacks[[1]])[2]), 180) - expect_equal(as.numeric(terra::ext(stacks[[1]])[3]), -60) - expect_equal(as.numeric(terra::ext(stacks[[1]])[4]), 85) + expect_identical(as.numeric(terra::ext(stacks[[1]])[1]), -180) + expect_identical(as.numeric(terra::ext(stacks[[1]])[2]), 180) + expect_identical(as.numeric(terra::ext(stacks[[1]])[3]), -60) + expect_identical(as.numeric(terra::ext(stacks[[1]])[4]), 85) }) # Test that wrld raster object resolution and extent are appropriate ----------- @@ -675,12 +675,12 @@ test_that("Test that wrld raster object resolution and extent are appropriate", wrld[] <- NA expect_type(wrld, "S4") - expect_equal(as.numeric(terra::ext(wrld)[1]), -180) - expect_equal(as.numeric(terra::ext(wrld)[2]), 180) - expect_equal(as.numeric(terra::ext(wrld)[3]), -65) - expect_equal(as.numeric(terra::ext(wrld)[4]), 90) - expect_equal(ncol(wrld), 2160) - expect_equal(nrow(wrld), 930) + expect_identical(as.numeric(terra::ext(wrld)[1]), -180) + expect_identical(as.numeric(terra::ext(wrld)[2]), 180) + expect_identical(as.numeric(terra::ext(wrld)[3]), -65) + expect_identical(as.numeric(terra::ext(wrld)[4]), 90) + expect_identical(ncol(wrld), 2160) + expect_identical(nrow(wrld), 930) }) @@ -701,9 +701,7 @@ test_that("month names are appropriate", { "dec" ) - expect_equal( - month_names, - c( + expect_identical(month_names, c( "jan", "feb", "mar", @@ -716,8 +714,7 @@ test_that("month names are appropriate", { "oct", "nov", "dec" - ) - ) + )) }) # Test that CRU_stack_list returns list of raster stacks with proper names ----- @@ -1239,8 +1236,8 @@ test_that("CRU_stack_list returns list of raster stacks with proper names", { expect_named(CRU_stack_list, c("pre", "tmp")) expect_type(CRU_stack_list, "list") - expect_equal(as.numeric(terra::ext(CRU_stack_list[[1]])[1]), -180) - expect_equal(as.numeric(terra::ext(CRU_stack_list[[1]])[2]), 180) - expect_equal(as.numeric(terra::ext(CRU_stack_list[[1]])[3]), -60) - expect_equal(as.numeric(terra::ext(CRU_stack_list[[1]])[4]), 85) + expect_identical(as.numeric(terra::ext(CRU_stack_list[[1]])[1]), -180) + expect_identical(as.numeric(terra::ext(CRU_stack_list[[1]])[2]), 180) + expect_identical(as.numeric(terra::ext(CRU_stack_list[[1]])[3]), -60) + expect_identical(as.numeric(terra::ext(CRU_stack_list[[1]])[4]), 85) }) diff --git a/tests/testthat/test-get_CRU.R b/tests/testthat/test-get_CRU.R index bb16939..0fde465 100644 --- a/tests/testthat/test-get_CRU.R +++ b/tests/testthat/test-get_CRU.R @@ -104,7 +104,7 @@ test_that("get_CRU will set pre to TRUE if pre_cv is TRUE and pre is FALSE", { pre <- FALSE pre_cv <- TRUE - expect_true(!isTRUE(pre)) + expect_false(isTRUE(pre)) if (isTRUE(pre_cv)) { pre <- TRUE @@ -123,8 +123,8 @@ test_that("get_CRU will set tmp and dtr to TRUE if tmn or tmx dtr <- FALSE tmn <- TRUE tmx <- TRUE - expect_true(!isTRUE(tmp)) - expect_true(!isTRUE(dtr)) + expect_false(isTRUE(tmp)) + expect_false(isTRUE(dtr)) if (isTRUE(tmn) | isTRUE(tmx)) { dtr <- tmp <- TRUE diff --git a/tests/testthat/test-get_CRU_df.R b/tests/testthat/test-get_CRU_df.R index 426cad3..a25b71a 100644 --- a/tests/testthat/test-get_CRU_df.R +++ b/tests/testthat/test-get_CRU_df.R @@ -496,7 +496,7 @@ test_that("get_CRU_df lists only .dat.gz files in the given dsn", { list.files(tempdir(), pattern = ".dat.gz$", full.names = TRUE) expect_type(files, "character") - expect_equal(files, file.path(tempdir(), "grid_10min_tmp.dat.gz")) + expect_identical(files, file.path(tempdir(), "grid_10min_tmp.dat.gz")) }) # Test that get_CRU_df sets the cache directory properly when cache is TRUE ---- @@ -515,7 +515,7 @@ test_that("get_CRU_df sets the cache directory properly when cache is TRUE", { cache_dir <- tempdir() } - expect_equal(cache_dir, rappdirs::user_config_dir("getCRUCLdata")) + expect_identical(cache_dir, rappdirs::user_config_dir("getCRUCLdata")) }) # Test that get_CRU_df sets the cache dir properly when cache is FALSE --------- @@ -533,5 +533,5 @@ test_that("get_CRU_df sets the cache directory properly when cache is FALSE", { cache_dir <- tempdir() } - expect_equal(cache_dir, tempdir()) + expect_identical(cache_dir, tempdir()) }) diff --git a/tests/testthat/test-get_CRU_stack.R b/tests/testthat/test-get_CRU_stack.R index 24f8591..6bf29f8 100644 --- a/tests/testthat/test-get_CRU_stack.R +++ b/tests/testthat/test-get_CRU_stack.R @@ -494,7 +494,7 @@ test_that("create_CRU_df lists only .dat.gz files in the given dsn", { list.files(dsn, pattern = ".dat.gz$", full.names = TRUE) expect_type(files, "character") - expect_equal(files, file.path(tempdir(), "grid_10min_tmp.dat.gz")) + expect_identical(files, file.path(tempdir(), "grid_10min_tmp.dat.gz")) }) # Test that get_CRU_stack sets the cache dir properly when cache is TRUE ------- @@ -512,7 +512,7 @@ test_that("get_CRU_stack sets the cache dir properly when cache is TRUE", { cache_dir <- tempdir() } - expect_equal(cache_dir, rappdirs::user_config_dir("getCRUCLdata")) + expect_identical(cache_dir, rappdirs::user_config_dir("getCRUCLdata")) }) # Test that get_CRU_stack sets the cache dir properly when cache is FALSE ------ @@ -530,5 +530,5 @@ test_that("get_CRU_stack sets the cache dir properly when cache is FALSE", { cache_dir <- tempdir() } - expect_equal(cache_dir, tempdir()) + expect_identical(cache_dir, tempdir()) }) diff --git a/tests/testthat/test_caching.R b/tests/testthat/test_caching.R index 3a0a704..a411e33 100644 --- a/tests/testthat/test_caching.R +++ b/tests/testthat/test_caching.R @@ -42,19 +42,16 @@ test_that("caching utils list files in cache and delete when asked", { # test getCRUCLdata cache list k <- list.files(manage_cache$cache_path_get()) - expect_equal(basename(manage_cache$list()), k) + expect_identical(basename(manage_cache$list()), k) # test delete one file expect_error(manage_cache$delete("file1.tif")) manage_cache$delete("file1.asc") l <- list.files(manage_cache$cache_path_get()) - expect_equal(basename(manage_cache$list()), l) + expect_identical(basename(manage_cache$list()), l) # test delete all manage_cache$delete_all() - expect_equal( - list.files(manage_cache$list()), - character(0) - ) + expect_identical(list.files(manage_cache$list()), character(0)) }) diff --git a/tests/testthat/test_get_local.R b/tests/testthat/test_get_local.R index e912576..4d3924a 100644 --- a/tests/testthat/test_get_local.R +++ b/tests/testthat/test_get_local.R @@ -503,6 +503,6 @@ test_that("Test that .get_local lists local files", { cache_dir ) - expect_equal(length(files), 1) - expect_equal(basename(files[1]), "grid_10min_pre.dat.gz") + expeexpect_length(files, 1) + expect_identical(basename(files[1]), "grid_10min_pre.dat.gz") }) From 1999998fc4a8f900029a83087a8b4fb3c62841c0 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 19:54:31 +0800 Subject: [PATCH 014/127] fix lint --- tests/testthat/test-create_CRU_stack.R | 2 +- tests/testthat/test_get_local.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-create_CRU_stack.R b/tests/testthat/test-create_CRU_stack.R index f1d30d9..948690e 100644 --- a/tests/testthat/test-create_CRU_stack.R +++ b/tests/testthat/test-create_CRU_stack.R @@ -499,7 +499,7 @@ test_that("create_CRU_stack returns a list of terra rast objects", { expect_named(CRU_stack, "pre") expect_identical(terra::nlyr(CRU_stack$pre), 12) - expeexpect_length(CRU_stack, 1) + expect_length(CRU_stack, 1) unlink(list.files( path = tempdir(), diff --git a/tests/testthat/test_get_local.R b/tests/testthat/test_get_local.R index 4d3924a..feea928 100644 --- a/tests/testthat/test_get_local.R +++ b/tests/testthat/test_get_local.R @@ -503,6 +503,6 @@ test_that("Test that .get_local lists local files", { cache_dir ) - expeexpect_length(files, 1) + expect_length(files, 1) expect_identical(basename(files[1]), "grid_10min_pre.dat.gz") }) From 3c62ff955012c3e6ab17dc2536102e7976a148ec Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 20:09:14 +0800 Subject: [PATCH 015/127] run tests in parallel and update tests --- DESCRIPTION | 46 ++++++++++++++++------------- tests/testthat/test-create_df.R | 18 +++++------ tests/testthat/test-create_stack.R | 16 +++++----- tests/testthat/test-get_CRU_df.R | 3 +- tests/testthat/test-get_CRU_stack.R | 2 +- 5 files changed, 44 insertions(+), 41 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index aca7e79..db68980 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,23 +1,24 @@ -Package: getCRUCLdata Type: Package +Package: getCRUCLdata Title: 'CRU' 'CL' v. 2.0 Climatology Client Version: 0.3.3 -Authors@R: person(given = "Adam H.", - family = "Sparks", - email = "adamhsparks@gmail.com", - role = c("aut", "cre"), - comment = c(ORCID = "0000-0002-0061-8359")) +Authors@R: + person("Adam H.", "Sparks", , "adamhsparks@gmail.com", role = c("aut", "cre"), + comment = c(ORCID = "0000-0002-0061-8359")) Description: Provides functions that automate downloading and importing University of East Anglia Climate Research Unit ('CRU') 'CL' v. 2.0 - climatology data, facilitates the calculation of minimum temperature and - maximum temperature and formats the data into a data frame or a list of - 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a gridded - climatology of 1961-1990 monthly means released in 2002 and cover all land - areas (excluding Antarctica) at 10 arc minutes (0.1666667 degree) - resolution. For more information see the description of the data provided - by the University of East Anglia Climate Research Unit, + climatology data, facilitates the calculation of minimum temperature + and maximum temperature and formats the data into a data frame or a + list of 'terra' 'rast' objects for use. 'CRU' 'CL' v. 2.0 data are a + gridded climatology of 1961-1990 monthly means released in 2002 and + cover all land areas (excluding Antarctica) at 10 arc minutes + (0.1666667 degree) resolution. For more information see the + description of the data provided by the University of East Anglia + Climate Research Unit, . License: MIT + file LICENSE +URL: https://docs.ropensci.org/getCRUCLdata/ +BugReports: https://github.com/ropensci/getCRUCLdata/issues Depends: R (>= 3.2.0) Imports: @@ -26,22 +27,25 @@ Imports: hoardr, terra, utils -RoxygenNote: 7.3.1 -ByteCompile: TRUE Suggests: ggplot2, knitr, - rmarkdown, rappdirs, + rmarkdown, roxygen2, spelling, testthat, viridis +VignetteBuilder: + knitr +ByteCompile: TRUE +Config/testthat/edition: 3 +Config/testthat/parallel: true Encoding: UTF-8 -URL: https://docs.ropensci.org/getCRUCLdata/ -BugReports: https://github.com/ropensci/getCRUCLdata/issues -VignetteBuilder: knitr +Language: en-US +RoxygenNote: 7.3.1 X-schema.org-applicationCategory: Tools -X-schema.org-keywords: anglia-cru, climate-data, cru-cl2, temperature, rainfall, elevation, data-access, wind, relative-humidity, solar-radiation, diurnal-temperature, frost X-schema.org-isPartOf: https://ropensci.org -Language: en-US +X-schema.org-keywords: anglia-cru, climate-data, cru-cl2, temperature, + rainfall, elevation, data-access, wind, relative-humidity, + solar-radiation, diurnal-temperature, frost diff --git a/tests/testthat/test-create_df.R b/tests/testthat/test-create_df.R index 93cbf7d..c0f2723 100644 --- a/tests/testthat/test-create_df.R +++ b/tests/testthat/test-create_df.R @@ -492,12 +492,12 @@ test_that("Test that .create_df() creates a tidy df of pre, pre_cv and tmp", { expect_true(is.data.frame(CRU_df)) expect_named(CRU_df, c("lat", "lon", "month", "pre", "pre_cv", "tmp")) - expect_is(CRU_df$lat, "numeric") - expect_is(CRU_df$lon, "numeric") - expect_is(CRU_df$month, "factor") - expect_is(CRU_df$pre, "numeric") - expect_is(CRU_df$pre_cv, "numeric") - expect_is(CRU_df$tmp, "numeric") + expect_type(CRU_df$lat, "double") + expect_type(CRU_df$lon, "double") + expect_type(CRU_df$month, "integer") + expect_type(CRU_df$pre, "double") + expect_type(CRU_df$pre_cv, "double") + expect_type(CRU_df$tmp, "double") }) test_that("Test that .create_df() creates a tidy dataframe of pre, tmp, elv", { @@ -571,9 +571,9 @@ test_that("Test that .create_df() creates a tidy dataframe of pre, tmp, elv", { expect_true(is.data.frame(CRU_df)) expect_named(CRU_df, c("lat", "lon", "month", "pre", "tmp", "elv")) - expect_is(CRU_df$lat, "numeric") - expect_is(CRU_df$lon, "numeric") - expect_is(CRU_df$elv, "numeric") + expect_type(CRU_df$lat, "double") + expect_type(CRU_df$lon, "double") + expect_type(CRU_df$elv, "double") }) unlink(list.files( diff --git a/tests/testthat/test-create_stack.R b/tests/testthat/test-create_stack.R index e4d93ff..cc04f60 100644 --- a/tests/testthat/test-create_stack.R +++ b/tests/testthat/test-create_stack.R @@ -652,10 +652,10 @@ test_that("create_CRU_stack creates a list containing only elv", { expect_named(stacks[[1]], "elv") expect_equal(terra::minmax(stacks[[1]])[[2]], 239, tolerance = 0.1) expect_equal(terra::minmax(stacks[[1]])[[1]], 19, tolerance = 0.1) - expect_identical(as.numeric(terra::ext(stacks[[1]])[1]), -180) - expect_identical(as.numeric(terra::ext(stacks[[1]])[2]), 180) - expect_identical(as.numeric(terra::ext(stacks[[1]])[3]), -60) - expect_identical(as.numeric(terra::ext(stacks[[1]])[4]), 85) + expect_identical(as.integer(terra::ext(stacks[[1]])[1]), -180L) + expect_identical(as.integer(terra::ext(stacks[[1]])[2]), 179L) + expect_identical(as.integer(terra::ext(stacks[[1]])[3]), -59L) + expect_identical(as.integer(terra::ext(stacks[[1]])[4]), 85L) }) # Test that wrld raster object resolution and extent are appropriate ----------- @@ -1236,8 +1236,8 @@ test_that("CRU_stack_list returns list of raster stacks with proper names", { expect_named(CRU_stack_list, c("pre", "tmp")) expect_type(CRU_stack_list, "list") - expect_identical(as.numeric(terra::ext(CRU_stack_list[[1]])[1]), -180) - expect_identical(as.numeric(terra::ext(CRU_stack_list[[1]])[2]), 180) - expect_identical(as.numeric(terra::ext(CRU_stack_list[[1]])[3]), -60) - expect_identical(as.numeric(terra::ext(CRU_stack_list[[1]])[4]), 85) + expect_identical(as.integer(terra::ext(CRU_stack_list[[1]])[1]), -180L) + expect_identical(as.integer(terra::ext(CRU_stack_list[[1]])[2]), 179L) + expect_identical(as.integer(terra::ext(CRU_stack_list[[1]])[3]), -59L) + expect_identical(as.integer(terra::ext(CRU_stack_list[[1]])[4]), 85L) }) diff --git a/tests/testthat/test-get_CRU_df.R b/tests/testthat/test-get_CRU_df.R index a25b71a..f17e162 100644 --- a/tests/testthat/test-get_CRU_df.R +++ b/tests/testthat/test-get_CRU_df.R @@ -10,9 +10,8 @@ test_that("get_CRU_df fails if no parameters are TRUE", { # Test that get_CRU_df will retrieve files from CRU server test_that("get_CRU_df will retrieve files from CRU server", { skip_on_cran() - rm(CRU_tmp) CRU_tmp <- get_CRU_df(tmp = TRUE, tmn = FALSE, tmx = FALSE, cache = FALSE) - expect_is(CRU_tmp, "data.frame") + expect_type(CRU_tmp, "list") }) # Test that get_CRU_df lists only .dat.gz files in the given dsn --------------- diff --git a/tests/testthat/test-get_CRU_stack.R b/tests/testthat/test-get_CRU_stack.R index 6bf29f8..b84b2c6 100644 --- a/tests/testthat/test-get_CRU_stack.R +++ b/tests/testthat/test-get_CRU_stack.R @@ -3,7 +3,7 @@ test_that("get_CRU_stack will retrieve files from CRU server", { skip_on_cran() CRU_tmp <- get_CRU_stack(tmp = TRUE, tmn = FALSE, tmx = FALSE, cache = FALSE) - expect_is(CRU_tmp, "list") + expect_type(CRU_tmp, "list") }) # Test that get_CRU_stack fails if no parameters are TRUE ---------------------- From 969bb019163781d48c8bd59755d025e8abe334a3 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 20:14:39 +0800 Subject: [PATCH 016/127] reknit vignette --- vignettes/getCRUCLdata.Rmd | 102 +++++++++++++++++++----------------- vignettes/violin_plot-1.png | Bin 61697 -> 61761 bytes 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/vignettes/getCRUCLdata.Rmd b/vignettes/getCRUCLdata.Rmd index 3796d7a..4b640b7 100644 --- a/vignettes/getCRUCLdata.Rmd +++ b/vignettes/getCRUCLdata.Rmd @@ -1,7 +1,7 @@ --- title: "getCRUCLdata" author: "Adam H. Sparks" -date: "2024-03-30" +date: "2024-12-11" output: rmarkdown::html_vignette: toc: true @@ -69,7 +69,7 @@ Local file path where CRU CL v. 2.0 .dat.gz files are located. The `get_CRU_df()` function automates the download process and creates data frames of the climatology elements. -```r +``` r library(getCRUCLdata) CRU_data <- get_CRU_df(pre = TRUE, @@ -86,38 +86,38 @@ CRU_data <- get_CRU_df(pre = TRUE, elv = TRUE) CRU_data -#> lat lon month dtr frs pre pre_cv rd0 -#> -#> 1: 30.917 35.417 NA NA NA NA NA -#> 2: 31.083 35.417 NA NA NA NA NA -#> 3: 31.250 35.417 NA NA NA NA NA -#> 4: 31.417 35.417 NA NA NA NA NA -#> 5: 31.750 35.583 NA NA NA NA NA -#> --- -#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 -#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 -#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 -#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 -#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 -#> reh sun tmp wnd elv tmx tmn -#> -#> 1: NA NA NA NA -260 NA NA -#> 2: NA NA NA NA -361 NA NA -#> 3: NA NA NA NA -336 NA NA -#> 4: NA NA NA NA -284 NA NA -#> 5: NA NA NA NA -248 NA NA -#> --- -#> 6795146: 70.6 0 -31.3 5.6 283 -26.95 -35.65 -#> 6795147: 70.6 0 -30.7 5.6 186 -26.40 -35.00 -#> 6795148: 70.6 0 -30.8 5.6 195 -26.50 -35.10 -#> 6795149: 70.6 0 -31.2 5.6 268 -26.90 -35.50 -#> 6795150: 70.6 0 -31.5 5.6 328 -27.20 -35.80 +#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv tmx +#> +#> 1: 30.917 35.417 NA NA NA NA NA NA NA NA NA -260 NA +#> 2: 31.083 35.417 NA NA NA NA NA NA NA NA NA -361 NA +#> 3: 31.250 35.417 NA NA NA NA NA NA NA NA NA -336 NA +#> 4: 31.417 35.417 NA NA NA NA NA NA NA NA NA -284 NA +#> 5: 31.750 35.583 NA NA NA NA NA NA NA NA NA -248 NA +#> --- +#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 70.6 0 -31.3 5.6 283 -26.95 +#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 70.6 0 -30.7 5.6 186 -26.40 +#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 70.6 0 -30.8 5.6 195 -26.50 +#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 70.6 0 -31.2 5.6 268 -26.90 +#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 70.6 0 -31.5 5.6 328 -27.20 +#> tmn +#> +#> 1: NA +#> 2: NA +#> 3: NA +#> 4: NA +#> 5: NA +#> --- +#> 6795146: -35.65 +#> 6795147: -35.00 +#> 6795148: -35.10 +#> 6795149: -35.50 +#> 6795150: -35.80 ``` Perhaps you only need one or two elements, it is easy to create a tidy data frame of mean temperature only. -```r +``` r t <- get_CRU_df(tmp = TRUE) t @@ -141,7 +141,7 @@ t Now that we have the data, we can plot it easily using _ggplot2_ and the _viridis_ package for the colour scale. -```r +``` r library(ggplot2) library(viridis) @@ -161,7 +161,7 @@ ggplot(data = t, aes(x = lon, y = lat, fill = tmp)) + We can also generate a violin plot of the same data to visualise how the temperatures change throughout the year. -```r +``` r ggplot(data = t, aes(x = month, y = tmp)) + geom_violin() + ylab("Temperature (˚C)") + @@ -180,7 +180,7 @@ Save the resulting tidy `data.frame` to local disk as a comma separated (CSV) file to local disk, using _data.table_'s `fwrite()`. -```r +``` r fwrite(x = t, file = "~/CRU_tmp.csv") ``` @@ -194,7 +194,7 @@ The `get_CRU_stack()` function automates the download process and creates a `ter Illustrated here is creating a `terra::rast()` of all CRU CL v. 2.0 climatology elements available. -```r +``` r CRU_stack <- get_CRU_stack( pre = TRUE, pre_cv = TRUE, @@ -209,6 +209,10 @@ CRU_stack <- get_CRU_stack( wnd = TRUE, elv = TRUE ) +#> +|---------|---------|---------|---------| +========================================= + CRU_stack #> $dtr @@ -216,7 +220,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 2.3, 2.1, 2.2, 2.3, 1.8, 2.5, ... @@ -227,7 +231,7 @@ CRU_stack #> dimensions : 870, 2160, 1 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> name : elv #> min value : -361 @@ -238,7 +242,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0, 0.0, 0, 0, 0, 0, ... @@ -249,8 +253,8 @@ CRU_stack #> dimensions : 870, 2160, 24 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 -#> source(s) : memory +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> source : spat_120a218a42dee_73890_SskviV5XwhZb4QV.tif #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.0, 0.0, 0.0, 0.0, 0, 0.0, ... #> max values : 910.1, 824.3, 727.3, 741.3, 1100, 2512.6, ... @@ -260,7 +264,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0, 0.0, 0, 0, 0.0, 0, ... @@ -271,7 +275,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 18.4, 14.6, 13.5, 13.4, 15.5, 10.2, ... @@ -282,7 +286,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.0, 0, 3.3, 4.3, 8.1, 6.6, ... @@ -293,7 +297,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : -51.6, -47.6, -45.2, -36.6, -22.2, -16.3, ... @@ -304,7 +308,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.1, 0.1, 0.3, 0.4, 0.3, 0.2, ... @@ -315,7 +319,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : -55.05, -52.95, -48.75, -41.35, -28, -21.40, ... @@ -326,7 +330,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 +#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : -48.2, -43.35, -41.65, -32.45, -17.55, -11.50, ... @@ -337,7 +341,7 @@ The `create_CRU_stack()` function works in the same way with only one minor diff You must supply the location of the files on the local disk (`dsn`) that you wish to import. -```r +``` r t <- create_CRU_stack(tmp = TRUE, dsn = "~/Downloads") ``` @@ -347,7 +351,7 @@ Because the stacks are in a `list()`, we need to access each element of the list Here using `[[7]]` we will plot the monthly average minimum temperature for all twelve months. -```r +``` r library(terra) plot(CRU_stack[[7]]) @@ -359,7 +363,7 @@ This is the name of the layer in the `terra::rast()`. So, we are telling R to plot the second object in the `CRU_stack` list, which is `tmx` and from that terra rast, plot only the layer for July. -```r +``` r plot(t[[8]]$jul) ``` @@ -368,7 +372,7 @@ plot(t[[8]]$jul) The terra rast stack objects can be saved to disk as geotiff files (others are available, see help for `terra::writeRaster()` and `terra::writeFormats()` for more options) on the `Data` directory with a tmn or tmx prefix to the month for a file name. -```r +``` r library(terra) dir.create(file.path("~/Data"), showWarnings = FALSE) diff --git a/vignettes/violin_plot-1.png b/vignettes/violin_plot-1.png index d896c347c38a43b09a5b94363c44b831fa64a9dc..8c7d69729c63b22046f937d1b15bebded77d3fc4 100644 GIT binary patch delta 60718 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 XaeI;I+4jx}7Wh-Wr=?gVZyx-AFxS%l delta 60655 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 From 89c9320176cfc0b47025984cc4ec568152efc053 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 20:20:22 +0800 Subject: [PATCH 017/127] fix badges and update check yml --- .github/workflows/R-CMD-check.yaml | 1 - README.md | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index d46a617..562fe0f 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -4,7 +4,6 @@ on: push: branches: [main, master] pull_request: - branches: [main, master] name: R-CMD-check.yaml diff --git a/README.md b/README.md index 1c65b45..11356a3 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R ================ -nsci/getCRUCLdata?branch=main) +[![R-CMD-check](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) [![CRAN\_Status\_Badge](http://www.r-pkg.org/badges/version/getCRUCLdata)](https://cran.r-project.org/package=getCRUCLdata) [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) -[![Codecov test coverage](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg)](https://app.codecov.io/gh/ropensci/getCRUCLdata) +[![codecov](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://codecov.io/gh/ropensci/getCRUCLdata) Author/Maintainer: Adam Sparks From 4f09a0809b2178ec1618968f0ab94c530d213563 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Wed, 11 Dec 2024 20:23:33 +0800 Subject: [PATCH 018/127] Remove cran status badge --- README.md | 1 - codemeta.json | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 11356a3..0aa9b11 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ getCRUCLdata: Use and Explore CRU CL v. 2.0 Climatology Elements in R [![R-CMD-check](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml) [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.466812.svg)](https://doi.org/10.5281/zenodo.466812) -[![CRAN\_Status\_Badge](http://www.r-pkg.org/badges/version/getCRUCLdata)](https://cran.r-project.org/package=getCRUCLdata) [![JOSS status](http://joss.theoj.org/papers/10.21105/joss.00230/status.svg)](https://joss.theoj.org/papers/10.21105/joss.00230) [![](https://badges.ropensci.org/96_status.svg)](https://github.com/ropensci/software-review/issues/96) [![codecov](https://codecov.io/gh/ropensci/getCRUCLdata/graph/badge.svg?token=OZjFYcNGbS)](https://codecov.io/gh/ropensci/getCRUCLdata) diff --git a/codemeta.json b/codemeta.json index 3e1db57..c7cac06 100644 --- a/codemeta.json +++ b/codemeta.json @@ -13,7 +13,7 @@ "name": "R", "url": "https://r-project.org" }, - "runtimePlatform": "R version 4.3.3 (2024-02-29)", + "runtimePlatform": "R version 4.4.2 (2024-10-31)", "author": [ { "@type": "Person", @@ -59,27 +59,27 @@ }, { "@type": "SoftwareApplication", - "identifier": "rmarkdown", - "name": "rmarkdown", + "identifier": "rappdirs", + "name": "rappdirs", "provider": { "@id": "https://cran.r-project.org", "@type": "Organization", "name": "Comprehensive R Archive Network (CRAN)", "url": "https://cran.r-project.org" }, - "sameAs": "https://CRAN.R-project.org/package=rmarkdown" + "sameAs": "https://CRAN.R-project.org/package=rappdirs" }, { "@type": "SoftwareApplication", - "identifier": "rappdirs", - "name": "rappdirs", + "identifier": "rmarkdown", + "name": "rmarkdown", "provider": { "@id": "https://cran.r-project.org", "@type": "Organization", "name": "Comprehensive R Archive Network (CRAN)", "url": "https://cran.r-project.org" }, - "sameAs": "https://CRAN.R-project.org/package=rappdirs" + "sameAs": "https://CRAN.R-project.org/package=rmarkdown" }, { "@type": "SoftwareApplication", @@ -195,7 +195,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "909.619KB", + "fileSize": "909.036KB", "citation": [ { "@type": "ScholarlyArticle", @@ -226,7 +226,7 @@ "relatedLink": "https://docs.ropensci.org/getCRUCLdata/", "releaseNotes": "https://github.com/ropensci/getCRUCLdata/blob/master/NEWS.md", "readme": "https://github.com/ropensci/getCRUCLdata/blob/main/README.md", - "contIntegration": ["https://app.codecov.io/gh/ropensci/getCRUCLdata?branch=main", "https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml"], + "contIntegration": ["https://github.com/ropensci/getCRUCLdata/actions/workflows/R-CMD-check.yaml", "https://codecov.io/gh/ropensci/getCRUCLdata"], "developmentStatus": "https://www.repostatus.org/", "review": { "@type": "Review", From 6cfd2e3a69ca1d7df0c9a148eed42bd64c4c7bfd Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 14 Dec 2024 12:09:38 +0800 Subject: [PATCH 019/127] update RoxygenNote --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index db68980..b293384 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -43,7 +43,7 @@ Config/testthat/edition: 3 Config/testthat/parallel: true Encoding: UTF-8 Language: en-US -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 X-schema.org-applicationCategory: Tools X-schema.org-isPartOf: https://ropensci.org X-schema.org-keywords: anglia-cru, climate-data, cru-cl2, temperature, From ce17775adb16167b1f0f45a09189f3ddaadb72e9 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 14 Dec 2024 12:09:48 +0800 Subject: [PATCH 020/127] add contributors --- README.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0aa9b11..8e30db9 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,77 @@ For complete documentation see the package website: + + + +All contributions to this project are gratefully acknowledged using the [`allcontributors` package](https://github.com/ropensci/allcontributors) following the [all-contributors](https://allcontributors.org) specification. Contributions of any kind are welcome! + +### Code + + + + + + + + + + +
+ + +
+adamhsparks +
+ + +
+sckott +
+ + +
+jeroen +
+ + +
+karthik +
+ + +### Issues + + + + + + + + + +
+ + +
+ivanhanigan +
+ + +
+sunjj878 +
+ + +
+mhesselbarth +
+ + + + ## Other From 891bffc9853a82a53d5110588a94b07832002c34 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 14 Dec 2024 12:09:55 +0800 Subject: [PATCH 021/127] Update wordlist --- inst/WORDLIST | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/inst/WORDLIST b/inst/WORDLIST index f777d3e..eb7c92d 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,6 +1,6 @@ +CMD CRU Centre -Codecov DOI Hulme JOSS @@ -18,11 +18,8 @@ arcminutes behaviour biogeochemical centred -centres -cgiar +codecov colour -cru -crudata cv dat dplyr @@ -37,10 +34,6 @@ ggplot gridded gz hoardr -hrg -http -https -iwmi kilometres magrittr maintainer's @@ -59,25 +52,20 @@ rast readme readr reh -ropensci sp sunp terra tibble tidyr tmax -tmc tmin tmn tmp tmx -uea -uk viridis visualise windspeed wnd -www xmax xmin ymax From 81f349ba26964a1e7947ba080a7e091edcce5d04 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 14 Dec 2024 12:10:05 +0800 Subject: [PATCH 022/127] Fix tests so that they pass again... --- tests/testthat/test-create_stack.R | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/testthat/test-create_stack.R b/tests/testthat/test-create_stack.R index cc04f60..d8fb931 100644 --- a/tests/testthat/test-create_stack.R +++ b/tests/testthat/test-create_stack.R @@ -652,10 +652,10 @@ test_that("create_CRU_stack creates a list containing only elv", { expect_named(stacks[[1]], "elv") expect_equal(terra::minmax(stacks[[1]])[[2]], 239, tolerance = 0.1) expect_equal(terra::minmax(stacks[[1]])[[1]], 19, tolerance = 0.1) - expect_identical(as.integer(terra::ext(stacks[[1]])[1]), -180L) - expect_identical(as.integer(terra::ext(stacks[[1]])[2]), 179L) - expect_identical(as.integer(terra::ext(stacks[[1]])[3]), -59L) - expect_identical(as.integer(terra::ext(stacks[[1]])[4]), 85L) + expect_equal(as.integer(terra::ext(stacks[[1]])[1]), -180) + expect_equal(as.integer(terra::ext(stacks[[1]])[2]), 180) + expect_equal(as.integer(terra::ext(stacks[[1]])[3]), -60) + expect_equal(as.integer(terra::ext(stacks[[1]])[4]), 85) }) # Test that wrld raster object resolution and extent are appropriate ----------- @@ -1236,8 +1236,8 @@ test_that("CRU_stack_list returns list of raster stacks with proper names", { expect_named(CRU_stack_list, c("pre", "tmp")) expect_type(CRU_stack_list, "list") - expect_identical(as.integer(terra::ext(CRU_stack_list[[1]])[1]), -180L) - expect_identical(as.integer(terra::ext(CRU_stack_list[[1]])[2]), 179L) - expect_identical(as.integer(terra::ext(CRU_stack_list[[1]])[3]), -59L) - expect_identical(as.integer(terra::ext(CRU_stack_list[[1]])[4]), 85L) + expect_equal(as.integer(terra::ext(CRU_stack_list[[1]])[1]), -180) + expect_equal(as.integer(terra::ext(CRU_stack_list[[1]])[2]), 180) + expect_equal(as.integer(terra::ext(CRU_stack_list[[1]])[3]), -60) + expect_equal(as.integer(terra::ext(CRU_stack_list[[1]])[4]), 85) }) From e38d467c30e2b927372d7d2d933453e92319927b Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sat, 14 Dec 2024 12:10:15 +0800 Subject: [PATCH 023/127] Update codemeta.json --- codemeta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codemeta.json b/codemeta.json index c7cac06..399cbb2 100644 --- a/codemeta.json +++ b/codemeta.json @@ -195,7 +195,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "909.036KB", + "fileSize": "911.341KB", "citation": [ { "@type": "ScholarlyArticle", From 99b4a2b46bd9686d57f9250c7067a24057f72026 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:26:20 +0800 Subject: [PATCH 024/127] update R to 4.0.0; add cli and rlang, use Roxygen markdown --- DESCRIPTION | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index b293384..016540c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,11 +20,13 @@ License: MIT + file LICENSE URL: https://docs.ropensci.org/getCRUCLdata/ BugReports: https://github.com/ropensci/getCRUCLdata/issues Depends: - R (>= 3.2.0) + R (>= 4.0.0) Imports: + cli, curl, data.table, hoardr, + rlang, terra, utils Suggests: @@ -43,6 +45,7 @@ Config/testthat/edition: 3 Config/testthat/parallel: true Encoding: UTF-8 Language: en-US +Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 X-schema.org-applicationCategory: Tools X-schema.org-isPartOf: https://ropensci.org From 91973c2ce729bf1f5ccc97a337d74e5777435e72 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:27:44 +0800 Subject: [PATCH 025/127] Update Roxygen, use @inherits and Markdown --- R/create_CRU_df.R | 72 +++++++++++++++++-------------------------- R/create_CRU_stack.R | 61 +++++------------------------------- R/get_CRU_df.R | 44 +++++++++++++------------- R/get_CRU_stack.R | 73 ++++++++------------------------------------ 4 files changed, 71 insertions(+), 179 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index bffacfb..7d5ec49 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -1,56 +1,40 @@ -#' @title Create a data of climatology variables from local disk files +#' Create a data of climatology variables from local disk files #' -#' @description Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology +#' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology #' data and creates a tidy data frame of the data. If requested, minimum and #' maximum temperature may also be automatically calculated as described in the #' data readme.txt file. This function can be useful if you have network #' connection issues that mean automated downloading of the files using \R #' does not work properly. #' -#' Nomenclature and units from readme.txt: -#' \describe{ -#' \item{pre}{precipitation (millimetres/month)} -#' \describe{ -#' \item{cv}{cv of precipitation (percent)} -#' } -#' \item{rd0}{wet-days (number days with >0.1mm rain per month)} -#' \item{tmp}{mean temperature (degrees Celsius)} -#' \item{dtr}{mean diurnal temperature range (degrees Celsius)} -#' \item{reh}{relative humidity (percent)} -#' \item{sunp}{sunshine (percent of maximum possible (percent of day length))} -#' \item{frs}{ground-frost (number of days with ground-frost per month)} -#' \item{wnd}{10 metre windspeed (metres/second)} -#' \item{elv}{elevation (automatically converted to metres)} -#' } -#' For more information see the description of the data provided by -#' \acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} +#' @inheritSection get_CRU_df Nomenclature and Units #' -#' @param pre Logical. Fetch precipitation (millimetres/month) from server and -#' return in the data frame? Defaults to \code{FALSE}. -#' @param pre_cv Logical. Fetch cv of precipitation (percent) from server and -#' return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to -#' \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and +#' @param pre Logical. Load precipitation (millimetres/month) from server and +#' return in the data frame? Defaults to `FALSE`. +#' @param pre_cv Logical. Load cv of precipitation (percent) from server and +#' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to +#' `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. -#' @param rd0 Logical. Fetch wet-days (number days with >0.1millimetres rain per -#' month) and return in the data frame? Defaults to \code{FALSE}. -#' @param dtr Logical. Fetch mean diurnal temperature range (degrees Celsius) -#' and return it in the data frame? Defaults to \code{FALSE}. -#' @param tmp Logical. Fetch temperature (degrees Celsius) and return it in the -#' data frame? Defaults to \code{FALSE}. +#' @param rd0 Logical. Load wet-days (number days with >0.1millimetres rain per +#' month) and return in the data frame? Defaults to `FALSE`. +#' @param dtr Logical. Load mean diurnal temperature range (degrees Celsius) +#' and return it in the data frame? Defaults to `FALSE`. +#' @param tmp Logical. Load temperature (degrees Celsius) and return it in the +#' data frame? Defaults to `FALSE`. #' @param tmn Logical. Calculate minimum temperature values (degrees Celsius) -#' and return it in the data frame? Defaults to \code{FALSE}. +#' and return it in the data frame? Defaults to `FALSE`. #' @param tmx Logical. Calculate maximum temperature (degrees Celsius) and -#' return it in the data frame? Defaults to \code{FALSE}. -#' @param reh Logical. Fetch relative humidity and return it in the data frame? -#' Defaults to \code{FALSE}. -#' @param sunp Logical. Fetch sunshine, percent of maximum possible (percent of -#' day length) and return it in data frame? Defaults to \code{FALSE}. -#' @param frs Logical. Fetch ground-frost records (number of days with ground- -#' frost per month) and return it in data frame? Defaults to \code{FALSE}. -#' @param wnd Logical. Fetch 10m wind speed (metres/second) and return it in the -#' data frame? Defaults to \code{FALSE}. -#' @param elv Logical. Fetch elevation (converted to metres) and return it in -#' the data frame? Defaults to \code{FALSE}. +#' return it in the data frame? Defaults to `FALSE`. +#' @param reh Logical. Load relative humidity and return it in the data frame? +#' Defaults to `FALSE`. +#' @param sunp Logical. Load sunshine, percent of maximum possible (percent of +#' day length) and return it in data frame? Defaults to `FALSE`. +#' @param frs Logical. Load ground-frost records (number of days with ground- +#' frost per month) and return it in data frame? Defaults to `FALSE`. +#' @param wnd Logical. Load 10m wind speed (metres/second) and return it in the +#' data frame? Defaults to `FALSE`. +#' @param elv Logical. Load elevation (converted to metres) and return it in +#' the data frame? Defaults to `FALSE`. #' @param dsn Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz #' files are located. #' @@ -68,10 +52,10 @@ #' CRU_tmp #' #' @seealso -#' \code{\link{get_CRU_df}} +#' [get_CRU_df()] #' #' @return A tidy data frame of \acronym{CRU} \acronym{CL} v. 2.0 climatology -#' elements as a \code{\link[base]{data.frame}} object +#' elements as a [base::data.frame()] object #' #' @author Adam H Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index d64edc6..f254376 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -1,61 +1,16 @@ -#' @title Create a list of terra rast objects from local disk files +#' Create a list of terra rast objects from local disk files #' -#' @description Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology -#' data and creates a \code{\link{terra}} \code{\link[terra]{rast}} of the +#' Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology +#' data and creates a [terra()] [terra::rast()] of the #' data. If requested, minimum and maximum temperature may also be #' automatically calculated as described in the data readme.txt file. This #' function can be useful if you have network connection issues that mean #' automated downloading of the files using \R does not work properly. #' -#' Nomenclature and units from readme.txt: -#' \describe{ -#' \item{pre}{precipitation (millimetres/month)} -#' \describe{ -#' \item{cv}{cv of precipitation (percent)} -#' } -#' \item{rd0}{wet-days (number days with >0.1mm rain per month)} -#' \item{tmp}{mean temperature (degrees Celsius)} -#' \item{dtr}{mean diurnal temperature range (degrees Celsius)} -#' \item{reh}{relative humidity (percent)} -#' \item{sunp}{sunshine (percent of maximum possible (percent of day length))} -#' \item{frs}{ground-frost (number of days with ground-frost per month)} -#' \item{wnd}{10 metre windspeed (metres/second)} -#' \item{elv}{elevation (automatically converted to metres)} -#' } -#' For more information see the description of the data provided by -#' \acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} +#' @inheritSection get_CRU_df Nomenclature and Units +#' @inheritParams create_CRU_df #' -#' @param pre Logical. Fetch precipitation (millimetres/month) from server and -#' return in the data frame? Defaults to \code{FALSE}. -#' @param pre_cv Logical. Fetch cv of precipitation (percent) from server and -#' return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to -#' \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and -#' returned as well. -#' @param rd0 Logical. Fetch wet-days (number days with >0.1millimetres rain per -#' month) and return in the data frame? Defaults to \code{FALSE}. -#' @param dtr Logical. Fetch mean diurnal temperature range (degrees Celsius) -#' and return it in the data frame? Defaults to \code{FALSE}. -#' @param tmp Logical. Fetch temperature (degrees Celsius) and return it in the -#' data frame? Defaults to \code{FALSE}. -#' @param tmn Logical. Calculate minimum temperature values (degrees Celsius) -#' and return it in the data frame? Defaults to \code{FALSE}. -#' @param tmx Logical. Calculate maximum temperature (degrees Celsius) and -#' return it in the data frame? Defaults to \code{FALSE}. -#' @param reh Logical. Fetch relative humidity and return it in the data frame? -#' Defaults to \code{FALSE}. -#' @param sunp Logical. Fetch sunshine, percent of maximum possible (percent of -#' day length) and return it in data frame? Defaults to \code{FALSE}. -#' @param frs Logical. Fetch ground-frost records (number of days with ground- -#' frost per month) and return it in data frame? Defaults to \code{FALSE}. -#' @param wnd Logical. Fetch 10m wind speed (metres/second) and return it in the -#' data frame? Defaults to \code{FALSE}. -#' @param elv Logical. Fetch elevation (converted to metres) and return it in -#' the data frame? Defaults to \code{FALSE}. -#' @param dsn Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz -#' files are located. #' @examplesIf interactive() -#' # Create a terra rast object of temperature from tmp files in the tempdir() -#' # directory. #' #' download.file( #' url = "https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz", @@ -67,10 +22,10 @@ #' CRU_tmp #' #' @seealso -#' \code{\link{get_CRU_stack}} +#' [get_CRU_stack()] #' -#' @return A \code{\link[base]{list}} of \code{\link{terra}} -#' \code{\link[terra]{rast}} objects of \acronym{CRU} \acronym{CL} v. 2.0 +#' @return A [base::list()] of [terra()] +#' [terra::rast()] objects of \acronym{CRU} \acronym{CL} v. 2.0 #' climatology elements #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 8a0f88a..6f31cab 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -1,13 +1,13 @@ -#' @title Download and create a data frame of climatology parameters +#' Download and create a data frame of climatology parameters #' -#' @description This function automates downloading and importing \acronym{CRU} +#' This function automates downloading and importing \acronym{CRU} #' \acronym{CL} v. 2.0 climatology data and creates a data frame of the data. #' If requested, minimum and maximum temperature may also be automatically #' calculated as described in the data readme.txt file. Data may be cached for #' later use by this function, saving time downloading files in future use of #' the function. #' -#' Nomenclature and units from readme.txt: +#' @section Nomenclature and Units: #' \describe{ #' \item{pre}{precipitation (millimetres/month)} #' \describe{ @@ -23,38 +23,38 @@ #' \item{elv}{elevation (automatically converted to metres)} #' } #' For more information see the description of the data provided by -#' \acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} +#' \acronym{CRU}, #' #' @param pre Logical. Fetch precipitation (millimetres/month) from server and -#' return in the data frame? Defaults to \code{FALSE}. +#' return in the data frame? Defaults to `FALSE`. #' @param pre_cv Logical. Fetch cv of precipitation (percent) from server and -#' return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to -#' \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and +#' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to +#' `TRUE` will always results in **pre** being set to `TRUE` and #' returned as well. #' @param rd0 Logical. Fetch wet-days (number days with >0.1 millimetres rain -#' per month) and return in the data frame? Defaults to \code{FALSE}. +#' per month) and return in the data frame? Defaults to `FALSE`. #' @param dtr Logical. Fetch mean diurnal temperature range (degrees Celsius) -#' and return it in the data frame? Defaults to \code{FALSE}. +#' and return it in the data frame? Defaults to `FALSE`. #' @param tmp Logical. Fetch temperature (degrees Celsius) and return it in the -#' data frame? Defaults to \code{FALSE}. +#' data frame? Defaults to `FALSE`. #' @param tmn Logical. Calculate minimum temperature values (degrees Celsius) -#' and return it in the data frame? Defaults to \code{FALSE}. +#' and return it in the data frame? Defaults to `FALSE`. #' @param tmx Logical. Calculate maximum temperature (degrees Celsius) and -#' return it in the data frame? Defaults to \code{FALSE}. +#' return it in the data frame? Defaults to `FALSE`. #' @param reh Logical. Fetch relative humidity and return it in the data frame? #' Defaults to FALSE. #' @param sunp Logical. Fetch sunshine, percent of maximum possible (percent of -#' day length) and return it in data frame? Defaults to \code{FALSE}. +#' day length) and return it in data frame? Defaults to `FALSE`. #' @param frs Logical. Fetch ground-frost records (number of days with ground- -#' frost per month) and return it in data frame? Defaults to \code{FALSE}. +#' frost per month) and return it in data frame? Defaults to `FALSE`. #' @param wnd Logical. Fetch 10m wind speed (metres/second) and return it in the -#' data frame? Defaults to \code{FALSE}. +#' data frame? Defaults to `FALSE`. #' @param elv Logical. Fetch elevation (converted to metres) and return it in -#' the data frame? Defaults to \code{FALSE}. +#' the data frame? Defaults to `FALSE`. #' @param cache Logical. Store CRU CL v. 2.0 data files locally for later use? -#' If \code{FALSE}, the downloaded files are removed when R session is closed. -#' To take advantage of cached files in future sessions, use \code{cache = TRUE} -#' after the initial download and caching. Defaults to \code{FALSE}. +#' If `FALSE`, the downloaded files are removed when R session is closed. +#' To take advantage of cached files in future sessions, use `cache = TRUE` +#' after the initial download and caching. Defaults to `FALSE`. #' #' @examplesIf interactive() #' # Download data and create a data frame of precipitation and temperature @@ -65,11 +65,11 @@ #' CRU_pre_tmp #' #' @seealso -#' \code{\link{create_CRU_stack}} -#' \code{\link{manage_cache}} +#' [create_CRU_stack()] +#' [manage_cache()] #' #' @return A tidy data frame of \acronym{CRU} \acronym{CL} v. 2.0 climatology -#' elements as a \code{\link[tibble]{tibble}} object +#' elements as a [tibble::tibble()] object #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index 402157e..c2b2d03 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -1,76 +1,29 @@ -#' @title Download and create a list of terra rast objects of climatology parameters +#' Download and create a list of terra rast objects of climatology parameters #' -#' @description This function automates downloading and importing CRU CL v. 2.0 -#' climatology data into \R and creates a list of \code{\link{terra}} -#' \code{\link[terra]{rast}} of the data. If requested, minimum and maximum +#' This function automates downloading and importing CRU CL v. 2.0 +#' climatology data into \R and creates a list of [terra()] +#' [terra::rast()] of the data. If requested, minimum and maximum #' temperature may also be automatically calculated as described in the data #' readme.txt file. Data may be cached for later use by this function, saving #' time downloading files in future use of the function. #' -#' Nomenclature and units from readme.txt: -#' \describe{ -#' \item{pre}{precipitation (millimetres/month)} -#' \describe{ -#' \item{cv}{cv of precipitation (percent)} -#' } -#' \item{rd0}{wet-days (number days with >0.1mm rain per month)} -#' \item{tmp}{mean temperature (degrees Celsius)} -#' \item{dtr}{mean diurnal temperature range (degrees Celsius)} -#' \item{reh}{relative humidity (percent)} -#' \item{sunp}{sunshine (percent of maximum possible (percent of day length))} -#' \item{frs}{ground-frost (number of days with ground-frost per month)} -#' \item{wnd}{10 metre windspeed (metres/second)} -#' \item{elv}{elevation (automatically converted to metres)} -#' } -#' For more information see the description of the data provided by CRU, -#' \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} +#' @inheritSection get_CRU_df Nomenclature and Units +#' @inheritParams get_CRU_df +#' @examplesIf interactive() #' -#' @param pre Logical. Fetch precipitation (millimetres/month) from server and -#' return in the data frame? Defaults to \code{FALSE}. -#' @param pre_cv Logical. Fetch cv of precipitation (percent) from server and -#' return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to -#' \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and -#' returned as well. -#' @param rd0 Logical. Fetch wet-days (number days with >0.1millimetres rain -#' per month) and return in the data frame? Defaults to \code{FALSE}. -#' @param dtr Logical. Fetch mean diurnal temperature range (degrees Celsius) -#' and return it in the data frame? Defaults to \code{FALSE}. -#' @param tmp Logical. Fetch temperature (degrees Celsius) and return it in the -#' data frame? Defaults to \code{FALSE}. -#' @param tmn Logical. Calculate minimum temperature values (degrees Celsius) -#' and return it in the data frame? Defaults to \code{FALSE}. -#' @param tmx Logical. Calculate maximum temperature (degrees Celsius) and -#' return it in the data frame? Defaults to \code{FALSE}. -#' @param reh Logical. Fetch relative humidity and return it in the data frame? -#' Defaults to FALSE. -#' @param sunp Logical. Fetch sunshine, percent of maximum possible (percent of -#' day length) and return it in data frame? Defaults to \code{FALSE}. -#' @param frs Logical. Fetch ground-frost records (number of days with ground- -#' frost per month) and return it in data frame? Defaults to \code{FALSE}. -#' @param wnd Logical. Fetch 10m wind speed (metres/second) and return it in -#' the data frame? Defaults to \code{FALSE}. -#' @param elv Logical. Fetch elevation (converted to metres) and return it in -#' the data frame? Defaults to \code{FALSE}. -#' @param cache Logical. Store CRU CL v. 2.0 data files locally for later use? -#' If \code{FALSE}, the downloaded files are removed when R session is closed. -#' To take advantage of cached files in future sessions, use \code{cache = TRUE} -#' after the initial download and caching. Defaults to \code{FALSE}. -#' -#' @examples -#' \donttest{ -#' # Download data and create a \code{\link{terra}} \code{\link[terra]{rast}} +#' # Download data and create a [terra()] [terra::rast()] #' # object of precipitation and temperature without caching the data files #' CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) #' #' CRU_pre_tmp -#' } +#' #' #' @seealso -#' \code{\link{create_CRU_stack}} -#' \code{\link{manage_cache}} +#' [create_CRU_stack()] +#' [manage_cache()] #' -#' @return A \code{\link[base]{list}} of \code{\link{terra}} -#' \code{\link[terra]{rast}} objects of CRU CL v. 2.0 climatology elements +#' @return A [base::list()] of [terra()] +#' [terra::rast()] objects of CRU CL v. 2.0 climatology elements #' #' @author Adam H. Sparks, \email{adamhsparks@@gmail.com} #' From a3f1f3260ee2232f2c25a4c5c51d41a660b98f27 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:28:35 +0800 Subject: [PATCH 026/127] improve user input checks --- R/create_CRU_df.R | 23 ++++++++----- R/create_CRU_stack.R | 23 ++++++++----- R/get_CRU_df.R | 21 ++++++++---- R/get_CRU_stack.R | 21 ++++++++---- R/internal_functions.R | 77 ++++++++++++++++++++++++++++++++++++++---- 5 files changed, 129 insertions(+), 36 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 7d5ec49..975fb32 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -76,14 +76,21 @@ create_CRU_df <- function(pre = FALSE, frs = FALSE, wnd = FALSE, elv = FALSE, - dsn = "") { - if (!isTRUE(pre) & !isTRUE(pre_cv) & !isTRUE(rd0) & !isTRUE(tmp) & - !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & - !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { - stop("\nYou must select at least one element for importing.\n", - call. = FALSE - ) - } + dsn) { + .check_vars_FALSE( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv + ) .validate_dsn(dsn) diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index f254376..ec2b0c3 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -53,14 +53,21 @@ create_CRU_stack <- function(pre = FALSE, frs = FALSE, wnd = FALSE, elv = FALSE, - dsn = "") { - if (!isTRUE(pre) & !isTRUE(pre_cv) & !isTRUE(rd0) & !isTRUE(tmp) & - !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & - !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { - stop("\nYou must select at least one element for importing.\n", - call. = FALSE - ) - } + dsn) { + .check_vars_FALSE( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv + ) .validate_dsn(dsn) diff --git a/R/get_CRU_df.R b/R/get_CRU_df.R index 6f31cab..59a83ed 100644 --- a/R/get_CRU_df.R +++ b/R/get_CRU_df.R @@ -92,13 +92,20 @@ get_CRU_df <- function(pre = FALSE, wnd = FALSE, elv = FALSE, cache = FALSE) { - if (!isTRUE(pre) & !isTRUE(pre_cv) & !isTRUE(rd0) & !isTRUE(tmp) & - !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & - !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { - stop("\nYou must select at least one element for download.\n", - call. = FALSE - ) - } + .check_vars_FALSE( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv + ) cache_dir <- .set_cache(cache) diff --git a/R/get_CRU_stack.R b/R/get_CRU_stack.R index c2b2d03..f687c78 100644 --- a/R/get_CRU_stack.R +++ b/R/get_CRU_stack.R @@ -52,13 +52,20 @@ get_CRU_stack <- wnd = FALSE, elv = FALSE, cache = FALSE) { - if (!isTRUE(pre) & !isTRUE(pre_cv) & !isTRUE(rd0) & !isTRUE(tmp) & - !isTRUE(dtr) & !isTRUE(reh) & !isTRUE(tmn) & !isTRUE(tmx) & - !isTRUE(sunp) & !isTRUE(frs) & !isTRUE(wnd) & !isTRUE(elv)) { - stop("\nYou must select at least one element for download.\n", - call. = FALSE - ) - } + .check_vars_FALSE( + pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv + ) cache_dir <- .set_cache(cache) diff --git a/R/internal_functions.R b/R/internal_functions.R index 6678fbc..0267b96 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -1,15 +1,80 @@ +#' Check That at Least One var is Requested +#' @param pre Logical. Fetch precipitation (millimetres/month) from server and +#' return in the data frame? Defaults to `FALSE`. +#' @param pre_cv Logical. Fetch cv of precipitation (percent) from server and +#' return in the data frame? Defaults to `FALSE`. NOTE. Setting this to +#' `TRUE` will always results in **pre** being set to `TRUE` and +#' returned as well. +#' @param rd0 Logical. Fetch wet-days (number days with >0.1 millimetres rain +#' per month) and return in the data frame? Defaults to `FALSE`. +#' @param dtr Logical. Fetch mean diurnal temperature range (degrees Celsius) +#' and return it in the data frame? Defaults to `FALSE`. +#' @param tmp Logical. Fetch temperature (degrees Celsius) and return it in the +#' data frame? Defaults to `FALSE`. +#' @param tmn Logical. Calculate minimum temperature values (degrees Celsius) +#' and return it in the data frame? Defaults to `FALSE`. +#' @param tmx Logical. Calculate maximum temperature (degrees Celsius) and +#' return it in the data frame? Defaults to `FALSE`. +#' @param reh Logical. Fetch relative humidity and return it in the data frame? +#' Defaults to FALSE. +#' @param sunp Logical. Fetch sunshine, percent of maximum possible (percent of +#' day length) and return it in data frame? Defaults to `FALSE`. +#' @param frs Logical. Fetch ground-frost records (number of days with ground- +#' frost per month) and return it in data frame? Defaults to `FALSE`. +#' @param wnd Logical. Fetch 10m wind speed (metres/second) and return it in the +#' data frame? Defaults to `FALSE`. +#' @param elv Logical. Fetch elevation (converted to metres) and return it in +#' the data frame? Defaults to `FALSE`. +#' +#' @examples +#' .check_vars_FALSE( +#' pre, +#' pre_cv, +#' rd0, +#' tmp, +#' dtr, +#' reh, +#' tmn, +#' tmx, +#' sunp, +#' frs, +#' wnd, +#' elv +#' ) +#' @noRd +#' @keywords Internal + +.check_vars_FALSE <- function(pre, + pre_cv, + rd0, + tmp, + dtr, + reh, + tmn, + tmx, + sunp, + frs, + wnd, + elv) { + if (!any(pre, pre_cv, rd0, tmp, dtr, reh, tmn, tmx, sunp, frs, wnd, elv)) { + cli::cli_abort("You must select at least one element for download or import.", + call = rlang::caller_env() + ) + } +} + #' Validates User Entered dsn value #' #' @param dsn User provided value for checking #' #' @noRd .validate_dsn <- function(dsn) { - if (is.null(dsn)) { - stop( - "\nYou must define the dsn where you have stored the local files\n", - "for import. If you want to download files using R, use one of the\n", - "'get_CRU_*()' functions provided.\n", - call. = FALSE + if (missing(dsn)) { + cli::cli_abort( + "You must define the dsn where you have stored the local files + for import. If you want to download files using R, use one of the + {.fn get_CRU} functions provided.", + call = rlang::caller_env() ) } else { dsn <- trimws(dsn) From 0315d90d807188d8a03acd707449578dd4333b50 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:29:17 +0800 Subject: [PATCH 027/127] Use cli for errors and warnings --- R/create_CRU_df.R | 8 +++----- R/create_CRU_stack.R | 9 +++------ R/get_CRU.R | 4 ++-- R/internal_functions.R | 6 +++--- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/R/create_CRU_df.R b/R/create_CRU_df.R index 975fb32..807cf48 100644 --- a/R/create_CRU_df.R +++ b/R/create_CRU_df.R @@ -110,11 +110,9 @@ create_CRU_df <- function(pre = FALSE, ) if (length(files) == 0) { - stop( - "\nNo CRU CL 2.0 data files were found in ", - dsn, - ". ", - "Please check that you have the proper file location.\n" + cli::cli_abort( + "No CRU CL 2.0 data files were found in {.var dsn}. + Please check that you have the proper file location." ) } diff --git a/R/create_CRU_stack.R b/R/create_CRU_stack.R index ec2b0c3..697e982 100644 --- a/R/create_CRU_stack.R +++ b/R/create_CRU_stack.R @@ -87,12 +87,9 @@ create_CRU_stack <- function(pre = FALSE, ) if (length(files) == 0) { - stop( - "\nNo CRU CL 2.0 data files were found in ", - dsn, - ". ", - "Please check that you have the proper file location.\n", - call. = FALSE + cli::cli_abort( + "No CRU CL 2.0 data files were found in {.var dsn}. + Please check that you have the proper file location." ) } diff --git a/R/get_CRU.R b/R/get_CRU.R index ed03e54..690eb62 100644 --- a/R/get_CRU.R +++ b/R/get_CRU.R @@ -87,8 +87,8 @@ }, error = function(x) { manage_cache$delete_all() - stop("\nThe file downloads have failed.\n - \nPlease start the download again.\n") + cli::cli_abort("The file downloads have failed. + Please start the download again.") } ) } diff --git a/R/internal_functions.R b/R/internal_functions.R index 0267b96..0d5ef6a 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -86,9 +86,9 @@ } else { p <- dsn } - if (!file.exists(p) & !file.exists(dsn)) { - stop("\nFile directory does not exist: ", dsn, ".\n", - call. = FALSE + if (!file.exists(p) || !file.exists(dsn)) { + cli::cli_abort("File directory does not exist: {.var dsn}.", + call = rlang::caller_env() ) } } From d8ba2249fe95fd9f54dfb2912d6cd246676e84e4 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:30:46 +0800 Subject: [PATCH 028/127] code linting --- R/get_CRU.R | 4 ++-- R/internal_functions.R | 20 +++++++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/R/get_CRU.R b/R/get_CRU.R index 690eb62..b69bd4e 100644 --- a/R/get_CRU.R +++ b/R/get_CRU.R @@ -29,7 +29,7 @@ pre <- TRUE } - if (isTRUE(tmn) | isTRUE(tmx)) { + if (isTRUE(tmn) || isTRUE(tmx)) { dtr <- tmp <- TRUE } # create object list to filter downloads ----------------------------------- @@ -63,7 +63,7 @@ # filter downloaded -------------------------------------------------------- # which files are being requested? - files <- files[object_list %in% !isTRUE(files)] + files <- files[which(object_list)] # which files are locally available? cache_dir_contents <- diff --git a/R/internal_functions.R b/R/internal_functions.R index 0d5ef6a..939f440 100644 --- a/R/internal_functions.R +++ b/R/internal_functions.R @@ -124,11 +124,11 @@ # Remove tmp/dtr if they aren't specified (necessary for tmn/tmx) if (isTRUE(tmx) | isTRUE(tmn)) { - if (!isTRUE(tmp)) { + if (isFALSE(tmp)) { CRU_df <- subset(CRU_df, select = -tmp) } - if (!isTRUE(dtr)) { + if (isFALSE(dtr)) { CRU_df <- subset(CRU_df, select = -dtr) } } @@ -178,7 +178,7 @@ # lastly merge the data frames into one tidy (large) data frame -------------- - if (!isTRUE(elv)) { + if (isFALSE(elv)) { CRU_df <- Reduce(function(...) { merge(..., by = c("lat", "lon", "month")) }, CRU_list) @@ -194,7 +194,6 @@ CRU_df <- CRU_list["elv"] } return(CRU_df) - } #' @noRd @@ -284,8 +283,7 @@ nrows = 930, ncols = 2160, ymin = -65, - ymax = 90, - xmin = -180, + ymax = 90, xmin = -180, xmax = 180 ) @@ -335,10 +333,10 @@ } # cleanup if tmn/tmx specified but tmp/dtr not ----------------------------- - if (any(c(isTRUE(tmx), isTRUE(tmn))) & !isTRUE(dtr)) { + if (any(tmx, tmn) && isFALSE(dtr)) { CRU_stack_list[which(names(CRU_stack_list) %in% "dtr")] <- NULL } - if (any(c(isTRUE(tmx), isTRUE(tmn))) & !isTRUE(tmp)) { + if (any(tmx, tmn) && isFALSE(tmp)) { CRU_stack_list[which(names(CRU_stack_list) %in% "tmp")] <- NULL } return(CRU_stack_list) @@ -489,7 +487,7 @@ # filter files ------------------------------------------------------------- # which files are being requested? - files <- files[object_list %in% !isTRUE(files)] + files <- files[which(object_list)] # filter files from cache directory in case there are local files for which # we do not want data @@ -500,8 +498,8 @@ files <- cache_dir_contents[cache_dir_contents %in% files] if (length(files) < 0) { - stop("\nThere are no CRU CL v. 2.0 data files available in this directory.\n", - call. = FALSE + cli::cli_abort("There are no CRU CL v. 2.0 data files available in this directory.", + call = rlang::caller_env() ) } From 4c7a9881ba9e6e5a19f5734cf8d06aed85328e08 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:31:09 +0800 Subject: [PATCH 029/127] Convert Roxygen to Markdown --- R/manage_cached_files.R | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/R/manage_cached_files.R b/R/manage_cached_files.R index 615e5fc..628f946 100644 --- a/R/manage_cached_files.R +++ b/R/manage_cached_files.R @@ -1,30 +1,30 @@ -#' @title Manage locally cached CRU CL v. 2.0 files +#' Manage locally cached CRU CL v. 2.0 files #' -#' @description Manage cached \CRANpkg{getCRUCLdata} files with \CRANpkg{hoardr} +#' Manage cached \pkg{getCRUCLdata} files with \CRANpkg{hoardr} #' #' @export #' @name manage_cache #' #' @details The default cache directory is -#' \code{file.path(rappdirs::user_cache_dir(), "R/getCRUCLdata")}, but you can -#' set your own path using \code{manage_cache$cache_path_set()} +#' `tools::R_user_dir(package = "getCRUCLdata")`, but you can +#' set your own path using `manage_cache$cache_path_set()` #' -#' \code{manage_cache$cache_delete} only accepts one file name, while -#' \code{manage_cache$cache_delete_all} +#' `manage_cache$cache_delete` only accepts one file name, while +#' `manage_cache$cache_delete_all` #' does not accept any names, but deletes all files. For deleting many specific -#' files, use \code{manage_cache$cache_delete} in an -#' \code{\link[base]{lapply}()} type call. +#' files, use `manage_cache$cache_delete` in an +#' [base::lapply()] type call. #' #' @section Useful user functions: #' \itemize{ -#' \item \code{manage_cache$cache_path_get()} - get cache path -#' \item \code{manage_cache$cache_path_set()} - set cache path -#' \item \code{manage_cache$list()} - returns a character vector of full +#' \item `manage_cache$cache_path_get()` - get cache path +#' \item `manage_cache$cache_path_set()` - set cache path +#' \item `manage_cache$list()` - returns a character vector of full #' path file names -#' \item \code{manage_cache$files()} - returns file objects with metadata -#' \item \code{manage_cache$details()} - returns files with details -#' \item \code{manage_cache$delete()} - delete specific files -#' \item \code{manage_cache$delete_all()} - delete all files, returns +#' \item `manage_cache$files()` - returns file objects with metadata +#' \item `manage_cache$details()` - returns files with details +#' \item `manage_cache$delete()` - delete specific files +#' \item `manage_cache$delete_all()` - delete all files, returns #' nothing #' } #' From a00fd237be8ad31a46f2631adb73511cfc8e7e56 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:31:20 +0800 Subject: [PATCH 030/127] Use data.table internally --- R/getCRUCLdata-package.R | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/R/getCRUCLdata-package.R b/R/getCRUCLdata-package.R index b30bbda..686b8ed 100644 --- a/R/getCRUCLdata-package.R +++ b/R/getCRUCLdata-package.R @@ -4,5 +4,14 @@ # The following block is used by usethis to automatically manage # roxygen namespace tags. Modify with care! ## usethis namespace: start +#' @importFrom data.table := +#' @importFrom data.table .BY +#' @importFrom data.table .EACHI +#' @importFrom data.table .GRP +#' @importFrom data.table .I +#' @importFrom data.table .N +#' @importFrom data.table .NGRP +#' @importFrom data.table .SD +#' @importFrom data.table data.table ## usethis namespace: end NULL From 4c4231d02deeaa2f4e2d8886fbdfc2d4bd087979 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:31:40 +0800 Subject: [PATCH 031/127] Use proper R user cache directory location --- R/zzz.R | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/R/zzz.R b/R/zzz.R index db3e76e..11d64e6 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -8,12 +8,11 @@ manage_cache <- NULL # nocov start utils::globalVariables(c(".")) x <- hoardr::hoard() - x$cache_path_set(path = "getCRUCLdata", type = "user_cache_dir") + x$cache_path_set(path = "getCRUCLdata", + prefix = "org.R-project.R/R", + type = "user_cache_dir") manage_cache <<- x } } -#' @import data.table -NULL - # nocov end From 90ab9bd51e76c5254fb63d2d4b026d59edc43512 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:31:55 +0800 Subject: [PATCH 032/127] Redocument package --- man/create_CRU_df.Rd | 44 +++++++++++++++--------------- man/create_CRU_stack.Rd | 58 ++++++++++++++++++++-------------------- man/get_CRU_df.Rd | 24 +++++++++-------- man/get_CRU_stack.Rd | 59 ++++++++++++++++++++++------------------- man/manage_cache.Rd | 24 ++++++++--------- 5 files changed, 108 insertions(+), 101 deletions(-) diff --git a/man/create_CRU_df.Rd b/man/create_CRU_df.Rd index a7956b5..bb8c381 100644 --- a/man/create_CRU_df.Rd +++ b/man/create_CRU_df.Rd @@ -17,28 +17,28 @@ create_CRU_df( frs = FALSE, wnd = FALSE, elv = FALSE, - dsn = "" + dsn ) } \arguments{ -\item{pre}{Logical. Fetch precipitation (millimetres/month) from server and +\item{pre}{Logical. Load precipitation (millimetres/month) from server and return in the data frame? Defaults to \code{FALSE}.} -\item{pre_cv}{Logical. Fetch cv of precipitation (percent) from server and +\item{pre_cv}{Logical. Load cv of precipitation (percent) from server and return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Logical. Fetch wet-days (number days with >0.1millimetres rain per +\item{rd0}{Logical. Load wet-days (number days with >0.1millimetres rain per month) and return in the data frame? Defaults to \code{FALSE}.} -\item{tmp}{Logical. Fetch temperature (degrees Celsius) and return it in the +\item{tmp}{Logical. Load temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{dtr}{Logical. Fetch mean diurnal temperature range (degrees Celsius) +\item{dtr}{Logical. Load mean diurnal temperature range (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{reh}{Logical. Fetch relative humidity and return it in the data frame? +\item{reh}{Logical. Load relative humidity and return it in the data frame? Defaults to \code{FALSE}.} \item{tmn}{Logical. Calculate minimum temperature values (degrees Celsius) @@ -47,16 +47,16 @@ and return it in the data frame? Defaults to \code{FALSE}.} \item{tmx}{Logical. Calculate maximum temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{sunp}{Logical. Fetch sunshine, percent of maximum possible (percent of +\item{sunp}{Logical. Load sunshine, percent of maximum possible (percent of day length) and return it in data frame? Defaults to \code{FALSE}.} -\item{frs}{Logical. Fetch ground-frost records (number of days with ground- +\item{frs}{Logical. Load ground-frost records (number of days with ground- frost per month) and return it in data frame? Defaults to \code{FALSE}.} -\item{wnd}{Logical. Fetch 10m wind speed (metres/second) and return it in the +\item{wnd}{Logical. Load 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} -\item{elv}{Logical. Fetch elevation (converted to metres) and return it in +\item{elv}{Logical. Load elevation (converted to metres) and return it in the data frame? Defaults to \code{FALSE}.} \item{dsn}{Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz @@ -64,7 +64,7 @@ files are located.} } \value{ A tidy data frame of \acronym{CRU} \acronym{CL} v. 2.0 climatology -elements as a \code{\link[base]{data.frame}} object +elements as a \code{\link[base:data.frame]{base::data.frame()}} object } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology @@ -73,13 +73,18 @@ maximum temperature may also be automatically calculated as described in the data readme.txt file. This function can be useful if you have network connection issues that mean automated downloading of the files using \R does not work properly. +} +\note{ +This package automatically converts elevation values from kilometres to +metres. +} +\section{Nomenclature and Units}{ -Nomenclature and units from readme.txt: \describe{ \item{pre}{precipitation (millimetres/month)} - \describe{ - \item{cv}{cv of precipitation (percent)} - } +\describe{ +\item{cv}{cv of precipitation (percent)} +} \item{rd0}{wet-days (number days with >0.1mm rain per month)} \item{tmp}{mean temperature (degrees Celsius)} \item{dtr}{mean diurnal temperature range (degrees Celsius)} @@ -92,10 +97,7 @@ Nomenclature and units from readme.txt: For more information see the description of the data provided by \acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} } -\note{ -This package automatically converts elevation values from kilometres to -metres. -} + \examples{ \dontshow{if (interactive()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create a data frame of temperature from locally available files in the @@ -112,7 +114,7 @@ CRU_tmp \dontshow{\}) # examplesIf} } \seealso{ -\code{\link{get_CRU_df}} +\code{\link[=get_CRU_df]{get_CRU_df()}} } \author{ Adam H Sparks, \email{adamhsparks@gmail.com} diff --git a/man/create_CRU_stack.Rd b/man/create_CRU_stack.Rd index aeab8b0..43178c7 100644 --- a/man/create_CRU_stack.Rd +++ b/man/create_CRU_stack.Rd @@ -17,28 +17,28 @@ create_CRU_stack( frs = FALSE, wnd = FALSE, elv = FALSE, - dsn = "" + dsn ) } \arguments{ -\item{pre}{Logical. Fetch precipitation (millimetres/month) from server and +\item{pre}{Logical. Load precipitation (millimetres/month) from server and return in the data frame? Defaults to \code{FALSE}.} -\item{pre_cv}{Logical. Fetch cv of precipitation (percent) from server and +\item{pre_cv}{Logical. Load cv of precipitation (percent) from server and return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Logical. Fetch wet-days (number days with >0.1millimetres rain per +\item{rd0}{Logical. Load wet-days (number days with >0.1millimetres rain per month) and return in the data frame? Defaults to \code{FALSE}.} -\item{tmp}{Logical. Fetch temperature (degrees Celsius) and return it in the +\item{tmp}{Logical. Load temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{dtr}{Logical. Fetch mean diurnal temperature range (degrees Celsius) +\item{dtr}{Logical. Load mean diurnal temperature range (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{reh}{Logical. Fetch relative humidity and return it in the data frame? +\item{reh}{Logical. Load relative humidity and return it in the data frame? Defaults to \code{FALSE}.} \item{tmn}{Logical. Calculate minimum temperature values (degrees Celsius) @@ -47,40 +47,50 @@ and return it in the data frame? Defaults to \code{FALSE}.} \item{tmx}{Logical. Calculate maximum temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} -\item{sunp}{Logical. Fetch sunshine, percent of maximum possible (percent of +\item{sunp}{Logical. Load sunshine, percent of maximum possible (percent of day length) and return it in data frame? Defaults to \code{FALSE}.} -\item{frs}{Logical. Fetch ground-frost records (number of days with ground- +\item{frs}{Logical. Load ground-frost records (number of days with ground- frost per month) and return it in data frame? Defaults to \code{FALSE}.} -\item{wnd}{Logical. Fetch 10m wind speed (metres/second) and return it in the +\item{wnd}{Logical. Load 10m wind speed (metres/second) and return it in the data frame? Defaults to \code{FALSE}.} -\item{elv}{Logical. Fetch elevation (converted to metres) and return it in +\item{elv}{Logical. Load elevation (converted to metres) and return it in the data frame? Defaults to \code{FALSE}.} \item{dsn}{Local file path where \acronym{CRU} \acronym{CL} v.2.0 .dat.gz files are located.} } \value{ -A \code{\link[base]{list}} of \code{\link{terra}} -\code{\link[terra]{rast}} objects of \acronym{CRU} \acronym{CL} v. 2.0 +A \code{\link[base:list]{base::list()}} of \code{\link[=terra]{terra()}} +\code{\link[terra:rast]{terra::rast()}} objects of \acronym{CRU} \acronym{CL} v. 2.0 climatology elements } \description{ Automates importing \acronym{CRU} \acronym{CL} v.2.0 climatology -data and creates a \code{\link{terra}} \code{\link[terra]{rast}} of the +data and creates a \code{\link[=terra]{terra()}} \code{\link[terra:rast]{terra::rast()}} of the data. If requested, minimum and maximum temperature may also be automatically calculated as described in the data readme.txt file. This function can be useful if you have network connection issues that mean automated downloading of the files using \R does not work properly. +} +\note{ +This package automatically converts elevation values from kilometres to +metres. + +This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +xmin = -180, xmax = 180. Note that the original wind data include land area +for parts of Antarctica, these data are excluded in the terra rast objects +generated by this function. +} +\section{Nomenclature and Units}{ -Nomenclature and units from readme.txt: \describe{ \item{pre}{precipitation (millimetres/month)} - \describe{ - \item{cv}{cv of precipitation (percent)} - } +\describe{ +\item{cv}{cv of precipitation (percent)} +} \item{rd0}{wet-days (number days with >0.1mm rain per month)} \item{tmp}{mean temperature (degrees Celsius)} \item{dtr}{mean diurnal temperature range (degrees Celsius)} @@ -93,19 +103,9 @@ Nomenclature and units from readme.txt: For more information see the description of the data provided by \acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} } -\note{ -This package automatically converts elevation values from kilometres to -metres. -This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the terra rast objects -generated by this function. -} \examples{ \dontshow{if (interactive()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} -# Create a terra rast object of temperature from tmp files in the tempdir() -# directory. download.file( url = "https://crudata.uea.ac.uk/cru/data/hrg/tmc/grid_10min_tmp.dat.gz", @@ -118,7 +118,7 @@ CRU_tmp \dontshow{\}) # examplesIf} } \seealso{ -\code{\link{get_CRU_stack}} +\code{\link[=get_CRU_stack]{get_CRU_stack()}} } \author{ Adam H. Sparks, \email{adamhsparks@gmail.com} diff --git a/man/get_CRU_df.Rd b/man/get_CRU_df.Rd index ba2e52a..53c1544 100644 --- a/man/get_CRU_df.Rd +++ b/man/get_CRU_df.Rd @@ -66,7 +66,7 @@ after the initial download and caching. Defaults to \code{FALSE}.} } \value{ A tidy data frame of \acronym{CRU} \acronym{CL} v. 2.0 climatology -elements as a \code{\link[tibble]{tibble}} object +elements as a \code{\link[tibble:tibble]{tibble::tibble()}} object } \description{ This function automates downloading and importing \acronym{CRU} @@ -75,13 +75,18 @@ If requested, minimum and maximum temperature may also be automatically calculated as described in the data readme.txt file. Data may be cached for later use by this function, saving time downloading files in future use of the function. +} +\note{ +This package automatically converts elevation values from kilometres to +metres. +} +\section{Nomenclature and Units}{ -Nomenclature and units from readme.txt: \describe{ \item{pre}{precipitation (millimetres/month)} - \describe{ - \item{cv}{cv of precipitation (percent)} - } +\describe{ +\item{cv}{cv of precipitation (percent)} +} \item{rd0}{wet-days (number days with >0.1mm rain per month)} \item{tmp}{mean temperature (degrees Celsius)} \item{dtr}{mean diurnal temperature range (degrees Celsius)} @@ -94,10 +99,7 @@ Nomenclature and units from readme.txt: For more information see the description of the data provided by \acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} } -\note{ -This package automatically converts elevation values from kilometres to -metres. -} + \examples{ \dontshow{if (interactive()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Download data and create a data frame of precipitation and temperature @@ -109,8 +111,8 @@ CRU_pre_tmp \dontshow{\}) # examplesIf} } \seealso{ -\code{\link{create_CRU_stack}} -\code{\link{manage_cache}} +\code{\link[=create_CRU_stack]{create_CRU_stack()}} +\code{\link[=manage_cache]{manage_cache()}} } \author{ Adam H. Sparks, \email{adamhsparks@gmail.com} diff --git a/man/get_CRU_stack.Rd b/man/get_CRU_stack.Rd index 0b86f84..56ce281 100644 --- a/man/get_CRU_stack.Rd +++ b/man/get_CRU_stack.Rd @@ -29,8 +29,8 @@ return in the data frame? Defaults to \code{FALSE}. NOTE. Setting this to \code{TRUE} will always results in \strong{pre} being set to \code{TRUE} and returned as well.} -\item{rd0}{Logical. Fetch wet-days (number days with >0.1millimetres rain -per month) and return in the data frame? Defaults to \code{FALSE}.} +\item{rd0}{Logical. Fetch wet-days (number days with >0.1 millimetres rain +per month) and return in the data frame? Defaults to \code{FALSE}.} \item{tmp}{Logical. Fetch temperature (degrees Celsius) and return it in the data frame? Defaults to \code{FALSE}.} @@ -50,11 +50,11 @@ return it in the data frame? Defaults to \code{FALSE}.} \item{sunp}{Logical. Fetch sunshine, percent of maximum possible (percent of day length) and return it in data frame? Defaults to \code{FALSE}.} -\item{frs}{Logical. Fetch ground-frost records (number of days with ground- +\item{frs}{Logical. Fetch ground-frost records (number of days with ground- frost per month) and return it in data frame? Defaults to \code{FALSE}.} -\item{wnd}{Logical. Fetch 10m wind speed (metres/second) and return it in -the data frame? Defaults to \code{FALSE}.} +\item{wnd}{Logical. Fetch 10m wind speed (metres/second) and return it in the +data frame? Defaults to \code{FALSE}.} \item{elv}{Logical. Fetch elevation (converted to metres) and return it in the data frame? Defaults to \code{FALSE}.} @@ -65,23 +65,33 @@ To take advantage of cached files in future sessions, use \code{cache = TRUE} after the initial download and caching. Defaults to \code{FALSE}.} } \value{ -A \code{\link[base]{list}} of \code{\link{terra}} -\code{\link[terra]{rast}} objects of CRU CL v. 2.0 climatology elements +A \code{\link[base:list]{base::list()}} of \code{\link[=terra]{terra()}} +\code{\link[terra:rast]{terra::rast()}} objects of CRU CL v. 2.0 climatology elements } \description{ This function automates downloading and importing CRU CL v. 2.0 -climatology data into \R and creates a list of \code{\link{terra}} -\code{\link[terra]{rast}} of the data. If requested, minimum and maximum +climatology data into \R and creates a list of \code{\link[=terra]{terra()}} +\code{\link[terra:rast]{terra::rast()}} of the data. If requested, minimum and maximum temperature may also be automatically calculated as described in the data readme.txt file. Data may be cached for later use by this function, saving time downloading files in future use of the function. +} +\note{ +This package automatically converts elevation values from kilometres to +metres. + +This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, +xmin = -180, xmax = 180. Note that the original wind data include land area +for parts of Antarctica, these data are excluded in the terra rast objects +generated by this function. +} +\section{Nomenclature and Units}{ -Nomenclature and units from readme.txt: \describe{ \item{pre}{precipitation (millimetres/month)} - \describe{ - \item{cv}{cv of precipitation (percent)} - } +\describe{ +\item{cv}{cv of precipitation (percent)} +} \item{rd0}{wet-days (number days with >0.1mm rain per month)} \item{tmp}{mean temperature (degrees Celsius)} \item{dtr}{mean diurnal temperature range (degrees Celsius)} @@ -91,31 +101,24 @@ Nomenclature and units from readme.txt: \item{wnd}{10 metre windspeed (metres/second)} \item{elv}{elevation (automatically converted to metres)} } -For more information see the description of the data provided by CRU, -\url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} +For more information see the description of the data provided by +\acronym{CRU}, \url{https://crudata.uea.ac.uk/cru/data/hrg/tmc/readme.txt} } -\note{ -This package automatically converts elevation values from kilometres to -metres. -This package crops all spatial outputs to an extent of ymin = -60, ymax = 85, -xmin = -180, xmax = 180. Note that the original wind data include land area -for parts of Antarctica, these data are excluded in the terra rast objects -generated by this function. -} \examples{ -\donttest{ -# Download data and create a \code{\link{terra}} \code{\link[terra]{rast}} +\dontshow{if (interactive()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} + +# Download data and create a [terra()] [terra::rast()] # object of precipitation and temperature without caching the data files CRU_pre_tmp <- get_CRU_stack(pre = TRUE, tmp = TRUE) CRU_pre_tmp -} +\dontshow{\}) # examplesIf} } \seealso{ -\code{\link{create_CRU_stack}} -\code{\link{manage_cache}} +\code{\link[=create_CRU_stack]{create_CRU_stack()}} +\code{\link[=manage_cache]{manage_cache()}} } \author{ Adam H. Sparks, \email{adamhsparks@gmail.com} diff --git a/man/manage_cache.Rd b/man/manage_cache.Rd index 05d8ed2..8a795de 100644 --- a/man/manage_cache.Rd +++ b/man/manage_cache.Rd @@ -4,31 +4,31 @@ \alias{manage_cache} \title{Manage locally cached CRU CL v. 2.0 files} \description{ -Manage cached \CRANpkg{getCRUCLdata} files with \CRANpkg{hoardr} +Manage cached \pkg{getCRUCLdata} files with \CRANpkg{hoardr} } \details{ The default cache directory is -\code{file.path(rappdirs::user_cache_dir(), "R/getCRUCLdata")}, but you can +\code{tools::R_user_dir(package = "getCRUCLdata")}, but you can set your own path using \code{manage_cache$cache_path_set()} \code{manage_cache$cache_delete} only accepts one file name, while \code{manage_cache$cache_delete_all} does not accept any names, but deletes all files. For deleting many specific files, use \code{manage_cache$cache_delete} in an -\code{\link[base]{lapply}()} type call. +\code{\link[base:lapply]{base::lapply()}} type call. } \section{Useful user functions}{ \itemize{ - \item \code{manage_cache$cache_path_get()} - get cache path - \item \code{manage_cache$cache_path_set()} - set cache path - \item \code{manage_cache$list()} - returns a character vector of full - path file names - \item \code{manage_cache$files()} - returns file objects with metadata - \item \code{manage_cache$details()} - returns files with details - \item \code{manage_cache$delete()} - delete specific files - \item \code{manage_cache$delete_all()} - delete all files, returns - nothing +\item \code{manage_cache$cache_path_get()} - get cache path +\item \code{manage_cache$cache_path_set()} - set cache path +\item \code{manage_cache$list()} - returns a character vector of full +path file names +\item \code{manage_cache$files()} - returns file objects with metadata +\item \code{manage_cache$details()} - returns files with details +\item \code{manage_cache$delete()} - delete specific files +\item \code{manage_cache$delete_all()} - delete all files, returns +nothing } } From 15a2744817af906630abc0cfa43800e8d54b3b87 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:32:07 +0800 Subject: [PATCH 033/127] Update tests --- tests/testthat/test-create_CRU_df.R | 4 ++-- tests/testthat/test-create_CRU_stack.R | 6 +++--- tests/testthat/test-create_stack.R | 26 +++++++++++++------------- tests/testthat/test-get_CRU_df.R | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/testthat/test-create_CRU_df.R b/tests/testthat/test-create_CRU_df.R index ff9ee8c..0fe627c 100644 --- a/tests/testthat/test-create_CRU_df.R +++ b/tests/testthat/test-create_CRU_df.R @@ -3,7 +3,7 @@ test_that("create_CRU_df fails if no parameters are TRUE", { expect_error( create_CRU_df(dsn = "~/"), - "You must select at least one element for import." + "You must select at least one element for download or import." ) }) @@ -12,7 +12,7 @@ test_that("create_CRU_df fails if no parameters are TRUE", { test_that("create_CRU_df fails if no dsn is specified", { expect_error( create_CRU_df(pre = TRUE), - "File directory does not exist: ." + "You must define the dsn where you have stored the local files for import." ) }) diff --git a/tests/testthat/test-create_CRU_stack.R b/tests/testthat/test-create_CRU_stack.R index 948690e..4e7e4c8 100644 --- a/tests/testthat/test-create_CRU_stack.R +++ b/tests/testthat/test-create_CRU_stack.R @@ -3,7 +3,7 @@ test_that("create_CRU_stack fails if no dsn is specified", { expect_error( create_CRU_stack(pre = TRUE), - "File directory does not exist: ." + "You must define the dsn where you have stored the local files for import." ) }) @@ -11,8 +11,8 @@ test_that("create_CRU_stack fails if no dsn is specified", { test_that("create_CRU_stack fails if no parameters are TRUE", { expect_error( - create_CRU_stack(dsn = "~/"), - "You must select at least one element for importing" + create_CRU_stack(), + "You must select at least one element for download or import." ) }) diff --git a/tests/testthat/test-create_stack.R b/tests/testthat/test-create_stack.R index d8fb931..275b9a0 100644 --- a/tests/testthat/test-create_stack.R +++ b/tests/testthat/test-create_stack.R @@ -702,19 +702,19 @@ test_that("month names are appropriate", { ) expect_identical(month_names, c( - "jan", - "feb", - "mar", - "apr", - "may", - "jun", - "jul", - "aug", - "sep", - "oct", - "nov", - "dec" - )) + "jan", + "feb", + "mar", + "apr", + "may", + "jun", + "jul", + "aug", + "sep", + "oct", + "nov", + "dec" + )) }) # Test that CRU_stack_list returns list of raster stacks with proper names ----- diff --git a/tests/testthat/test-get_CRU_df.R b/tests/testthat/test-get_CRU_df.R index f17e162..62eba5a 100644 --- a/tests/testthat/test-get_CRU_df.R +++ b/tests/testthat/test-get_CRU_df.R @@ -10,7 +10,7 @@ test_that("get_CRU_df fails if no parameters are TRUE", { # Test that get_CRU_df will retrieve files from CRU server test_that("get_CRU_df will retrieve files from CRU server", { skip_on_cran() - CRU_tmp <- get_CRU_df(tmp = TRUE, tmn = FALSE, tmx = FALSE, cache = FALSE) + CRU_tmp <- get_CRU_df(tmp = TRUE, cache = FALSE) expect_type(CRU_tmp, "list") }) From 6ed9c95b220718beca0cc5dcfc2393e2eb1cd82c Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:32:20 +0800 Subject: [PATCH 034/127] update NAMESPACE --- NAMESPACE | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/NAMESPACE b/NAMESPACE index b707a71..2ad4069 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -5,4 +5,12 @@ export(create_CRU_stack) export(get_CRU_df) export(get_CRU_stack) export(manage_cache) -import(data.table) +importFrom(data.table,":=") +importFrom(data.table,.BY) +importFrom(data.table,.EACHI) +importFrom(data.table,.GRP) +importFrom(data.table,.I) +importFrom(data.table,.N) +importFrom(data.table,.NGRP) +importFrom(data.table,.SD) +importFrom(data.table,data.table) From 541a4d7c616671f2c2fec98a24f4e11ee272b6f2 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:32:37 +0800 Subject: [PATCH 035/127] Update codemeta.json --- codemeta.json | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/codemeta.json b/codemeta.json index 399cbb2..58a68a9 100644 --- a/codemeta.json +++ b/codemeta.json @@ -135,9 +135,21 @@ "@type": "SoftwareApplication", "identifier": "R", "name": "R", - "version": ">= 3.2.0" + "version": ">= 4.0.0" }, "2": { + "@type": "SoftwareApplication", + "identifier": "cli", + "name": "cli", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=cli" + }, + "3": { "@type": "SoftwareApplication", "identifier": "curl", "name": "curl", @@ -149,7 +161,7 @@ }, "sameAs": "https://CRAN.R-project.org/package=curl" }, - "3": { + "4": { "@type": "SoftwareApplication", "identifier": "data.table", "name": "data.table", @@ -161,7 +173,7 @@ }, "sameAs": "https://CRAN.R-project.org/package=data.table" }, - "4": { + "5": { "@type": "SoftwareApplication", "identifier": "hoardr", "name": "hoardr", @@ -173,7 +185,19 @@ }, "sameAs": "https://CRAN.R-project.org/package=hoardr" }, - "5": { + "6": { + "@type": "SoftwareApplication", + "identifier": "rlang", + "name": "rlang", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=rlang" + }, + "7": { "@type": "SoftwareApplication", "identifier": "terra", "name": "terra", @@ -185,7 +209,7 @@ }, "sameAs": "https://CRAN.R-project.org/package=terra" }, - "6": { + "8": { "@type": "SoftwareApplication", "identifier": "utils", "name": "utils" @@ -195,7 +219,7 @@ "applicationCategory": "Tools", "isPartOf": "https://ropensci.org", "keywords": ["anglia-cru", "climate-data", "cru-cl2", "temperature", "rainfall", "elevation", "data-access", "wind", "relative-humidity", "solar-radiation", "diurnal-temperature", "frost", "cru", "r", "rstats", "r-package", "peer-reviewed"], - "fileSize": "911.341KB", + "fileSize": "907.301KB", "citation": [ { "@type": "ScholarlyArticle", From cc0275a09216f5eedeb7db66d96e5f8cfc725de3 Mon Sep 17 00:00:00 2001 From: "Adam H. Sparks" Date: Sun, 15 Dec 2024 07:36:21 +0800 Subject: [PATCH 036/127] Reknit vingette --- vignettes/getCRUCLdata.Rmd | 132 +++++++++++++++++------------------- vignettes/plot_t-1.png | Bin 126264 -> 33938 bytes vignettes/violin_plot-1.png | Bin 61761 -> 44969 bytes 3 files changed, 64 insertions(+), 68 deletions(-) diff --git a/vignettes/getCRUCLdata.Rmd b/vignettes/getCRUCLdata.Rmd index 4b640b7..d996e64 100644 --- a/vignettes/getCRUCLdata.Rmd +++ b/vignettes/getCRUCLdata.Rmd @@ -1,7 +1,7 @@ --- title: "getCRUCLdata" author: "Adam H. Sparks" -date: "2024-12-11" +date: "2024-12-15" output: rmarkdown::html_vignette: toc: true @@ -86,32 +86,32 @@ CRU_data <- get_CRU_df(pre = TRUE, elv = TRUE) CRU_data -#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv tmx -#> -#> 1: 30.917 35.417 NA NA NA NA NA NA NA NA NA -260 NA -#> 2: 31.083 35.417 NA NA NA NA NA NA NA NA NA -361 NA -#> 3: 31.250 35.417 NA NA NA NA NA NA NA NA NA -336 NA -#> 4: 31.417 35.417 NA NA NA NA NA NA NA NA NA -284 NA -#> 5: 31.750 35.583 NA NA NA NA NA NA NA NA NA -248 NA -#> --- -#> 6795146: 83.583 -30.083 dec 8.7 31 0.1 72.7 5.1 70.6 0 -31.3 5.6 283 -26.95 -#> 6795147: 83.583 -29.917 dec 8.6 31 0.1 72.8 4.9 70.6 0 -30.7 5.6 186 -26.40 -#> 6795148: 83.583 -29.750 dec 8.6 31 0.1 72.9 4.9 70.6 0 -30.8 5.6 195 -26.50 -#> 6795149: 83.583 -29.583 dec 8.6 31 0.1 73.0 5.0 70.6 0 -31.2 5.6 268 -26.90 -#> 6795150: 83.583 -29.417 dec 8.6 31 0.1 73.1 5.1 70.6 0 -31.5 5.6 328 -27.20 -#> tmn -#> -#> 1: NA -#> 2: NA -#> 3: NA -#> 4: NA -#> 5: NA -#> --- -#> 6795146: -35.65 -#> 6795147: -35.00 -#> 6795148: -35.10 -#> 6795149: -35.50 -#> 6795150: -35.80 +#> lat lon month dtr frs pre pre_cv rd0 reh sun tmp wnd elv tmx +#> +#> 1: -55.583 -68.250 NA NA NA NA NA NA NA NA NA 62 NA +#> 2: -55.417 -69.750 NA NA NA NA NA NA NA NA NA 86 NA +#> 3: -55.417 -69.583 NA NA NA NA NA NA NA NA NA 83 NA +#> 4: -55.417 -69.417 NA NA NA NA NA NA NA NA NA 121 NA +#> 5: -55.417 -69.250 NA NA NA NA NA NA NA NA NA 51 NA +#> --- +#> 566374: -55.750 -67.417 dec 7.7 8.7 68.4 47.6 11.1 80.1 34.2 7.3 5.3 103 11.15 +#> 566375: -55.750 -67.250 dec 7.6 8.7 67.1 47.6 11.1 79.9 34.2 7.5 5.3 63 11.30 +#> 566376: -55.583 -68.083 dec 7.9 8.4 69.8 48.6 10.9 80.1 34.7 7.6 5.2 123 11.55 +#> 566377: -55.583 -67.583 dec 7.8 8.3 65.2 48.4 10.9 79.4 34.6 8.0 5.2 19 11.90 +#> 566378: -55.583 -67.417 dec 7.8 8.5 64.0 48.3 11.1 79.1 34.4 7.7 5.3 77 11.60 +#> tmn +#> +#> 1: NA +#> 2: NA +#> 3: NA +#> 4: NA +#> 5: NA +#> --- +#> 566374: 3.45 +#> 566375: 3.70 +#> 566376: 3.65 +#> 566377: 4.10 +#> 566378: 3.80 ``` Perhaps you only need one or two elements, it is easy to create a tidy data frame of mean temperature only. @@ -121,19 +121,19 @@ Perhaps you only need one or two elements, it is easy to create a tidy data fram t <- get_CRU_df(tmp = TRUE) t -#> lat lon month tmp -#> -#> 1: -59.083 -26.583 jan 0.2 -#> 2: -58.417 -26.250 jan 0.6 -#> 3: -58.417 -26.417 jan 0.4 -#> 4: -55.917 -67.250 jan 8.0 -#> 5: -55.750 -67.250 jan 8.2 -#> --- -#> 6795140: 83.583 -36.083 dec -32.6 -#> 6795141: 83.583 -36.250 dec -33.0 -#> 6795142: 83.583 -36.417 dec -33.4 -#> 6795143: 83.583 -36.583 dec -33.3 -#> 6795144: 83.583 -36.750 dec -33.3 +#> lat lon month tmp +#> +#> 1: -59.083 -26.583 jan 0.2 +#> 2: -58.417 -26.250 jan 0.6 +#> 3: -58.417 -26.417 jan 0.4 +#> 4: -55.917 -67.250 jan 8.0 +#> 5: -55.750 -67.250 jan 8.2 +#> --- +#> 116: -55.750 -67.417 dec 7.3 +#> 117: -55.750 -67.583 dec 7.7 +#> 118: -55.583 -67.417 dec 7.7 +#> 119: -55.583 -67.583 dec 8.0 +#> 120: -55.583 -68.083 dec 7.6 ``` #### Plotting data from the tidy dataframe @@ -209,10 +209,6 @@ CRU_stack <- get_CRU_stack( wnd = TRUE, elv = TRUE ) -#> -|---------|---------|---------|---------| -========================================= - CRU_stack #> $dtr @@ -220,7 +216,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 2.3, 2.1, 2.2, 2.3, 1.8, 2.5, ... @@ -231,7 +227,7 @@ CRU_stack #> dimensions : 870, 2160, 1 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory #> name : elv #> min value : -361 @@ -242,7 +238,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0, 0.0, 0, 0, 0, 0, ... @@ -253,18 +249,18 @@ CRU_stack #> dimensions : 870, 2160, 24 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) -#> source : spat_120a218a42dee_73890_SskviV5XwhZb4QV.tif -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : 0.0, 0.0, 0.0, 0.0, 0, 0.0, ... -#> max values : 910.1, 824.3, 727.3, 741.3, 1100, 2512.6, ... +#> coord. ref. : lon/lat WGS 84 +#> source : spat_4486664f1fd6_17542_SskviV5XwhZb4QV.tif +#> names : jan, feb, mar, apr, may, jun, ... +#> min values : 65.3, 70.3, 73.4, 74.0, 63.3, 62.4, ... +#> max values : 106.6, 121.9, 142.1, 147.5, 160.3, 163.5, ... #> #> $rd0 #> class : SpatRaster #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0, 0.0, 0, 0, 0.0, 0, ... @@ -275,7 +271,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 18.4, 14.6, 13.5, 13.4, 15.5, 10.2, ... @@ -286,7 +282,7 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.0, 0, 3.3, 4.3, 8.1, 6.6, ... @@ -297,18 +293,18 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : -51.6, -47.6, -45.2, -36.6, -22.2, -16.3, ... -#> max values : 32.5, 32.1, 32.4, 34.3, 36.0, 38.3, ... +#> names : jan, feb, mar, apr, may, jun, ... +#> min values : 0.2, 0.3, 0.2, -1.9, -6.0, -9.8, ... +#> max values : 8.6, 8.6, 7.3, 5.6, 3.4, 2.0, ... #> #> $wnd #> class : SpatRaster #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory #> names : jan, feb, mar, apr, may, jun, ... #> min values : 0.1, 0.1, 0.3, 0.4, 0.3, 0.2, ... @@ -319,22 +315,22 @@ CRU_stack #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : -55.05, -52.95, -48.75, -41.35, -28, -21.40, ... -#> max values : 26.30, 26.25, 27.40, 27.50, 30, 30.65, ... +#> names : jan, feb, mar, apr, may, jun, ... +#> min values : -0.95, -0.75, -0.9, -3.05, -7.90, -12.05, ... +#> max values : 4.70, 4.75, 3.5, 2.20, 0.45, -0.75, ... #> #> $tmx #> class : SpatRaster #> dimensions : 870, 2160, 12 (nrow, ncol, nlyr) #> resolution : 0.1666667, 0.1666667 (x, y) #> extent : -180, 180, -60, 85 (xmin, xmax, ymin, ymax) -#> coord. ref. : lon/lat WGS 84 (CRS84) (OGC:CRS84) +#> coord. ref. : lon/lat WGS 84 #> source(s) : memory -#> names : jan, feb, mar, apr, may, jun, ... -#> min values : -48.2, -43.35, -41.65, -32.45, -17.55, -11.50, ... -#> max values : 39.7, 38.40, 40.25, 41.85, 43.60, 45.95, ... +#> names : jan, feb, mar, apr, may, jun, ... +#> min values : 1.35, 1.35, 1.3, -0.75, -4.10, -7.55, ... +#> max values : 12.50, 12.45, 11.1, 9.00, 6.35, 4.75, ... ``` The `create_CRU_stack()` function works in the same way with only one minor difference. diff --git a/vignettes/plot_t-1.png b/vignettes/plot_t-1.png index 1591135c3f3551c5ebd9c735749615d536c890d3..ad5d32c9e4602cece768d3be67f03bddc44d13bc 100644 GIT binary patch literal 33938 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