diff --git a/.github/decrypt_secret.sh b/.github/decrypt_secret.sh deleted file mode 100755 index 60176fdf..00000000 --- a/.github/decrypt_secret.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh - -# Decrypt the file - -mkdir -p $HOME/.config/earthengine/ndef/ - -mkdir -p /home/rstudio/.config/earthengine/ndef/ - -mkdir -p /github/home/config/earthengine - -mkdir -p ./secrets - -# --batch to prevent interactive command -# --yes to assume "yes" for questions - - -# Decrypt ee credentials (currently decrypting to a bunch of places hoping that earth engine finds one) - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output $HOME/.config/earthengine/ndef/credentials ./scratch_code/credentials.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output /home/rstudio/.config/earthengine/ndef/credentials ./scratch_code/credentials.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output ~/.config/earthengine/credentials ./scratch_code/credentials.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output /github/home/config/earthengine/credentials ./scratch_code/credentials.gpg - - -# Decrypt google drive credentials -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output $HOME/.config/earthengine/ndef/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com ./scratch_code/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output /home/rstudio/.config/earthengine/ndef/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com ./scratch_code/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com.gpg - - -# Decrypt google drive credentials json creds - -#Note: directly encrypting hte .json provided by Google failed. Instead, I loaded it into R, re-saved it, THEN encrypted the new version. - -echo " json token " - -gpg --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output ./secrets/ee-wilsonlab-emma-ef416058504a.json ./scratch_code/ee-wilsonlab-emma-ef416058504a.json.gpg - -#Encrypting - - #gpg --output your-json-token.json.gpg --symmetric your-json-token.json - diff --git a/.github/decrypt_secret_gd.sh b/.github/decrypt_secret_gd.sh deleted file mode 100644 index 77c91518..00000000 --- a/.github/decrypt_secret_gd.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -# Decrypt the file - - -# --batch to prevent interactive command -# --yes to assume "yes" for questions - - -# Decrypt google drive credentials (newer version) -gpg --quiet --batch --yes --decrypt --passphrase="$GD_SECRET" \ ---output /home/rstudio/.config/earthengine/ndef/maitner-f590bfc7be54.json ./scratch_code/maitner-f590bfc7be54.json.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$GD_SECRET" \ ---output $HOME/.config/earthengine/ndef/maitner-f590bfc7be54.json ./scratch_code/maitner-f590bfc7be54.json.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$GD_SECRET" \ ---output $HOME/.config/earthengine/ndef/maitner-f590bfc7be54.json ./scratch_code/maitner-f590bfc7be54.json.gpg - diff --git a/.github/workflow-logs/failure-20260302-212358.log b/.github/workflow-logs/failure-20260302-212358.log new file mode 100644 index 00000000..5eb51dd0 --- /dev/null +++ b/.github/workflow-logs/failure-20260302-212358.log @@ -0,0 +1,44 @@ +Starting tar_make() +ℹ Loading EMMAv1 +Registered S3 method overwritten by 'httr': + method from + print.cache_info hoardr +Setting up NASA EarthData authentication (keyring file backend) +AppEEARS authentication configured +terra 1.8.93 +── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── +✔ dplyr 1.2.0 ✔ readr 2.1.6 +✔ forcats 1.0.1 ✔ stringr 1.6.0 +✔ ggplot2 4.0.1 ✔ tibble 3.3.1 +✔ lubridate 1.9.5 ✔ tidyr 1.3.2 +✔ purrr 1.2.1 +── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── +✖ tidyr::extract() masks terra::extract() +✖ dplyr::filter() masks stats::filter() +✖ readr::guess_encoding() masks rvest::guess_encoding() +✖ dplyr::lag() masks stats::lag() +ℹ Use the conflicted package () to force all conflicts to become errors + +Attaching package: ‘arrow’ + +The following object is masked from ‘package:lubridate’: + + duration + +The following object is masked from ‘package:terra’: + + buffer + +The following object is masked from ‘package:utils’: + + timestamp + +Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.4.0; sf_use_s2() is TRUE +udunits database from /usr/share/xml/udunits/udunits2.xml +Loaded 29 packages from DESCRIPTION +System info: sysname=Linux; release=6.14.0-1017-azure; version=#17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025; nodename=01451219768c; machine=x86_64; login=unknown; user=root; effective_user=root +Error: +! Error in tar_make(): + 'names' and 'val' are of different lengths + See https://books.ropensci.org/targets/debugging.html +Execution halted diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 314a3032..d793d7bb 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -30,109 +30,47 @@ on: branches: - main - master + - dev-adam-appeears - dev-jiyeon # Allows you to run this workflow manually from the Actions tab workflow_dispatch: schedule: - # - cron: '1 0 * * 0' # runs every Sunday at 00:01 - - cron: '0 0 * * *' # runs every day at midnight + - cron: '0 0 * * 0' # runs every Sunday at midnight UTC + # - cron: '0 0 * * *' # runs every day at midnight # - cron: '0 */6 * * *' # run every 6th hour name: targets jobs: targets: - runs-on: ubuntu-24.04 #ubuntu-22.04 + runs-on: ubuntu-latest container: adamwilsonlab/emma:latest + permissions: + contents: write + pull-requests: write + issues: write env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + EARTHDATA_PASSWORD: ${{ secrets.EARTHDATA_PASSWORD }} + EARTHDATA_USER: ${{ secrets.EARTHDATA_USER }} RENV_PATHS_ROOT: ~/.local/share/renv ACTIONS_RUNNER_DEBUG: true - PYTHONPATH: /opt/conda/envs/r-reticulate/bin/python - RETICULATE_PYTHON: /opt/conda/envs/r-reticulate/bin/python - # GARGLE_AUTH_FILE: secrets/ee-wilsonlab-emma-ef416058504a.json - GOOGLE_APPLICATION_CREDENTIALS: secrets/ee-wilsonlab-emma-ef416058504a.json steps: - uses: actions/checkout@v2 with: - ref: main + ref: dev-adam-appeears lfs: true - name: Whitelist directory run: git config --global --add safe.directory /__w/emma_envdata/emma_envdata - - name: Checkout LFS objects - run: git lfs checkout - continue-on-error: true - # - name: List files in scratch_code - # run: ls -lh scratch_code/ -# - name: Setup Python -# uses: actions/setup-python@v2 -# with: -# python-version: '3.x' -# - name: Install Python Dependencies -# run: | -# pip install earthengine-api -# pip install -r requirements.txt # If you have other dependencies listed in a requirements file -# - name: Verify Python Installation -# run: | -# python -m pip show earthengine-api -# python -c "import ee; print(ee.__version__)" -# # - name: Install Linux system dependencies -# # if: runner.os == 'Linux' -# # run: | -# # sudo apt-get update - - name: Install Google Cloud SDK in container + - name: Install system deps for keyring run: | apt-get update - apt-get install -y curl apt-transport-https ca-certificates gnupg - echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" \ - | tee /etc/apt/sources.list.d/google-cloud-sdk.list - curl https://packages.cloud.google.com/apt/doc/apt-key.gpg \ - | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - - apt-get update - apt-get install -y google-cloud-cli=492.0.0-0 - - name: DECRYPT rgee SECRETS - run: ./.github/decrypt_secret.sh - env: - RGEE_SECRET: ${{ secrets.RGEE_SECRET }} - continue-on-error: true - # - name: List files in secrets - # run: ls -lh secrets/ -# - name: Check git settings -# run: -# git config --get http.postBuffer -# continue-on-error: true - - # - name: Display Service Account JSON - # run: | - # echo "=== Service Account JSON ===" - # cat secrets/ee-wilsonlab-emma-ef416058504a.json - # echo "============================" - - - name: Install Earth Engine API 1.5.4 in r-reticulate env - run: | - /opt/conda/envs/r-reticulate/bin/pip install --upgrade earthengine-api==0.1.370 #0.1.381 - # conda install -n r-reticulate -y -c conda-forge earthengine-api=1.5.4 - - - name: Verify EE API version - run: | - /opt/conda/envs/r-reticulate/bin/pip show earthengine-api - + apt-get install -y libsecret-1-0 libsecret-1-dev - name: Install R Package Dependencies run: |- Rscript -e "questionr::qscan(list.files(pattern='*.R',recursive=T), load = TRUE, detail = TRUE)" # this scans all scripts and installs any needed packages - # - name: Upgrade rgee to latest from GitHub - # run: | - # Rscript -e "if (!requireNamespace('devtools', quietly = TRUE)) install.packages('devtools')" - # Rscript -e 'devtools::install_github("r-spatial/rgee", ref="v.1.1.5")' - - # - name: Install rgee v1.1.5 from CRAN Archive - # run: | - # Rscript -e 'if (!requireNamespace("remotes", quietly=TRUE)) install.packages("remotes", repos="https://cloud.r-project.org")' - # Rscript -e 'remotes::install_version("rgee", version="1.1.5", repos="https://cloud.r-project.org")' - - - name: Install rgee from bmaitner/rgee - run: Rscript -e 'devtools::install_github(repo = "bmaitner/rgee", ref = "noninteractive_auth")' - name: Parse _targets.R run: Rscript -e "parse('_targets.R')" @@ -144,175 +82,149 @@ jobs: key: ${{ runner.os }}-renv-${{ hashFiles('**/renv.lock') }} restore-keys: ${{ runner.os }}-renv- - - name: Authenticate to GCP - run: | - # write the JSON secret to disk - # activate the service account (no --scopes flag) - gcloud auth activate-service-account \ - --key-file="secrets/ee-wilsonlab-emma-ef416058504a.json" \ - --project=ee-wilsonlab-emma \ - --quiet - - - name: Add r-reticulate env to PATH - run: echo "/opt/conda/envs/r-reticulate/bin" >> $GITHUB_PATH - - # - name: Authenticate Earth Engine - # run: earthengine authenticate \ - # --service_account \ - # --quiet \ - # #--key_file=${{ runner.temp }}/gee-key.json - - # - name: Authenticate to GCP (ADC with scopes) - # run: | - # gcloud auth application-default login \ - # --project=ee-wilsonlab-emma \ - # --scopes=https://www.googleapis.com/auth/cloud-platform \ - # --quiet - - # - name: Restore packages - # shell: Rscript {0} - # run: | - # if (!requireNamespace("renv", quietly = TRUE)) install.packages("renv") - # renv::restore() - - - name: Check if previous runs exists - id: runs-exist - run: git ls-remote --exit-code --heads origin targets-runs - continue-on-error: true - - - name: Checkout previous run - if: steps.runs-exist.outcome == 'success' - uses: actions/checkout@v2 + - name: Cache targets store + uses: actions/cache@v3 with: - ref: targets-runs - fetch-depth: 1 - path: .targets-runs - lfs: 'true' #attempting to fix issue with target-committed lfs files not being treated as lfs - - - name: Restore output files from the previous run - if: steps.runs-exist.outcome == 'success' + path: _targets/ + key: targets-${{ hashFiles('_targets.R', 'R/**') }} + restore-keys: targets- + - name: Run targets pipeline run: | - for (dest in scan(".targets-runs/.targets-files", what = character())) { - source <- file.path(".targets-runs", dest) - if (!file.exists(dirname(dest))) dir.create(dirname(dest), recursive = TRUE) - if (file.exists(source)) file.rename(source, dest) + Rscript -e "targets::tar_make()" 2>&1 | tee targets-output.log + shell: bash + - name: Export final data products to releases + if: github.ref == 'refs/heads/main' + run: | + # Load final targets and export to data/releases/ + targets::tar_load_everything() + + # Create releases directory + dir.create("data/releases", recursive = TRUE, showWarnings = FALSE) + + # Export domain as gpkg (example - adjust to your actual target names) + if (exists("domain")) { + sf::st_write( + sf::st_as_sf(domain), + "data/releases/domain.gpkg", + delete_dsn = TRUE + ) } + + # Add other final outputs here as needed + # Example: write.csv(final_data, "data/releases/final_data.csv") + shell: Rscript {0} - # - name: Find credential JSON - # run: | - # echo "Searching for ee-wilsonlab-emma-ef416058504a.json ..." - # find / -name 'ee-wilsonlab-emma-ef416058504a.json' 2>/dev/null || true -# - name: Run targets pipeline -# run: | -# Sys.setenv(HOME="/home/rstudio") -# cmdstanr::set_cmdstan_path("/home/rstudio/.cmdstanr/cmdstan-2.28.1") -# cmdstanr::check_cmdstan_toolchain() -# #cmdstanr::install_cmdstan() -# targets::tar_make() -# shell: Rscript {0} -# - name: Run targets pt 1 -# run: | -# Sys.setenv(HOME="/home/rstudio") -# cmdstanr::set_cmdstan_path("/home/rstudio/.cmdstanr/cmdstan-2.28.1") -# cmdstanr::check_cmdstan_toolchain() -# #cmdstanr::install_cmdstan() -# shell: Rscript {0} - - name: Verify credentials - run: | - ./.github/decrypt_secret.sh -# ls ~/.config/earthengine -# /usr/bin/earthengine -h -# echo " main dir" -# ls -# echo "scratch dir" -# ls scratch_code -# echo "secrets dir" -# ls secrets - env: - RGEE_SECRET: ${{ secrets.RGEE_SECRET }} - GD_SECRET: ${{ secrets.GD_SECRET }} continue-on-error: true - # - name: Install custom rgee - # run: | - # # added below on april 9 from https://github.com/r-spatial/rgee/issues/353#issuecomment-1983765552 - # library(reticulate) - # py_config() # see the name of your conda (python) environment, in my case "r-reticulate" - # reticulate::py_install('earthengine-api==0.1.370', envname='r-reticulate') - # # Check the installation of "earthengine-api" with - # py_list_packages() - # pyl <- py_list_packages() - # pyl[pyl$package == "earthengine-api", ] - # # check python version with - # py_run_string("import sys; print(sys.version)") - # devtools::install_github(repo = "bmaitner/rgee", ref = "noninteractive_auth") - # - name: Install custom rgee - # run: | - # Rscript -e "library(reticulate)" - # Rscript -e "reticulate::py_install('earthengine-api==0.1.370', envname='r-reticulate')" - # Rscript -e "pyl <- py_list_packages(); print(pyl[pyl$package == 'earthengine-api', ])" - # Rscript -e "reticulate::py_run_string('import sys; print(sys.version)')" - # Rscript -e "devtools::install_github(repo = 'bmaitner/rgee', ref = 'noninteractive_auth')" -# shell: Rscript {0} - # - name: Print environment - # run: env - # - name: Print R session info - # run: Rscript -e 'sessionInfo()' - # - name: “Set up gcloud CLI” - # uses: google-github-actions/setup-gcloud@v1 - # with: - # project_id: ${{ secrets.GCP_PROJECT }} - # service_account_key: ${{ secrets.GCP_SA_KEY }} - - name: Run targets pt 2 + + - name: Upload to GitHub Releases + if: github.ref == 'refs/heads/main' + uses: softprops/action-gh-release@v1 + with: + tag_name: latest + files: | + data/releases/* + body: | + Latest data products from targets pipeline + Updated: ${{ github.event.head_commit.timestamp }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install GitHub CLI + if: failure() && github.event_name == 'push' run: | - #reticulate::use_python('/usr/bin/python3') - #rgee::ee_set_pyenv('/usr/bin/python3','r-reticulate', confirm = F) - #targets::tar_destroy(destroy = "all",ask = FALSE) #uncomment to reset - targets::tar_make() - shell: Rscript {0} - - name: Identify files that the targets pipeline produced - run: git ls-files -mo --exclude=renv > .targets-files - - name: Create the runs branch if it does not already exist - if: steps.runs-exist.outcome != 'success' - run: git checkout --orphan targets-runs - - name: Put the worktree in the runs branch if the latter already exists - if: steps.runs-exist.outcome == 'success' + apt-get update + apt-get install -y gh + + - name: Create review PR on failure + if: failure() && github.event_name == 'push' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - rm -r .git - mv .targets-runs/.git . - rm -r .targets-runs + # Create error log if it doesn't exist + if [ ! -f targets-output.log ]; then + echo "No targets-output.log file found. Pipeline may have failed during execution." > targets-output.log + fi + # Get last 100 lines of error + tail -100 targets-output.log > error-summary.txt + + # Create branch + BRANCH="auto-fix-$(date +%s)" + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git checkout -b "$BRANCH" + + # Add error log + mkdir -p .github/workflow-logs + cp targets-output.log .github/workflow-logs/failure-$(date +%Y%m%d-%H%M%S).log + git add .github/workflow-logs/ + git commit -m "Add workflow failure log for review" || true + git push origin "$BRANCH" + + # Create PR (Copilot will auto-review it) + gh pr create \ + --title "🚨 Targets workflow failed - Review needed" \ + --body "## Workflow Failure - - name: update md - run: | - webshot::install_phantomjs() - knitr::knit("README.Rmd") - shell: Rscript {0} - - name: Upload latest run - run: | - git config --local user.name "GitHub Actions" - git config --local user.email "actions@github.com" - rm -r .gitignore .github/workflows - git lfs track _targets/objects/* #use git LFS to track the targets output (larger files) - git lfs track data/raw_data/* - git lfs track data/* #use git LFS to track the data output (larger files) - git lfs track "raw_data/**" #use git LFS to track raw_data output (larger files) - git lfs track "data/**" - git lfs track _targets/metadata/* #track metadata - git lfs track *.tif - git add .gitattributes - git add --all -- ':!renv' ':!*json' - for file in $(git ls-files ':!*.json' -mo --exclude=renv) - do - git add -f $file - done - git commit -am "Run pipeline" - git push origin targets-runs -# Move the loop below up two lines (after git add) to commit large files. - - name: Prepare failure artifact - if: failure() - run: rm -rf .git .github .targets-files .targets-runs + The targets pipeline failed. GitHub Copilot will review this PR. + + ### Error Summary + \`\`\` + $(cat error-summary.txt) + \`\`\` + + ### Full Log + See \`.github/workflow-logs/\` for complete output. + + **Next steps:** + 1. Review Copilot's suggestions in the PR + 2. Apply fixes + 3. Close this PR once resolved" \ + --base main \ + --head "$BRANCH" \ + --label "bug" + + # Request Copilot review + gh pr comment $BRANCH --body "@github-copilot review" + + # Request Copilot coding agent to fix the issue + gh pr comment $BRANCH --body "@github-copilot-agent Please analyze the error log and create fixes for this targets pipeline failure" + - name: Post failure artifact if: failure() uses: actions/upload-artifact@main with: - name: ${{ runner.os }}-r${{ matrix.config.r }}-results + name: ${{ runner.os }}-results path: . + + - name: Prepare failure artifact + if: failure() + run: rm -rf .git .github + + - name: Comment on existing PR with status + if: always() && github.event_name == 'pull_request' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + STATUS="${{ steps.targets.outcome }}" + if [ "$STATUS" = "success" ]; then + EMOJI="✅" + MESSAGE="Targets workflow completed successfully!" + else + EMOJI="❌" + MESSAGE="Targets workflow failed. See logs below." + fi + + if [ ! -f targets-output.log ]; then + echo "No targets-output.log file found. Pipeline completed without explicit log output." > targets-output.log + fi + gh pr comment ${{ github.event.pull_request.number }} --body "## $EMOJI Targets Workflow Result + + $MESSAGE + +
+ Show last 50 lines of output + + \`\`\` + $(tail -50 targets-output.log) + \`\`\` +
" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 889aa851..fc6328d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,53 +1,76 @@ -# History files +# R session files .Rhistory .Rapp.history -# Session Data files .RData -# User-specific files .Ruserdata -# Example code in package build process + +# RStudio files +.Rproj.user/ + +# Targets workflow - track meta/meta for pipeline state +_targets/objects/ +_targets/user/ +_targets/workspaces/ + +# Data directories +data/temp/ +data/other_data/ +data/raw_data/ +data/manual_download/*.gpkg +data/manual_download/NVM* +data/raw* +data/.tar_cache/ +data/target_outputs/ + +# Terra auxiliary files (from terra_preserve_metadata) +*.tif.aux.xml +*.tif.zip +*.ovr + +# Secrets & credentials +.Renviron +.httr-oauth +~/.boxr-oauth +.secrets +secrets/ +debugging_auth.R + +# JSON files - specific patterns only +secrets/*.json +scratch_code/*.json + +# AppEEARS/NASA downloads +*.hdf +*.h5 + +# Test scripts +test_*.R + +# R package build *-Ex.R -# Output files from R CMD build /*.tar.gz -# Output files from R CMD check /*.Rcheck/ -# RStudio files -.Rproj.user/ -# produced vignettes + +# Vignettes vignettes/*.html vignettes/*.pdf -# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 -.httr-oauth -# knitr and R markdown default cache directories + +# knitr and R markdown *_cache/ /cache/ -# Temporary files created by R markdown *.utf8.md *.knit.md -# R Environment Variables -.Renviron -# targets related workflow stuff -~/.boxr-oauth index.md -index_files/* -firemodel_predict -#raw_data/ +index_files/ + +# Output/legacy directories processed_data/ -#data/* -*.gpkg -data/other_data/ -*/other_data/* -.DS_Store -#*/meta -img/network.html +firemodel_predict + +# Image outputs +img/*_files +img/*.html img/network* -scratch_code/*.json -scratch_code/!*.json.gpg -.secrets -secrets -secrets/ -secrets/* -secrets/*.json -secrets/!*.json.gpg -debugging_auth.R -*.json + +# OS files +.DS_Store diff --git a/.targets-files b/.targets-files new file mode 100644 index 00000000..50cfbbde --- /dev/null +++ b/.targets-files @@ -0,0 +1,2443 @@ +.targets-files +.targets-runs/ +Rplots.pdf +_targets/meta/.gitignore +_targets/meta/meta +_targets/meta/process +_targets/meta/progress +_targets/objects/alos +_targets/objects/burn_date_to_last_burned_date +_targets/objects/climate_chelsa +_targets/objects/clouds_wilson +_targets/objects/correct_fire_proj +_targets/objects/correct_kndvi_proj +_targets/objects/correct_ndvi_date_proj +_targets/objects/correct_ndvi_proj +_targets/objects/country +_targets/objects/data +_targets/objects/domain +_targets/objects/elevation_nasadem +_targets/objects/fire_dates_to_parquet +_targets/objects/fire_doy_to_unix_date +_targets/objects/fire_modis +_targets/objects/group_data +_targets/objects/kndvi_modis +_targets/objects/landcover_za +_targets/objects/model +_targets/objects/model_fit +_targets/objects/most_recent_fire_dates_to_parquet +_targets/objects/ndvi_dates_modis +_targets/objects/ndvi_modis +_targets/objects/ndvi_relative_days_since_fire +_targets/objects/ndvi_to_parquet +_targets/objects/posterior_summary +_targets/objects/precipitation_chelsa +_targets/objects/projected_alos +_targets/objects/projected_climate_chelsa +_targets/objects/projected_clouds_wilson +_targets/objects/projected_elevation_nasadem +_targets/objects/projected_landcover_za +_targets/objects/projected_precipitation_chelsa +_targets/objects/raw_data +_targets/objects/stan_data +_targets/objects/template +_targets/objects/test_tif +_targets/objects/vegmap +data/domain.gpkg +data/model_data.csv +data/processed_data/alos/alos_chili.tif +data/processed_data/alos/alos_mtpi.tif +data/processed_data/alos/alos_topographic_diversity.tif +data/processed_data/alos/landforms.tif +data/processed_data/climate_chelsa/CHELSA_bio10_01_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_02_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_03_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_04_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_05_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_06_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_07_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_08_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_09_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_10_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_11_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_12_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_13_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_14_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_15_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_16_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_17_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_18_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_19_V1.2_clipped.tif +data/processed_data/clouds_wilson/MODCF_interannualSD.tif +data/processed_data/clouds_wilson/MODCF_intraannualSD.tif +data/processed_data/clouds_wilson/MODCF_meanannual.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_01.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_02.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_03.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_04.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_05.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_06.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_07.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_08.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_09.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_10.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_11.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_12.tif +data/processed_data/clouds_wilson/MODCF_seasonality_concentration.tif +data/processed_data/clouds_wilson/MODCF_seasonality_rgb.tif +data/processed_data/clouds_wilson/MODCF_seasonality_theta.tif +data/processed_data/clouds_wilson/MODCF_seasonality_visct.tif +data/processed_data/clouds_wilson/MODCF_spatialSD_1deg.tif +data/processed_data/elevation_nasadem/nasadem.tif +data/processed_data/fire_dates/2000_11_01.tif +data/processed_data/fire_dates/2000_12_01.tif +data/processed_data/fire_dates/2001_01_01.tif +data/processed_data/fire_dates/2001_02_01.tif +data/processed_data/fire_dates/2001_03_01.tif +data/processed_data/fire_dates/2001_04_01.tif +data/processed_data/fire_dates/2001_05_01.tif +data/processed_data/fire_dates/2001_06_01.tif +data/processed_data/fire_dates/2001_07_01.tif +data/processed_data/fire_dates/2001_08_01.tif +data/processed_data/fire_dates/2001_09_01.tif +data/processed_data/fire_dates/2001_10_01.tif +data/processed_data/fire_dates/2001_11_01.tif +data/processed_data/fire_dates/2001_12_01.tif +data/processed_data/fire_dates/2002_01_01.tif +data/processed_data/fire_dates/2002_02_01.tif +data/processed_data/fire_dates/2002_03_01.tif +data/processed_data/fire_dates/2002_04_01.tif +data/processed_data/fire_dates/2002_05_01.tif +data/processed_data/fire_dates/2002_06_01.tif +data/processed_data/fire_dates/2002_07_01.tif +data/processed_data/fire_dates/2002_08_01.tif +data/processed_data/fire_dates/2002_09_01.tif +data/processed_data/fire_dates/2002_10_01.tif +data/processed_data/fire_dates/2002_11_01.tif +data/processed_data/fire_dates/2002_12_01.tif +data/processed_data/fire_dates/2003_01_01.tif +data/processed_data/fire_dates/2003_02_01.tif +data/processed_data/fire_dates/2003_03_01.tif +data/processed_data/fire_dates/2003_04_01.tif +data/processed_data/fire_dates/2003_05_01.tif +data/processed_data/fire_dates/2003_06_01.tif +data/processed_data/fire_dates/2003_07_01.tif +data/processed_data/fire_dates/2003_08_01.tif +data/processed_data/fire_dates/2003_09_01.tif +data/processed_data/fire_dates/2003_10_01.tif +data/processed_data/fire_dates/2003_11_01.tif +data/processed_data/fire_dates/2003_12_01.tif +data/processed_data/fire_dates/2004_01_01.tif +data/processed_data/fire_dates/2004_02_01.tif +data/processed_data/fire_dates/2004_03_01.tif +data/processed_data/fire_dates/2004_04_01.tif +data/processed_data/fire_dates/2004_05_01.tif +data/processed_data/fire_dates/2004_06_01.tif +data/processed_data/fire_dates/2004_07_01.tif +data/processed_data/fire_dates/2004_08_01.tif +data/processed_data/fire_dates/2004_09_01.tif +data/processed_data/fire_dates/2004_10_01.tif +data/processed_data/fire_dates/2004_11_01.tif +data/processed_data/fire_dates/2004_12_01.tif +data/processed_data/fire_dates/2005_01_01.tif +data/processed_data/fire_dates/2005_02_01.tif +data/processed_data/fire_dates/2005_03_01.tif +data/processed_data/fire_dates/2005_04_01.tif +data/processed_data/fire_dates/2005_05_01.tif +data/processed_data/fire_dates/2005_06_01.tif +data/processed_data/fire_dates/2005_07_01.tif +data/processed_data/fire_dates/2005_08_01.tif +data/processed_data/fire_dates/2005_09_01.tif +data/processed_data/fire_dates/2005_10_01.tif +data/processed_data/fire_dates/2005_11_01.tif +data/processed_data/fire_dates/2005_12_01.tif +data/processed_data/fire_dates/2006_01_01.tif +data/processed_data/fire_dates/2006_02_01.tif +data/processed_data/fire_dates/2006_03_01.tif +data/processed_data/fire_dates/2006_04_01.tif +data/processed_data/fire_dates/2006_05_01.tif +data/processed_data/fire_dates/2006_06_01.tif +data/processed_data/fire_dates/2006_07_01.tif +data/processed_data/fire_dates/2006_08_01.tif +data/processed_data/fire_dates/2006_09_01.tif +data/processed_data/fire_dates/2006_10_01.tif +data/processed_data/fire_dates/2006_11_01.tif +data/processed_data/fire_dates/2006_12_01.tif +data/processed_data/fire_dates/2007_01_01.tif +data/processed_data/fire_dates/2007_02_01.tif +data/processed_data/fire_dates/2007_03_01.tif +data/processed_data/fire_dates/2007_04_01.tif +data/processed_data/fire_dates/2007_05_01.tif +data/processed_data/fire_dates/2007_06_01.tif +data/processed_data/fire_dates/2007_07_01.tif +data/processed_data/fire_dates/2007_08_01.tif +data/processed_data/fire_dates/2007_09_01.tif +data/processed_data/fire_dates/2007_10_01.tif +data/processed_data/fire_dates/2007_11_01.tif +data/processed_data/fire_dates/2007_12_01.tif +data/processed_data/fire_dates/2008_01_01.tif +data/processed_data/fire_dates/2008_02_01.tif +data/processed_data/fire_dates/2008_03_01.tif +data/processed_data/fire_dates/2008_04_01.tif +data/processed_data/fire_dates/2008_05_01.tif +data/processed_data/fire_dates/2008_06_01.tif +data/processed_data/fire_dates/2008_07_01.tif +data/processed_data/fire_dates/2008_08_01.tif +data/processed_data/fire_dates/2008_09_01.tif +data/processed_data/fire_dates/2008_10_01.tif +data/processed_data/fire_dates/2008_11_01.tif +data/processed_data/fire_dates/2008_12_01.tif +data/processed_data/fire_dates/2009_01_01.tif +data/processed_data/fire_dates/2009_02_01.tif +data/processed_data/fire_dates/2009_03_01.tif +data/processed_data/fire_dates/2009_04_01.tif +data/processed_data/fire_dates/2009_05_01.tif +data/processed_data/fire_dates/2009_06_01.tif +data/processed_data/fire_dates/2009_07_01.tif +data/processed_data/fire_dates/2009_08_01.tif +data/processed_data/fire_dates/2009_09_01.tif +data/processed_data/fire_dates/2009_10_01.tif +data/processed_data/fire_dates/2009_11_01.tif +data/processed_data/fire_dates/2009_12_01.tif +data/processed_data/fire_dates/2010_01_01.tif +data/processed_data/fire_dates/2010_02_01.tif +data/processed_data/fire_dates/2010_03_01.tif +data/processed_data/fire_dates/2010_04_01.tif +data/processed_data/fire_dates/2010_05_01.tif +data/processed_data/fire_dates/2010_06_01.tif +data/processed_data/fire_dates/2010_07_01.tif +data/processed_data/fire_dates/2010_08_01.tif +data/processed_data/fire_dates/2010_09_01.tif +data/processed_data/fire_dates/2010_10_01.tif +data/processed_data/fire_dates/2010_11_01.tif +data/processed_data/fire_dates/2010_12_01.tif +data/processed_data/fire_dates/2011_01_01.tif +data/processed_data/fire_dates/2011_02_01.tif +data/processed_data/fire_dates/2011_03_01.tif +data/processed_data/fire_dates/2011_04_01.tif +data/processed_data/fire_dates/2011_05_01.tif +data/processed_data/fire_dates/2011_06_01.tif +data/processed_data/fire_dates/2011_07_01.tif +data/processed_data/fire_dates/2011_08_01.tif +data/processed_data/fire_dates/2011_09_01.tif +data/processed_data/fire_dates/2011_10_01.tif +data/processed_data/fire_dates/2011_11_01.tif +data/processed_data/fire_dates/2011_12_01.tif +data/processed_data/fire_dates/2012_01_01.tif +data/processed_data/fire_dates/2012_02_01.tif +data/processed_data/fire_dates/2012_03_01.tif +data/processed_data/fire_dates/2012_04_01.tif +data/processed_data/fire_dates/2012_05_01.tif +data/processed_data/fire_dates/2012_06_01.tif +data/processed_data/fire_dates/2012_07_01.tif +data/processed_data/fire_dates/2012_08_01.tif +data/processed_data/fire_dates/2012_09_01.tif +data/processed_data/fire_dates/2012_10_01.tif +data/processed_data/fire_dates/2012_11_01.tif +data/processed_data/fire_dates/2012_12_01.tif +data/processed_data/fire_dates/2013_01_01.tif +data/processed_data/fire_dates/2013_02_01.tif +data/processed_data/fire_dates/2013_03_01.tif +data/processed_data/fire_dates/2013_04_01.tif +data/processed_data/fire_dates/2013_05_01.tif +data/processed_data/fire_dates/2013_06_01.tif +data/processed_data/fire_dates/2013_07_01.tif +data/processed_data/fire_dates/2013_08_01.tif +data/processed_data/fire_dates/2013_09_01.tif +data/processed_data/fire_dates/2013_10_01.tif +data/processed_data/fire_dates/2013_11_01.tif +data/processed_data/fire_dates/2013_12_01.tif +data/processed_data/fire_dates/2014_01_01.tif +data/processed_data/fire_dates/2014_02_01.tif +data/processed_data/fire_dates/2014_03_01.tif +data/processed_data/fire_dates/2014_04_01.tif +data/processed_data/fire_dates/2014_05_01.tif +data/processed_data/fire_dates/2014_06_01.tif +data/processed_data/fire_dates/2014_07_01.tif +data/processed_data/fire_dates/2014_08_01.tif +data/processed_data/fire_dates/2014_09_01.tif +data/processed_data/fire_dates/2014_10_01.tif +data/processed_data/fire_dates/2014_11_01.tif +data/processed_data/fire_dates/2014_12_01.tif +data/processed_data/fire_dates/2015_01_01.tif +data/processed_data/fire_dates/2015_02_01.tif +data/processed_data/fire_dates/2015_03_01.tif +data/processed_data/fire_dates/2015_04_01.tif +data/processed_data/fire_dates/2015_05_01.tif +data/processed_data/fire_dates/2015_06_01.tif +data/processed_data/fire_dates/2015_07_01.tif +data/processed_data/fire_dates/2015_08_01.tif +data/processed_data/fire_dates/2015_09_01.tif +data/processed_data/fire_dates/2015_10_01.tif +data/processed_data/fire_dates/2015_11_01.tif +data/processed_data/fire_dates/2015_12_01.tif +data/processed_data/fire_dates/2016_01_01.tif +data/processed_data/fire_dates/2016_02_01.tif +data/processed_data/fire_dates/2016_03_01.tif +data/processed_data/fire_dates/2016_04_01.tif +data/processed_data/fire_dates/2016_05_01.tif +data/processed_data/fire_dates/2016_06_01.tif +data/processed_data/fire_dates/2016_07_01.tif +data/processed_data/fire_dates/2016_08_01.tif +data/processed_data/fire_dates/2016_09_01.tif +data/processed_data/fire_dates/2016_10_01.tif +data/processed_data/fire_dates/2016_11_01.tif +data/processed_data/fire_dates/2016_12_01.tif +data/processed_data/fire_dates/2017_01_01.tif +data/processed_data/fire_dates/2017_02_01.tif +data/processed_data/fire_dates/2017_03_01.tif +data/processed_data/fire_dates/2017_04_01.tif +data/processed_data/fire_dates/2017_05_01.tif +data/processed_data/fire_dates/2017_06_01.tif +data/processed_data/fire_dates/2017_07_01.tif +data/processed_data/fire_dates/2017_08_01.tif +data/processed_data/fire_dates/2017_09_01.tif +data/processed_data/fire_dates/2017_10_01.tif +data/processed_data/fire_dates/2017_11_01.tif +data/processed_data/fire_dates/2017_12_01.tif +data/processed_data/fire_dates/2018_01_01.tif +data/processed_data/fire_dates/2018_02_01.tif +data/processed_data/fire_dates/2018_03_01.tif +data/processed_data/fire_dates/2018_04_01.tif +data/processed_data/fire_dates/2018_05_01.tif +data/processed_data/fire_dates/2018_06_01.tif +data/processed_data/fire_dates/2018_07_01.tif +data/processed_data/fire_dates/2018_08_01.tif +data/processed_data/fire_dates/2018_09_01.tif +data/processed_data/fire_dates/2018_10_01.tif +data/processed_data/fire_dates/2018_11_01.tif +data/processed_data/fire_dates/2018_12_01.tif +data/processed_data/fire_dates/2019_01_01.tif +data/processed_data/fire_dates/2019_02_01.tif +data/processed_data/fire_dates/2019_03_01.tif +data/processed_data/fire_dates/2019_04_01.tif +data/processed_data/fire_dates/2019_05_01.tif +data/processed_data/fire_dates/2019_06_01.tif +data/processed_data/fire_dates/2019_07_01.tif +data/processed_data/fire_dates/2019_08_01.tif +data/processed_data/fire_dates/2019_09_01.tif +data/processed_data/fire_dates/2019_10_01.tif +data/processed_data/fire_dates/2019_11_01.tif +data/processed_data/fire_dates/2019_12_01.tif +data/processed_data/fire_dates/2020_01_01.tif +data/processed_data/fire_dates/2020_02_01.tif +data/processed_data/fire_dates/2020_03_01.tif +data/processed_data/fire_dates/2020_04_01.tif +data/processed_data/fire_dates/2020_05_01.tif +data/processed_data/fire_dates/2020_06_01.tif +data/processed_data/fire_dates/2020_07_01.tif +data/processed_data/fire_dates/2020_08_01.tif +data/processed_data/fire_dates/2020_09_01.tif +data/processed_data/fire_dates/2020_10_01.tif +data/processed_data/fire_dates/2020_11_01.tif +data/processed_data/fire_dates/2020_12_01.tif +data/processed_data/fire_dates/2021_01_01.tif +data/processed_data/fire_dates/2021_02_01.tif +data/processed_data/fire_dates/2021_03_01.tif +data/processed_data/fire_dates/2021_04_01.tif +data/processed_data/fire_dates/2021_05_01.tif +data/processed_data/fire_dates/2021_06_01.tif +data/processed_data/fire_dates/2021_07_01.tif +data/processed_data/fire_dates/2021_08_01.tif +data/processed_data/fire_dates/2021_09_01.tif +data/processed_data/fire_dates/2021_10_01.tif +data/processed_data/fire_dates/2021_11_01.tif +data/processed_data/fire_dates/2021_12_01.tif +data/processed_data/landcover_za/SA_NLC_2020_GEO.tif +data/processed_data/landcover_za/SA_NLC_2020_GEO.tif.vat.cpg +data/processed_data/landcover_za/SA_NLC_2020_GEO.tif.vat.dbf +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11262.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11292.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11323.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11354.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11382.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11413.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11443.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11474.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11504.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11535.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11566.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11596.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11627.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11657.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11688.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11719.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11747.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11778.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11808.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11839.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11869.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11900.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11931.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11961.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11992.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12022.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12053.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12084.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12112.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12143.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12173.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12204.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12234.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12265.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12296.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12326.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12357.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12387.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12418.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12449.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12478.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12509.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12539.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12570.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12600.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12631.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12662.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12692.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12723.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12753.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12784.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12815.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12843.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12874.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12904.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12935.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12965.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12996.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13027.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13057.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13088.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13118.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13149.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13180.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13208.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13239.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13269.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13300.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13330.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13361.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13392.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13422.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13453.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13483.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13514.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13545.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13573.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13604.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13634.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13665.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13695.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13726.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13757.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13787.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13818.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13848.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13879.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13910.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13939.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13970.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14000.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14031.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14061.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14092.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14123.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14153.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14184.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14214.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14245.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14276.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14304.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14335.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14365.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14396.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14426.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14457.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14488.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14518.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14549.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14579.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14610.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14641.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14669.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14700.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14730.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14761.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14791.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14822.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14853.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14883.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14914.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14944.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14975.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15006.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15034.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15065.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15095.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15126.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15156.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15187.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15218.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15248.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15279.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15309.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15340.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15371.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15400.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15431.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15461.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15492.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15522.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15553.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15584.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15614.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15645.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15675.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15706.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15737.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15765.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15796.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15826.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15857.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15887.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15918.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15949.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15979.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16010.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16040.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16071.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16102.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16130.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16161.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16191.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16222.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16252.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16283.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16314.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16344.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16375.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16405.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16436.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16467.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16495.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16526.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16556.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16587.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16617.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16648.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16679.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16709.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16740.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16770.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16801.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16832.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16861.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16892.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16922.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16953.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16983.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17014.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17045.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17075.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17106.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17136.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17167.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17198.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17226.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17257.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17287.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17318.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17348.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17379.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17410.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17440.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17471.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17501.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17532.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17563.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17591.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17622.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17652.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17683.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17713.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17744.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17775.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17805.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17836.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17866.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17897.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17928.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17956.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17987.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18017.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18048.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18078.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18109.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18140.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18170.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18201.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18231.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18262.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18293.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18322.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18353.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18383.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18414.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18444.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18475.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18506.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18536.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18567.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18597.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18628.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18659.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18687.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18718.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18748.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18779.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18809.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18840.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18871.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18901.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18932.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18962.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11005.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11021.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11037.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11053.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11069.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11085.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11101.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11117.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11133.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11149.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11165.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11181.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11197.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11213.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11229.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11245.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11261.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11277.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11293.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11309.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11323.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11339.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11355.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11371.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11387.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11403.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11419.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11435.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11451.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11467.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11483.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11499.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11515.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11531.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11547.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11563.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11579.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11595.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11611.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11627.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11643.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11659.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11675.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11688.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11704.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11720.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11736.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11752.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11768.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11784.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11800.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11816.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11832.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11848.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11864.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11880.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11896.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11912.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11928.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11944.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11960.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11976.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11992.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12008.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12024.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12040.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12053.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12069.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12085.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12101.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12117.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12133.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12149.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12165.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12181.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12197.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12213.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12229.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12245.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12261.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12277.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12293.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12309.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12325.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12341.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12357.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12373.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12389.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12405.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12418.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12434.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12450.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12466.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12482.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12498.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12514.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12530.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12546.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12562.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12578.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12594.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12610.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12626.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12642.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12658.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12674.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12690.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12706.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12722.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12738.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12754.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12770.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12784.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12800.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12816.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12832.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12848.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12864.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12880.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12896.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12912.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12928.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12944.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12960.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12976.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12992.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13008.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13024.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13040.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13056.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13072.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13088.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13104.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13120.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13136.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13149.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13165.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13181.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13197.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13213.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13229.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13245.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13261.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13277.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13293.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13309.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13325.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13341.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13357.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13373.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13389.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13405.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13421.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13437.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13453.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13469.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13485.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13501.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13514.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13530.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13546.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13562.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13578.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13594.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13610.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13626.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13642.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13658.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13674.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13690.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13706.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13722.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13738.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13754.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13770.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13786.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13802.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13818.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13834.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13850.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13866.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13879.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13895.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13911.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13927.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13943.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13959.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13975.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13991.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14007.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14023.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14039.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14055.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14071.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14087.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14103.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14119.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14135.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14151.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14167.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14183.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14199.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14215.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14231.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14245.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14261.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14277.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14293.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14309.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14325.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14341.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14357.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14373.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14389.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14405.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14421.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14437.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14453.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14469.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14485.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14501.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14517.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14533.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14549.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14565.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14581.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14597.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14610.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14626.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14642.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14658.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14674.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14690.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14706.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14722.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14738.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14754.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14770.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14786.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14802.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14818.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14834.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14850.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14866.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14882.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14898.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14914.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14930.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14946.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14962.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14975.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14991.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15007.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15023.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15039.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15055.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15071.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15087.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15103.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15119.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15135.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15151.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15167.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15183.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15199.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15215.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15231.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15247.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15263.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15279.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15295.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15311.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15327.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15340.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15356.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15372.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15388.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15404.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15420.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15436.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15452.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15468.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15484.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15500.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15516.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15532.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15548.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15564.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15580.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15596.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15612.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15628.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15644.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15660.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15676.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15692.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15706.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15722.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15738.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15754.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15770.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15786.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15802.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15818.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15834.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15850.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15866.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15882.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15898.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15914.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15930.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15946.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15962.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15978.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15994.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16010.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16026.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16042.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16058.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16071.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16087.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16103.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16119.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16135.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16151.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16167.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16183.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16199.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16215.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16231.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16247.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16263.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16279.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16295.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16311.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16327.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16343.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16359.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16375.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16391.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16407.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16423.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16436.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16452.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16468.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16484.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16500.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16516.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16532.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16548.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16564.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16580.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16596.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16612.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16628.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16644.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16660.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16676.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16692.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16708.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16724.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16740.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16756.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16772.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16788.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16801.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16817.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16833.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16849.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16865.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16881.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16897.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16913.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16929.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16945.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16961.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16977.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16993.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17009.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17025.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17041.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17057.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17073.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17089.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17105.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17121.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17137.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17153.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17167.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17183.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17199.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17215.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17231.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17247.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17263.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17279.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17295.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17311.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17327.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17343.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17359.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17375.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17391.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17407.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17423.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17439.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17455.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17471.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17487.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17503.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17519.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17532.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17548.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17564.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17580.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17596.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17612.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17628.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17644.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17660.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17676.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17692.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17708.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17724.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17740.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17756.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17772.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17788.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17804.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17820.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17836.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17852.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17868.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17884.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17897.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17913.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17929.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17945.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17961.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17977.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17993.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18009.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18025.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18041.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18057.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18073.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18089.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18105.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18121.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18137.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18153.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18169.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18185.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18201.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18217.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18233.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18249.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18262.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18278.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18294.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18310.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18326.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18342.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18358.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18374.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18390.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18406.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18422.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18438.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18454.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18470.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18486.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18502.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18518.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18534.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18550.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18566.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18582.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18598.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18614.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18628.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18644.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18660.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18676.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18692.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18708.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18724.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18740.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18756.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18772.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18788.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18804.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18820.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18836.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18852.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18868.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18884.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18900.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18916.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18932.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18948.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18964.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18980.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18993.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/19009.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11005.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11021.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11037.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11053.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11069.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11085.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11101.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11117.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11133.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11149.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11165.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11181.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11197.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11213.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11229.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11245.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11261.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11277.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11293.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11309.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11323.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11339.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11355.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11371.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11387.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11403.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11419.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11435.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11451.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11467.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11483.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11499.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11515.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11531.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11547.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11563.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11579.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11595.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11611.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11627.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11643.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11659.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11675.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11688.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11704.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11720.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11736.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11752.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11768.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11784.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11800.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11816.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11832.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11848.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11864.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11880.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11896.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11912.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11928.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11944.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11960.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11976.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11992.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12008.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12024.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12040.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12053.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12069.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12085.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12101.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12117.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12133.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12149.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12165.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12181.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12197.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12213.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12229.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12245.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12261.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12277.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12293.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12309.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12325.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12341.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12357.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12373.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12389.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12405.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12418.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12434.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12450.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12466.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12482.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12498.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12514.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12530.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12546.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12562.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12578.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12594.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12610.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12626.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12642.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12658.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12674.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12690.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12706.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12722.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12738.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12754.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12770.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12784.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12800.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12816.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12832.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12848.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12864.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12880.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12896.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12912.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12928.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12944.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12960.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12976.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12992.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13008.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13024.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13040.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13056.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13072.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13088.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13104.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13120.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13136.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13149.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13165.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13181.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13197.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13213.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13229.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13245.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13261.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13277.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13293.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13309.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13325.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13341.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13357.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13373.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13389.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13405.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13421.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13437.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13453.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13469.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13485.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13501.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13514.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13530.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13546.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13562.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13578.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13594.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13610.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13626.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13642.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13658.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13674.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13690.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13706.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13722.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13738.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13754.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13770.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13786.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13802.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13818.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13834.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13850.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13866.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13879.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13895.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13911.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13927.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13943.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13959.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13975.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13991.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14007.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14023.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14039.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14055.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14071.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14087.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14103.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14119.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14135.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14151.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14167.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14183.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14199.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14215.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14231.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14245.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14261.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14277.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14293.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14309.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14325.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14341.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14357.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14373.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14389.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14405.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14421.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14437.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14453.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14469.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14485.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14501.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14517.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14533.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14549.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14565.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14581.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14597.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14610.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14626.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14642.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14658.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14674.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14690.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14706.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14722.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14738.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14754.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14770.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14786.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14802.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14818.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14834.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14850.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14866.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14882.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14898.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14914.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14930.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14946.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14962.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14975.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14991.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15007.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15023.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15039.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15055.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15071.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15087.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15103.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15119.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15135.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15151.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15167.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15183.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15199.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15215.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15231.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15247.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15263.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15279.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15295.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15311.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15327.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15340.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15356.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15372.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15388.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15404.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15420.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15436.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15452.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15468.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15484.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15500.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15516.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15532.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15548.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15564.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15580.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15596.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15612.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15628.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15644.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15660.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15676.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15692.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15706.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15722.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15738.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15754.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15770.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15786.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15802.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15818.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15834.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15850.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15866.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15882.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15898.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15914.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15930.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15946.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15962.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15978.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15994.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16010.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16026.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16042.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16058.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16071.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16087.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16103.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16119.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16135.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16151.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16167.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16183.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16199.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16215.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16231.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16247.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16263.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16279.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16295.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16311.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16327.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16343.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16359.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16375.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16391.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16407.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16423.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16436.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16452.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16468.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16484.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16500.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16516.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16532.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16548.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16564.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16580.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16596.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16612.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16628.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16644.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16660.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16676.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16692.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16708.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16724.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16740.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16756.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16772.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16788.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16801.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16817.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16833.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16849.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16865.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16881.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16897.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16913.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16929.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16945.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16961.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16977.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16993.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17009.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17025.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17041.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17057.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17073.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17089.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17105.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17121.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17137.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17153.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17167.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17183.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17199.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17215.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17231.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17247.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17263.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17279.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17295.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17311.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17327.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17343.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17359.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17375.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17391.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17407.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17423.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17439.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17455.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17471.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17487.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17503.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17519.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17532.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17548.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17564.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17580.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17596.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17612.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17628.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17644.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17660.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17676.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17692.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17708.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17724.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17740.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17756.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17772.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17788.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17804.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17820.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17836.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17852.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17868.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17884.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17897.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17913.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17929.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17945.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17961.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17977.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17993.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18009.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18025.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18041.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18057.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18073.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18089.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18105.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18121.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18137.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18153.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18169.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18185.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18201.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18217.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18233.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18249.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18262.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18278.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18294.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18310.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18326.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18342.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18358.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18374.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18390.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18406.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18422.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18438.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18454.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18470.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18486.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18502.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18518.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18534.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18550.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18566.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18582.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18598.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18614.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18628.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18644.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18660.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18676.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18692.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18708.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18724.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18740.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18756.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18772.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18788.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18804.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18820.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18836.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18852.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18868.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18884.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18900.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18916.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18932.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18948.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18964.gz.parquet +data/processed_data/model_data/stable_data.gz.parquet +data/processed_data/most_recent_burn_dates/2000_11_01.tif +data/processed_data/most_recent_burn_dates/2000_12_01.tif +data/processed_data/most_recent_burn_dates/2001_01_01.tif +data/processed_data/most_recent_burn_dates/2001_02_01.tif +data/processed_data/most_recent_burn_dates/2001_03_01.tif +data/processed_data/most_recent_burn_dates/2001_04_01.tif +data/processed_data/most_recent_burn_dates/2001_05_01.tif +data/processed_data/most_recent_burn_dates/2001_06_01.tif +data/processed_data/most_recent_burn_dates/2001_07_01.tif +data/processed_data/most_recent_burn_dates/2001_08_01.tif +data/processed_data/most_recent_burn_dates/2001_09_01.tif +data/processed_data/most_recent_burn_dates/2001_10_01.tif +data/processed_data/most_recent_burn_dates/2001_11_01.tif +data/processed_data/most_recent_burn_dates/2001_12_01.tif +data/processed_data/most_recent_burn_dates/2002_01_01.tif +data/processed_data/most_recent_burn_dates/2002_02_01.tif +data/processed_data/most_recent_burn_dates/2002_03_01.tif +data/processed_data/most_recent_burn_dates/2002_04_01.tif +data/processed_data/most_recent_burn_dates/2002_05_01.tif +data/processed_data/most_recent_burn_dates/2002_06_01.tif +data/processed_data/most_recent_burn_dates/2002_07_01.tif +data/processed_data/most_recent_burn_dates/2002_08_01.tif +data/processed_data/most_recent_burn_dates/2002_09_01.tif +data/processed_data/most_recent_burn_dates/2002_10_01.tif +data/processed_data/most_recent_burn_dates/2002_11_01.tif +data/processed_data/most_recent_burn_dates/2002_12_01.tif +data/processed_data/most_recent_burn_dates/2003_01_01.tif +data/processed_data/most_recent_burn_dates/2003_02_01.tif +data/processed_data/most_recent_burn_dates/2003_03_01.tif +data/processed_data/most_recent_burn_dates/2003_04_01.tif +data/processed_data/most_recent_burn_dates/2003_05_01.tif +data/processed_data/most_recent_burn_dates/2003_06_01.tif +data/processed_data/most_recent_burn_dates/2003_07_01.tif +data/processed_data/most_recent_burn_dates/2003_08_01.tif +data/processed_data/most_recent_burn_dates/2003_09_01.tif +data/processed_data/most_recent_burn_dates/2003_10_01.tif +data/processed_data/most_recent_burn_dates/2003_11_01.tif +data/processed_data/most_recent_burn_dates/2003_12_01.tif +data/processed_data/most_recent_burn_dates/2004_01_01.tif +data/processed_data/most_recent_burn_dates/2004_02_01.tif +data/processed_data/most_recent_burn_dates/2004_03_01.tif +data/processed_data/most_recent_burn_dates/2004_04_01.tif +data/processed_data/most_recent_burn_dates/2004_05_01.tif +data/processed_data/most_recent_burn_dates/2004_06_01.tif +data/processed_data/most_recent_burn_dates/2004_07_01.tif +data/processed_data/most_recent_burn_dates/2004_08_01.tif +data/processed_data/most_recent_burn_dates/2004_09_01.tif +data/processed_data/most_recent_burn_dates/2004_10_01.tif +data/processed_data/most_recent_burn_dates/2004_11_01.tif +data/processed_data/most_recent_burn_dates/2004_12_01.tif +data/processed_data/most_recent_burn_dates/2005_01_01.tif +data/processed_data/most_recent_burn_dates/2005_02_01.tif +data/processed_data/most_recent_burn_dates/2005_03_01.tif +data/processed_data/most_recent_burn_dates/2005_04_01.tif +data/processed_data/most_recent_burn_dates/2005_05_01.tif +data/processed_data/most_recent_burn_dates/2005_06_01.tif +data/processed_data/most_recent_burn_dates/2005_07_01.tif +data/processed_data/most_recent_burn_dates/2005_08_01.tif +data/processed_data/most_recent_burn_dates/2005_09_01.tif +data/processed_data/most_recent_burn_dates/2005_10_01.tif +data/processed_data/most_recent_burn_dates/2005_11_01.tif +data/processed_data/most_recent_burn_dates/2005_12_01.tif +data/processed_data/most_recent_burn_dates/2006_01_01.tif +data/processed_data/most_recent_burn_dates/2006_02_01.tif +data/processed_data/most_recent_burn_dates/2006_03_01.tif +data/processed_data/most_recent_burn_dates/2006_04_01.tif +data/processed_data/most_recent_burn_dates/2006_05_01.tif +data/processed_data/most_recent_burn_dates/2006_06_01.tif +data/processed_data/most_recent_burn_dates/2006_07_01.tif +data/processed_data/most_recent_burn_dates/2006_08_01.tif +data/processed_data/most_recent_burn_dates/2006_09_01.tif +data/processed_data/most_recent_burn_dates/2006_10_01.tif +data/processed_data/most_recent_burn_dates/2006_11_01.tif +data/processed_data/most_recent_burn_dates/2006_12_01.tif +data/processed_data/most_recent_burn_dates/2007_01_01.tif +data/processed_data/most_recent_burn_dates/2007_02_01.tif +data/processed_data/most_recent_burn_dates/2007_03_01.tif +data/processed_data/most_recent_burn_dates/2007_04_01.tif +data/processed_data/most_recent_burn_dates/2007_05_01.tif +data/processed_data/most_recent_burn_dates/2007_06_01.tif +data/processed_data/most_recent_burn_dates/2007_07_01.tif +data/processed_data/most_recent_burn_dates/2007_08_01.tif +data/processed_data/most_recent_burn_dates/2007_09_01.tif +data/processed_data/most_recent_burn_dates/2007_10_01.tif +data/processed_data/most_recent_burn_dates/2007_11_01.tif +data/processed_data/most_recent_burn_dates/2007_12_01.tif +data/processed_data/most_recent_burn_dates/2008_01_01.tif +data/processed_data/most_recent_burn_dates/2008_02_01.tif +data/processed_data/most_recent_burn_dates/2008_03_01.tif +data/processed_data/most_recent_burn_dates/2008_04_01.tif +data/processed_data/most_recent_burn_dates/2008_05_01.tif +data/processed_data/most_recent_burn_dates/2008_06_01.tif +data/processed_data/most_recent_burn_dates/2008_07_01.tif +data/processed_data/most_recent_burn_dates/2008_08_01.tif +data/processed_data/most_recent_burn_dates/2008_09_01.tif +data/processed_data/most_recent_burn_dates/2008_10_01.tif +data/processed_data/most_recent_burn_dates/2008_11_01.tif +data/processed_data/most_recent_burn_dates/2008_12_01.tif +data/processed_data/most_recent_burn_dates/2009_01_01.tif +data/processed_data/most_recent_burn_dates/2009_02_01.tif +data/processed_data/most_recent_burn_dates/2009_03_01.tif +data/processed_data/most_recent_burn_dates/2009_04_01.tif +data/processed_data/most_recent_burn_dates/2009_05_01.tif +data/processed_data/most_recent_burn_dates/2009_06_01.tif +data/processed_data/most_recent_burn_dates/2009_07_01.tif +data/processed_data/most_recent_burn_dates/2009_08_01.tif +data/processed_data/most_recent_burn_dates/2009_09_01.tif +data/processed_data/most_recent_burn_dates/2009_10_01.tif +data/processed_data/most_recent_burn_dates/2009_11_01.tif +data/processed_data/most_recent_burn_dates/2009_12_01.tif +data/processed_data/most_recent_burn_dates/2010_01_01.tif +data/processed_data/most_recent_burn_dates/2010_02_01.tif +data/processed_data/most_recent_burn_dates/2010_03_01.tif +data/processed_data/most_recent_burn_dates/2010_04_01.tif +data/processed_data/most_recent_burn_dates/2010_05_01.tif +data/processed_data/most_recent_burn_dates/2010_06_01.tif +data/processed_data/most_recent_burn_dates/2010_07_01.tif +data/processed_data/most_recent_burn_dates/2010_08_01.tif +data/processed_data/most_recent_burn_dates/2010_09_01.tif +data/processed_data/most_recent_burn_dates/2010_10_01.tif +data/processed_data/most_recent_burn_dates/2010_11_01.tif +data/processed_data/most_recent_burn_dates/2010_12_01.tif +data/processed_data/most_recent_burn_dates/2011_01_01.tif +data/processed_data/most_recent_burn_dates/2011_02_01.tif +data/processed_data/most_recent_burn_dates/2011_03_01.tif +data/processed_data/most_recent_burn_dates/2011_04_01.tif +data/processed_data/most_recent_burn_dates/2011_05_01.tif +data/processed_data/most_recent_burn_dates/2011_06_01.tif +data/processed_data/most_recent_burn_dates/2011_07_01.tif +data/processed_data/most_recent_burn_dates/2011_08_01.tif +data/processed_data/most_recent_burn_dates/2011_09_01.tif +data/processed_data/most_recent_burn_dates/2011_10_01.tif +data/processed_data/most_recent_burn_dates/2011_11_01.tif +data/processed_data/most_recent_burn_dates/2011_12_01.tif +data/processed_data/most_recent_burn_dates/2012_01_01.tif +data/processed_data/most_recent_burn_dates/2012_02_01.tif +data/processed_data/most_recent_burn_dates/2012_03_01.tif +data/processed_data/most_recent_burn_dates/2012_04_01.tif +data/processed_data/most_recent_burn_dates/2012_05_01.tif +data/processed_data/most_recent_burn_dates/2012_06_01.tif +data/processed_data/most_recent_burn_dates/2012_07_01.tif +data/processed_data/most_recent_burn_dates/2012_08_01.tif +data/processed_data/most_recent_burn_dates/2012_09_01.tif +data/processed_data/most_recent_burn_dates/2012_10_01.tif +data/processed_data/most_recent_burn_dates/2012_11_01.tif +data/processed_data/most_recent_burn_dates/2012_12_01.tif +data/processed_data/most_recent_burn_dates/2013_01_01.tif +data/processed_data/most_recent_burn_dates/2013_02_01.tif +data/processed_data/most_recent_burn_dates/2013_03_01.tif +data/processed_data/most_recent_burn_dates/2013_04_01.tif +data/processed_data/most_recent_burn_dates/2013_05_01.tif +data/processed_data/most_recent_burn_dates/2013_06_01.tif +data/processed_data/most_recent_burn_dates/2013_07_01.tif +data/processed_data/most_recent_burn_dates/2013_08_01.tif +data/processed_data/most_recent_burn_dates/2013_09_01.tif +data/processed_data/most_recent_burn_dates/2013_10_01.tif +data/processed_data/most_recent_burn_dates/2013_11_01.tif +data/processed_data/most_recent_burn_dates/2013_12_01.tif +data/processed_data/most_recent_burn_dates/2014_01_01.tif +data/processed_data/most_recent_burn_dates/2014_02_01.tif +data/processed_data/most_recent_burn_dates/2014_03_01.tif +data/processed_data/most_recent_burn_dates/2014_04_01.tif +data/processed_data/most_recent_burn_dates/2014_05_01.tif +data/processed_data/most_recent_burn_dates/2014_06_01.tif +data/processed_data/most_recent_burn_dates/2014_07_01.tif +data/processed_data/most_recent_burn_dates/2014_08_01.tif +data/processed_data/most_recent_burn_dates/2014_09_01.tif +data/processed_data/most_recent_burn_dates/2014_10_01.tif +data/processed_data/most_recent_burn_dates/2014_11_01.tif +data/processed_data/most_recent_burn_dates/2014_12_01.tif +data/processed_data/most_recent_burn_dates/2015_01_01.tif +data/processed_data/most_recent_burn_dates/2015_02_01.tif +data/processed_data/most_recent_burn_dates/2015_03_01.tif +data/processed_data/most_recent_burn_dates/2015_04_01.tif +data/processed_data/most_recent_burn_dates/2015_05_01.tif +data/processed_data/most_recent_burn_dates/2015_06_01.tif +data/processed_data/most_recent_burn_dates/2015_07_01.tif +data/processed_data/most_recent_burn_dates/2015_08_01.tif +data/processed_data/most_recent_burn_dates/2015_09_01.tif +data/processed_data/most_recent_burn_dates/2015_10_01.tif +data/processed_data/most_recent_burn_dates/2015_11_01.tif +data/processed_data/most_recent_burn_dates/2015_12_01.tif +data/processed_data/most_recent_burn_dates/2016_01_01.tif +data/processed_data/most_recent_burn_dates/2016_02_01.tif +data/processed_data/most_recent_burn_dates/2016_03_01.tif +data/processed_data/most_recent_burn_dates/2016_04_01.tif +data/processed_data/most_recent_burn_dates/2016_05_01.tif +data/processed_data/most_recent_burn_dates/2016_06_01.tif +data/processed_data/most_recent_burn_dates/2016_07_01.tif +data/processed_data/most_recent_burn_dates/2016_08_01.tif +data/processed_data/most_recent_burn_dates/2016_09_01.tif +data/processed_data/most_recent_burn_dates/2016_10_01.tif +data/processed_data/most_recent_burn_dates/2016_11_01.tif +data/processed_data/most_recent_burn_dates/2016_12_01.tif +data/processed_data/most_recent_burn_dates/2017_01_01.tif +data/processed_data/most_recent_burn_dates/2017_02_01.tif +data/processed_data/most_recent_burn_dates/2017_03_01.tif +data/processed_data/most_recent_burn_dates/2017_04_01.tif +data/processed_data/most_recent_burn_dates/2017_05_01.tif +data/processed_data/most_recent_burn_dates/2017_06_01.tif +data/processed_data/most_recent_burn_dates/2017_07_01.tif +data/processed_data/most_recent_burn_dates/2017_08_01.tif +data/processed_data/most_recent_burn_dates/2017_09_01.tif +data/processed_data/most_recent_burn_dates/2017_10_01.tif +data/processed_data/most_recent_burn_dates/2017_11_01.tif +data/processed_data/most_recent_burn_dates/2017_12_01.tif +data/processed_data/most_recent_burn_dates/2018_01_01.tif +data/processed_data/most_recent_burn_dates/2018_02_01.tif +data/processed_data/most_recent_burn_dates/2018_03_01.tif +data/processed_data/most_recent_burn_dates/2018_04_01.tif +data/processed_data/most_recent_burn_dates/2018_05_01.tif +data/processed_data/most_recent_burn_dates/2018_06_01.tif +data/processed_data/most_recent_burn_dates/2018_07_01.tif +data/processed_data/most_recent_burn_dates/2018_08_01.tif +data/processed_data/most_recent_burn_dates/2018_09_01.tif +data/processed_data/most_recent_burn_dates/2018_10_01.tif +data/processed_data/most_recent_burn_dates/2018_11_01.tif +data/processed_data/most_recent_burn_dates/2018_12_01.tif +data/processed_data/most_recent_burn_dates/2019_01_01.tif +data/processed_data/most_recent_burn_dates/2019_02_01.tif +data/processed_data/most_recent_burn_dates/2019_03_01.tif +data/processed_data/most_recent_burn_dates/2019_04_01.tif +data/processed_data/most_recent_burn_dates/2019_05_01.tif +data/processed_data/most_recent_burn_dates/2019_06_01.tif +data/processed_data/most_recent_burn_dates/2019_07_01.tif +data/processed_data/most_recent_burn_dates/2019_08_01.tif +data/processed_data/most_recent_burn_dates/2019_09_01.tif +data/processed_data/most_recent_burn_dates/2019_10_01.tif +data/processed_data/most_recent_burn_dates/2019_11_01.tif +data/processed_data/most_recent_burn_dates/2019_12_01.tif +data/processed_data/most_recent_burn_dates/2020_01_01.tif +data/processed_data/most_recent_burn_dates/2020_02_01.tif +data/processed_data/most_recent_burn_dates/2020_03_01.tif +data/processed_data/most_recent_burn_dates/2020_04_01.tif +data/processed_data/most_recent_burn_dates/2020_05_01.tif +data/processed_data/most_recent_burn_dates/2020_06_01.tif +data/processed_data/most_recent_burn_dates/2020_07_01.tif +data/processed_data/most_recent_burn_dates/2020_08_01.tif +data/processed_data/most_recent_burn_dates/2020_09_01.tif +data/processed_data/most_recent_burn_dates/2020_10_01.tif +data/processed_data/most_recent_burn_dates/2020_11_01.tif +data/processed_data/most_recent_burn_dates/2020_12_01.tif +data/processed_data/most_recent_burn_dates/2021_01_01.tif +data/processed_data/most_recent_burn_dates/2021_02_01.tif +data/processed_data/most_recent_burn_dates/2021_03_01.tif +data/processed_data/most_recent_burn_dates/2021_04_01.tif +data/processed_data/most_recent_burn_dates/2021_05_01.tif +data/processed_data/most_recent_burn_dates/2021_06_01.tif +data/processed_data/most_recent_burn_dates/2021_07_01.tif +data/processed_data/most_recent_burn_dates/2021_08_01.tif +data/processed_data/most_recent_burn_dates/2021_09_01.tif +data/processed_data/most_recent_burn_dates/2021_10_01.tif +data/processed_data/most_recent_burn_dates/2021_11_01.tif +data/processed_data/most_recent_burn_dates/2021_12_01.tif +data/processed_data/ndvi_relative_time_since_fire/2000_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2000_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2000_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2000_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2000_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2000_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2000_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2000_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2000_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2000_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2000_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2000_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2000_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2000_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2000_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2000_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2000_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2000_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2000_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2000_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2001_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2001_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2001_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2001_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2001_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2001_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2001_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2001_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2001_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2001_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2001_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2001_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2001_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2001_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2001_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2001_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2001_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2001_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2001_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2001_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2001_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2001_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2001_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2002_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2002_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2002_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2002_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2002_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2002_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2002_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2002_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2002_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2002_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2002_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2002_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2002_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2002_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2002_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2002_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2002_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2002_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2002_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2002_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2002_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2002_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2002_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2003_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2003_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2003_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2003_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2003_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2003_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2003_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2003_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2003_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2003_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2003_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2003_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2003_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2003_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2003_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2003_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2003_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2003_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2003_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2003_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2003_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2003_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2003_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2004_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2004_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2004_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2004_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2004_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2004_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2004_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2004_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2004_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2004_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2004_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2004_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2004_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2004_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2004_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2004_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2004_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2004_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2004_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2004_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2004_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2004_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2004_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2005_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2005_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2005_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2005_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2005_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2005_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2005_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2005_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2005_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2005_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2005_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2005_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2005_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2005_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2005_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2005_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2005_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2005_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2005_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2005_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2005_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2005_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2005_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2006_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2006_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2006_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2006_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2006_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2006_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2006_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2006_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2006_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2006_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2006_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2006_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2006_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2006_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2006_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2006_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2006_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2006_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2006_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2006_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2006_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2006_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2006_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2007_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2007_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2007_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2007_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2007_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2007_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2007_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2007_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2007_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2007_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2007_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2007_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2007_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2007_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2007_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2007_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2007_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2007_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2007_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2007_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2007_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2007_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2007_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2008_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2008_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2008_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2008_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2008_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2008_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2008_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2008_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2008_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2008_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2008_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2008_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2008_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2008_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2008_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2008_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2008_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2008_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2008_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2008_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2008_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2008_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2008_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2009_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2009_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2009_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2009_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2009_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2009_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2009_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2009_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2009_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2009_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2009_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2009_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2009_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2009_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2009_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2009_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2009_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2009_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2009_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2009_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2009_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2009_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2009_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2010_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2010_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2010_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2010_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2010_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2010_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2010_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2010_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2010_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2010_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2010_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2010_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2010_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2010_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2010_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2010_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2010_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2010_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2010_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2010_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2010_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2010_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2010_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2011_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2011_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2011_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2011_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2011_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2011_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2011_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2011_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2011_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2011_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2011_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2011_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2011_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2011_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2011_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2011_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2011_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2011_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2011_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2011_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2011_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2011_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2011_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2012_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2012_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2012_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2012_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2012_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2012_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2012_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2012_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2012_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2012_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2012_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2012_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2012_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2012_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2012_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2012_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2012_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2012_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2012_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2012_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2012_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2012_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2012_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2013_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2013_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2013_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2013_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2013_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2013_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2013_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2013_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2013_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2013_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2013_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2013_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2013_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2013_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2013_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2013_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2013_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2013_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2013_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2013_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2013_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2013_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2013_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2014_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2014_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2014_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2014_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2014_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2014_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2014_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2014_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2014_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2014_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2014_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2014_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2014_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2014_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2014_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2014_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2014_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2014_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2014_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2014_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2014_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2014_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2014_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2015_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2015_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2015_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2015_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2015_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2015_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2015_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2015_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2015_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2015_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2015_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2015_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2015_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2015_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2015_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2015_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2015_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2015_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2015_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2015_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2015_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2015_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2015_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2016_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2016_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2016_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2016_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2016_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2016_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2016_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2016_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2016_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2016_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2016_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2016_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2016_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2016_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2016_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2016_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2016_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2016_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2016_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2016_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2016_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2016_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2016_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2017_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2017_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2017_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2017_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2017_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2017_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2017_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2017_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2017_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2017_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2017_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2017_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2017_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2017_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2017_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2017_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2017_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2017_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2017_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2017_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2017_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2017_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2017_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2018_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2018_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2018_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2018_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2018_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2018_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2018_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2018_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2018_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2018_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2018_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2018_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2018_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2018_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2018_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2018_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2018_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2018_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2018_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2018_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2018_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2018_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2018_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2019_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2019_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2019_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2019_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2019_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2019_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2019_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2019_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2019_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2019_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2019_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2019_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2019_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2019_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2019_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2019_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2019_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2019_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2019_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2019_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2019_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2019_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2019_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2020_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2020_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2020_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2020_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2020_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2020_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2020_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2020_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2020_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2020_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2020_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2020_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2020_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2020_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2020_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2020_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2020_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2020_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2020_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2020_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2020_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2020_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2020_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2021_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2021_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2021_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2021_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2021_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2021_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2021_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2021_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2021_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2021_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2021_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2021_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2021_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2021_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2021_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2021_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2021_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2021_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2021_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2021_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2021_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2021_12_03.tif +data/processed_data/precipitation_chelsa/CHELSA_prec_01_V1.2_land_clipped.tif +data/processed_data/precipitation_chelsa/CHELSA_prec_07_V1.2_land_clipped.tif +data/raw_data/alos/alos_chili.tif +data/raw_data/alos/alos_mtpi.tif +data/raw_data/alos/alos_topographic_diversity.tif +data/raw_data/alos/landforms.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_01_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_02_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_03_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_04_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_05_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_06_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_07_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_08_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_09_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_10_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_11_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_12_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_13_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_14_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_15_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_16_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_17_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_18_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_19_V1.2_clipped.tif +data/raw_data/climate_chelsa/chelsa_citation.bib +data/raw_data/clouds_wilson/MODCF_interannualSD.tif +data/raw_data/clouds_wilson/MODCF_intraannualSD.tif +data/raw_data/clouds_wilson/MODCF_meanannual.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_01.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_02.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_03.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_04.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_05.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_06.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_07.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_08.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_09.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_10.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_11.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_12.tif +data/raw_data/clouds_wilson/MODCF_seasonality_concentration.tif +data/raw_data/clouds_wilson/MODCF_seasonality_rgb.tif +data/raw_data/clouds_wilson/MODCF_seasonality_theta.tif +data/raw_data/clouds_wilson/MODCF_seasonality_visct.tif +data/raw_data/clouds_wilson/MODCF_spatialSD_1deg.tif +data/raw_data/elevation_nasadem/nasadem.tif +data/raw_data/fire_modis/2021_11_01.tif +data/raw_data/fire_modis/2021_12_01.tif +data/raw_data/kndvi_modis/.tif +data/raw_data/landcover_za/SA_NLC_2020_GEO.tif +data/raw_data/landcover_za/SA_NLC_2020_GEO.tif.vat.cpg +data/raw_data/landcover_za/SA_NLC_2020_GEO.tif.vat.dbf +data/raw_data/ndvi_dates_modis/.tif +data/raw_data/ndvi_dates_modis/2022_01_01.tif +data/raw_data/ndvi_dates_modis/2022_01_17.tif +data/raw_data/ndvi_modis/.tif +data/raw_data/ndvi_modis/2022_01_01.tif +data/raw_data/ndvi_modis/2022_01_17.tif +data/raw_data/precipitation_chelsa/chelsa_citation.bib +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_01_V1.2_land_clipped.grd +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_01_V1.2_land_clipped.gri +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_01_V1.2_land_clipped.tif +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_07_V1.2_land_clipped.grd +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_07_V1.2_land_clipped.gri +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_07_V1.2_land_clipped.tif +data/remnant_distance.tif +data/remnants.tif +firemodel_predict +index.md +index_files/figure-gfm/p1-1.png +index_files/figure-gfm/plot-1.png +scratch_code/test.zip +scratch_code/wc2.1_10m_tmin_01.tif +data/raw_data/fire_modis/log.csv +data/raw_data/ndvi_dates_modis/log.csv +data/raw_data/ndvi_modis/log.csv diff --git a/DESCRIPTION b/DESCRIPTION index 9bf7a592..eb4c5312 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,10 +1,10 @@ Package: EMMAv1 Type: Project Title: EMMA Targets Workflow -Version: 0.1.0 +Version: 0.2.0 Author: Adam M. Wilson Maintainer: Adam M. Wilson - Description: Example targets workflow for GitHub actions + Description: EMMA data workflow using targets, AppEEARS, and GitHub releases License: MIT + file LICENSE Encoding: UTF-8 LazyData: true @@ -14,12 +14,32 @@ Imports: viridis, colourvalues, sf, - raster, + terra, + stars, testthat, kableExtra, knitr, - cmdstanr, - posterior, - bayesplot + appeears, + piggyback, + lubridate, + jsonlite, + dplyr, + arrow, + targets, + tarchetypes, + visNetwork, + rdryad, + keyring, + filelock, + sfarrow, + geotargets, + janitor, + ncdf4, + devtools, + smoothr, + piggyback Suggests: + rgee, + reticulate, + raster, RoxygenNote: 7.1.1 diff --git a/IMPLEMENTATION_SUMMARY.txt b/IMPLEMENTATION_SUMMARY.txt new file mode 100644 index 00000000..4fb37614 --- /dev/null +++ b/IMPLEMENTATION_SUMMARY.txt @@ -0,0 +1,190 @@ +# MODIS VI Monthly Download Implementation - Summary + +## Implementation Date +February 23, 2026 + +## Overview +Refactored MODIS VI data downloading from a single monolithic AppEEARS request to a month-by-month approach with dynamic branching in the targets workflow. + +## Changes Made + +### 1. New File: `R/modis_vi_monthly_helpers.R` +**Purpose**: Helper functions for month management and aggregation + +**Functions**: +- `generate_month_sequence()` - Creates all months within a date range +- `identify_missing_months()` - Detects which months need downloading +- `aggregate_modis_vi_monthly()` - Combines monthly files into single NetCDF +- `create_modis_vi_monthly_index()` - Creates parquet index of monthly files + +**Key Features**: +- Supports both "prime" (all months) and "update" (recent months) modes +- Automatic detection of missing months based on output directory +- Parallelization-ready: dynamic branching identifies independent work units + +### 2. Updated File: `R/get_modis_vi.R` +**Added Functions**: +- `submit_modis_vi_month()` - Submits single month to AppEEARS (new) +- `download_modis_vi_month()` - Downloads and processes single month (new) + +**Kept Functions** (for backward compatibility): +- `submit_modis_vi_task()` - Original monolithic submission (deprecated) +- `download_modis_vi_results()` - Original monolithic download (deprecated) + +**Size**: Added ~280 lines of code (functions well-documented with roxygen2 comments) + +### 3. Updated File: `_targets.R` +**Replaced Targets**: +- `modis_vi_task_id` → New dynamic branching workflow +- `modis_vi` → New monthly download targets + +**New Targets** (lines 288-387): +1. **`modis_vi_months_to_download`** - Identifies missing months +2. **`modis_vi_month_task_ids`** - Dynamic branching: submits each month +3. **`modis_vi_monthly_files`** - Dynamic branching: downloads each month +4. **`modis_vi_monthly_index`** - Creates parquet index of all files +5. **`modis_vi`** (commented) - Optional aggregation to single file + +**Improvements**: +- Added descriptive comment block explaining the new approach +- Dynamic branching enables parallelization (2+ workers) +- Monthly granularity enables natural incremental updates +- Resilience: Single month failure doesn't cascade + +### 4. New File: `R/MODIS_VI_MONTHLY_README.md` +**Purpose**: User documentation and implementation guide + +**Sections**: +- How It Works (overview of 5-step pipeline) +- File Structure (output directory layout) +- Migration notes (old vs new approach) +- Parallelization instructions +- Downstream usage examples +- Troubleshooting guide +- Future enhancements + +## Technical Details + +### Month Sequence Generation +``` +2000-02 (49 days) → 2000-03, 2000-04, ... → 2026-02 +Total: 313 months +``` + +### Dynamic Branching Pattern +```r +tar_target(months_to_download, ...) %>% # Identify work + tar_target(monthly_tasks, ..., # One task per month + pattern = map(months_to_download) + ) %>% + tar_target(monthly_files, ..., # One download per task + pattern = map(monthly_tasks) + ) +``` + +### File Naming Convention +- Input: Monthly NetCDF files from AppEEARS +- Output: `modis_vi_YYYY_MM.nc` (e.g., `modis_vi_2000_02.nc`) +- Index: `modis_vi_monthly_index.parquet` + +### Parallelization Potential +- **Current**: Single-processor (sequential) +- **Potential with GitHub Actions**: 2 workers → ~2x speedup +- **Potential on CCR cluster**: 8+ workers → ~8x speedup + +## Backward Compatibility + +- Old functions (`submit_modis_vi_task`, `download_modis_vi_results`) remain available +- Can revert to monolithic approach if needed by uncommenting old targets +- New functions follow consistent naming and parameter patterns + +## Testing + +✓ **Syntax validation**: `_targets.R` parses successfully +✓ **Function loading**: All new functions source without errors +✓ **Month sequence**: Generates 313 months correctly (2000-02 to 2026-02) +✓ **Code organization**: Follows existing project patterns + +## Next Steps for User + +### Option 1: Immediate Testing (Recommended) +```r +# Test month identification locally +source("R/modis_vi_monthly_helpers.R") +missing_months <- identify_missing_months( + output_dir = "data/target_outputs/modis_vi_monthly", + start_date = "2025-01-01", + end_date = "2025-12-31" +) +# Should return months not yet in output directory +``` + +### Option 2: Run Full Pipeline (Prime Mode) +```bash +cd /Users/adamw/Documents/repos/emma/emma_envdata +Rscript -e "targets::tar_make()" +``` +- Downloads all months from 2000-02 to present +- First run creates 313 monthly files (~1-2 TB total) +- Subsequent runs only add new months + +### Option 3: Enable Parallelization +Edit `.github/workflows/targets.yaml` line ~97: +```yaml +# Old: Single processor +Rscript -e "targets::tar_make()" + +# New: Two processors (GitHub Actions) +Rscript -e "targets::tar_make_future(workers = 2)" +``` + +### Option 4: Keep Monthly Files Separate +Default behavior keeps monthly NetCDF files separate. To aggregate: +1. Uncomment the `modis_vi` target in `_targets.R` (lines 389-407) +2. Run pipeline: `targets::tar_make()` +3. Creates `modis_vi_combined.nc` with all months stacked + +## Performance Characteristics + +### Prime Mode (First Run) +- 313 months, ~5-10 GB per month per format +- Sequential: ~24-48 hours (depends on AppEEARS load) +- With 2 workers: ~12-24 hours +- Network: Heavy (100+ GB total download) + +### Update Mode (GitHub Actions) +- Last 3 months only (~20 GB) +- Sequential: ~30-60 minutes +- With 2 workers: ~15-30 minutes +- Network: Light per run, but frequent (weekly) + +### File Storage +- Monthly files: ~500-600 GB for 26 years (5-10 GB/month × 313) +- Index file: ~10 KB (parquet) +- Optional combined file: 150-200 GB (if aggregated) + +## Potential Issues & Solutions + +### Issue 1: AppEEARS Timeout +**Symptom**: "Task polling timed out after 120 minutes" +**Solution**: Increase `max_retries` in `download_modis_vi_month()` or wait for AppEEARS recovery + +### Issue 2: Memory Issues with Aggregation +**Symptom**: "Cannot allocate vector of size X GB" +**Solution**: Keep monthly files separate (default); aggregate only if needed + +### Issue 3: Inconsistent Results Between Months +**Symptom**: Different projection/grid in different months +**Solution**: All months use same domain template (`domain_raster`); shouldn't occur + +## Documentation +- Inline comments in code explain each function +- MODIS_VI_MONTHLY_README.md provides user guide +- This summary document (IMPLEMENTATION_SUMMARY.txt) + +## Rollback Plan +If issues arise, can revert to old approach: +1. Restore old targets in `_targets.R` (lines 287-305 commented out) +2. Remove monthly targets (lines 288-387) +3. Re-enable: `modis_vi_task_id` and `modis_vi` +4. Keep monthly files in `modis_vi_monthly/` directory (separate from pipeline) diff --git a/OBJECTS_RELEASE.md b/OBJECTS_RELEASE.md new file mode 100644 index 00000000..fa67a3de --- /dev/null +++ b/OBJECTS_RELEASE.md @@ -0,0 +1,129 @@ +# Target Objects Release (`objects_current`) + +This GitHub release contains cached computational artifacts from the emma_envdata workflow pipeline using content-addressable storage. Objects are stored with hash-based filenames for deduplication and efficient caching, enabling the workflow to avoid redundant computation of expensive intermediate datasets. + +## Contents + +This release stores two types of objects: + +### File Outputs (Spatial Data) +Published directly as files on the release such as parquet and netCDF files. However, due to the targets workflow's content-addressable storage system, these files are referenced by their content hash in the workflow metadata. The targets workflow automatically manages hash lookups and downloads based on content. + +### Serialized R Objects (Intermediate Results) +Stored with hash-based filenames (content-addressable storage) for efficient deduplication. These intermediate objects are serialized as QS files (`.qs`) and referenced by content hash on the release page. The targets workflow automatically manages hash lookups and downloads based on content. + + +## How the Workflow Uses These Objects + +### Prime Mode (Full Processing) +When running on the analysis server (`run_mode = "prime"`), the workflow: +1. **Retrieves** objects from this release using the `tar_github_release_repo()` backend +2. **Caches locally** in `data/target_outputs/.tar_cache/` for speed +3. **Recomputes** targets only if: + - Source code has changed + - Input data has changed + - Objects are manually invalidated with `tar_invalidate()` +4. **Uploads** new/modified targets back to this release + +### Update Mode (GitHub Actions) +When running on GitHub Actions (`run_mode = "update"`), the workflow: +1. **Retrieves** all cached objects from this release +2. **Never recomputes** (cue mode = "never") to save CI/CD time +3. **Uses cached objects** for downstream operations only +4. **Skips** expensive computations (elevation API calls, climate downloads) unless manually invalidated + +This separation allows: +- **Local development** with full control and recomputation +- **Efficient CI/CD** that leverages pre-computed intermediate results +- **Reproducibility** by pinning exact object versions in the release + +## File Formats & Storage + +### Spatial Files (NetCDF) +Published with human-readable filenames on the release: +- `.nc` files are CF-1.8 compliant netCDF4 format +- Include geospatial metadata (CRS, bounds, variable attributes) +- Can be read with standard tools (GDAL, xarray, R terra/ncdf4) + +### Serialized Objects (QS Format) +Stored with hash-based filenames (content-addressable storage): +- `.qs` files are R object serializations (fast, lossless) +- Filenames are SHA-256 hashes of content +- Hash naming enables deduplication: identical objects share one file +- Managed transparently by targets—humans don't interact with hashes directly +- Only the workflow's metadata tracks which hash corresponds to which target + +## When Objects Are Updated + +Objects in this release are regenerated and pushed automatically when: +1. Running `tar_make()` on the analysis server with changes to: + - R functions in `R/` folder + - Data download URLs or APIs + - Target definitions in `_targets.R` +2. Manual `tar_make(targets = "target_name")` calls +3. Scheduled workflows or CI/CD pipelines + +## Accessing Objects + +### Automatic (Preferred) +Objects are automatically retrieved by `tar_load()` and `tar_read()`: +```r +tar_load(elevation) # Loads from cache or downloads from release +``` + +### Manual Download +To download specific objects manually: +```bash +gh release download objects_current --dir data/target_outputs +``` + +## Cache Management + +The local cache in `data/target_outputs/.tar_cache/` can be cleared to force re-downloads: +```r +unlink("data/target_outputs/.tar_cache", recursive = TRUE) +tar_make() # Will re-download from release +``` + +## Hash-to-File Mapping + +The targets metadata stores the relationship between hash-based filenames and human-readable target names. To view this mapping: + +```r +# Show all targets with their store information +tar_manifest() %>% + select(name, type, path, repository) %>% + filter(!is.na(path)) # Only file-based targets +``` + +This shows: +- **name**: Target name (e.g., `domain_boundary.parquet`, `elevation`) +- **type**: Object type (e.g., "file", "qs") +- **path**: Output file path (for file targets like NetCDF) +- **repository**: Storage location (gh_repo for GitHub release objects) + +For serialized R objects without human-readable filenames, the mapping is stored in `_targets/meta/objects/` as metadata files that track content hashes. + +## Troubleshooting + +**Objects not loading?** +- Check GitHub credentials: `gitcreds::gitcreds_set()` +- Verify network connectivity +- Clear cache and retry: `unlink("data/target_outputs/.tar_cache", recursive = TRUE)` + +**Out-of-sync objects?** +- Invalidate and recompute: `tar_invalidate(target_name)` +- Rebuild all: `tar_destroy(); tar_make()` + +**Need to recompute everything?** +```r +unlink("_targets", recursive = TRUE) # Clear all metadata +unlink("data/target_outputs/.tar_cache", recursive = TRUE) # Clear cache +tar_make() # Recompute all targets +``` + +## Related Files + +- [`_targets.R`](https://github.com/AdamWilsonLab/emma_envdata/blob/main/_targets.R) - Workflow pipeline definition +- [`R/`](https://github.com/AdamWilsonLab/emma_envdata/tree/main/R) - R functions that generate these objects +- [DESCRIPTION](https://github.com/AdamWilsonLab/emma_envdata/blob/main/DESCRIPTION) - Package dependencies diff --git a/R/MODIS_VI_MONTHLY_README.md b/R/MODIS_VI_MONTHLY_README.md new file mode 100644 index 00000000..c93765fc --- /dev/null +++ b/R/MODIS_VI_MONTHLY_README.md @@ -0,0 +1,151 @@ +# MODIS VI Monthly Download Implementation Guide + +## Overview + +As of February 2026, MODIS VI data is downloaded **month-by-month** instead of in a single monolithic request. This improves resilience, enables parallelization, and simplifies incremental updates. + +## How It Works + +### 1. Month Identification (`modis_vi_months_to_download`) +- Generates full sequence of months from start date to present +- Checks which months already exist in `data/target_outputs/modis_vi_monthly/` +- Returns only missing months for downstream processing +- **Prime mode**: Downloads all months from 2000-02-18 to present +- **Update mode**: Downloads last ~3 months (to recapture any missed dates) + +### 2. Task Submission (`modis_vi_month_task_ids`) +- **Dynamic branching**: One task per missing month +- Each task submits a single month to AppEEARS API +- Returns task ID for downstream polling +- With 2 workers: Can submit 2 months simultaneously + +### 3. Download & Processing (`modis_vi_monthly_files`) +- **Dynamic branching**: Polls and downloads each month independently +- Applies QA masking to EVI data +- Projects to domain CRS and grid +- Outputs: Individual NetCDF file per month (format: `modis_vi_YYYY_MM.nc`) +- With 2 workers: Can download 2 months simultaneously + +### 4. Indexing (`modis_vi_monthly_index`) +- Creates parquet summary of all monthly files +- Maps: month → file path, size, creation date +- Useful for downstream analysis tools to discover available data + +### 5. Optional Aggregation (Commented Out) +- Can combine all months into single NetCDF file +- Uncomment the `modis_vi` target in `_targets.R` if needed +- Trade-off: Single file easier to use, but loses monthly granularity + +## File Structure + +``` +data/ +├── target_outputs/ +│ ├── modis_vi_monthly/ # Monthly NetCDF files +│ │ ├── modis_vi_2000_02.nc +│ │ ├── modis_vi_2000_03.nc +│ │ └── ... (1 file per month) +│ └── modis_vi_monthly_index.parquet # Index of all monthly files +``` + +## Migration from Old Approach + +**Old approach** (commented-out in current code): +- Single AppEEARS request for entire date range (26+ years) +- Returns one massive download +- Failure means entire run fails +- "Update mode" creates separate file and requires reconciliation + +**New approach**: +- 312 independent AppEEARS requests (one per month) +- Each month ~5-10 GB per format (NDVI, EVI, QA) +- Failure of month N doesn't affect other months +- "Update mode" naturally only downloads missing months +- Targets automatically parallelizes: with 2 workers, ~156 parallel jobs instead of 1 serial job + +## Parallelization + +The current GitHub Actions workflow runs single-processor. To enable parallelization: + +In `_targets.R` line ~97, change: +```r +Rscript -e "targets::tar_make()" +``` + +To: +```r +Rscript -e "targets::tar_make_future(workers = 2)" +``` + +This will download up to 2 months simultaneously, ~2x speedup for full historical runs. + +## Resuming Interrupted Runs + +If a GitHub Actions run times out mid-way: +1. The completed monthly files are already saved +2. On next run, `modis_vi_months_to_download` will detect and skip them +3. Only missing months are re-downloaded +4. No re-submission of already-completed AppEEARS tasks needed + +## Downstream Usage + +### Access All Monthly Data +```r +# Load the index +library(arrow) +monthly_index <- read_parquet("data/target_outputs/modis_vi_monthly_index.parquet") + +# Load specific month(s) +ndvi_jan_2020 <- terra::rast( + monthly_index$file_path[monthly_index$month == "2020-01-01"] +) +``` + +### Access Time Series Data +```r +# Read all months as stacked raster +monthly_files <- sort(list.files( + "data/target_outputs/modis_vi_monthly", + pattern = "modis_vi_.*\\.nc$", + full.names = TRUE +)) +ndvi_timeseries <- terra::rast(monthly_files) # Stacked raster +``` + +### Aggregate After Pipeline Completes +If needed, aggregate monthly files manually: +```r +# After all months downloaded, aggregate to single file +r::source("R/modis_vi_monthly_helpers.R") + +aggregate_modis_vi_monthly( + monthly_files = sort(list.files(...)), + out_file = "data/target_outputs/modis_vi_combined.nc" +) +``` + +## Future Enhancements + +Potential improvements: +1. **Parallel download speeds**: Currently 2 workers (limited by GitHub Actions CPU); CCR cluster supports more +2. **Tighter incremental updates**: Current "update mode" re-downloads last 3 months; could be refined to only new data +3. **QA statistics**: Track which months had failed pixels, guide re-processing +4. **Data subsetting**: Support downloading specific regions instead of full domain +5. **Format flexibility**: Consider keeping data as monthly parquet files instead of NetCDF for model consumption + +## Troubleshooting + +### "No NetCDF files downloaded from AppEEARS" +- AppEEARS task failed to complete +- Check AppEEARS API status (may be temporarily down) +- Verify domain geometry is valid (simplify step in `submit_modis_vi_month()`) +- Manual retry: Delete month file from `modis_vi_monthly/` and re-run targets + +### "modis_vi_monthly_index not found" +- Monthly downloads still in progress (check GitHub Actions logs) +- Or all months already exist and no work was done (expected in updates) + +### Memory issues with aggregation +- Monthly files are large (~5-10 GB each) +- If aggregating many months, may need to increase memory or process subset +- Better solution: Keep monthly files separate, access via index diff --git a/R/appeears_auth.R b/R/appeears_auth.R new file mode 100644 index 00000000..2ec66a98 --- /dev/null +++ b/R/appeears_auth.R @@ -0,0 +1,42 @@ +library(appeears) + +# AppEEARS authentication via keyring (no .netrc) +earthdata_user <- Sys.getenv("EARTHDATA_USER") +earthdata_pass <- Sys.getenv("EARTHDATA_PASSWORD") + +if (earthdata_user != "" && earthdata_pass != "") { + message("Setting up NASA EarthData authentication (keyring file backend)") + + # Configure file keyring backend and location + if (Sys.getenv("R_KEYRING_PASSWORD") == "") { + Sys.setenv(R_KEYRING_PASSWORD = earthdata_pass) + } + if (Sys.getenv("R_KEYRING_FILE") == "") { + Sys.setenv(R_KEYRING_FILE = path.expand("~/.config/r-keyring/appeears.keyring")) + } + options(keyring_backend = "file") + suppressWarnings(dir.create(dirname(Sys.getenv("R_KEYRING_FILE")), recursive = TRUE, showWarnings = FALSE)) + + kr_name <- "appeears" + kr_pwd <- Sys.getenv("R_KEYRING_PASSWORD") + + # Create keyring only if missing + existing_kr <- tryCatch(keyring::keyring_list()$keyring, error = function(e) character(0)) + if (!(kr_name %in% existing_kr)) { + keyring::keyring_create(kr_name, password = kr_pwd) + } + + # Unlock if locked (non-interactive using env password) + if (keyring::keyring_is_locked(kr_name)) { + keyring::keyring_unlock(kr_name, password = kr_pwd) + } + + # Store credentials for appeears token refresh + suppressMessages(appeears::rs_set_key(user = earthdata_user, password = earthdata_pass)) + + # Authenticate (reads from keyring) + rstoken <- appeears::rs_login(earthdata_user) + message("AppEEARS authentication configured") +} else { + warning("EARTHDATA credentials not found. Set EARTHDATA_USER and EARTHDATA_PASSWORD environment variables.") +} diff --git a/R/ccr_startup.sh b/R/ccr_startup.sh new file mode 100644 index 00000000..6a187c46 --- /dev/null +++ b/R/ccr_startup.sh @@ -0,0 +1,29 @@ +#!/bin/bash + + +## Script to launch an interactive Apptainer session on CCR + +ssh vortex.ccr.buffalo.edu +salloc --cluster=faculty --qos=adamw --partition=adamw \ + --job-name=InteractiveJob --nodes=1 --ntasks=4 \ + --mem=10G -C INTEL --time=24:00:00 + + +export GROUP="adamw" +export PROJECT_FOLDER="/projects/academic/"$GROUP +export APPTAINER_CACHEDIR="/vscratch/grp-adamw/"$USER"/singularity" +export SIF_PATH=$PROJECT_FOLDER"/users/"$USER"/singularity" +export SIF_FILE="AdamWilsonLab-emma_docker-latest.sif" + +# set singularity cache and tmp directories to the same as apptainer +# needed because CCR is still using singularity and it will use these directories +export SINGULARITY_CACHEDIR=$APPTAINER_CACHEDIR +export SINGULARITY_TMPDIR=$APPTAINER_TMPDIR +export SINGULARITY_LOCALCACHEDIR=$APPTAINER_LOCALCACHEDIR + + +apptainer run \ + --bind $PROJECT_FOLDER:$PROJECT_FOLDER \ + --bind $APPTAINER_CACHEDIR/tmp:/tmp \ + --bind $APPTAINER_CACHEDIR/run:/run \ + $SIF_PATH/$SIF_FILE R diff --git a/R/data_chelsa.R b/R/data_chelsa.R new file mode 100644 index 00000000..b00b86fe --- /dev/null +++ b/R/data_chelsa.R @@ -0,0 +1,195 @@ +#R script to download climate data (CHELSA) + +library(terra) +library(ncdf4) + +#' @author Brian Maitner & Adam Wilson +#' @description This function will download CHELSA climate data if it isn't present, and (invisibly) return a NULL if it is present +#' @param temp_directory Where to save the files, defaults to "data/raw_data/climate_chelsa/" +#' @param domain domain (sf polygon) used for masking +#' @param tag Tag for the release +#' @param cleanup Logical. If TRUE (default, for GitHub Actions), clean temp directory before/after. If FALSE (local development), preserve cached files. +#' @import terra +get_chelsa <- function(temp_directory = "data/temp/raw_data/climate_chelsa/", + tag = "raw_static", + domain, + cleanup = TRUE){ + + #ensure temp directory is empty only if cleanup mode is enabled + + if(cleanup && dir.exists(temp_directory)){ + unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + } + + #make a directory if one doesn't exist yet + + if(!dir.exists(temp_directory)){ + dir.create(temp_directory,recursive = TRUE) + } + + + #Make sure there is a release by attempting to create one. If it already exists, this will fail + + tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", + tag = tag), + error = function(e){message("Previous release found")}) + + #Adjust the download timeout duration (this needs to be large enough to allow the download to complete) + + if(getOption('timeout') < 1000){ + options(timeout = 1000) + } + + + #Transform domain to wgs84 to get the coordinates + + # domain_extent <- + # domain %>% + # st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")@projargs)%>% + # extent() + + domain_tf <- + domain %>% + st_as_sf() %>% + sf::st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")) + + # Download the data + # Note that it would be useful to clip these to a polygon to save space + # It would also be useful if only the relevant data could be downloaded (rather than downloading and THEN pruning) + + # CF-compliant metadata for CHELSA bioclimatic variables + bio_metadata <- tribble( + ~bio_name, ~long_name, ~units, + "bio01", "Annual Mean Temperature", "°C * 10", + "bio02", "Mean Diurnal Range", "°C * 10", + "bio03", "Isothermality", "%", + "bio04", "Temperature Seasonality", "°C * 10", + "bio05", "Max Temperature of Warmest Month", "°C * 10", + "bio06", "Min Temperature of Coldest Month", "°C * 10", + "bio07", "Temperature Annual Range", "°C * 10", + "bio08", "Mean Temperature of Wettest Quarter", "°C * 10", + "bio09", "Mean Temperature of Driest Quarter", "°C * 10", + "bio10", "Mean Temperature of Warmest Quarter", "°C * 10", + "bio11", "Mean Temperature of Coldest Quarter", "°C * 10", + "bio12", "Annual Precipitation", "mm", + "bio13", "Precipitation of Wettest Month", "mm", + "bio14", "Precipitation of Driest Month", "mm", + "bio15", "Precipitation Seasonality", "%", + "bio16", "Precipitation of Wettest Quarter", "mm", + "bio17", "Precipitation of Driest Quarter", "mm", + "bio18", "Precipitation of Warmest Quarter", "mm", + "bio19", "Precipitation of Coldest Quarter", "mm" + ) + + # Record download date + download_date <- Sys.Date() + + for(idx in 1:nrow(bio_metadata)){ + i <- bio_metadata$bio_name[idx] + + # Construct filename + tif_filename <- file.path(temp_directory, paste("CHELSA_bio", sprintf("%02d", idx), "_1981-2010_V.2.1.tif", sep = "")) + + # Skip download if file already exists (when cleanup = FALSE, running locally) + if (!cleanup && file.exists(tif_filename)) { + message("File already exists, skipping download: ", basename(tif_filename)) + } else { + # Download the file + robust_download_file( + url = paste("https://os.unil.cloud.switch.ch/chelsa02/chelsa/global/bioclim/", i, "/1981-2010/CHELSA_bio", sprintf("%02d", idx), "_1981-2010_V.2.1.tif", sep = ""), + destfile = tif_filename, + max_attempts = 10, + sleep_time = 10 + ) + } + + # load + rast_i <- terra::rast(tif_filename) + + # crop + + rast_i <- terra::crop(x = rast_i, + y = ext(domain_tf)) + + # mask + rast_i <- + terra::mask(rast_i, + mask = terra::vect(domain_tf)) + + # Write as NetCDF with CF-compliant metadata + nc_filename <- file.path(temp_directory, paste("CHELSA_", i, "_1981-2010_V.2.1.nc", sep = "")) + + # Use terra's writeCDF function which creates NetCDF4 files + terra::writeCDF(x = rast_i, + filename = nc_filename, + overwrite = TRUE, + compression = 9) + + # Add CF-compliant metadata using ncdf4 package + nc_file <- ncdf4::nc_open(nc_filename, write = TRUE) + + # Get variable name (should be the first variable in the file) + var_name <- names(rast_i) + if (is.null(var_name) || var_name == "") { + var_name <- i + } + + # Get metadata for this bioclimatic variable + long_name <- bio_metadata$long_name[idx] + units <- bio_metadata$units[idx] + + # Add global attributes + ncdf4::ncatt_put(nc_file, 0, "title", + paste("CHELSA Bioclimatic Variable", i, sep = " ")) + ncdf4::ncatt_put(nc_file, 0, "source", "CHELSA v.2.1 (Climatologies at high resolution for the earth land areas)") + ncdf4::ncatt_put(nc_file, 0, "dataset_url", "https://chelsa-climate.org/") + ncdf4::ncatt_put(nc_file, 0, "download_date", as.character(download_date)) + ncdf4::ncatt_put(nc_file, 0, "temporal_range", "1981-2010") + ncdf4::ncatt_put(nc_file, 0, "Conventions", "CF-1.8") + ncdf4::ncatt_put(nc_file, 0, "history", + paste("Downloaded on", as.character(download_date), + "and clipped to domain. Processed using terra and ncdf4 R packages. ")) + + # Add variable attributes (long_name and units) + ncdf4::ncatt_put(nc_file, 1, "long_name", long_name) + ncdf4::ncatt_put(nc_file, 1, "units", units) + ncdf4::ncatt_put(nc_file, 1, "standard_name", paste("bioclimatic_variable_", i, sep = "")) + + ncdf4::nc_close(nc_file) + + rm(rast_i) + + } + + rm(i) + + # release + to_release <- + list.files(path = file.path(temp_directory), + recursive = TRUE, + full.names = TRUE) + + + to_release <- + to_release[grepl(pattern = "CHELSA", + ignore.case = TRUE, + x = basename(to_release))] + + # Filter for NetCDF files only + to_release <- to_release[grepl(pattern = "\\.nc$", x = to_release)] + + # pb_upload(repo = "AdamWilsonLab/emma_envdata", + # file = to_release, + # tag = tag) + + # delete directory and contents + # unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + + + + message("CHELSA climate files downloaded") + return(Sys.Date()) + + +} # end fx + diff --git a/R/data_vegmap.R b/R/data_vegmap.R new file mode 100644 index 00000000..7ac34596 --- /dev/null +++ b/R/data_vegmap.R @@ -0,0 +1,165 @@ +## Process Vegmap to add field related to biome type + +data_vegmap <- function(domain_raster, + vegmap_shp, + disagg_factor = 10, + out_file = "data/raw/vegmap.nc") { + + # Load domain raster (may be passed as file path or raster object) + domain <- if (is.character(domain_raster)) { + # If it's a file path, load the 'domain' variable from NetCDF + rast(domain_raster, subds = "domain") + } else { + domain_raster + } + + # Load and prep vegmap + vegmap_sf <- st_read(vegmap_shp, quiet = TRUE) %>% + janitor::clean_names() %>% + st_make_valid() %>% + st_transform(st_crs(domain, proj = TRUE)) %>% + st_intersection(st_as_sfc(st_bbox(domain))) |> #crop to domain + mutate(t_vegtypeid = as.numeric(factor(t_mapcode))) #create numeric vegtype ID + + # Create fine template to reduce sliver effects, then modal aggregate back + template_fine <- disagg(domain, disagg_factor) + + rasterize_modal <- function(field_name) { + r_fine <- terra::rasterize( + x = vect(vegmap_sf), + y = template_fine, + field = field_name, + touches = TRUE + ) + aggregated <- terra::aggregate(r_fine, disagg_factor, fun = "modal") + # Resample to exactly match domain grid (nearest neighbor for categorical) + terra::resample(aggregated, domain, method = "near") + } + + biome_raster <- rasterize_modal("t_biomeid") + bioregion_raster <- rasterize_modal("t_brgnid") + vegtype_raster <- rasterize_modal("t_vegtypeid") + + # Combine into multiband raster + multiband <- c(biome_raster, bioregion_raster, vegtype_raster) + names(multiband) <- c("vegbiome", "vegbioregion", "vegtype") + + # Mask to domain (set to NA where domain is NA) + domain_mask <- !is.na(domain) + multiband <- terra::mask(multiband, domain_mask, maskvalues = 0) + + # Lookup table for IDs -> names + lookup_tbl <- vegmap_sf %>% + st_drop_geometry() %>% + dplyr::select(t_biomeid, t_brgnid, t_vegtypeid, t_mapcode, t_name, t_biome, t_bioregio) %>% + dplyr::rename(vegbiome = t_biomeid, vegbioregion = t_brgnid, vegtype = t_vegtypeid) %>% + dplyr::distinct() + + # Create output file path (ensure directory exists) + output_file <- out_file + dir.create(dirname(output_file), recursive = TRUE, showWarnings = FALSE) + + # Get spatial extent and resolution for dimensions + ext <- ext(multiband) + dx <- res(multiband)[1] + dy <- res(multiband)[2] + + x_vals <- seq(ext$xmin + dx/2, ext$xmax - dx/2, by = dx) + y_vals <- seq(ext$ymax - dy/2, ext$ymin + dy/2, by = -dy) + + # Define dimensions with coordinate vectors + dim_x <- ncdf4::ncdim_def(name = "easting", units = "meter", vals = x_vals, longname = "easting") + dim_y <- ncdf4::ncdim_def(name = "northing", units = "meter", vals = y_vals, longname = "northing") + + # Define variables with compression level 9 for categorical data (storage as short integers) + var_biome <- ncdf4::ncvar_def( + name = "vegbiome", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Biome ID (biomeid_18)", + missval = -32768, + prec = "short", + compression = 9 + ) + + var_bioregion <- ncdf4::ncvar_def( + name = "vegbioregion", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Bioregion ID (brgnid_18)", + missval = -32768, + prec = "short", + compression = 9 + ) + + var_vegtype <- ncdf4::ncvar_def( + name = "vegtype", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Vegetation type code (mapcode18)", + missval = -32768, + prec = "short", + compression = 9 + ) + + # Create NetCDF file with all variables + unlink(output_file) + nc <- ncdf4::nc_create( + filename = output_file, + vars = list(var_biome, var_bioregion, var_vegtype), + force_v4 = TRUE + ) + + # Convert rasters to matrices, transpose to match dimension order, replace NAs with fill values + biome_matrix <- t(as.matrix(biome_raster, wide = TRUE)) + biome_matrix <- as.integer(biome_matrix) + biome_matrix[is.na(biome_matrix)] <- -32768 + + bioregion_matrix <- t(as.matrix(bioregion_raster, wide = TRUE)) + bioregion_matrix <- as.integer(bioregion_matrix) + bioregion_matrix[is.na(bioregion_matrix)] <- -32768 + + vegtype_matrix <- t(as.matrix(vegtype_raster, wide = TRUE)) + vegtype_matrix <- as.integer(vegtype_matrix) + vegtype_matrix[is.na(vegtype_matrix)] <- -32768 + + # Write data to variables + ncdf4::ncvar_put(nc, var_biome, biome_matrix) + ncdf4::ncvar_put(nc, var_bioregion, bioregion_matrix) + ncdf4::ncvar_put(nc, var_vegtype, vegtype_matrix) + + # Add global attributes + ncdf4::ncatt_put(nc, 0, "title", "Vegetation Map - Biome, Bioregion, and Vegetation Type") + ncdf4::ncatt_put(nc, 0, "source", "South Africa National Vegetation Map 2024") + ncdf4::ncatt_put(nc, 0, "history", paste0("created: ", Sys.time())) + ncdf4::ncatt_put(nc, 0, "crs", as.character(crs(multiband))) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + ncdf4::ncatt_put(nc, 0, "lookup_table_json", jsonlite::toJSON(lookup_tbl, dataframe = "rows", auto_unbox = TRUE)) + + # Add CRS variable for CF compliance and GIS compatibility + crs_var <- ncdf4::ncvar_def("crs", "", list(), prec = "integer") + nc <- ncdf4::ncvar_add(nc, crs_var) + + crs_wkt <- as.character(crs(multiband)) +# ncdf4::ncatt_put(nc, "crs", "grid_mapping_name", "albers_conical_equal_area") + ncdf4::ncatt_put(nc, "crs", "crs_wkt", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "spatial_ref", crs_wkt) + + # Add geotransform for GDAL compatibility + ncdf4::ncatt_put(nc, "crs", "GeoTransform", paste(ext$xmin, dx, 0, ext$ymax, 0, -dy)) + + # Add grid_mapping to data variables + ncdf4::ncatt_put(nc, "vegbiome", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "vegbioregion", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "vegtype", "grid_mapping", "crs") + + # Close file + ncdf4::nc_close(nc) + + return(output_file) +} + +if(F){ + test=rast(output_file) + plot(test) +} \ No newline at end of file diff --git a/R/domain_bbox.R b/R/domain_bbox.R new file mode 100644 index 00000000..ff64d241 --- /dev/null +++ b/R/domain_bbox.R @@ -0,0 +1,34 @@ +# Create buffered domain bounding box and write GeoParquet + +#' Create a buffered bounding box around the domain +#' +#' @param domain_parquet Path to domain polygon GeoParquet (output of domain_define). +#' @param buffer_m Numeric buffer distance in meters applied to the bbox (default 50 km). +#' @param out_file Output GeoParquet path (default data/raw/domain_bbox.parquet). +#' @return Character path to the written GeoParquet file. +#' @details Reads the domain polygon, builds its bounding box, converts to sf, buffers, and writes to GeoParquet. +make_domain_bbox <- function(domain_parquet, buffer_m = 50000, out_file = "data/target_outputs/domain_bbox.parquet") { + domain_sf <- sfarrow::st_read_parquet(domain_parquet) + bbox_geom <- domain_sf |> sf::st_bbox() |> sf::st_as_sfc() |> sf::st_buffer(buffer_m) + bbox_sf <- sf::st_as_sf(bbox_geom) + + # Ensure directory exists + dir.create(dirname(out_file), recursive = TRUE, showWarnings = FALSE) + + # Try writing with sfarrow, fall back to sf::st_write if needed + tryCatch({ + sfarrow::st_write_parquet(bbox_sf, out_file) + message("[domain_bbox] Wrote with sfarrow: ", out_file) + }, error = function(e) { + message("[domain_bbox] sfarrow failed, trying sf::st_write: ", conditionMessage(e)) + sf::st_write(bbox_sf, out_file, quiet = TRUE, delete_dsn = TRUE) + }) + + # Verify file exists + if (!file.exists(out_file)) { + stop("[domain_bbox] Failed to create output file: ", out_file) + } + + message("[domain_bbox] File created: ", out_file, " (", file.size(out_file), " bytes)") + out_file +} diff --git a/R/domain_define.R b/R/domain_define.R index 44659341..2c8d4659 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -1,54 +1,46 @@ -# Make Domain +# Define buffered project domain #' @author Adam M. Wilson +#' @description Build a smoothed, buffered domain polygon from the 2018 vegetation map and country boundary, then write it to GeoParquet. +#' @param vegmap_shp Path to the vegetation map shapefile (e.g., VEGMAP2018). +#' @param country Path to the country boundary GeoParquet file. +#' @return Character path to the written GeoParquet file (`data/raw/domain_boundary.parquet`). +#' @details Filters to target biomes, unions polygons, simplifies (500 m), buffers (50 km), smooths (ksmooth, smoothness=120), intersects with country, and writes to GeoParquet. -# Process 2018 Vegetation dataset to define project domain +domain_define <- function(vegmap_shp, country){ - -#' @param vegmap is the domains of interest from the 2018 national vegetation map -#' @param vegmap_shp is the path to the 2018 national vegetation map - used to get national boundary -#' @param buffer size of domain buffer (in m) - -domain_define <- function(vegmap, country){ + # Always read country from a parquet path + if (!is.character(country)) { + stop("country must be a path to a GeoParquet file") + } + country <- sfarrow::st_read_parquet(country) biomes = c("Fynbos")#,"Succulent Karoo")#,"Albany Thicket") - vegmap_union=vegmap %>% - filter(biome_18 %in% biomes ) %>% #filter to list above + vegmap_union=st_read(vegmap_shp) %>% + janitor::clean_names() %>% + filter(t_biome %in% biomes ) %>% #filter to list above st_union() # union all polygons into one multipolygon, dissolving internal boundaries - - #buffer domain biomes - vegmap_buffer= vegmap_union %>% - st_simplify(dTolerance=500) %>% - st_buffer(50000) %>% - st_simplify(dTolerance=100) - - - - + +vegmap_buffer = vegmap_union %>% + st_simplify(dTolerance=500) %>% + st_buffer(50000) %>% + smoothr::smooth(method="ksmooth",smoothness=120) #%>% + +country= st_as_sf(country) %>% + st_transform(crs=st_crs(vegmap_buffer)) + domain <- vegmap_buffer %>% - st_intersection(st_transform(country,crs=st_crs(vegmap))) %>% #only keep land areas of buffer - no ocean + st_intersection(st_transform(country,crs=st_crs(vegmap_union))) %>% #only keep land areas of buffer - no ocean st_as_sf() %>% mutate(domain=1) - #Delete file if it exists (this should be handled by the line below, but that seems to fail on github) - if(file.exists("data/domain.gpkg")){file.remove("data/domain.gpkg")} - - # save the files - st_write(domain,dsn="data/domain.gpkg", append = F, delete_layer = TRUE)# overwrite layer if it exists (caused an error in targets) - - #release the domain - piggyback::pb_upload(file = "data/domain.gpkg", - repo = "AdamWilsonLab/emma_envdata", - tag = "raw_static", - overwrite = TRUE) - - return(domain) - -} - - - + # Write to GeoParquet + out_file <- "data/raw/domain_boundary.parquet" + sfarrow::st_write_parquet(domain, out_file) + + return(out_file) +} \ No newline at end of file diff --git a/R/domain_define_bioscape.R b/R/domain_define_bioscape.R new file mode 100644 index 00000000..5ce32bc4 --- /dev/null +++ b/R/domain_define_bioscape.R @@ -0,0 +1,52 @@ +# Make Domain + +#' @author Adam M. Wilson + +# Process 2018 Vegetation dataset to define project domain + + +#' @param vegmap is the domains of interest from the 2018 national vegetation map +#' @param vegmap_shp is the path to the 2018 national vegetation map - used to get national boundary +#' @param buffer size of domain buffer (in m) + +domain_define_bioscape <- function(vegmap, country){ + + require(smoothr) + + biomes = c("Fynbos")#,"Succulent Karoo")#,"Albany Thicket") + + + vegmap_union=vegmap %>% + filter(biome_18 %in% biomes ) %>% #filter to list above + st_union() # union all polygons into one multipolygon, dissolving internal boundaries + + #buffer domain biomes + vegmap_buffer= vegmap_union %>% + st_simplify(dTolerance=500) %>% + st_buffer(set_units(set_units(100,km),m)) #%>% + +# v2<- vegmap_buffer %>% +# smooth(method = "ksmooth",smoothness=25) +# +# plot(vegmap_union); plot(v2,add=T) + + domain <- + vegmap_buffer %>% + smooth(method = "ksmooth",smoothness=50) %>% +# st_intersection(st_transform(country,crs=st_crs(vegmap))) %>% #only keep land areas of buffer - no ocean + st_as_sf() %>% + mutate(domain=1) %>% + st_make_valid() %>% + st_transform(4326) + + # save the files + st_write(domain,dsn="data/bioscape_domain.gpkg",append=F) + file.remove("data/bioscape_domain.geojson"); st_write(domain,dsn="data/bioscape_domain.geojson",append=F) + + return(domain) + +} + + + + diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index 862c3e15..f48f9512 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -1,28 +1,194 @@ -# Rasterize Domain +# Rasterize Domain and Remnants +#' @title Rasterize domain with pixel IDs, remnants, and distance to remnants #' @author Adam M. Wilson +#' @description Creates a multivariate NetCDF file with four variables: domain mask, pixel IDs, remnant indicators, and distance to nearest remnant. Each variable is written separately with maximum compression and CF-1.8 compliant metadata. +#' @param domain sf or SpatVector object defining the study area (typically from domain_define). +#' @param remnants_shp Path to remnant vegetation shapefile. +#' @param dx Numeric x-resolution in CRS units (default 500 m). +#' @param dy Numeric y-resolution in CRS units (default 500 m). +#' @param out_file Character path for output NetCDF file (default "data/raw/domain.nc"). +#' @return Character path to the written NetCDF file. +#' @details Generates a raster template from domain bounding box, rasterizes domain and remnants, computes pixel IDs (sequential within domain) and Euclidean distance to nearest remnant (in km). Writes four variables (domain, pid, remnants, remnants_distance) to NetCDF with FORMAT=NC4, COMPRESS=DEFLATE, ZLEVEL=9, SHUFFLE=YES. Adds CF-compliant metadata via ncdf4 including long_name, units, CRS, history, and Conventions attributes. -# Rasterize domain to common grid to define the raster domain +domain_rasterize <- function(domain, remnants_shp, dx = 500, dy = 500, out_file = "data/raw/domain.nc") { -#' @param domain vector file of study domain -#' @param dx x resolution -#' @param dy y resolution + # Generate raster template and rasterize domain with terra (touches = TRUE) + domain_template <- rast(st_as_stars(st_bbox(domain), dx = dx, dy = dy)) -domain_rasterize <- function(domain,dx = 500, dy = 500){ + domain_raster <- domain %>% + st_as_sf() %>% + mutate(domain = 1) %>% + vect() %>% + terra::rasterize( + x = ., + y = domain_template, + field = "domain", + touches = TRUE + ) + + # Ensure pixels outside domain are NA (not 0) + domain_raster[domain_raster == 0] <- NA - # generate raster version of domain - domain_template=st_as_stars(st_bbox(domain), dx = dx, dy = dy) - domain_raster <- domain %>% - dplyr::select(biomeid_18) %>% - st_rasterize(template = domain_template) +## Process remnants to add fields related to whether the cell is in a remnant and distance to remnant - domain_raster - #writeRaster(domain_raster,file="data/domain.tif") +# Load remnants file + remnants <- st_read(remnants_shp) %>% + janitor::clean_names() %>% + st_transform(crs = crs(domain)) %>% + st_crop(st_as_sfc(st_bbox(domain))) #crop to domain box +# st_union() %>% +# st_make_valid() -} + remnants_raster <- remnants %>% + st_as_sf() |> + mutate(remnant=1) %>% + vect() %>% + rasterize(x = ., + y = domain_raster, + field = "remnant", + touches = T, + cover = T)|> + terra::mask(mask=domain_raster)*100 #set to NA outside domain and convert to integer + + remnants_distance <- remnants_raster |> + terra::app(fun=function(x) ifelse(is.na(x),0,1)) |> + terra::distance(target=1)|> + terra::mask(mask=domain_raster) #set to NA outside domain + + # Create pixel ID raster: 1:ncell where domain=1, NA elsewhere + pid_raster <- domain_raster + pid_values <- rep(NA, ncell(pid_raster)) + domain_cells <- which(!is.na(values(domain_raster))) + pid_values[domain_cells] <- seq_along(domain_cells) + values(pid_raster) <- pid_values + # Prepare layers for per-variable write + layers <- list( + domain = domain_raster, + pid = pid_raster, + remnants = remnants_raster, + remnants_distance = remnants_distance + ) + + # Get spatial extent and create dimensions for NetCDF + ext <- ext(domain_raster) + x_vals <- seq(ext$xmin + dx/2, ext$xmax - dx/2, by = dx) + y_vals <- seq(ext$ymax - dy/2, ext$ymin + dy/2, by = -dy) + + # Define dimensions + dim_x <- ncdf4::ncdim_def(name = "easting", units = "meter", vals = x_vals, longname = "easting") + dim_y <- ncdf4::ncdim_def(name = "northing", units = "meter", vals = y_vals, longname = "northing") + + # Define variables with optimal data types and compression + var_domain <- ncdf4::ncvar_def( + name = "domain", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Domain mask (1 = in domain, NA = outside)", + missval = -128, + prec = "byte", + compression = 9 + ) + + var_pid <- ncdf4::ncvar_def( + name = "pid", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Pixel ID for domain grid cells", + missval = -2147483648, + prec = "integer", + compression = 9 + ) + + var_remnants <- ncdf4::ncvar_def( + name = "remnants", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Remnant vegetation proportion (100 = full remnant, 5 = 5% remnant, NA = not remnant)", + missval = -128, + prec = "byte", + compression = 9 + ) + + var_dist <- ncdf4::ncvar_def( + name = "remnants_distance", + units = "meters", + dim = list(dim_x, dim_y), + longname = "Distance to nearest remnant vegetation", + missval = -2147483648, + prec = "integer", + compression = 9 + ) + + # Create NetCDF file with all variables +unlink(out_file) + + nc <- ncdf4::nc_create( + filename = out_file, + vars = list(var_domain, var_pid, var_remnants, var_dist), + force_v4 = TRUE + ) + + # Convert rasters to matrices and replace NAs with fill values + # Note: as.matrix() from terra returns (nrow, ncol), but ncdf4 expects (ncol, nrow) for (x, y) dims + domain_matrix <- t(as.matrix(layers$domain, wide = TRUE)) + domain_matrix[is.na(domain_matrix)] <- -128 + + pid_matrix <- t(as.matrix(layers$pid, wide = TRUE)) + pid_matrix[is.na(pid_matrix)] <- -2147483648 + + remnants_matrix <- t(as.matrix(layers$remnants, wide = TRUE)) + remnants_matrix[is.na(remnants_matrix)] <- -128 + + dist_matrix <- t(as.matrix(layers$remnants_distance, wide = TRUE)) + dist_matrix[is.na(dist_matrix)] <- -2147483648 + + # Write data to variables + ncdf4::ncvar_put(nc, var_domain, domain_matrix) + ncdf4::ncvar_put(nc, var_pid, pid_matrix) + ncdf4::ncvar_put(nc, var_remnants, remnants_matrix) + ncdf4::ncvar_put(nc, var_dist, dist_matrix) + + # Add global attributes + ncdf4::ncatt_put(nc, 0, "title", "Rasterized domain with remnants and distance") + ncdf4::ncatt_put(nc, 0, "history", paste0("created: ", Sys.time())) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + + # Add CRS variable with comprehensive attributes for GIS compatibility + crs_var <- ncdf4::ncvar_def("crs", "", list(), prec = "integer") + nc <- ncdf4::ncvar_add(nc, crs_var) + + # Get CRS as WKT string (most reliable for terra) + crs_wkt <- as.character(crs(domain_raster)) + + # Add CRS attributes + ncdf4::ncatt_put(nc, "crs", "grid_mapping_name", "albers_conical_equal_area") + ncdf4::ncatt_put(nc, "crs", "crs_wkt", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "spatial_ref", crs_wkt) + + # Add geotransform for GDAL compatibility + ext_vals <- ext(domain_raster) + geotransform <- paste(ext_vals$xmin, dx, 0, ext_vals$ymax, 0, -dy) + ncdf4::ncatt_put(nc, "crs", "GeoTransform", geotransform) + + # Add grid_mapping attribute to all data variables + ncdf4::ncatt_put(nc, "domain", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "pid", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "remnants", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "remnants_distance", "grid_mapping", "crs") + + # Close file + ncdf4::nc_close(nc) + + out_file +} +if(F){ +test=rast(out_file) +plot(test$domain) +} \ No newline at end of file diff --git a/R/domain_to_geoparquet.R b/R/domain_to_geoparquet.R new file mode 100644 index 00000000..8bcf576f --- /dev/null +++ b/R/domain_to_geoparquet.R @@ -0,0 +1,44 @@ +#' @title Convert domain raster to geoparquet +#' @description Converts the domain raster (with pid and coordinates) to a geoparquet file +#' for use as a spatial reference for dynamic data +#' @param domain_raster_file Path to domain NetCDF file (from domain_rasterize) +#' @param out_file Output geoparquet file path +#' @param verbose Logical for progress messages +#' @return Character path to the written geoparquet file +#' @details Extracts the pid layer from the domain raster, converts to a point geometry +#' with coordinates, and writes as a geoparquet file for efficient spatial queries +#' @import terra +#' @import sf +#' @import sfarrow + +domain_to_geoparquet <- function( + domain_raster_file, + out_file = "data/target_outputs/domain.parquet", + verbose = TRUE +) { + + if (verbose) message("Loading domain raster from: ", domain_raster_file) + + # Load the pid layer from the domain raster + domain_raster <- terra::rast(domain_raster_file, subds = "pid") + + # Convert raster to dataframe with coordinates + # This gives us x, y coordinates and the pid value for each non-NA cell + df <- terra::as.data.frame(domain_raster, xy = TRUE, na.rm = TRUE) + colnames(df) <- c("x", "y", "pid") + + # Convert to spatial points dataframe + sp_df <- sf::st_as_sf(df, coords = c("x", "y"), crs = terra::crs(domain_raster)) + + if (verbose) message("Converting to geoparquet: ", nrow(sp_df), " pixels") + + # Ensure output directory exists + dir.create(dirname(out_file), recursive = TRUE, showWarnings = FALSE) + + # Write as geoparquet using sfarrow + sfarrow::st_write_parquet(sp_df, out_file) + + if (verbose) message("Domain geoparquet written to: ", out_file) + + invisible(out_file) +} diff --git a/R/download_vegmap_release.R b/R/download_vegmap_release.R new file mode 100644 index 00000000..a3648164 --- /dev/null +++ b/R/download_vegmap_release.R @@ -0,0 +1,46 @@ +#' Download vegetation map release and return shapefile path +#' +#' Downloads a zipped vegetation map from a GitHub release using piggyback, +#' unzips it into a local directory, and returns the path to the `.shp` file +#' for use in targets. +#' +#' @param repo character. GitHub repository in "owner/repo" format. +#' @param tag character. Release tag (e.g., "latest" or "v1.0.0"). +#' @param file character. Name of the release asset file to download (e.g., "vegmap.zip"). +#' @param local_dir character. Local directory to store the unzipped files. +#' @param shapefile_name character. Name of the shapefile to return (e.g., "NVM2024Final_IEM5_12_07012025.shp"). +#' +#' @return character. Full path to the shapefile on disk. +#' +#' @details If the shapefile already exists at `local_dir`, no download +#' is performed. Otherwise, the zip file is downloaded via piggyback and extracted. +#' +#' +#' @importFrom piggyback pb_download +#' @importFrom utils unzip +#' @export +download_vegmap_release <- function(repo, tag, file, local_dir, shapefile_name) { + dir.create(local_dir, recursive = TRUE, showWarnings = FALSE) + + # Check if shapefile already exists in the expected location (with shapefile subdirectory) + shp_file_correct <- file.path(local_dir, "shapefile", shapefile_name) + + if (!file.exists(shp_file_correct)) { + message("Downloading vegmap from GitHub release using piggyback...") + piggyback::pb_download( + file = file, + repo = repo, + tag = tag, + dest = local_dir, + overwrite = FALSE + ) + message("Unzipping vegmap...") + list.files(local_dir,recursive = T) + zip_file <- file.path(local_dir, file) + utils::unzip(zip_file, exdir = local_dir) + unlink(zip_file) + } + + # Return the correct path (shapefile is in a subdirectory after extraction) + shp_file_correct +} diff --git a/R/functions.R b/R/functions.R index 18e71e6f..353e7f47 100644 --- a/R/functions.R +++ b/R/functions.R @@ -1,3 +1,33 @@ +# Load all packages listed in DESCRIPTION file (quietly, suppressing startup messages) +load_description_packages <- function(description_file = "DESCRIPTION", quietly = TRUE, verbose = FALSE) { + # Read DESCRIPTION file + dcf <- read.dcf(description_file) + + # Extract Imports and Depends fields + imports <- if ("Imports" %in% colnames(dcf)) dcf[1, "Imports"] else "" + depends <- if ("Depends" %in% colnames(dcf)) dcf[1, "Depends"] else "" + + # Combine, split, and clean + all_text <- paste(imports, depends, sep = ",") + packages <- trimws(strsplit(all_text, ",")[[1]]) + + # Remove version specifications (e.g., "ggplot2 (>= 3.0)" -> "ggplot2") + packages <- sub("\\s*\\(.*\\).*", "", packages) + + # Remove empty strings and R itself + packages <- packages[nzchar(packages) & packages != "R"] + + # Load each package with suppressed startup messages + invisible(sapply(packages, function(pkg) { + suppressPackageStartupMessages( + library(pkg, character.only = TRUE, quietly = quietly) + ) + })) + + if (verbose) message(paste("Loaded", length(packages), "packages from DESCRIPTION")) + invisible(packages) +} + #tidy up clean_data <- function(raw_data_file){ raw_data_file %>% diff --git a/R/generate_release_manifest.R b/R/generate_release_manifest.R new file mode 100644 index 00000000..01e6d436 --- /dev/null +++ b/R/generate_release_manifest.R @@ -0,0 +1,47 @@ +#' Generate a human-readable manifest of all targets for the GitHub release +#' +#' Creates a JSON file mapping target names to descriptions and file hashes +#' from the targets store. Useful for cross-referencing hash-based filenames +#' in the GitHub release with human-readable target names. +#' +#' @return Path to manifest file +#' @export +#' +generate_release_manifest <- function() { + + # Target descriptions + descriptions <- c( + vegmap_shp = "Vegetation map shapefile (from GitHub release vegmap2024)", + remnants_shp = "Vegetation remnants shapefile (manual download)", + capenature_fires_shp = "Fire extent shapefile (manual download)", + country.parquet = "Country boundary geometry (derived from geodata)", + domain_boundary.parquet = "Study domain boundary (intersection of vegetation map and country)", + domain_bbox.parquet = "50km-buffered download boundary (locked to prevent re-downloads)", + domain_nc = "Domain raster grid with pixel IDs, remnants, and distance-to-remnants", + vegmap_nc = "Vegetation map rasterized to analysis grid", + climate_chelsa = "CHELSA bioclimatic variables (19 NetCDF files: bio01-bio19)", + elevation_task_id = "AppEEARS task ID for NASADEM elevation download (task submission only)", + elevation = "NASADEM elevation data (resampled to analysis grid, masked to domain)" + ) + + # Build JSON string directly to avoid complex object serialization + json_lines <- c("{", " \"targets\": [") + + for (i in seq_along(descriptions)) { + target_name <- names(descriptions)[i] + description <- descriptions[i] + # Escape quotes in description + description <- gsub('"', '\\"', description, fixed = TRUE) + comma <- if (i < length(descriptions)) "," else "" + json_lines <- c(json_lines, sprintf(' {"name": "%s", "description": "%s"}%s', target_name, description, comma)) + } + + json_lines <- c(json_lines, " ]", "}") + json_manifest <- paste(json_lines, collapse = "\n") + + # Write to file + out_file <- "data/target_outputs/TARGET_MANIFEST.json" + writeLines(json_manifest, con = out_file) + + out_file # Return the file path for targets +} diff --git a/R/get_climate_chelsa.R b/R/get_climate_chelsa.R new file mode 100644 index 00000000..868f6087 --- /dev/null +++ b/R/get_climate_chelsa.R @@ -0,0 +1,154 @@ +#' @title Download and process CHELSA climate data +#' @description Downloads CHELSA bioclimatic variables, clips to domain, and writes as NetCDF files +#' @author Brian Maitner & Adam Wilson +#' @param domain domain (sf polygon) used for masking +#' @param temp_directory Temporary working directory for downloads (default: "data/temp/raw_data/climate_chelsa/") +#' @param out_dir Output directory for NetCDF files (default: "data/target_outputs/") +#' @param cleanup Logical. If TRUE (default, for GitHub Actions), clean temp directory. If FALSE (local development), preserve cached files. +#' @param verbose Logical for progress messages +#' @return Character vector of output NetCDF file paths +#' @import terra +#' @import sf +#' @import ncdf4 + +get_climate_chelsa <- function( + domain, + temp_directory = "data/temp/raw_data/climate_chelsa/", + out_dir = "data/target_outputs/", + cleanup = TRUE, + verbose = TRUE +) { + + # Ensure temp directory exists, clean only if cleanup mode enabled + if (cleanup && dir.exists(temp_directory)) { + unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + } + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + + # Adjust download timeout + if (getOption('timeout') < 1000) { + options(timeout = 1000) + } + + # Transform domain to WGS84 + domain_tf <- domain %>% + st_as_sf() %>% + sf::st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")) + + # CF-compliant metadata for CHELSA bioclimatic variables + bio_metadata <- tribble( + ~bio_name, ~long_name, ~units, + "bio01", "Annual Mean Temperature", "°C * 10", + "bio02", "Mean Diurnal Range", "°C * 10", + "bio03", "Isothermality", "%", + "bio04", "Temperature Seasonality", "°C * 10", + "bio05", "Max Temperature of Warmest Month", "°C * 10", + "bio06", "Min Temperature of Coldest Month", "°C * 10", + "bio07", "Temperature Annual Range", "°C * 10", + "bio08", "Mean Temperature of Wettest Quarter", "°C * 10", + "bio09", "Mean Temperature of Driest Quarter", "°C * 10", + "bio10", "Mean Temperature of Warmest Quarter", "°C * 10", + "bio11", "Mean Temperature of Coldest Quarter", "°C * 10", + "bio12", "Annual Precipitation", "mm", + "bio13", "Precipitation of Wettest Month", "mm", + "bio14", "Precipitation of Driest Month", "mm", + "bio15", "Precipitation Seasonality", "%", + "bio16", "Precipitation of Wettest Quarter", "mm", + "bio17", "Precipitation of Driest Quarter", "mm", + "bio18", "Precipitation of Warmest Quarter", "mm", + "bio19", "Precipitation of Coldest Quarter", "mm" + ) + + # Record download date + download_date <- Sys.Date() + output_files <- character() + + for (idx in 1:nrow(bio_metadata)) { + i <- bio_metadata$bio_name[idx] + + if (verbose) message("Processing ", i, " (", idx, "/", nrow(bio_metadata), ")") + + # Construct filename + tif_filename <- file.path(temp_directory, paste("CHELSA_bio", sprintf("%02d", idx), + "_1981-2010_V.2.1.tif", sep = "")) + + # Skip download if file already exists (when cleanup = FALSE, running locally) + if (!cleanup && file.exists(tif_filename)) { + if (verbose) message(" File already cached, skipping download: ", basename(tif_filename)) + } else { + # Download the file + if (verbose) message(" Downloading...") + robust_download_file( + url = paste("https://os.unil.cloud.switch.ch/chelsa02/chelsa/global/bioclim/", i, + "/1981-2010/CHELSA_bio", sprintf("%02d", idx), "_1981-2010_V.2.1.tif", sep = ""), + destfile = tif_filename, + max_attempts = 10, + sleep_time = 10 + ) + } + + # Load, crop, and mask + rast_i <- terra::rast(tif_filename) + domain_tf2=st_transform(domain_tf, st_crs(rast_i)) + rast_i <- terra::crop(x = rast_i, y = ext(domain_tf2)) + rast_i <- terra::mask(rast_i, mask = terra::vect(domain_tf2)) + + # Check if raster has data after masking + + # Write as NetCDF with CF-compliant metadata + nc_filename <- file.path(out_dir, paste("CHELSA_", i, "_1981-2010_V.2.1.nc", sep = "")) + + terra::writeCDF(x = rast_i, + filename = nc_filename, + overwrite = TRUE, + compression = 9) + + # Add CF-compliant metadata using ncdf4 package + nc_file <- ncdf4::nc_open(nc_filename, write = TRUE) + + # Get variable name + var_name <- names(rast_i) + if (is.null(var_name) || var_name == "") { + var_name <- i + } + + # Get metadata for this bioclimatic variable + long_name <- bio_metadata$long_name[idx] + units <- bio_metadata$units[idx] + + # Add global attributes + ncdf4::ncatt_put(nc_file, 0, "title", + paste("CHELSA Bioclimatic Variable", i, sep = " ")) + ncdf4::ncatt_put(nc_file, 0, "source", "CHELSA v.2.1 (Climatologies at high resolution for the earth land areas)") + ncdf4::ncatt_put(nc_file, 0, "dataset_url", "https://chelsa-climate.org/") + ncdf4::ncatt_put(nc_file, 0, "download_date", as.character(download_date)) + ncdf4::ncatt_put(nc_file, 0, "temporal_range", "1981-2010") + ncdf4::ncatt_put(nc_file, 0, "Conventions", "CF-1.8") + ncdf4::ncatt_put(nc_file, 0, "history", + paste("Downloaded on", as.character(download_date), + "and clipped to domain. Processed using terra and ncdf4 R packages.")) + + # Add variable attributes + ncdf4::ncatt_put(nc_file, var_name, "long_name", long_name) + ncdf4::ncatt_put(nc_file, var_name, "units", units) + ncdf4::ncatt_put(nc_file, var_name, "standard_name", paste("bioclimatic_variable_", i, sep = "")) + + ncdf4::nc_close(nc_file) + output_files <- c(output_files, nc_filename) + + rm(rast_i) + } + + # Cleanup temp directory only if cleanup mode enabled + if (cleanup) { + unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + } + + if (verbose) message("CHELSA climate files processed to: ", out_dir) + + # Return output file paths for targets to track + output_files + +} + diff --git a/R/get_country.R b/R/get_country.R new file mode 100644 index 00000000..fddefaa9 --- /dev/null +++ b/R/get_country.R @@ -0,0 +1,34 @@ +# National Boundary + +#' @author Adam M. Wilson +#' @description Download national boundary file from the UN +#' @source https://data.humdata.org/dataset/cod-ab-zaf + +get_country <- function(){ + + #Adjust timeout to allow for slow internet + if(getOption('timeout') < 1000){ + options(timeout = 1000) + } + + url="https://data.humdata.org/dataset/061d4492-56e8-458c-a3fb-e7950991adf0/resource/37175ff4-41a3-4753-a2c3-ced24142a96c/download/zaf_admin_boundaries.geojson.zip" + tmpfile1=tempfile() + tmpdir1=tempdir() + download.file(url,destfile = tmpfile1) + unzip(tmpfile1,exdir=tmpdir1) + + # Read the converted GeoJSON, union, and convert to sf + country <- st_read(file.path(tmpdir1, "zaf_admin0.geojson"), quiet = TRUE) |> + st_union() |> + st_as_sf() + + # Write to GeoParquet + out_file <- "data/target_outputs/country.parquet" + suppressWarnings(sfarrow::st_write_parquet(country, out_file)) + + return(out_file) +} +# end function + + + diff --git a/R/get_elevation.R b/R/get_elevation.R new file mode 100644 index 00000000..93b4fa2d --- /dev/null +++ b/R/get_elevation.R @@ -0,0 +1,213 @@ +#' @title Submit NASADEM elevation request via AppEEARS +#' @description Submits an AppEEARS area request for NASADEM elevation data +#' over the provided domain polygon. Returns task ID for polling. +#' @author EMMA Team +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param verbose Logical for progress messages +#' @return Character string with AppEEARS task ID + +submit_elevation_task <- function( + domain_vector, + verbose = TRUE +) { + + # Convert domain vector to sf, fix geometry, simplify, merge, and reproject to WGS84 (required by AppEEARS) + domain_sf <- st_as_sf(domain_vector) %>% + st_simplify(dTolerance = 100, preserveTopology = TRUE) %>% + st_buffer(0) %>% + st_make_valid() %>% + st_transform(crs = 4326) %>% + geojsonsf::sf_geojson(simplify = FALSE) %>% + jsonlite::fromJSON() + + # Build AppEEARS request with proper structure + req <- list( + task_type = "area", + task_name = paste0("NASADEM_", format(Sys.time(), "%Y%m%d%H%M%S")), + params = list( + dates = list(list( + startDate = "02-11-2000", + endDate = "02-11-2000" + )), + layers = list(list( + product = "SRTMGL3_NC.003", + layer = "SRTMGL3_DEM" + )), + output = list( + format = list(type = "netcdf4"), + projection = "native" + ), + geo = domain_sf + ) + ) + + # Submit task + if (verbose) message("Submitting AppEEARS elevation task...") + task <- appeears::rs_request( + request = req, + user = Sys.getenv("EARTHDATA_USER"), + transfer = FALSE, + verbose = verbose + ) + + task_id <- task$get_task_id() + if (verbose) message("Task submitted with ID: ", task_id) + + task_id +} + + +#' @title Download and process NASADEM elevation from AppEEARS +#' @description Polls for completion of AppEEARS task and downloads results, +#' then resamples elevation to domain grid and writes to NetCDF. +#' @author EMMA Team +#' @param task_id Character string with AppEEARS task ID (from submit_elevation_task) +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param domain_raster A SpatRaster (domain.tif) defining the output grid and mask +#' @param out_file Output NetCDF file path +#' @param temp_directory Temporary working directory for downloads +#' @param verbose Logical for progress messages +#' @return Character path to output NetCDF file + +download_elevation_results <- function( + task_id, + domain_vector, + domain_raster, + out_file = "data/target_outputs/elevation_nasadem.nc", + temp_directory = "data/temp/raw_data/elevation_nasadem/", + verbose = TRUE +) { + + # Ensure clean temp directory + unlink(temp_directory, recursive = TRUE, force = TRUE) + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + + # Clean terra temp + terra_tmp <- file.path(getwd(), "data/temp/terra") + unlink(terra_tmp, recursive = TRUE, force = TRUE) + dir.create(terra_tmp, recursive = TRUE, showWarnings = FALSE) + terraOptions(tempdir = terra_tmp, memfrac = 0.8) + + # Reconnect to task and poll for completion + if (verbose) message("Polling task ", task_id, " for completion...") + + # Poll for task completion using rs_list_task + max_retries <- 120 # 2 hours at 60s intervals + retry_count <- 0 + task_status <- "pending" + + repeat { + retry_count <- retry_count + 1 + + # Check task status + task_info <- appeears::rs_list_task(task_id = task_id, user = Sys.getenv("EARTHDATA_USER")) + task_status <- task_info$status + + if (task_status == "done") { + if (verbose) message("Task completed successfully") + break + } + + if (task_status %in% c("failed", "error")) { + stop("AppEEARS task ", task_id, " failed with status: ", task_status) + } + + if (retry_count >= max_retries) { + stop("Task ", task_id, " polling timed out after ", max_retries, " minutes") + } + + if (verbose && retry_count %% 10 == 0) { + message("Task status: ", task_status, " (", retry_count, "/", max_retries, ")") + } + + Sys.sleep(60) + } + + # Download results using rs_transfer + if (verbose) message("Downloading files for task: ", task_id) + appeears::rs_transfer( + task_id = task_id, + user = Sys.getenv("EARTHDATA_USER"), + path = temp_directory, + verbose = verbose + ) + + # Load the NetCDF file + nc_paths <- list.files(temp_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) + if (length(nc_paths) == 0) { + stop("No NetCDF files downloaded from AppEEARS") + } + + if (verbose) message("Reading elevation data from: ", nc_paths[1]) + elev_raster <- terra::rast(nc_paths[grepl(nc_paths, pattern = "SRTMGL3_NC.003_90m_aid0001.nc")]) + + # Ensure we have a SpatRaster template (accept path or raster) + domain_template <- if (is.character(domain_raster)) terra::rast(domain_raster) else domain_raster + + # Project to domain CRS/grid and mask to domain + if (verbose) message("Projecting elevation to domain CRS/grid") + elev_on_grid <- terra::project(elev_raster, domain_template, method = "average") + + # Mask to domain (NA where domain is NA) + mask_layer <- if ("domain" %in% names(domain_template)) domain_template[["domain"]] else domain_template + elev_masked <- terra::mask(elev_on_grid, mask_layer) + + # Set metadata + names(elev_masked) <- "elevation" + + # Write NetCDF with compression and CF metadata + dir.create(dirname(out_file), recursive = TRUE, showWarnings = FALSE) + unlink(out_file) + + ext_vals <- ext(elev_masked) + dx <- res(elev_masked)[1] + dy <- res(elev_masked)[2] + x_vals <- seq(ext_vals$xmin + dx/2, ext_vals$xmax - dx/2, by = dx) + y_vals <- seq(ext_vals$ymax - dy/2, ext_vals$ymin + dy/2, by = -dy) + + dim_x <- ncdf4::ncdim_def(name = "easting", units = "meter", vals = x_vals, longname = "easting") + dim_y <- ncdf4::ncdim_def(name = "northing", units = "meter", vals = y_vals, longname = "northing") + + var_elev <- ncdf4::ncvar_def( + name = "elevation", + units = "meters", + dim = list(dim_x, dim_y), + longname = "NASADEM elevation above mean sea level", + missval = -3.4e38, + prec = "float", + compression = 9 + ) + + nc <- ncdf4::nc_create(filename = out_file, vars = list(var_elev), force_v4 = TRUE) + + elev_matrix <- t(as.matrix(elev_masked, wide = TRUE)) + elev_matrix[is.na(elev_matrix)] <- -3.4e38 + ncdf4::ncvar_put(nc, var_elev, elev_matrix) + + crs_wkt <- as.character(crs(elev_masked)) + crs_var <- ncdf4::ncvar_def("crs", "", list(), prec = "integer") + nc <- ncdf4::ncvar_add(nc, crs_var) + ncdf4::ncatt_put(nc, "crs", "crs_wkt", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "spatial_ref", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "GeoTransform", paste(ext_vals$xmin, dx, 0, ext_vals$ymax, 0, -dy)) + ncdf4::ncatt_put(nc, "elevation", "grid_mapping", "crs") + + ncdf4::ncatt_put(nc, 0, "title", "NASADEM elevation resampled to domain") + ncdf4::ncatt_put(nc, 0, "source", "NASADEM_HGT.001 via AppEEARS") + ncdf4::ncatt_put(nc, 0, "history", paste0("created: ", Sys.time())) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + + ncdf4::nc_close(nc) + + # Cleanup + unlink(temp_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + + if (verbose) message("Elevation data saved to: ", out_file) + out_file +} + + + + diff --git a/R/get_modis_vi.R b/R/get_modis_vi.R new file mode 100644 index 00000000..1a2c0445 --- /dev/null +++ b/R/get_modis_vi.R @@ -0,0 +1,757 @@ +#' @title Generate monthly sequences for MODIS/VIIRS VI downloads +#' @description Creates a data frame of all months to download based on a date range. +#' @param start_date Start date (YYYY-MM-DD), default 2000-02-18 (MODIS Terra start) +#' @param end_date End date (YYYY-MM-DD), default today +#' @return Data frame with columns: month_start, month_end, date_str (YYYYMM format) +#' @export +generate_monthly_sequence <- function(start_date = "2000-02-18", end_date = NULL) { + if (is.null(end_date)) { + end_date <- Sys.Date() + } + + start_date <- as.Date(start_date) + end_date <- as.Date(end_date) + + # Generate all month starts from beginning month + month_starts <- seq(as.Date(cut(start_date, "month")), end_date, by = "month") + month_ends <- c(month_starts[-1] - 1, end_date) + + # Trim if extends past end_date + valid_idx <- month_starts <= end_date + month_starts <- month_starts[valid_idx] + month_ends <- month_ends[valid_idx] + + data.frame( + month_start = month_starts, + month_end = pmin(month_ends, end_date), + date_str = format(month_starts, "%Y%m"), + row.names = NULL + ) +} + + +#' @title Identify missing monthly submissions from output directory +#' @description Compares generated monthly sequence with existing downloaded NetCDF files +#' @param output_dir Directory containing downloaded raw NetCDF files +#' @param dataset Name of dataset (e.g., "modis_vi", "viirs_vi") used in filename pattern +#' @param start_date Start date for sequence (YYYY-MM-DD) +#' @param end_date End date for sequence (YYYY-MM-DD), default is today +#' @return Data frame of months that haven't been downloaded yet +#' @export +identify_missing_vi <- function(output_dir, dataset = "modis_vi", start_date = "2000-02-18", end_date = NULL) { + + # Create full monthly sequence + all_months <- generate_monthly_sequence(start_date, end_date) + + # Check which ones already exist as downloaded NetCDF files + dir.create(output_dir, recursive = TRUE, showWarnings = FALSE) + pattern <- paste0("^", dataset, "_\\d{6}_monthly\\.nc$") + existing_files <- list.files(output_dir, pattern = pattern) + + if (length(existing_files) == 0) { + return(all_months) + } + + # Extract YYYYMM from existing files and convert to match date_str + # Format: __monthly.nc + pattern_prefix <- paste0("^", dataset, "_") + existing_dates <- existing_files %>% + gsub(pattern_prefix, "", .) %>% + gsub("_monthly\\.nc$", "", .) + + # Return only missing months + missing <- all_months[!all_months$date_str %in% existing_dates, ] + + if (nrow(missing) == 0) { + message("All months already downloaded in ", output_dir) + return(data.frame()) + } + + missing +} + + + +#' @title Submit monthly MODIS VI request via AppEEARS +#' @description Submits an AppEEARS area request for MOD13A1.061 and MYD13A1.061 +#' EVI, and QA (500m resolution, 16-day composite) for a monthly period. +#' @author EMMA Team +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param month_start Start date for the month (YYYY-MM-DD) +#' @param month_end End date for the month (YYYY-MM-DD) +#' @param verbose Logical for progress messages +#' @return Character string with AppEEARS task ID +#' @export +submit_modis_vi <- function( + domain_vector, + month_start, + month_end, + verbose = TRUE +) { + + # Convert domain vector to sf, fix geometry, simplify, merge, and reproject to WGS84 + domain_sf <- st_as_sf(domain_vector) %>% + st_simplify(dTolerance = 100, preserveTopology = TRUE) %>% + st_buffer(0) %>% + st_make_valid() %>% + st_transform(crs = 4326) %>% + geojsonsf::sf_geojson(simplify = FALSE) %>% + jsonlite::fromJSON() + + # Validate dates + month_start <- as.Date(month_start) + month_end <- as.Date(month_end) + + if (verbose) { + message("AppEEARS MODIS VI monthly request: ", format(month_start, "%Y-%m-%d"), + " to ", format(month_end, "%Y-%m-%d")) + } + + # Resolve layer names dynamically (same as full-range version) + evi_layer <- "_500m_16_days_EVI" + qa_layer <- "_500m_16_days_VI_Quality" + date_layer <- "_500m_16_days_composite_day_of_the_year" + + try({ + lyr <- appeears::rs_layers("MOD13A1.061") + cand_cols <- intersect(c("Layer", "Name", "layer", "name"), names(lyr)) + if (length(cand_cols)) { + vals <- unlist(lapply(cand_cols, function(cc) lyr[[cc]])) + evi_cand <- vals[grepl("EVI", vals, ignore.case = TRUE)][1] + qa_cand <- vals[grepl("VI.*Quality|Quality", vals, ignore.case = TRUE)][1] + date_cand <- vals[grepl("composite_day_of_the_year", vals, ignore.case = TRUE)][1] + if (!is.na(evi_cand)) evi_layer <- evi_cand + if (!is.na(qa_cand)) qa_layer <- qa_cand + if (!is.na(date_cand)) date_layer <- date_cand + } + }, silent = TRUE) + + if (verbose) message("Using layers: ", evi_layer, ", ", qa_layer, ", ", date_layer) + + # Build request payload for monthly period + req <- list( + task_type = "area", + task_name = paste0("MODIS_VI_", format(month_start, "%Y%m"), "_", format(Sys.time(), "%H%M%S")), + params = list( + dates = list(list( + startDate = format(month_start, "%m-%d-%Y"), + endDate = format(month_end, "%m-%d-%Y") + )), + layers = list( + # MOD13A1.061 (Terra) + list(product = "MOD13A1.061", layer = evi_layer), + list(product = "MOD13A1.061", layer = qa_layer), + list(product = "MOD13A1.061", layer = date_layer), + # MYD13A1.061 (Aqua) + list(product = "MYD13A1.061", layer = evi_layer), + list(product = "MYD13A1.061", layer = qa_layer), + list(product = "MYD13A1.061", layer = date_layer) + ), + output = list( + format = list(type = "netcdf4"), + projection = "native" + ), + geo = domain_sf + ) + ) + + # Submit task + if (verbose) message("Submitting AppEEARS MODIS VI monthly task...") + task <- appeears::rs_request( + request = req, + user = Sys.getenv("EARTHDATA_USER"), + transfer = FALSE, + verbose = verbose + ) + + task_id <- task$get_task_id() + if (verbose) message("Task submitted with ID: ", task_id) + + task_id +} + + +#' @title Download MODIS VI NetCDF files from AppEEARS +#' @description Polls for completion of AppEEARS task and downloads results. +#' Separates I/O from computation for independent parallelization. +#' @author EMMA Team +#' @param task_id Character string with AppEEARS task ID +#' @param month_start Start date for monthly period (YYYY-MM-DD) +#' @param temp_directory Temporary working directory for downloads +#' @param cleanup Logical to delete temporary files after processing. Defaults to TRUE on GitHub Actions (GITHUB_ACTIONS env var), FALSE on local execution. +#' @param verbose Logical for progress messages +#' @return Character path to temporary directory containing downloaded NetCDF files and metadata +#' @export +download_modis_vi_netcdf <- function( + task_id, + month_start, + temp_directory = "data/temp/raw_data/modis_vi_netcdf/", + cleanup = Sys.getenv("GITHUB_ACTIONS") == "true", + verbose = TRUE +) { + + month_start <- as.Date(month_start) + yyyymm <- format(month_start, "%Y%m") + + # Check if this month was already downloaded (marker file exists) + cache_dir <- "data/target_outputs/modis_vi" + dir.create(cache_dir, recursive = TRUE, showWarnings = FALSE) + cache_file <- file.path(cache_dir, paste0("modis_vi_", yyyymm, "_monthly.nc")) + + if (file.exists(cache_file)) { + if (verbose) message("Marker file found for ", yyyymm, " - skipping AppEEARS download") + # Create minimal temp directory so netcdf_to_parquet gets valid path + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + return(temp_directory) + } + + # Clean and create temp directory + if (!cleanup_mode) unlink(temp_directory, recursive = TRUE, force = TRUE) + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + + # Poll for task completion + if (verbose) message("Polling task ", task_id, " for completion...") + + max_retries <- 120 # 2 hours at 60s intervals + retry_count <- 0 + task_status <- "pending" + + repeat { + retry_count <- retry_count + 1 + + # Check task status + task_info <- appeears::rs_list_task(task_id = task_id, user = Sys.getenv("EARTHDATA_USER")) + task_status <- task_info$status + + if (task_status == "done") { + if (verbose) message("Task completed successfully") + break + } + + if (task_status %in% c("failed", "error")) { + stop("AppEEARS task ", task_id, " failed with status: ", task_status) + } + + if (retry_count >= max_retries) { + stop("Task ", task_id, " polling timed out after ", max_retries, " minutes") + } + + if (verbose && retry_count %% 10 == 0) { + message("Task status: ", task_status, " (", retry_count, "/", max_retries, ")") + } + + Sys.sleep(60) + } + + # Download results + if (verbose) message("Downloading files for task: ", task_id) + appeears::rs_transfer( + task_id = task_id, + user = Sys.getenv("EARTHDATA_USER"), + path = temp_directory, + verbose = verbose + ) + + # Check if NetCDF files were downloaded + nc_paths <- list.files(temp_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) + if (length(nc_paths) == 0) { + if (verbose) message("No NetCDF files returned from AppEEARS for month ", yyyymm) + if (cleanup) { + unlink(temp_directory, recursive = TRUE, force = TRUE) + } + return(NA_character_) + } + + if (verbose) message("Downloaded ", length(nc_paths), " NetCDF files to ", temp_directory) + + # Create persistent marker file to avoid re-downloading this month + # Check which months have already been downloaded by looking for marker files + cache_dir <- "data/target_outputs/modis_vi" + dir.create(cache_dir, recursive = TRUE, showWarnings = FALSE) + cache_file <- file.path(cache_dir, paste0("modis_vi_", yyyymm, "_monthly.nc")) + + # Write a simple marker file (just needs to exist to be detected by identify_missing_vi) + cat("", file = cache_file) + + if (verbose) message("Created download marker: ", cache_file) + + # Return temp directory so netcdf_to_parquet() can access the actual files + return(temp_directory) +} + + +#' @title Extract QA-good values from AppEEARS lookup table +#' @description Helper function to extract pixel QA flag values that meet quality criteria. +#' Filters based on: VI quality, no adjacent cloud, no shadow, no snow, over land, low aerosol. +#' @param qa_lookup_files Character vector of paths to VI Quality lookup CSV files +#' @return Integer vector of QA flag values that pass all quality filters +#' @keywords internal +extract_keep_qa_values <- function(qa_lookup_files) { + + extract_keep <- function(path) { + tab <- tryCatch(read.csv(path, stringsAsFactors = FALSE), error = function(e) NULL) + if (is.null(tab)) return(NULL) + + # Find required columns (case-insensitive) + value_col <- names(tab)[grepl("^value$", tolower(names(tab)))][1] + modland_col <- names(tab)[grepl("modland", tolower(names(tab)))][1] + adj_cloud_col <- names(tab)[grepl("adjacent.*cloud", tolower(names(tab)))][1] + snow_col <- names(tab)[grepl("possible.*snow|snow.*ice", tolower(names(tab)))][1] + shadow_col <- names(tab)[grepl("possible.*shadow", tolower(names(tab)))][1] + land_col <- names(tab)[grepl("land/water|land.*water", tolower(names(tab)))][1] + aerosol_col <- names(tab)[grepl("aerosol", tolower(names(tab)))][1] + + # Check all required columns are present + required_cols <- c(value_col, modland_col, adj_cloud_col, snow_col, shadow_col, land_col, aerosol_col) + if (any(is.na(required_cols))) { + warning("QA lookup missing required columns. Found: value=", !is.na(value_col), + ", modland=", !is.na(modland_col), ", adj_cloud=", !is.na(adj_cloud_col), + ", snow=", !is.na(snow_col), ", shadow=", !is.na(shadow_col), + ", land=", !is.na(land_col), ", aerosol=", !is.na(aerosol_col)) + return(NULL) + } + + # Filter for pixels that meet ALL QA criteria: + # 1. VI produced with good quality + # 2. No adjacent cloud detected + # 3. No cloud shadow + # 4. No snow/ice + # 5. Over land (not ocean or water) + # 6. Not high aerosol loading + keep <- (grepl("vi produced", tolower(tab[[modland_col]]))) & + (grepl("^no$", tolower(tab[[adj_cloud_col]]))) & + (grepl("^no$", tolower(tab[[shadow_col]]))) & + (grepl("^no$", tolower(tab[[snow_col]]))) & + (grepl("land", tolower(tab[[land_col]]))) & + (!grepl("high", tolower(tab[[aerosol_col]]))) + + tab[[value_col]][keep & !is.na(tab[[value_col]])] + } + + unique(unlist(lapply(qa_lookup_files, extract_keep))) +} + + +#' @title Extract MODIS VI observations from single NetCDF file +#' @description Processes one NetCDF file: detects Terra/Aqua product from metadata, applies QA masking, +#' reprojects to domain grid, and extracts observations in tabular format. +#' @param nc_path Character path to NetCDF file +#' @param domain_template SpatRaster defining output grid and CRS +#' @param keep_values Integer vector of QA flag values that pass quality criteria +#' @param month_start Start date for monthly period (YYYY-MM-DD), used for date conversion +#' @param verbose Logical for progress messages +#' @return Tibble with columns: pid, date, variable, value. Returns NULL if no valid observations found. +#' @keywords internal +extract_vi_observations <- function( + nc_path, + domain_template, + keep_values, + month_start, + verbose = TRUE +) { + + # Load raster from NetCDF + rast_obj <- terra::rast(nc_path) + + # Detect product (Terra=MOD13 vs Aqua=MYD13) from NetCDF global attributes + product_name <- "terra" + sensor_id <- 1L + + tryCatch({ + nc <- ncdf4::nc_open(nc_path) + global_attrs <- names(ncdf4::ncatt_get(nc, 0)) + + for (attr_name in global_attrs) { + attr_val <- ncdf4::ncatt_get(nc, 0, attr_name)$value + if (!is.null(attr_val) && is.character(attr_val)) { + if (grepl("MYD13", attr_val, ignore.case = TRUE)) { + product_name <- "aqua" + sensor_id <- 2L + break + } else if (grepl("MOD13", attr_val, ignore.case = TRUE)) { + product_name <- "terra" + sensor_id <- 1L + break + } + } + } + ncdf4::nc_close(nc) + }, error = function(e) { + if (verbose) warning("Could not detect product from NetCDF metadata, defaulting to terra") + }) + + # Extract and validate required layer indices + evi_idx <- which(grepl("EVI", names(rast_obj), ignore.case = TRUE))[1] + qa_idx <- which(grepl("Quality", names(rast_obj), ignore.case = TRUE))[1] + date_idx <- which(grepl("composite_day_of_the_year", names(rast_obj), ignore.case = TRUE))[1] + + if (is.na(evi_idx) || is.na(qa_idx) || is.na(date_idx)) { + if (verbose) { + message("Skipping file: missing required layers. EVI: ", !is.na(evi_idx), + ", QA: ", !is.na(qa_idx), ", Date: ", !is.na(date_idx)) + } + return(NULL) + } + + # Apply QA mask: keep only pixels with good QA values + qa_r <- rast_obj[[qa_idx]] + keep_mask <- terra::app(qa_r, function(x) x %in% keep_values) + + # Mask, project, and scale EVI + evi <- terra::mask(rast_obj[[evi_idx]], keep_mask, maskvalue = FALSE) |> + terra::project(domain_template, method = "average") |> + terra::app(function(x) x * 100) + + # Mask and project date (composite day of year) + date <- terra::mask(rast_obj[[date_idx]], keep_mask, maskvalue = FALSE) |> + terra::project(domain_template, method = "mode") + + # Get pid layer from domain + if (!"pid" %in% names(domain_template)) { + stop("domain_template must include a 'pid' layer") + } + pid_layer <- domain_template[["pid"]] + + # Convert rasters to matrices and vectorize + evi_matrix <- terra::as.matrix(evi, wide = TRUE) + date_matrix <- terra::as.matrix(date, wide = TRUE) + pid_matrix <- terra::as.matrix(pid_layer, wide = TRUE) + + evi_vec <- as.vector(evi_matrix) + date_vec <- as.vector(date_matrix) + pid_vec <- as.vector(pid_matrix) + + # Identify valid observations (all three must be non-NA) + valid_idx <- !is.na(evi_vec) & !is.na(date_vec) & !is.na(pid_vec) + + if (!any(valid_idx)) { + if (verbose) message("No valid observations in ", basename(nc_path)) + return(NULL) + } + + # Convert day-of-year to days-since-epoch + ref_year <- as.integer(format(month_start, "%Y")) + year_start <- as.Date(paste0(ref_year, "-01-01")) + + doy_to_epoch <- function(doy) { + if (is.na(doy) || !is.finite(doy)) return(NA_integer_) + date_obj <- year_start + (as.integer(doy) - 1) + as.integer(date_obj - as.Date("1970-01-01")) + } + + # Build observation tibble with vectorized date conversion + obs_df <- tibble::tibble( + pid = as.integer(pid_vec[valid_idx]), + date = as.integer(sapply(date_vec[valid_idx], doy_to_epoch)), + variable = sensor_id, + value = as.integer(evi_vec[valid_idx]) + ) + + if (verbose) { + message("Extracted ", nrow(obs_df), " observations from ", basename(nc_path), " (", product_name, ")") + } + + obs_df +} + + +#' @title Convert MODIS VI NetCDF files to parquet format +#' @description Processes downloaded NetCDF files: applies QA masking, reprojects to domain grid, +#' and converts observations to parquet format with one row per observation. +#' @author EMMA Team +#' @param netcdf_directory Path to directory containing downloaded NetCDF files and metadata +#' @param domain_raster A SpatRaster (domain.tif) defining the output grid and mask +#' @param month_start Start date for monthly period (YYYY-MM-DD) +#' @param out_dir Output directory for parquet files +#' @param cleanup Logical to delete temporary files after processing. Defaults to TRUE on GitHub Actions (GITHUB_ACTIONS env var), FALSE on local execution. +#' @param verbose Logical for progress messages +#' @return Character path to output parquet file (format: modis_vi_YYYYMM.gz.parquet) +#' @details +#' Parquet schema: +#' - pid (int32): Pixel ID from domain grid +#' - date (int32): Days since epoch (1970-01-01) +#' - variable (int32): Sensor code (1=Terra, 2=Aqua, 3=VIIRS) +#' - value (int32): EVI value × 100 +#' +#' One row per unique observation (pid, date, sensor combination). +#' @export +netcdf_to_parquet <- function( + netcdf_directory, + domain_raster, + month_start, + out_dir = "data/processed_data/dynamic_parquet/modis_vi", + cleanup = Sys.getenv("GITHUB_ACTIONS") == "true", + verbose = TRUE +) { + + month_start <- as.Date(month_start) + yyyymm <- format(month_start, "%Y%m") + + terra_tmp <- file.path(getwd(), "data/temp/terra") + + # Clean terra temp + unlink(terra_tmp, recursive = TRUE, force = TRUE) + dir.create(terra_tmp, recursive = TRUE, showWarnings = FALSE) + terraOptions(tempdir = terra_tmp, memfrac = 0.8) + + # Validate and load NetCDF files + nc_paths <- list.files(netcdf_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) + if (length(nc_paths) == 0) { + if (verbose) message("No NetCDF files found in ", netcdf_directory, " - writing skip marker") + + # Create a lightweight skip marker file instead of fake data + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + skip_file <- file.path(out_dir, paste0("modis_vi_", yyyymm, "_monthly.skip")) + + writeLines( + c( + paste("Month:", yyyymm), + paste("Reason: No NetCDF files available for processing"), + paste("Note: Possible causes - polar region, cloud cover, instrument malfunction, or outside data availability period"), + paste("Timestamp:", Sys.time()) + ), + skip_file + ) + + if (verbose) message("Created skip marker: ", skip_file) + + if (cleanup) { + unlink(netcdf_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + } + + return(skip_file) + } + + if (verbose) message("Reading ", length(nc_paths), " NetCDF files") + + +# Vargas et al.,15 pixels with any of the following QA flags were removed: +# not confidently clear, adjacent to cloud, cloud shadow, snow or ice, thin cirrus cloud, +# high aerosol loading, solar zenith angle >65 deg, and not over land. + + # Apply QA mask to VI layers + qa_lookup <- list.files( + netcdf_directory, + pattern = "(VI-Quality-lookup).*\\.csv$", + full.names = TRUE, + recursive = TRUE + ) + if (!length(qa_lookup)) { + stop("QA lookup table (VI_Quality*.csv) not found in netcdf_directory; cannot mask VI data") + } + + keep_values <- extract_keep_qa_values(qa_lookup) + if (!length(keep_values)) { + stop("No 'good quality' entries found in any QA table; refusing to proceed") + } + + if (verbose) message("Using ", length(keep_values), " QA values for masking") + + # Load and validate domain raster + domain_template <- if (is.character(domain_raster)) terra::rast(domain_raster) else domain_raster + + if (!"pid" %in% names(domain_template)) { + stop("domain_raster must include a 'pid' layer") + } + + # Get domain mask and valid pids + mask_layer <- if ("domain" %in% names(domain_template)) domain_template[["domain"]] else domain_template + pid_raster <- terra::mask(domain_template[["pid"]], mask_layer) + valid_pids <- unique(terra::values(pid_raster)[, 1]) + valid_pids <- valid_pids[!is.na(valid_pids)] + + if (verbose) message("Domain has ", length(valid_pids), " valid pixels") + + # Process each NetCDF file independently (call helper once per file) + all_obs <- list() + + for (nc_path in nc_paths) { + obs <- extract_vi_observations( + nc_path = nc_path, + domain_template = domain_template, + keep_values = keep_values, + month_start = month_start, + verbose = verbose + ) + + if (!is.null(obs)) { + # Filter to domain pids + obs <- obs[obs$pid %in% valid_pids, ] + if (nrow(obs) > 0) { + all_obs[[length(all_obs) + 1]] <- obs + } + } + } + + if (length(all_obs) == 0) { + if (verbose) message("No valid observations found after QA masking and domain filtering") + if (cleanup) { + unlink(netcdf_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + } + return(NA_character_) + } + + # Bind all observations into single dataframe and drop any NAs (should be none after filtering, but just in case) + df <- dplyr::bind_rows(all_obs)|> + dplyr::filter(!is.na(.data$value)) + + + # Write to parquet + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + parquet_file <- file.path(out_dir, sprintf("dynamic_modis_vi_%s.gz.parquet", yyyymm)) + + unlink(parquet_file) + if (verbose) message("Writing ", nrow(df), " observations to parquet") + arrow::write_parquet( + df, + sink = parquet_file, + compression = "gzip" + ) + + if (verbose) message("Parquet file saved: ", parquet_file) + + # Cleanup + if (cleanup) { + unlink(netcdf_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + } + + parquet_file +} + + +#' @title Convert parquet observations back to GeoTIFF +#' @description Reads MODIS VI parquet file, maps observations back to spatial grid using domain_nc, +#' and writes a GeoTIFF. Supports filtering by date/sensor and optional aggregation. +#' @author EMMA Team +#' @param parquet_file Path to parquet file (e.g., modis_vi_202401.gz.parquet) +#' @param domain_nc Path to domain.nc or domain raster (SpatRaster) +#' @param out_file Output GeoTIFF path +#' @param date Optional integer (days since epoch) or Date object to filter specific date. +#' If NULL, uses most recent observation per pixel. If length 2, treated as date range. +#' @param sensor Optional integer: 1=Terra, 2=Aqua, 3=VIIRS. If NULL, uses all available. +#' @param aggregate_fun Optional function to aggregate multiple observations per pixel +#' (e.g., mean, median, max). If NULL, uses most recent observation. +#' @param verbose Logical for progress messages +#' @return Path to written GeoTIFF file +#' @export +parquet_to_geotif <- function( + parquet_file, + domain_nc, + out_file, + date = NULL, + sensor = NULL, + aggregate_fun = NULL, + verbose = TRUE +) { + + # Load parquet + if (!file.exists(parquet_file)) { + stop("Parquet file not found: ", parquet_file) + } + + if (verbose) message("Reading parquet: ", parquet_file) + df <- arrow::read_parquet(parquet_file) + + # Filter by sensor if specified + if (!is.null(sensor)) { + if (!sensor %in% c(1L, 2L, 3L)) stop("sensor must be 1 (Terra), 2 (Aqua), or 3 (VIIRS)") + df <- dplyr::filter(df, .data$variable == sensor) + if (verbose) message("Filtered to sensor: ", c("Terra", "Aqua", "VIIRS")[sensor]) + } + + # Filter by date if specified + if (!is.null(date)) { + # Convert Date to days since epoch if needed + if (inherits(date, "Date")) { + date <- as.integer(date - as.Date("1970-01-01")) + } + + if (length(date) == 1) { + # Single date: filter to exact date + df <- dplyr::filter(df, .data$date == date) + if (verbose) message("Filtered to date: ", as.Date(date, origin = "1970-01-01")) + } else if (length(date) == 2) { + # Date range: filter to range + df <- dplyr::filter(df, .data$date >= min(date) & .data$date <= max(date)) + if (verbose) message("Filtered to date range: ", + as.Date(min(date), origin = "1970-01-01"), " to ", + as.Date(max(date), origin = "1970-01-01")) + } + } + + if (nrow(df) == 0) { + stop("No observations match filter criteria") + } + + # Load domain raster to get pid→spatial mapping + if (verbose) message("Loading domain raster...") + if (is.character(domain_nc)) { + if (!file.exists(domain_nc)) { + stop("domain_nc file not found: ", domain_nc) + } + domain <- terra::rast(domain_nc) + } else { + domain <- domain_nc # Assume it's a SpatRaster + } + + # Extract pid layer + if (!"pid" %in% names(domain)) { + stop("domain raster must include a 'pid' layer") + } + pid_raster <- domain[["pid"]] + + # Aggregate if multiple observations per pixel and aggregate_fun provided + if (!is.null(aggregate_fun)) { + if (verbose) message("Aggregating multiple observations per pixel...") + df <- df %>% + dplyr::group_by(.data$pid) %>% + dplyr::summarise(value = aggregate_fun(.data$value), .groups = "drop") + } else { + # Use most recent observation per pixel (if multiple) + if (verbose && nrow(df) > nrow(dplyr::distinct(df, .data$pid))) { + message("Multiple observations per pixel - using most recent") + } + df <- df %>% + dplyr::arrange(dplyr::desc(.data$date), dplyr::desc(.data$variable)) %>% + dplyr::distinct(.data$pid, .keep_all = TRUE) + } + + # Create output raster + if (verbose) message("Creating raster from ", nrow(df), " observations...") + output_raster <- pid_raster * NA # Start with same structure but all NA + + # Vectorized mapping: create lookup vector indexed by pid + pid_vals <- terra::values(pid_raster)[, 1] # Get all pid values + max_pid <- max(c(df$pid, pid_vals), na.rm = TRUE) + + # Create lookup vector with NA for missing pids, then use vectorized indexing + lookup <- rep(NA_integer_, max_pid) + lookup[df$pid] <- df$value + + # Map all pid values to evi values in one vectorized operation + output_values <- lookup[pid_vals] + terra::values(output_raster) <- output_values + + # Write GeoTIFF + if (verbose) message("Writing GeoTIFF: ", out_file) + dir.create(dirname(out_file), recursive = TRUE, showWarnings = FALSE) + terra::writeRaster( + output_raster, + filename = out_file, + filetype = "GTiff", + datatype = "INT2U", + overwrite = TRUE, + names = "EVI" + ) + + if (verbose) message("GeoTIFF saved: ", out_file) + return(out_file) +} + +# parquet_to_geotif("data/target_outputs/modis_vi/modis_vi_202601.gz.parquet", "data/raw/domain.nc", "output.tif") \ No newline at end of file diff --git a/R/get_release_alos.R b/R/get_release_alos.R deleted file mode 100644 index d3e88137..00000000 --- a/R/get_release_alos.R +++ /dev/null @@ -1,167 +0,0 @@ -#ALOS - -#' @author Brian Maitner - -#make a function to reduce code duplication - -#' @param image_text is the text string used by gee to refer to an image, e.g. "CSP/ERGo/1_0/Global/ALOS_mTPI" -#' @param dir directory to save data in -#' @param domain domain (sf polygon) used for masking -#' @note This code is only designed to work with a handful of images by CSP/ERGo -get_alos_data <- function(image_text, dir, domain, - json_token){ - - #Load the image - - focal_image <- ee$Image(image_text) - - focal_name <- focal_image$getInfo()$properties$visualization_0_name - - focal_name <- tolower(focal_name) - - focal_name <-gsub(pattern = " ", replacement = "_", x = focal_name) - - #Format the domain - domain <- sf_as_ee(x = domain) - domain <- domain$geometry() - - #get CRS - crs <- focal_image$getInfo()$bands[[1]]$crs - - #Download the raster - ee_as_raster(image = focal_image, - region = domain, - #scale = 100, #used to adjust the scale. commenting out uses the default - dsn = file.path(dir,focal_name), - maxPixels = 10000000000, - drive_cred_path = json_token) - - -}# end function - - - -#' @description This function makes use of the previous helper function to download data -#' @param domain domain (sf polygon) used for masking -#' @param temp_directory Where to save the files, defaults to "data/raw_data/alos/" -#' @param tag tag for the release you want the data stored in -get_release_alos <- function(temp_directory = "data/temp/raw_data/alos/", - tag = "raw_static", - domain, - json_token){ - - #make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory, recursive = TRUE) - } - - - #Make sure there is a release by attempting to create one. If it already exists, this will fail - - tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", - tag = tag), - error = function(e){message("Previous release found")}) - - - #Initialize earth engine (for targets works better if called here) - - #ee_Initialize() - - # Get files that have been downloaded - - alos_files <- list.files(temp_directory, pattern = ".tif$") - - #Download files that have not previously been downloaded - - # mTPI - if(!length(grep(pattern = "mtpi",x = alos_files)) > 0){ - - get_alos_data(image_text = "CSP/ERGo/1_0/Global/ALOS_mTPI", - dir = temp_directory, - domain = domain, - json_token = json_token) - - } - - # release - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = file.path(temp_directory,"alos_mtpi.tif"), - tag = tag, - name = "alos_mtpi.tif") - - # delete - file.remove(file.path(temp_directory,"alos_mtpi.tif")) - - - # CHILI - if(!length(grep(pattern = "chili",x = alos_files)) > 0){ - - get_alos_data(image_text = "CSP/ERGo/1_0/Global/ALOS_CHILI", - dir = temp_directory, - domain = domain, - json_token = json_token) - - } - - # release - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = file.path(temp_directory,"alos_chili.tif"), - tag = tag, - name = "alos_chili.tif") - - # delete - file.remove(file.path(temp_directory,"alos_chili.tif")) - - - # landforms - if(!length(grep(pattern = "landforms",x = alos_files)) > 0){ - get_alos_data(image_text = 'CSP/ERGo/1_0/Global/ALOS_landforms', - dir = temp_directory, - domain = domain, - json_token = json_token) - } - - # release - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = file.path(temp_directory,"landforms.tif"), - tag = tag, - name = "alos_landforms.tif") - - # delete - file.remove(file.path(temp_directory,"landforms.tif")) - - - # topo diversity - if(!length(grep(pattern = "topographic",x = alos_files)) > 0){ - get_alos_data(image_text = 'CSP/ERGo/1_0/Global/ALOS_topoDiversity', - dir = temp_directory, - domain = domain, - json_token = json_token) - } - - # release - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = file.path(temp_directory,"alos_topographic_diversity.tif"), - tag = tag, - name = "alos_topodiversity.tif") - - # delete - file.remove(file.path(temp_directory,"alos_topographic_diversity.tif")) - - - # Clean up - unlink(x = file.path(temp_directory), recursive = TRUE) - - - message("Finished downloading ALOS layers") - - - return(tag) - -} - - - -################################## - diff --git a/R/get_release_climate_chelsa.R b/R/get_release_climate_chelsa.R deleted file mode 100644 index 23c8d1eb..00000000 --- a/R/get_release_climate_chelsa.R +++ /dev/null @@ -1,129 +0,0 @@ -#R script to download climate data (CHELSA) - -library(terra) - -#' @author Brian Maitner -#' @description This function will download CHELSA climate data if it isn't present, and (invisibly) return a NULL if it is present -#' @param temp_directory Where to save the files, defaults to "data/raw_data/climate_chelsa/" -#' @param domain domain (sf polygon) used for masking -#' @param tag Tag for the release -#' @import terra -get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/climate_chelsa/", - tag = "raw_static", - domain){ - - #ensure temp directory is empty - - if(dir.exists(temp_directory)){ - unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - #make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory,recursive = TRUE) - } - - - #Make sure there is a release by attempting to create one. If it already exists, this will fail - - tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", - tag = tag), - error = function(e){message("Previous release found")}) - - #Adjust the download timeout duration (this needs to be large enough to allow the download to complete) - - if(getOption('timeout') < 1000){ - options(timeout = 1000) - } - - - #Transform domain to wgs84 to get the coordinates - - # domain_extent <- - # domain %>% - # st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")@projargs)%>% - # extent() - - domain_tf <- - domain %>% - sf::st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")) - - # Download the data - # Note that it would be useful to clip these to a polygon to save space - # It would also be useful if only the relevant data could be downloaded (rather than downloading and THEN pruning) - - bio_vec <- - c("1","2","3","4","5","6","7","8","9", - "10","11","12","13","14","15","16","17","18","19") - - for(i in bio_vec){ - - # download files - # download.file(url = paste("https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/bio/CHELSA_bio10_",i,".tif",sep = ""), - # destfile = file.path(temp_directory,paste("CHELSA_bio10_",i,"_V1.2.tif",sep = "")) - # ) - - # https://os.zhdk.cloud.switch.ch/chelsav2/GLOBAL/climatologies/1981-2010/bio/CHELSA_bio1_1981-2010_V.2.1.tif - robust_download_file(url = paste("https://os.zhdk.cloud.switch.ch/chelsav2/GLOBAL/climatologies/1981-2010/bio/CHELSA_bio",i,"_1981-2010_V.2.1.tif",sep = ""), - destfile = file.path(temp_directory,paste("CHELSA_bio",i,"_1981-2010_V.2.1.tif",sep = "")), - max_attempts = 10, - sleep_time = 10 - ) - - # load - rast_i <- terra::rast(file.path(temp_directory,paste("CHELSA_bio",i,"_1981-2010_V.2.1.tif",sep = ""))) - - # crop - - rast_i <- terra::crop(x = rast_i, - y = ext(domain_tf)) - - # mask - rast_i <- - terra::mask(rast_i, - mask = terra::vect(domain_tf)) - - # save raster - terra::writeRaster(x = rast_i, - filename = file.path(temp_directory,paste("CHELSA_bio",i,"_1981-2010_V.2.1.tif",sep = "")), - overwrite = TRUE) - - # plot - # plot(rast_i) - # plot(domain_tf,add=TRUE,col=NA) - - rm(rast_i) - - } - - rm(i,bio_vec) - - - # release - to_release <- - list.files(path = file.path(temp_directory), - recursive = TRUE, - full.names = TRUE) - - - to_release <- - to_release[grepl(pattern = "CHELSA", - ignore.case = TRUE, - x = basename(to_release))] - - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = to_release, - tag = tag) - - # delete directory and contents - unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) - - - - message("CHELSA climate files downloaded") - return(Sys.Date()) - - -} # end fx - diff --git a/R/get_release_clouds_wilson.R b/R/get_release_clouds_wilson.R index b538a5c4..47a4cfca 100644 --- a/R/get_release_clouds_wilson.R +++ b/R/get_release_clouds_wilson.R @@ -96,15 +96,15 @@ get_release_clouds_wilson <- function(temp_directory = "data/temp/raw_data/cloud # Push release - pb_upload(file = file.path(temp_directory, filename), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - name = filename, - overwrite = TRUE) + # pb_upload(file = file.path(temp_directory, filename), + # repo = "AdamWilsonLab/emma_envdata", + # tag = tag, + # name = filename, + # overwrite = TRUE) # Delete file - file.remove(file.path(temp_directory, filename)) + # file.remove(file.path(temp_directory, filename)) # pause to keep github happy Sys.sleep(sleep_time) diff --git a/R/get_release_kndvi_modis.R b/R/get_release_kndvi_modis.R deleted file mode 100644 index 8dc6d606..00000000 --- a/R/get_release_kndvi_modis.R +++ /dev/null @@ -1,393 +0,0 @@ - -library(rgee) -library(tidyverse) - -#' @description This function will download kndvi layers (derived from MODIS 16 day products), skipping any that have been downloaded already. -#' @author Brian Maitner, but built from code by Qinwen, Adam, and the KNDVI ms authors -#' @param temp_directory The directory the fire layers should be saved to prior to releasing, defaults to "data/raw_data/kndvi_modis/" -#' @param tag tag to be used for the Github release -#' @param domain domain (sf polygon) used for masking -#' @param max_layers the maximum number of layers to download at once. Set to NULL to ignore. Default is 50 -#' @param sleep_time Amount of time to wait between attempts. Needed to keep github happy -#' @import rgee -get_release_kndvi_modis <- function(temp_directory = "data/temp/raw_data/kndvi_modis/", - tag = "raw_kndvi_modis", - domain, - max_layers = 50, - sleep_time = 1, - json_token, - verbose = TRUE) { - - - # #Ensure directory is empty if it exists - - if(dir.exists(temp_directory)){ - - if(verbose){message("Clearing directory")} - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - - } - - # make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - - if(verbose){message("Creating directory")} - dir.create(temp_directory, recursive = TRUE) - - } - - #Make sure there is a release by attempting to create one. If it already exists, this will fail - - - # get list releases - - if(verbose){message("Getting metadata for releases")} - - released_files <- pb_list(repo = "AdamWilsonLab/emma_envdata") - - #Make sure there is a release by attempting to create one. If it already exists, this will fail - - if(!tag %in% released_files$tag){ - - if(verbose){message("Creating a new release")} - - - tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", - tag = tag), - error = function(e){message("Previous release found")}) - - } - - #Initialize earth engine (for targets works better if called here) - - #ee_Initialize() #commenting this out since it wipes out manually added credentials - - # Load the image collection - - if(verbose){message("Loading image collection")} - modis_ndvi <- ee$ImageCollection("MODIS/061/MOD13A1") #500 m - # modis_ndvi <- ee$ImageCollection("MODIS/006/MOD13A2") #1 km - - - #Format the domain - - if(verbose){message("Formatting the domain")} - domain <- sf_as_ee(x = domain) - domain <- domain$geometry() - - # Add a kndvi band - - get_kndvi <- function(img){ - - red <- img$select("sur_refl_b01") - nir <- img$select("sur_refl_b02") - - #Commented out code below is the original ee code provided by https://doi-org.gate.lib.buffalo.edu/10.1126/sciadv.abc7447 - - #// Compute D2 a rename it to d2 - #var D2 = nir.subtract(red).pow(2).select([0],['d2']) - - D2 <- nir$subtract(red)$pow(2)$select(0)$rename("d2") #note that this rename should be do-able within the select, but it seems to cause issues when rgee tries to rename a single band using select - - # // Gamma, defined as 1/sigmaˆ2 - # var gamma = ee.Number(4e6).multiply(-2.0); - - gamma <- ee$Number(4e6)$multiply(-2.0) - - # // Compute kernel (k) and KNDVI - # var k = D2.divide(gamma).exp(); - - k <- D2$divide(gamma)$exp() - - # var kndvi = ee.Image.constant(1) - # .subtract(k).divide( - # ee.Image.constant(1).add(k)) - # .select([0],['knd']); - - kndvi <- ee$Image$constant(1)$ - subtract(k)$divide( - ee$Image$constant(1)$add(k))$ - select(0)$rename("KNDVI")$ - set('system:time_start',img$get('system:time_start'))$ #these last lines just copy over metadata I thought might be useful - set('system:time_end',img$get('system:time_end')) - - img$addBands(kndvi) - - - } - - if(verbose){message("Generating the KNDVI data")} - - modis_kndvi <- modis_ndvi$map(get_kndvi) - - #Map$addLayer(modis_kndvi$first()$select("KNDVI"),visParams = ndviviz) - - - #MODIS makes it simple to filter out poor quality pixels thanks to a quality control bits band (DetailedQA). - #The following function helps us to distinct between good data (bit == …00) and marginal data (bit != …00). - - getQABits <- function(image, qa) { - # Convert binary (character) to decimal (little endian) - qa <- sum(2^(which(rev(unlist(strsplit(as.character(qa), "")) == 1))-1)) - # Return a mask band image, giving the qa value. - image$bitwiseAnd(qa)$lt(1) - } - - #Using getQABits we construct a single-argument function (mod13A2_clean) - #that is used to map over all the images of the collection (modis_ndvi). - - mod13A1_clean <- function(img) { - - # Extract the NDVI band - kndvi_values <- img$select("KNDVI") - - # Extract the quality band - ndvi_qa <- img$select("SummaryQA") - - # Select pixels to mask - quality_mask <- getQABits(ndvi_qa, "11") - - # Mask pixels with value zero. - kndvi_values$updateMask(quality_mask) - - - } - - - # Clean the dataset - - if(verbose){message("Cleaning the data")} - - kndvi_clean <- modis_kndvi$map(mod13A1_clean) - - #Get a list of files already released - - if(verbose){message("Identifying which files have been released")} - - kndvi_tag <- tag - - released_files <- - released_files %>% - filter(tag == kndvi_tag) - - released_files$date <- gsub(pattern = ".tif", - replacement = "", - x = released_files$file_name) - - released_files <- - released_files %>% - dplyr::filter(file_name != "") %>% - dplyr::filter(file_name != "log.csv") - - - #check to see if any images have been downloaded already - - if(nrow(released_files) == 0){ - - newest <- lubridate::as_date(-1) #if nothing is downloaded, start in 1970 - - }else{ - - newest <- max(lubridate::as_date(released_files$date)) #if there are images, start with the most recent - - } - - #Filter the data to exclude anything you've already downloaded (or older) - - if(verbose){message("Filtering by date")} - - kndvi_clean_and_new <- kndvi_clean$filterDate(start = paste(as.Date(newest+1),sep = ""), - opt_end = paste(format(Sys.time(), "%Y-%m-%d"),sep = "") ) #I THINK I can just pull the most recent date, and then use this to download everything since then - - - - # Function to optionally limit the number of layers downloaded at once - ## Note that this code is placed before the gain and offset adjustment, which removes the metadata needed in the date filtering - - - if(verbose){message("Filtering to max layers (if needed)")} - - if(!is.null(max_layers)){ - - info <- kndvi_clean_and_new$getInfo() - to_download <- unlist(lapply(X = info$features, FUN = function(x){x$properties$`system:index`})) - to_download <- gsub(pattern = "_", replacement = "-", x = to_download) - - if(length(to_download) > max_layers){ - kndvi_clean_and_new <- kndvi_clean_and_new$filterDate(start = to_download[1], - opt_end = to_download[max_layers+1]) - - } - - - }# end if maxlayers is not null - - - # This section causes errors in later layer (since early 2022). Despite months of an open ticket on earth engine, the issue persists so I'll do it with R instead - # #Adjust gain and offset - # adjust_gain_and_offset <- function(img){ - # img$add(1)$multiply(100)$round() - # - # } -# -# -# kndvi_clean_and_new <- kndvi_clean_and_new$map(adjust_gain_and_offset) - - - # Check if anything to download - - if(length(kndvi_clean_and_new$getInfo()$features) == 0 ){ - - message("Releases are already up to date.") - return(max(gsub(pattern = "_",replacement = "-",x = released_files$date))) #return the last date that had been done - - } - - - #Download layers - - if(length(kndvi_clean_and_new$getInfo()$features) == 1 ){ - - if(verbose){message("Downloading a single layer")} - - # assign name - - file_name <- kndvi_clean_and_new$getInfo()$features[[1]]$properties$`system:index` - - if(!is.Date(as_date(file_name))){stop("Error in filename")} - - # convert to image - - kndvi_clean_and_new_image <- kndvi_clean_and_new %>% - ee$ImageCollection$toList(count = 1, offset = 0) %>% - ee$List$get(0) %>% - ee$Image() - - # download single image - - tryCatch(expr = - ee_as_stars(image = kndvi_clean_and_new_image, - region = domain, - dsn = file.path(temp_directory,file_name), - formatOptions = c(cloudOptimized = true), - drive_cred_path = json_token - ), - error = function(e){message("Captured an error in rgee/earth engine processing of NDVI.")} - )#trycatch - - }else{ - - tryCatch(expr = - ee_imagecollection_to_local(ic = kndvi_clean_and_new, - region = domain, - dsn = temp_directory, - formatOptions = c(cloudOptimized = true), - drive_cred_path = json_token - #,scale = 463.3127 - ), - error = function(e){message("Captured an error in rgee/earth engine processing of NDVI.")} - ) - - }#else - - - - #Push files to release - - # Get a lost of the local files - - local_files <- data.frame(local_filename = list.files(path = temp_directory, - recursive = TRUE, - full.names = TRUE)) - - # end things if nothing was downloaded - - if(nrow(local_files) == 0){ - message("Nothing downloaded") - return(max(gsub(pattern = "_",replacement = "-",x = released_files$date))) #return the last date that had been done - } - - - # Get a list of the local files - local_files <- data.frame(local_filename = list.files(path = temp_directory, - recursive = TRUE, - full.names = TRUE)) - - - - # loop through and release everything - - for( i in 1:nrow(local_files)){ - - # adjusting gain and offset - # Note: this section could be omitted if earth engine fixes their modis import - - # check the filename - - - file_name_i <- - local_files$local_filename[i] %>% - basename() - - file_name_i <- gsub(pattern = ".tif",replacement = "",x = file_name_i) - - if(!is.Date(as_date(file_name_i))){stop("Error in filename")} - - - - # load the file - - rast_i <- terra::rast(local_files$local_filename[i]) - - # reformat - rast_i <- ((rast_i + 1)*100) %>% - round() - - # save - - terra::writeRaster(x = rast_i, - filename = local_files$local_filename[i], - overwrite=TRUE) - - #cleanup - rm(rast_i) - - # End gain and offset bit - - Sys.sleep(sleep_time) #We need to limit our rate in order to keep Github happy - - pb_upload(file = local_files$local_filename[i], - repo = "AdamWilsonLab/emma_envdata", - tag = tag) - - } # end i loop - - - # Delete temp files - unlink(x = gsub(pattern = "/$", replacement = "", x = temp_directory), #sub used to delete any trailing slashes, which interfere with unlink - recursive = TRUE) - - # End - - message("Finished Downloading KNDVI layers") - - local_files %>% - filter(grepl(pattern = ".tif$",x = local_filename)) %>% - mutate(date_format = basename(local_filename)) %>% - mutate(date_format = gsub(pattern = ".tif",replacement = "",x = date_format)) %>% - mutate(date_format = gsub(pattern = "_",replacement = "-",x = date_format)) %>% - mutate(date_format = lubridate::as_date(date_format))%>% - dplyr::select(date_format) -> local_files - - return(as.character(max(local_files$date_format))) # return the date of the latest file that was updated - - -}# End get_kndvi fx - - - - - - - diff --git a/R/national_boundary.R b/R/national_boundary.R deleted file mode 100644 index fd86f380..00000000 --- a/R/national_boundary.R +++ /dev/null @@ -1,30 +0,0 @@ -# National Boundary - -#' @author Adam M. Wilson -#' @description Download national boundary file from the UN -#' @source https://data.humdata.org/dataset/south-africa-admin-level-1-boundaries - -national_boundary <- function(file="data/south_africa.gpkg"){ - - #Adjust timeout to allow for slow internet - if(getOption('timeout') < 1000){ - options(timeout = 1000) - } - - - url="https://data.humdata.org/dataset/061d4492-56e8-458c-a3fb-e7950991adf0/resource/f5b08257-8d03-48dc-92c8-aaa4fb7285f0/download/zaf_adm_sadb_ocha_20201109_shp.zip" - tmpfile1=tempfile() - tmpdir1=tempdir() - download.file(url,destfile = tmpfile1) - unzip(tmpfile1,exdir=tmpdir1) - - country=st_read(file.path(tmpdir1,"zaf_adm_sadb_ocha_20201109_SHP/zaf_admbnda_adm0_sadb_ocha_20201109.shp")) -# st_write(country,dsn=file,append=F) -# return(file) - - return(country) -} -# end function - - - diff --git a/R/network_drive_explore.R b/R/network_drive_explore.R deleted file mode 100644 index 48a9a49c..00000000 --- a/R/network_drive_explore.R +++ /dev/null @@ -1,62 +0,0 @@ -# # box code not working -# library(boxr) -# library(tidyverse) -# -# # library(fs) -# # dir_create("~/.boxr-auth") -# -# # from https://github.com/r-box/boxr/issues/166 -# # options(boxr.retry.times = 10) -# -# #box_auth() -# -# # sometimes this fails for no apparent reason - must just wait for it to work again! -# # https://github.com/r-box/boxr/issues/166 -# box_auth_service() -# #box_auth_service(token_text = unlist(read_lines('~/.boxr-auth/token.json'))) -# -# # root directory -# -# -# box_setwd() -# -# -# # create new directory to hold results -# dir_name="emmabox" -# box_dir_create(dir_name = dir_name) -# -# eid <- box_ls() %>% as.data.frame() %>% filter(name==dir_name) -# -# # Share folder with -# uid=271686873 # adamw@buffalo.edu -# -# -# box_collab_create( -# dir_id = eid$id, -# user_id = uid, -# role = "co-owner", -# can_view_path = TRUE -# ) -# -# # set box working directory -# box_setwd(eid$id) -# box_setwd("..") -# -# boxr_options() -# box_ls() -# -# # test writing to folder -# box_write( -# iris, -# "iris.csv") -# -# files <- box_ls() %>% as.data.frame -# -# files %>% -# filter(name=="iris.csv") %>% -# select(id) %>% unlist() %>% -# box_delete_file() -# -# -# -# diff --git a/R/process_dynamic_data.R b/R/process_dynamic_data.R new file mode 100644 index 00000000..26f8e33b --- /dev/null +++ b/R/process_dynamic_data.R @@ -0,0 +1,101 @@ + +library(arrow) +library(tidyverse) + + +############################################################# +#' @author Brian Maitner +#' @description this function takes in tif file from the input, converts them to tidy format, and saves as .gz.parquet +#' @param input_dir Directory containing input files. +#' @param output_dir Directory to stick output files in +#' @param variable_name This is included in the tidy file output +#' @param ... Does nothing. Used for targets. +#' @note Output dataframes have three columns: CellID, date, variable, value. ALso note that cells with NA values are omitted. +process_dynamic_data_to_parquet <- function(input_dir = "data/raw_data/ndvi_modis/", + output_dir = "data/processed_data/dynamic_parquet/ndvi/", + variable_name = "ndvi", + ...){ + + + # make a directory if one doesn't exist yet + + if(!dir.exists(output_dir)){ + + dir.create(output_dir, recursive = TRUE) + + } + + # get files + + all_files <- list.files(path = input_dir,pattern = ".tif$",full.names = TRUE) + + all_files_int <- + all_files %>% + gsub(pattern = input_dir, replacement = "") %>% + gsub(pattern = "/", replacement = "") %>% + gsub(pattern = ".tif", replacement = "") %>% + lubridate::as_date()|> + as.numeric() + + + # figure out which files have been processed + + output_files <- + list.files(path = output_dir, pattern = ".gz.parquet", full.names = TRUE) %>% + gsub(pattern = output_dir, replacement = "") %>% + gsub(pattern = "/", replacement = "") %>% + gsub(pattern = ".gz.parquet", replacement = "") + + #Don't worry about files that have been processed already + + all_files <- all_files[which(!all_files_int %in% output_files)] + + rm(output_files, all_files_int) + + #end if things are already done + if(length(all_files) == 0){ + + message(paste("Finished converting ", + variable_name, + " files to parquet", sep = "")) + + return(output_dir) + + } + + + # process the files that haven't been done yet + + + for(i in 1:length(all_files)){ + + # Get the date in integer format (will append to the data) + all_files[i] |> + gsub(pattern = input_dir, replacement = "")|> + gsub(pattern = "/", replacement = "")|> + gsub(pattern = ".tif", replacement = "")|> + lubridate::as_date()|> + as.numeric()-> integer_date_i + + + # Process ith file + + all_files[i] |> + stars::read_stars() |> + as.data.frame() %>% + mutate(cellID = row_number(), + date = integer_date_i, + variable = variable_name) %>% + rename( value := 3) %>% + dplyr::select(cellID, date, variable, value ) %>% + drop_na() %>% + write_parquet(sink = paste(output_dir, integer_date_i, ".gz.parquet", sep = ""), + compression = "gzip") + + } #end i loop + + #End fx + message(paste("Finished converting ",variable_name, " files to parquet",sep = "")) + return(output_dir) + +}#end fx diff --git a/R/process_fix_modis_NDVI_release_extent.R b/R/process_fix_modis_NDVI_release_extent.R deleted file mode 100644 index 828f0593..00000000 --- a/R/process_fix_modis_NDVI_release_extent.R +++ /dev/null @@ -1,317 +0,0 @@ -temp_directory = "data/temp/raw_data/ndvi_modis_extent/" -tag = "raw_ndvi_modis" -max_layers = NULL -sleep_time = 1 -verbose=TRUE - - -# code to fix raster extent issues - -# MODIS 6.1 fire rasters from 2000 to 2019 have one set of extents, 2020 another, and 2021 - present another. -#' @description to check the Extent of MODIS products downloaded from rgee -#' @author Brian Maitner -#' @param temp_directory The directory the layers should be temporarily saved in -#' @param tag tag associated with the Github release -#' @param max_layers the maximum number of layers to correct at once. Default (NULL) is to use all. -#' @param sleep_time amount of time to pause after using pb_upload/download. Used to keep Git happy -process_fix_modis_NDVI_release_extent <- function(temp_directory, - tag, - max_layers = NULL, - sleep_time = 0.1, - verbose=FALSE, - ...){ - - # get a list of released files - - if(verbose){message("Downloading list of releases")} - - released_files <- pb_list(repo = "AdamWilsonLab/emma_envdata", - tag = tag) - - # #Ensure directory is empty if it exists - - if(dir.exists(temp_directory)){ - - if(verbose){message("Emptying directory")} - - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - - # make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - - if(verbose){message("Creating directory")} - - dir.create(temp_directory, recursive = TRUE) - - } - - #set up a change log if needed - - if("extent_log.csv" %in% released_files$file_name){ - - if(verbose){message("Downloading log")} - - - robust_pb_download(file = "extent_log.csv", - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - - }else{ - - if(verbose){message("Creating log")} - - suppressWarnings(expr = - cbind("file","original_extent","final_extent") %>% - write.table(x = ., - file = file.path(temp_directory,"extent_log.csv"), - append = FALSE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - ) - - - } - - - # Get a list of raster that haven't been fixed by comparison with the log - - if(verbose){message("Identifying rasters in need of processing")} - - rasters <- released_files$file_name[grep(x = released_files$file_name, pattern = ".tif")] - - log <- read.csv(file.path(temp_directory, "extent_log.csv")) - - rasters <- rasters[which(!rasters %in% log$file)] - - if(!is.null(max_layers)){ - - if(max_layers < length(rasters)){ - - rasters <- rasters[1:max_layers] - - } - - - - } - - - # check whether there is anything left to fix - - if(length(rasters) == 0){ - - message(paste("Finished checking ",tag," extents",sep = "")) - - return( - released_files %>% - filter(tag == tag) %>% - dplyr::select(file_name) %>% - filter(file_name != "") %>% - filter(grepl(pattern = ".tif$", x = file_name)) %>% - mutate(date_format = gsub(pattern = ".tif", - replacement = "", - x = file_name))%>% - mutate(date_format = gsub(pattern = "_", replacement = "-", - x = date_format)) %>% - dplyr::pull(date_format) %>% - max() - ) - - - } - - # IF extent checking is required, load the template used for comparison - - if(verbose){message("Using first MODIS layer as template")} - - - - robust_pb_download(file = released_files$file_name[1], - dest = file.path(temp_directory), - repo = paste(released_files$owner[1], - released_files$repo[1],sep = "/"), - tag = released_files$tag[1], - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - - template <- rast(file.path(temp_directory,released_files$file_name[1])) - - template_extent <- ext(template) |> as.character() - - # iterate and fix - - for(i in 1:length(rasters)){ - - if(verbose){message("Checking raster ", i, " of ", length(rasters))} - - # download ith raster - - robust_pb_download(file = rasters[i], - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - Sys.sleep(sleep_time) - - # load ith raster - - rast_i <- terra::rast(x = file.path(temp_directory,rasters[i])) - - # get the extent - - original_extent <- ext(rast_i) |> as.character() - - # check whether the raster matches the correct extent - - if(!identical(template_extent, original_extent)){ - - message("Detected error in MODIS extent, correcting and logging the change") - - rast_i <- terra::resample(rast_i,y = template,method="near") - - # write a new raster with a different name - - terra::writeRaster(x = rast_i, - filename = file.path(temp_directory,gsub(pattern = ".tif$", - replacement =".temp.tif", - x = rasters[i])), - filetype="GTiff", - overwrite = TRUE) - - # delete old raster - - unlink(file.path(temp_directory,rasters[i])) - - - # update new name - - file.rename(from = file.path(temp_directory,gsub(pattern = ".tif$", - replacement =".temp.tif", - x = rasters[i])), - to = file.path(temp_directory, rasters[i])) - - #log the change - - - data.frame(file = rasters[i], - original_extent = original_extent, - final_extent = template_extent) %>% - - write.table(x = ., - file = file.path(temp_directory,"extent_log.csv"), - append = TRUE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - - # push the updated raster - - # pb_upload(file = file.path(temp_directory,rasters[i]), - # repo = "AdamWilsonLab/emma_envdata", - # tag = tag, - # name = rasters[i], overwrite = TRUE) - - robust_pb_upload(files = file.path(temp_directory,rasters[i]), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - name = rasters[i], - overwrite = TRUE, - sleep_time = sleep_time) - - - #Sys.sleep(sleep_time) - - # push the updated log - - # pb_upload(file = file.path(temp_directory,"extent_log.csv"), - # repo = "AdamWilsonLab/emma_envdata", - # tag = tag) - - robust_pb_upload(file = file.path(temp_directory,"extent_log.csv"), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - sleep_time = sleep_time) - - #Sys.sleep(sleep_time) - - # Delete the new raster - - unlink(file.path(temp_directory,rasters[i])) - - }else{ - - #if the projection is correct, log it - - data.frame(file = rasters[i], - original_extent = original_extent, - final_extent = template_extent) %>% - - write.table(x = ., - file = file.path(temp_directory,"extent_log.csv"), - append = TRUE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - - # pb_upload(file = file.path(temp_directory,"extent_log.csv"), - # repo = "AdamWilsonLab/emma_envdata", - # tag = tag) - - # robust_pb_upload(file = file.path(temp_directory,"extent_log.csv"), - # repo = "AdamWilsonLab/emma_envdata", - # tag = tag) - - robust_pb_upload(file = file.path(temp_directory,"extent_log.csv"), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - sleep_time = sleep_time) - - - # Sys.sleep(sleep_time) - - unlink(file.path(temp_directory,rasters[i])) - - - } - - } #for i rasters loop - - # Cleanup and end - - if(verbose){message("Cleaning up")} - - - # Delete temp files - unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) - - # Finish up - - message(paste("Finished checking ",tag," extents",sep = "")) - - return( - rasters |> - gsub(pattern = ".tif", replacement = "") |> - gsub(pattern = "_",replacement = "-") |> - max() - ) - - - - - - -} #end fx diff --git a/R/process_fix_modis_release_extent.R b/R/process_fix_modis_release_extent.R deleted file mode 100644 index 52d32b35..00000000 --- a/R/process_fix_modis_release_extent.R +++ /dev/null @@ -1,285 +0,0 @@ - -# code to fix raster extent issues - -# MODIS 6.1 fire rasters from 2000 to 2019 have one set of extents, 2020 another, and 2021 - present another. -#' @description to check the Extebt of MODIS products downloaded from rgee -#' @author Brian Maitner -#' @param temp_directory The directory the layers should be temporarily saved in -#' @param tag tag associated with the Github release -#' @param template_release Information on where to find a template to use -#' @param max_layers the maximum number of layers to correct at once. Default (NULL) is to use all. -#' @param sleep_time amount of time to pause after using pb_upload/download. Used to keep Git happy -process_fix_modis_release_extent <- function(temp_directory, - tag, - template_release = template_release, - max_layers = NULL, - sleep_time = 0.1, - verbose=FALSE, - ...){ - - # get a list of released files - - if(verbose){message("Downloading list of releases")} - - released_files <- pb_list(repo = "AdamWilsonLab/emma_envdata", - tag = tag) - - # #Ensure directory is empty if it exists - - if(dir.exists(temp_directory)){ - - if(verbose){message("Emptying directory")} - - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - - # make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - - if(verbose){message("Creating directory")} - - dir.create(temp_directory, recursive = TRUE) - - } - - #set up a change log if needed - - if("extent_log.csv" %in% released_files$file_name){ - - if(verbose){message("Downloading log")} - - - robust_pb_download(file = "extent_log.csv", - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - - }else{ - - if(verbose){message("Creating log")} - - suppressWarnings(expr = - cbind("file","original_extent","final_extent") %>% - write.table(x = ., - file = file.path(temp_directory,"extent_log.csv"), - append = FALSE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - ) - - - } - - - # Get a list of raster that haven't been fixed by comparison with the log - - if(verbose){message("Identifying rasters in need of processing")} - - rasters <- released_files$file_name[grep(x = released_files$file_name, pattern = ".tif")] - - log <- read.csv(file.path(temp_directory, "extent_log.csv")) - - rasters <- rasters[which(!rasters %in% log$file)] - - if(!is.null(max_layers)){ - - if(max_layers < length(rasters)){ - - rasters <- rasters[1:max_layers] - - } - - - - } - - - # check whether there is anything left to fix - - if(length(rasters) == 0){ - - message(paste("Finished checking ",tag," extents",sep = "")) - - return( - released_files %>% - filter(tag == tag) %>% - dplyr::select(file_name) %>% - filter(file_name != "") %>% - filter(grepl(pattern = ".tif$", x = file_name)) %>% - mutate(date_format = gsub(pattern = ".tif", - replacement = "", - x = file_name))%>% - mutate(date_format = gsub(pattern = "_", replacement = "-", - x = date_format)) %>% - dplyr::pull(date_format) %>% - max() - ) - - - } - - # IF extent checking is required, load the template used for comparison - - if(verbose){message("Downloading template")} - - robust_pb_download(file = template_release$file, - dest = file.path(temp_directory), - repo = template_release$repo, - tag = template_release$tag, - overwrite = TRUE, - max_attempts = 10, - sleep_time = 10) - - template <- rast(file.path(temp_directory,template_release$file)) - - template_extent <- ext(template) |> as.character() - - # iterate and fix - - for(i in 1:length(rasters)){ - - if(verbose){message("Checking raster ", i, " of ", length(rasters))} - - # download ith raster - - robust_pb_download(file = rasters[i], - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - Sys.sleep(sleep_time) - - # load ith raster - - rast_i <- terra::rast(x = file.path(temp_directory,rasters[i])) - - # get the extent - - original_extent <- ext(rast_i) |> as.character() - - # check whether the raster matches the correct extent - - if(!identical(template_extent, original_extent)){ - - message("Detected error in MODIS extent, correcting and logging the change") - - rast_i <- terra::resample(rast_i,y = template,method="near") - - # write a new raster with a different name - - terra::writeRaster(x = rast_i, - filename = file.path(temp_directory,gsub(pattern = ".tif$", - replacement =".temp.tif", - x = rasters[i])), - filetype="GTiff", - overwrite = TRUE) - - # delete old raster - - unlink(file.path(temp_directory,rasters[i])) - - - # update new name - - file.rename(from = file.path(temp_directory,gsub(pattern = ".tif$", - replacement =".temp.tif", - x = rasters[i])), - to = file.path(temp_directory, rasters[i])) - - #log the change - - - data.frame(file = rasters[i], - original_extent = original_extent, - final_extent = template_extent) %>% - - write.table(x = ., - file = file.path(temp_directory,"extent_log.csv"), - append = TRUE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - - # push the updated raster - - robust_pb_upload(file = file.path(temp_directory,rasters[i]), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - name = rasters[i], - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - # push the updated log - - robust_pb_upload(file = file.path(temp_directory,"extent_log.csv"), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - max_attempts = 10, - sleep_time = sleep_time, - overwrite = TRUE) - - # Delete the new raster - - unlink(file.path(temp_directory,rasters[i])) - - }else{ - - #if the projection is correct, log it - - data.frame(file = rasters[i], - original_extent = original_extent, - final_extent = template_extent) %>% - - write.table(x = ., - file = file.path(temp_directory,"extent_log.csv"), - append = TRUE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - - robust_pb_upload(file = file.path(temp_directory,"extent_log.csv"), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - max_attempts = 10, - sleep_time = sleep_time, - overwrite = TRUE) - - Sys.sleep(sleep_time) - - unlink(file.path(temp_directory,rasters[i])) - - } - - } #for i rasters loop - - # Cleanup and end - - if(verbose){message("Cleaning up")} - - - # Delete temp files - unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) - - # Finish up - - message(paste("Finished checking ",tag," extents",sep = "")) - - return( - rasters |> - gsub(pattern = ".tif", replacement = "") |> - gsub(pattern = "_",replacement = "-") |> - max() - ) - -} #end fx diff --git a/R/process_fix_modis_release_projection.R b/R/process_fix_modis_release_projection.R deleted file mode 100644 index 60743be3..00000000 --- a/R/process_fix_modis_release_projection.R +++ /dev/null @@ -1,278 +0,0 @@ - -#' @description to check the projection of MODIS products downloaded from rgee -#' @author Brian Maitner -#' @param temp_directory The directory the layers should be temporarily saved in -#' @param tag tag associated with the Github release -#' @param max_layers the maximum number of layers to correct at once. Default (NULL) is to use all. -#' @param sleep_time amount of time to pause after using pb_upload/download. Used to keep Git happy -#' @param verbose. More messages are shown -process_fix_modis_release_projection <- - function(temp_directory, - tag, - max_layers = NULL, - sleep_time = 0.1, - verbose = TRUE, - ...){ - - # specify the correct projection - nasa_proj <- "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +R=6371007.181 +units=m +no_defs" - - - # get a list of released files - released_files <- pb_list(repo = "AdamWilsonLab/emma_envdata", - tag = tag) - - # #Ensure directory is empty if it exists - - if(dir.exists(temp_directory)){ - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - - # make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory, recursive = TRUE) - } - - #set up a change log if needed - - if("log.csv" %in% released_files$file_name){ - - robust_pb_download(file = "log.csv", - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - - }else{ - - suppressWarnings(expr = - cbind("file","original_proj","assigned_proj") %>% - write.table(x = ., - file = file.path(temp_directory,"log.csv"), - append = FALSE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - ) - - - } - - #Get a list of raster that haven't been fixed by comparison with the log - - rasters <- released_files$file_name[grep(x = released_files$file_name, pattern = ".tif")] - - log <- read.csv(paste(temp_directory, "log.csv", sep = "")) - - rasters <- rasters[which(!rasters %in% log$file)] - - if(!is.null(max_layers)){ - - if(max_layers < length(rasters)){ - - rasters <- rasters[1:max_layers] - - } - - - - } - - - # check whether there is anything left to fix - - if(length(rasters) == 0){ - - message(paste("Finished updating ",tag," projections",sep = "")) - - return( - released_files %>% - filter(tag == tag) %>% - dplyr::select(file_name) %>% - filter(file_name != "") %>% - filter(grepl(pattern = ".tif$", x = file_name)) %>% - mutate(date_format = gsub(pattern = ".tif", - replacement = "", - x = file_name))%>% - mutate(date_format = gsub(pattern = "_", replacement = "-", - x = date_format)) %>% - dplyr::pull(date_format) %>% - max() - ) - - - } - - - - #iterate and fix - for(i in 1:length(rasters)){ - - if(verbose){message("Checking raster ", i, " of ", length(rasters))} - - # download ith raster - - robust_pb_download(file = rasters[i], - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - Sys.sleep(sleep_time) - - # load ith raster - - rast_i <- terra::rast(x = file.path(temp_directory,rasters[i])) - - # get the projection - - original_proj <- crs(rast_i, proj = TRUE) - - # check whether the raster matches the correct projection - if(!identical(nasa_proj, original_proj)){ - - message("Detected error in MODIS projection for raster ",rasters[i], - " correcting and logging the change") - - crs(rast_i) <- nasa_proj - - # write a new raster with a different name - - terra::writeRaster(x = rast_i, - filename = gsub(pattern = ".tif$", - replacement =".temp.tif", - x = file.path(temp_directory,rasters[i])), - filetype="GTiff", - overwrite = TRUE) - - # delete old raster - - unlink(file.path(temp_directory,rasters[i])) - - - # update new name - - file.rename(from = gsub(pattern = ".tif$", - replacement =".temp.tif", - x = file.path(temp_directory,rasters[i])), - to = file.path(temp_directory, rasters[i])) - - #log the change - - - data.frame(file = rasters[i], - original_proj = original_proj, - assigned_proj = nasa_proj) %>% - - write.table(x = ., - file = file.path(temp_directory,"log.csv"), - append = TRUE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - - # push the updated raster - - # pb_upload(file = file.path(temp_directory,rasters[i]), - # repo = "AdamWilsonLab/emma_envdata", - # tag = tag, - # name = rasters[i], overwrite = TRUE) - - robust_pb_upload(file = file.path(temp_directory,rasters[i]), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - name = rasters[i], - overwrite = TRUE, - sleep_time = sleep_time) - - #Sys.sleep(sleep_time) - - - - # push the updated log - - # pb_upload(file = file.path(temp_directory,"log.csv"), - # repo = "AdamWilsonLab/emma_envdata", - # tag = tag) - # - # Sys.sleep(sleep_time) - - robust_pb_upload(file = file.path(temp_directory,"log.csv"), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - sleep_time = sleep_time) - - - # Delete the new raster - - unlink(file.path(temp_directory,rasters[i])) - - }else{ - - #if the projection is correct, log it - - if(verbose){message("Projection for raster ", rasters[i], " looks correct")} - - data.frame(file = rasters[i], - original_proj = original_proj, - assigned_proj = nasa_proj) %>% - - write.table(x = ., - file = file.path(temp_directory,"log.csv"), - append = TRUE, - col.names = FALSE, - row.names=FALSE, - sep = ",") - - # pb_upload(file = file.path(temp_directory,"log.csv"), - # repo = "AdamWilsonLab/emma_envdata", - # tag = tag) - # - # Sys.sleep(sleep_time) - - robust_pb_upload(file = file.path(temp_directory,"log.csv"), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - name = NULL, - sleep_time = sleep_time) - - - unlink(file.path(temp_directory,rasters[i])) - - - } - - } #for i rasters loop - - # Cleanup and end - - # Delete temp files - unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) - - # Finish up - - message(paste("Finished updating ",tag," projections",sep = "")) - - return( - rasters |> - gsub(pattern = ".tif", replacement = "") |> - gsub(pattern = "_",replacement = "-") |> - max() - ) - - - - - -} # end function - -########################### - - diff --git a/R/process_fix_modis_release_projection_and_extent.R b/R/process_fix_modis_release_projection_and_extent.R deleted file mode 100644 index 914d349f..00000000 --- a/R/process_fix_modis_release_projection_and_extent.R +++ /dev/null @@ -1,288 +0,0 @@ -#' @description to correct the projection and extent of MODIS products downloaded from rgee -#' @author Brian Maitner -#' @param temp_directory The directory the layers should be temporarily saved in -#' @param input_tag tag associated with the Github release -#' @param output_tag -#' @param max_layers the maximum number of layers to correct at once. Default (NULL) is to use all. -#' @param sleep_time amount of time to pause after using pb_upload/download. Used to keep Git happy -#' @param verbose. More messages are shown -process_fix_modis_release_projection_and_extent <- - function(temp_directory, - input_tag, - output_tag, - max_layers = NULL, - sleep_time = 0.1, - verbose = TRUE, - ...){ - - - # specify the correct projection - nasa_proj <- "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +R=6371007.181 +units=m +no_defs" - - - # get a list of released files - released_files <- pb_list(repo = "AdamWilsonLab/emma_envdata", - tag = c(input_tag,output_tag,"raw_ndvi_modis")) - - # filter to only tifs - - released_files %>% - filter(grepl(x = file_name, pattern = ".tif")) -> released_files - - # #Ensure directory is empty if it exists - - if(dir.exists(temp_directory)){ - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - - # make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory, recursive = TRUE) - } - - # make releases if needed - - #Make sure there is an input release - - if(!input_tag %in% released_files$tag){ - - if(verbose){message("Creating a new release")} - - tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", - tag = input_tag), - error = function(e){message("Previous release found")}) - - - } - - #Make sure there is an output release - - if(!output_tag %in% released_files$tag){ - - if(verbose){message("Creating a new release")} - - tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", - tag = output_tag), - error = function(e){message("Previous release found")}) - - - } - - #Get a list of raster that haven't been fixed by comparing input and output - - input_rasters <- released_files %>% filter(tag == input_tag) - - output_rasters <- released_files %>% filter(tag == output_tag) - - rasters <- input_rasters %>% - filter(!file_name %in% output_rasters$file_name) %>% - pull(file_name) - - # Only do the first n layers if max_layers specified, otherwise do all of them - - if(!is.null(max_layers)){ - - if(max_layers < length(rasters)){ - - rasters <- rasters[1:max_layers] - - } - } - - # check whether there is anything left to fix - - if(length(rasters) == 0){ - - message(paste("Finished updating ",tag," projections",sep = "")) - - return( - released_files %>% - filter(tag == tag) %>% - dplyr::select(file_name) %>% - filter(file_name != "") %>% - filter(grepl(pattern = ".tif$", x = file_name)) %>% - mutate(date_format = gsub(pattern = ".tif", - replacement = "", - x = file_name))%>% - mutate(date_format = gsub(pattern = "_", replacement = "-", - x = date_format)) %>% - dplyr::pull(date_format) %>% - max() - ) - } - - # get template raster to align extent to - - # IF extent checking is required, load the template used for comparison - - if(verbose){message("Using first MODIS layer as template")} - - template <- - released_files %>% - filter(tag == "raw_ndvi_modis") %>% - arrange(file_name) %>% - slice_head(n=1) - - robust_pb_download(file = template$file_name[1], - dest = file.path(temp_directory), - repo = paste(template$owner[1], - template$repo[1],sep = "/"), - tag = template$tag[1], - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - #rename the file being used as template. This is done for rare instances where it might confict with other names - file.rename(from = file.path(temp_directory,template$file_name[1]), - to = file.path(temp_directory,"template.tif")) - - template <- rast(file.path(temp_directory,"template.tif")) - - template_extent <- ext(template) |> as.character() - - - # iterate and fix - - for(i in 1:length(rasters)){ - - if(verbose){message("Checking raster ", i, " of ", length(rasters))} - - # download ith raster - - robust_pb_download(file = rasters[i], - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = input_tag, - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - # load ith raster - - rast_i <- terra::rast(x = file.path(temp_directory,rasters[i])) - - # get the projection - - original_proj <- crs(rast_i, proj = TRUE) - - # check whether the raster matches the correct projection - - if(!identical(nasa_proj, original_proj)){ - - message("Detected error in MODIS projection for raster ",rasters[i], - " correcting") - - crs(rast_i) <- nasa_proj - - }else{ - - if(verbose){message("Raster ", rasters[i], " projection looks good")} - - } - - - # check get the extent - - original_extent <- ext(rast_i) |> as.character() - - # check whether the raster matches the correct extent - - if(!identical(template_extent, original_extent)){ - - message("Detected error in MODIS extent, correcting") - - rast_i <- terra::resample(rast_i,y = template,method="near") - - }else{ - - if(verbose){message("Raster ", rasters[i], " extent looks good")} - - } - - - # write a new raster with a different name - - terra::writeRaster(x = rast_i, - filename = gsub(pattern = ".tif$", - replacement =".temp.tif", - x = file.path(temp_directory,rasters[i])), - filetype="GTiff", - overwrite = TRUE) - - # delete old raster - - unlink(file.path(temp_directory,rasters[i])) - - # update new name - - file.rename(from = gsub(pattern = ".tif$", - replacement =".temp.tif", - x = file.path(temp_directory,rasters[i])), - to = file.path(temp_directory, rasters[i])) - - # check that updates worked - - updated_raster <- terra::rast(x = file.path(temp_directory,rasters[i])) - - - if(!identical(nasa_proj, crs(updated_raster, proj=TRUE))){ - stop("Error in fixing CRS") - - } - - if(!identical(template_extent, - ext(updated_raster) |> as.character())){ - - message("Error in fixing extent") - - } - - # push the updated raster - - pb_upload(file = file.path(temp_directory,rasters[i]), - repo = "AdamWilsonLab/emma_envdata", - tag = output_tag, - name = rasters[i], - overwrite = TRUE) - - Sys.sleep(sleep_time) - - # Using the regular pb_upload because it uses fewer queries - - # robust_pb_upload(file = file.path(temp_directory,rasters[i]), - # repo = "AdamWilsonLab/emma_envdata", - # tag = tag, - # name = rasters[i], - # overwrite = TRUE, - # sleep_time = sleep_time) - - - # Delete the new raster - - unlink(file.path(temp_directory,rasters[i])) - - } #for i rasters loop - - # Cleanup and end - - if(verbose){message("Cleaning up")} - - # Delete temp files - - unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) - - # Finish up - - message(paste("Finished checking ",input_tag," extents and projections",sep = "")) - - return( - rasters |> - gsub(pattern = ".tif", replacement = "") |> - gsub(pattern = "_",replacement = "-") |> - max() - ) - - - } #end fx diff --git a/R/process_release_alos.R b/R/process_release_alos.R deleted file mode 100644 index 1c488feb..00000000 --- a/R/process_release_alos.R +++ /dev/null @@ -1,160 +0,0 @@ -#' @author Brian Maitner -#' @param input_dir directory where the input files live -#' @param output_dir directory for the output files -#' @param template_release path to raster file to use as a template for reprojection -#' @param ... Does nothing, but is used in making connections between files in the targets framework -#' @note This function uses bilinear for continuous variables and nearest neighbor for categorical -process_release_alos <- function(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/alos/", - template_release, - sleep_time = 30, - ...){ - - # #Ensure directory is empty if it exists - - if(dir.exists(temp_directory)){ - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - # make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory, recursive = TRUE) - } - - - # get template raster - - robust_pb_download(file = template_release$file, - dest = temp_directory, - repo = template_release$repo, - tag = template_release$tag, - max_attempts = 10, - sleep_time = sleep_time) - - template <- terra::rast(file.path(temp_directory, template_release$file)) - - # get input rasters - - raster_list <- pb_list(repo = "AdamWilsonLab/emma_envdata", - tag = input_tag) %>% - filter(grepl(pattern = "alos_", - x = file_name)) - - robust_pb_download(file = raster_list$file_name, - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = input_tag, - max_attempts = 10, - sleep_time = sleep_time) - - - # reformat and save each - - for(i in 1:nrow(raster_list)){ - - raster_i <- terra::rast(file.path(temp_directory, raster_list$file_name[i])) - - - #Use bilinear for everything except landforms - - if(length(grep(pattern = "landforms", x = raster_list$file_name[i])) > 0){ - - method <- "near" # uncomment for terra - - }else{ - - method <- "bilinear" - - } - - # terra doesn't overwrite, so I have to delete and rename - - terra::project(x = raster_i, - y = template, - method = method, - filename = file.path(temp_directory, - gsub(pattern = ".tif$", - replacement = ".temp.tif", - x = raster_list$file_name[i])), - overwrite=TRUE) - - # check the projection - - if(terra::crs(rast(file.path(temp_directory, - gsub(pattern = ".tif$", - replacement = ".temp.tif", - x = raster_list$file_name[i]))), - proj=TRUE) != terra::crs(template, proj=TRUE)){ - stop("Issue with reprojection")} - - # delete the original - - file.remove(file.path(temp_directory, raster_list$file_name[i])) - - file.rename(from = file.path(temp_directory, - gsub(pattern = ".tif$", - replacement = ".temp.tif", - x = raster_list$file_name[i])), - to = file.path(temp_directory, raster_list$file_name[i])) - - # check the new projection - - if(terra::crs(rast(file.path(temp_directory, raster_list$file_name[i])), - proj=TRUE) != terra::crs(template, proj=TRUE)){ - stop("Issue with reprojection")} - - # upload the new file - - pb_upload(file = file.path(temp_directory, raster_list$file_name[i]), - repo = "AdamWilsonLab/emma_envdata", - tag = output_tag, - name = raster_list$file_name[i]) - - rm(raster_i) - - file.remove(file.path(temp_directory, raster_list$file_name[i])) - - Sys.sleep(sleep_time) - - - } #i loop - - - #Clear out the folder - - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - - #End functions - - message("Finished processing ALOS layers") - return(invisible(NULL)) - - - -} #end fx - - - -################################# - - -# CSP/ERGo/1_0/Global/ALOS_mTPI -#continuous measure of hills vs valleys -> bilinear -#270 - - -# "CSP/ERGo/1_0/Global/ALOS_CHILI" -#continuous -> bilinear -#90 - -# 'CSP/ERGo/1_0/Global/ALOS_landforms' -# categorical land classes -> near -#90 meter - -# 'CSP/ERGo/1_0/Global/ALOS_topoDiversity' -#continuous -> bilinear -#270 m - - diff --git a/R/process_release_biome_raster.R b/R/process_release_biome_raster.R deleted file mode 100644 index 95d2875b..00000000 --- a/R/process_release_biome_raster.R +++ /dev/null @@ -1,107 +0,0 @@ -# Make Domain - -#' @author Brian S. Maitner - -# Process 2018 Vegetation dataset into a raster with MODIS specs - - -#' @param vegmap_shp path to the 2018 national vegetation map shapefile -#' @param template_release path information to template release. -#' @param temp_directory temporary directory. will be deleted. -#' @param sleep_time amount of time (in seconds) to pause after a Github query. Defaults to 10. - -process_release_biome_raster <- function(template_release, - vegmap_shp, - domain, - temp_directory = "data/temp/raw_data/vegmap_raster/", - sleep_time = 10){ - - # Ensure directory is empty if it exists - - if(dir.exists(file.path(temp_directory))){ - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - # make a directory if one doesn't exist yet - - if(!dir.exists(file.path(temp_directory))){ - dir.create(file.path(temp_directory), recursive = TRUE) - } - - # get template raster - - robust_pb_download(file = template_release$file, - dest = temp_directory, - repo = template_release$repo, - tag = template_release$tag, - max_attempts = 10, - sleep_time = sleep_time) - - # load template - - template <- terra::rast(file.path(temp_directory, template_release$file)) - - # load vegmap - - vegmap_za <- st_read(vegmap_shp) %>% - janitor::clean_names() %>% - st_make_valid() %>% - st_transform(crs = crs(template)) - - #transform domain - domain %>% st_transform(crs = crs(template)) -> domain - - #crop vegmap to save size? - - vegmap_za %>% - st_intersection(y = domain) -> vegmap_za - - # rasterize vegmap - - # Note: the Github version of exactextractr could do this more simply using exactextractr::coverage_fraction() - - n <- 10 #number of subcells to use for aggregation - - template <- disagg(rast(template), n) #break raster into smaller one - - #r <- disagg(template, n) #break raster into smaller one: this is more memory-intense - - r <- rasterize(x = vect(vegmap_za), - y = template, - field = "biome_18") #rasterize at fine resolution - - out_rast <- aggregate(r, n, "modal") #re-aggregate using modal biome - - # save output version - - writeRaster(x = out_rast, - filename = file.path(temp_directory,"biome_raster_modis_proj.tif"), - overwrite=TRUE) - - # upload transformed version - - pb_upload(file = file.path(temp_directory,"biome_raster_modis_proj.tif"), - repo = "AdamWilsonLab/emma_envdata", - tag = "processed_static", - name = "biome_raster_modis_proj.tif") - - pb_upload(file = file.path(temp_directory,"biome_raster_modis_proj.tif.aux.xml"), - repo = "AdamWilsonLab/emma_envdata", - tag = "processed_static", - name = "biome_raster_modis_proj.tif.aux.xml") - - # cleanup - - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - - # End functions - - message("Finished rasterizing vegmap") - return(as.character(Sys.Date())) - - -} - - - - diff --git a/R/process_release_dynamic_data_to_parquet.R b/R/process_release_dynamic_data_to_parquet.R deleted file mode 100644 index a9b67bb9..00000000 --- a/R/process_release_dynamic_data_to_parquet.R +++ /dev/null @@ -1,189 +0,0 @@ -library(piggyback) -library(arrow) -library(tidyverse) - - -############################################################# -#' @author Brian Maitner -#' @description this function takes in tif file from the input, converts them to tidy format, and saves as .gz.parquet -#' @param input_dir Directory containing input files. -#' @param output_dir Directory to stick output files in -#' @param variable_name This is included in the tidy file output -#' @param ... Does nothing. Used for targets. -#' @note Output dataframes have three columns: CellID, date, variable, value. ALso note that cells with NA values are omitted. -process_release_dynamic_data_to_parquet <- function(temp_directory = "data/temp/raw_data/ndvi_modis/", - input_tag = "raw_ndvi_modis", - output_tag = "current", - variable_name = "ndvi", - sleep_time = 30, - ...){ - - - # #Ensure directory is empty if it exists - - if(dir.exists(temp_directory)){ - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - # make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory, recursive = TRUE) - } - - #get release assets - release_assetts <- pb_list(repo = "AdamWilsonLab/emma_envdata") - - # load files - - raster_list <- - release_assetts %>% - filter(tag == input_tag) %>% - filter(file_name != "log.csv") %>% - mutate(parquet_name = lubridate::as_date(x = gsub(pattern = ".tif",replacement = "",x = file_name,)))%>% - mutate(parquet_name = as.numeric(parquet_name))%>% - mutate(parquet_name = paste("-dynamic_parquet-",variable_name,"-",parquet_name,".gz.parquet",sep = "")) - - #-dynamic_parquet-ndvi-11005.gz.parquet - - # get files - - - # figure out which files have been processed - - processed_list <- - release_assetts %>% - filter(tag == output_tag)%>% - filter(grepl(pattern = paste("-",variable_name,"-",sep = ""), - x = file_name)) - - #Don't worry about files that have been processed already - - raster_list <- raster_list[which(!raster_list$parquet_name %in% processed_list$file_name),] - - #end if things are already done - - if(nrow(raster_list) == 0){ - - message(paste("Finished converting ", - variable_name, - " files to parquet", sep = "")) - - return( - release_assetts %>% - filter(tag == input_tag) %>% - dplyr::select(file_name) %>% - filter(file_name != "") %>% - filter(grepl(pattern = ".tif$", x = file_name)) %>% - mutate(date_format = gsub(pattern = ".tif", - replacement = "", - x = file_name))%>% - mutate(date_format = gsub(pattern = "_", replacement = "-", x = date_format)) %>% - dplyr::pull(date_format) %>% - max() - ) - - - - } - - - # process the files that haven't been done yet - - - for(i in 1:nrow(raster_list)){ - - #Download the ith raster - robust_pb_download(file = raster_list$file_name[i], - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = raster_list$tag[i], - overwrite = TRUE, - max_attempts = 10, - sleep_time = sleep_time) - - #Pause to keep Github happy - - Sys.sleep(sleep_time) - - # Get the date in integer format (will append to the data) - - raster_list$file_name[i] |> - gsub(pattern = "/", replacement = "")|> - gsub(pattern = ".tif", replacement = "")|> - lubridate::as_date()|> - as.numeric() -> integer_date_i - - # Process ith file - - file.path(temp_directory,raster_list$file_name[i]) |> - stars::read_stars() |> - as.data.frame() %>% - mutate(cellID = row_number(), - date = integer_date_i, - variable = variable_name) %>% - rename( value := 3) %>% - dplyr::select(cellID, date, variable, value ) %>% - drop_na() %>% - write_parquet(sink = file.path(temp_directory, - paste("-dynamic_parquet-", - variable_name,"-", - integer_date_i, - ".gz.parquet", sep = "")), - compression = "gzip") - - # Upload ith file - - pb_upload(file = file.path(temp_directory, - paste("-dynamic_parquet-", - variable_name,"-", - integer_date_i, - ".gz.parquet", sep = "")), - repo = "AdamWilsonLab/emma_envdata", - tag = output_tag, - overwrite = TRUE - ) - - #clean up - - unlink(file.path(temp_directory,raster_list$file_name[i])) - - unlink( file.path(temp_directory, - paste("-dynamic_parquet-", - variable_name,"-", - integer_date_i, - ".gz.parquet", sep = "")) ) - - rm(integer_date_i) - - #Pause to keep Github happy - - Sys.sleep(sleep_time) - - } #end i loop - - #Clean up - - unlink(file.path(temp_directory), - recursive = TRUE, - force = TRUE) - - #End fx - - message(paste("Finished converting ",variable_name, " files to parquet",sep = "")) - return( - raster_list %>% - filter(tag == input_tag) %>% - dplyr::select(file_name) %>% - filter(file_name != "") %>% - filter(grepl(pattern = ".tif$", x = file_name)) %>% - mutate(date_format = gsub(pattern = ".tif", - replacement = "", - x = file_name))%>% - mutate(date_format = gsub(pattern = "_", replacement = "-", x = date_format)) %>% - dplyr::pull(date_format) %>% - max() - ) - - -}#end fx diff --git a/R/process_release_protected_area_distance.R b/R/process_release_protected_area_distance.R index a7ab1b6b..62555d4c 100644 --- a/R/process_release_protected_area_distance.R +++ b/R/process_release_protected_area_distance.R @@ -9,7 +9,7 @@ library(terra) #' @author Adam Wilson & Brian Maitner #' @description This code produces a raster containing distances to protected areas #' @param template_release path to raster file to use as a template for reprojection -process_release_protected_area_distance <- function(template_release, +data_protected_areas <- function(domain_raster, out_file="protected_area_distance.tif", temp_directory = "data/temp/protected_area", out_tag = "processed_static" diff --git a/R/process_stable_data.R b/R/process_stable_data.R new file mode 100644 index 00000000..ba742f6f --- /dev/null +++ b/R/process_stable_data.R @@ -0,0 +1,65 @@ +library(arrow) + +#' @param output_dir directory (no file name) in which to save the csv that is returned +#' @param precip_dir directory containing the precipitation layers +#' @param landcover_dir directory containing the landcover layers +#' @param elevation_dir directory containing the elevation layer +#' @param cloud_dir directory containing the could layers +#' @param climate_dir directory containing the climate layers +#' @param alos_dir directory containing the alos layers +#' @param ... Does nothing, used to ensure upstream changes impact things +process_stable_data <- function(output_dir = "data/processed_data/model_data/", + precip_dir = "data/processed_data/precipitation_chelsa/", + landcover_dir = "data/processed_data/landcover_za/", + elevation_dir = "data/processed_data/elevation_nasadem/", + cloud_dir = "data/processed_data/clouds_wilson/", + climate_dir = "data/processed_data/climate_chelsa/", + alos_dir = "data/processed_data/alos/", + ...) { + + + # make a directory if one doesn't exist yet + + if(!dir.exists(output_dir)){ + dir.create(output_dir, recursive = TRUE) + } + + # process data + + c(precip_dir, + landcover_dir, + elevation_dir, + cloud_dir, + climate_dir, + alos_dir) |> + + lapply(FUN = function(x){ + list.files(path = x, + pattern = ".tif$", + full.names = T, + recursive = T)}) |> + unlist() |> + stars::read_stars() |> + as.data.frame() |> + mutate(cellID = row_number()) %>% + mutate(count_na = apply(., 1,FUN = function(x){sum(is.na(x))} )) %>% + filter(count_na < 20) %>% + write_parquet(sink = paste(output_dir,"stable_data.gz.parquet",sep = ""), + compression = "gzip") + + #The following line of code can be used to break things down by a grouping variable + # write_dataset(path = output_dir, + # format = "parquet", + # basename_template = "stable_data{i}.parquet.gz", + # compression = "gzip", + # existing_data_behavior = "delete_matching") + + #cleanup + gc() + + # Return filename + + message("Finished processing stable model data") + return(paste(output_dir,"stable_data.gz.parquet",sep = "")) + +} diff --git a/R/release_data.R b/R/release_data.R deleted file mode 100644 index 11ea589f..00000000 --- a/R/release_data.R +++ /dev/null @@ -1,95 +0,0 @@ -library(piggyback) - -#' @author Brian Maitner -#' @param data_directory Directory storing the data you want to serve via Github releases -#' @param tag tag for the release -#' @param ... Does nothing but helps with targets connections -#' @note Releases doesn't handle directories, so any directory structure is converted to part of the file name -release_data <- function(data_directory = "data/processed_data/model_data/", tag = "current", ...){ - - - - #Make sure there is a release by attempting to create one. If it already exists, this will fail - tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", - tag = tag), - error = function(e){message("Previous release found")}) - - #Get a list of files already released - released_files <- pb_list(repo = "AdamWilsonLab/emma_envdata", - tag = tag) - - - # Get a lost of the local files - local_files <- data.frame(local_filename = list.files(path = data_directory, - recursive = TRUE, - full.names = TRUE)) - - # Convert local filenames to be releases compatible - local_files$file_name <- - sapply(X = local_files$local_filename, - FUN = function(x){ - - name_i <- gsub(pattern = data_directory, - replacement = "", - x = x) - - name_i <- gsub(pattern = "/", - replacement = "-", - x = name_i) - return(name_i) - - }) - - # Get timestamps on local files - local_files$last_modified <- - Reduce(c, lapply(X = local_files$local_filename, - FUN = function(x) { - file.info(x)$mtime}) - ) - - - # Figure out which files DON'T need to be released - merged_info <- merge(x = released_files, - y = local_files, - all = TRUE) - - merged_info$diff_hrs <- difftime(time2 = merged_info$timestamp, - time1 = merged_info$last_modified, - units = "hours") - - - # We only want time differences of greater than zero (meaning that the local file is more recent) or NA - merged_info <- merged_info[which(!merged_info$diff_hrs < 0 | is.na(merged_info$diff_hrs)),] - - #Quit if there are no new/updated files to release - if(nrow(merged_info) == 0){ - - message("Releases are already up to date.") - return(invisible(NULL)) - - - } - - - # loop through and release everything - for( i in 1:nrow(merged_info)){ - - Sys.sleep(0.1) #We need to limit our rate in order to keep Github happy - - - pb_upload(file = merged_info$local_filename[i], - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - name = merged_info$file_name[i]) - - - - - } # end i loop - - # End - message("Finished releasing data") - return(invisible(NULL)) - - -}#end function diff --git a/R/stac_functions.R b/R/stac_functions.R new file mode 100644 index 00000000..165c3af4 --- /dev/null +++ b/R/stac_functions.R @@ -0,0 +1,298 @@ +#' @title Generate STAC Collection for MODIS VI dataset +#' @description Creates a STAC Collection and individual Item files for monthly MODIS VI parquet data. +#' Items are configured to point to GitHub release URLs. +#' This is a dataset-specific collection that will be linked from a parent STAC Catalog. +#' @author EMMA Team +#' @param parquet_files Character vector of processed parquet file paths (from targets branching; used to establish dependency) +#' @param parquet_dir Directory containing monthly MODIS VI parquet files +#' @param stac_dir Output directory for this collection's STAC JSON files +#' @param parent_catalog_path Path to parent catalog (for generating relative links) +#' @param gh_repo GitHub repository in format "owner/repo" +#' @param gh_release_tag GitHub release tag where files will be hosted +#' @param verbose Logical for progress messages +#' @return Character path to collection.json for this dataset +#' @keywords internal +generate_modis_vi_stac <- function( + parquet_files = NULL, # Dependency on branched target, may be unused + parquet_dir = "data/processed_data/dynamic_parquet/modis_vi", + stac_dir = "data/stac/modis_vi", + parent_catalog_path = "data/stac", + gh_repo = "AdamWilsonLab/emma_envdata", + gh_release_tag = "data_modis_vi_current", + verbose = TRUE +) { + + # Create output directory + dir.create(stac_dir, recursive = TRUE, showWarnings = FALSE) + + # Find all monthly parquet files + parquet_files <- list.files( + parquet_dir, + pattern = "^dynamic_modis_vi_\\d{6}\\.gz\\.parquet$", + full.names = FALSE + ) + + if (length(parquet_files) == 0) { + if (verbose) warning("No MODIS VI parquet files found in ", parquet_dir) + return(NA_character_) + } + + # Extract year-month from filenames + dates <- as.Date(paste0(gsub(".*_(\\d{6})\\..*", "\\1", parquet_files), "01"), "%Y%m%d") + + if (verbose) message("Generating STAC Collection for MODIS VI with ", length(parquet_files), " monthly files") + + # Create STAC Collection (part of parent catalog) + collection <- list( + stac_version = "1.0.0", + stac_extensions = c( + "https://stac-extensions.github.io/scientific/v1.0.0/schema.json" + ), + type = "Collection", + id = "modis_vi", + description = "MODIS Enhanced Vegetation Index (EVI) observations from Terra and Aqua satellites. 500m resolution, 16-day composites. Data processed from AppEEARS.", + license = "CC-BY-4.0", + keywords = c("MODIS", "EVI", "vegetation", "Terra", "Aqua", "500m", "16-day"), + extent = list( + spatial = list( + bbox = list(c(-180, -90, 180, 90)) + ), + temporal = list( + interval = list(c( + paste0(format(min(dates), "%Y-%m-%d"), "T00:00:00Z"), + paste0(format(max(dates), "%Y-%m-%d"), "T23:59:59Z") + )) + ) + ), + links = list( + list( + rel = "root", + href = "../catalog.json", + type = "application/json" + ), + list( + rel = "parent", + href = "../catalog.json", + type = "application/json" + ), + list( + rel = "license", + href = "https://creativecommons.org/licenses/by/4.0/", + type = "text/html" + ), + list( + rel = "about", + href = "https://lpdaac.usgs.gov/products/mod13a1v061/", + title = "MOD13A1.061 Product Information", + type = "text/html" + ) + ), + providers = list( + list( + name = "USGS LP DAAC", + description = "Data source for MOD13A1 and MYD13A1", + roles = c("producer", "licensor"), + url = "https://lpdaac.usgs.gov/" + ), + list( + name = "NASA AppEEARS", + description = "Data access and subsetting service", + roles = c("processor"), + url = "https://appeears.org/" + ), + list( + name = "EMMA Lab", + description = "Data processing and aggregation", + roles = c("processor"), + url = "https://adamwilsonlab.github.io/" + ) + ), + summaries = list( + sci_doi = "10.5067/MODIS/MOD13A1.061|10.5067/MODIS/MYD13A1.061", + platforms = c("Terra", "Aqua"), + instruments = c("MODIS"), + gsd = list(500), + bands = list( + list( + name = "EVI", + description = "Enhanced Vegetation Index", + data_type = "int32", + scale = 0.01, + offset = 0, + nodata = -9999 + ) + ) + ) + ) + + # Write collection.json + collection_file <- file.path(stac_dir, "collection.json") + jsonlite::write_json(collection, collection_file, pretty = TRUE, auto_unbox = TRUE) + + if (verbose) message("Created STAC Collection: ", collection_file) + + # Create individual Item files + for (i in seq_along(parquet_files)) { + pq_file <- parquet_files[i] + pq_date <- dates[i] + year_month <- format(pq_date, "%Y%m") + + # GitHub release URL + gh_raw_url <- paste0( + "https://github.com/", gh_repo, "/releases/download/", gh_release_tag, "/", + pq_file + ) + + item <- list( + stac_version = "1.0.0", + stac_extensions = c( + "https://stac-extensions.github.io/scientific/v1.0.0/schema.json" + ), + type = "Feature", + id = paste0("modis_vi_", year_month), + description = paste("MODIS EVI observations for", format(pq_date, "%B %Y")), + geometry = list( + type = "Polygon", + coordinates = list(list( + c(-180, -90), c(180, -90), c(180, 90), c(-180, 90), c(-180, -90) + )) + ), + properties = list( + `datetime` = paste0(format(pq_date, "%Y-%m-%d"), "T00:00:00Z"), + start_datetime = paste0(format(pq_date, "%Y-%m-01"), "T00:00:00Z"), + end_datetime = paste0(format(as.Date(paste0(format(pq_date + 31, "%Y-%m"), "-01")) - 1, "%Y-%m-%d"), "T23:59:59Z"), + platforms = c("Terra", "Aqua"), + instruments = c("MODIS"), + gsd = 500, + dataset = "modis_vi" + ), + links = list( + list( + rel = "collection", + href = "collection.json", + type = "application/json" + ), + list( + rel = "root", + href = "../catalog.json", + type = "application/json" + ), + list( + rel = "parent", + href = "collection.json", + type = "application/json" + ) + ), + assets = list( + data = list( + href = gh_raw_url, + title = paste0("MODIS VI Parquet - ", year_month), + description = "Enhanced Vegetation Index observations in parquet format", + type = "application/octet-stream", + roles = c("data") + ) + ) + ) + + item_file <- file.path(stac_dir, paste0("modis_vi_", year_month, ".json")) + jsonlite::write_json(item, item_file, pretty = TRUE, auto_unbox = TRUE) + + # Add item link to collection + collection$links[[length(collection$links) + 1]] <- list( + rel = "item", + href = paste0("modis_vi_", year_month, ".json"), + type = "application/json", + title = paste("MODIS VI", year_month) + ) + } + + # Update collection.json with all item links + jsonlite::write_json(collection, collection_file, pretty = TRUE, auto_unbox = TRUE) + + if (verbose) message("Generated ", length(parquet_files), " STAC Item files") + + collection_file +} + + +#' @title Generate parent STAC Catalog for EMMA environmental datasets +#' @description Creates a parent STAC Catalog that organizes and links all EMMA datasets +#' (MODIS VI, VIIRS VI, burned area, age, etc.). +#' @author EMMA Team +#' @param stac_base_dir Base directory for STAC output (datasets will be in subdirectories) +#' @param dataset_collections List of dataset collection paths (e.g., list(modis_vi = "data/stac/modis_vi")) +#' @param gh_repo GitHub repository in format "owner/repo" +#' @param verbose Logical for progress messages +#' @return Character path to parent catalog.json +#' @keywords internal +generate_emma_stac_catalog <- function( + stac_base_dir = "data/stac", + dataset_collections = list( + modis_vi = "data/stac/modis_vi" + ), + gh_repo = "AdamWilsonLab/emma_envdata", + verbose = TRUE +) { + + dir.create(stac_base_dir, recursive = TRUE, showWarnings = FALSE) + + # Create parent STAC Catalog + catalog <- list( + stac_version = "1.0.0", + type = "Catalog", + id = "emma", + description = "EMMA Environmental Data Catalog - A curated collection of environmental datasets for the Eastern Mediterranean and Maghreb region.", + links = list( + list( + rel = "root", + href = "catalog.json", + type = "application/json", + title = "EMMA Catalog" + ), + list( + rel = "license", + href = "https://creativecommons.org/licenses/by/4.0/", + type = "text/html", + title = "Creative Commons Attribution 4.0" + ), + list( + rel = "about", + href = paste0("https://github.com/", gh_repo), + type = "text/html", + title = "EMMA Project Repository" + ) + ) + ) + + if (verbose) message("Creating parent STAC Catalog with ", length(dataset_collections), " dataset(s)") + + # Add links to each dataset collection + for (dataset_name in names(dataset_collections)) { + collection_path <- dataset_collections[[dataset_name]] + collection_file <- file.path(collection_path, "collection.json") + + if (file.exists(collection_file)) { + # Relative path from catalog to collection + rel_path <- paste0(dataset_name, "/collection.json") + + catalog$links[[length(catalog$links) + 1]] <- list( + rel = "child", + href = rel_path, + type = "application/json", + title = paste0(dataset_name, " - Dynamic VI observations") + ) + + if (verbose) message(" Linked collection: ", dataset_name) + } else { + if (verbose) warning("Collection not found: ", collection_file) + } + } + + # Write parent catalog + catalog_file <- file.path(stac_base_dir, "catalog.json") + jsonlite::write_json(catalog, catalog_file, pretty = TRUE, auto_unbox = TRUE) + + if (verbose) message("Created parent STAC Catalog: ", catalog_file) + + catalog_file +} diff --git a/R/tar_release_storage.R b/R/tar_release_storage.R new file mode 100644 index 00000000..903158b1 --- /dev/null +++ b/R/tar_release_storage.R @@ -0,0 +1,392 @@ +#' Download targets from GitHub Release +#' @description Download locally stored targets from GitHub releases (useful for GitHub Actions) +#' @param repo Repository in "owner/repo" format (default from environment or "AdamWilsonLab/emma_envdata") +#' @param tag Release tag to store objects (default from environment or "objects_current") +#' @param cache_dir Cache directory (default: "data/target_outputs/.tar_cache") +#' @param which_targets Optional vector of specific target names to download +#' @param verbose Logical for progress messages +#' @details Call this at the start of tar_make() in update mode to download targets +#' @export +tar_download_github_release <- function( + repo = NULL, + tag = NULL, + cache_dir = "data/target_outputs/.tar_cache", + which_targets = NULL, + verbose = TRUE +) { + # Use environment variables as fallback, but allow explicit parameters + repo <- repo %||% Sys.getenv("TAR_GH_RELEASE_REPO") %||% "AdamWilsonLab/emma_envdata" + tag <- tag %||% Sys.getenv("TAR_GH_RELEASE_TAG") %||% "objects_current" + cache_dir <- cache_dir %||% Sys.getenv("TAR_GH_RELEASE_CACHE_DIR") %||% "data/target_outputs/.tar_cache" + objects_dir <- "_targets/objects" + + if (!nzchar(repo) || !nzchar(tag)) { + stop("GitHub release configuration not set. Provide repo and tag parameters or set environment variables.") + } + + dir.create(cache_dir, recursive = TRUE, showWarnings = FALSE) + dir.create(objects_dir, recursive = TRUE, showWarnings = FALSE) + + # Get list of assets on GitHub release + tryCatch({ + assets <- piggyback::pb_list(repo = repo, tag = tag) + if (verbose) message("[tar_github_release] Found ", nrow(assets), " assets on GitHub release") + }, error = function(e) { + stop("[tar_github_release] Could not access GitHub release: ", conditionMessage(e)) + }) + + # Filter assets if specific targets requested + if (!is.null(which_targets)) { + assets <- assets[assets$file_name %in% which_targets | startsWith(assets$file_name, which_targets), ] + } + + if (nrow(assets) == 0) { + if (verbose) message("[tar_github_release] No assets to download") + return(invisible(NULL)) + } + + # Download each asset + for (i in seq_len(nrow(assets))) { + asset_name <- assets$file_name[i] + + # Check if this is a file-format target (has extension) + # File-format targets are stored as "target_name.extension" (e.g., "country.parquet") + # Regular objects are stored as "target_name" (e.g., "elevation_task_id") + is_file_format <- grepl("\\.[^.]+$", asset_name) + + if (is_file_format) { + # Extract target name by removing extension + target_name <- sub("\\.[^.]+$", "", asset_name) + file_ext <- sub(".*\\.", "", asset_name) + } else { + target_name <- asset_name + file_ext <- NULL + } + + local_path <- file.path(objects_dir, target_name) + cached_path <- file.path(cache_dir, asset_name) + + # Download to cache if not already there + if (!file.exists(cached_path)) { + if (verbose) message("[tar_github_release] Downloading: ", asset_name) + max_attempts <- 3 + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_download( + file = asset_name, + repo = repo, + tag = tag, + dest = cache_dir, + overwrite = TRUE + ) + if (verbose) message("[tar_github_release] Downloaded: ", asset_name) + break + }, error = function(e) { + if (attempt < max_attempts) { + if (verbose) message("[tar_github_release] Download attempt ", attempt, " failed: ", conditionMessage(e)) + Sys.sleep(2) + } else { + warning("[tar_github_release] Failed to download after ", max_attempts, " attempts: ", conditionMessage(e)) + } + }) + } + } else { + if (verbose) message("[tar_github_release] Already cached: ", asset_name) + } + + # Copy from cache to appropriate target location + if (file.exists(cached_path)) { + if (is_file_format) { + # For file-format targets: + # 1. Copy actual file to _targets/workspaces/ (where targets expects it) + # 2. Copy to data/target_outputs/ (for user access) + # 3. Create RDS wrapper in _targets/objects/ pointing to workspaces location + + ws_dir <- "_targets/workspaces" + dir.create(ws_dir, recursive = TRUE, showWarnings = FALSE) + ws_path <- file.path(ws_dir, asset_name) + file.copy(cached_path, ws_path, overwrite = TRUE) + + # Also copy to data/target_outputs/ for user access + out_dir <- "data/target_outputs" + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + out_path <- file.path(out_dir, asset_name) + file.copy(cached_path, out_path, overwrite = TRUE) + + # Create RDS wrapper in _targets/objects/ that points to the workspaces file path + obj_dir <- "_targets/objects" + dir.create(obj_dir, recursive = TRUE, showWarnings = FALSE) + obj_path <- file.path(obj_dir, target_name) + saveRDS(ws_path, obj_path) + if (verbose) message("[tar_github_release] Restored file-format target: ", target_name) + } else { + # Regular object file: copy to _targets/objects/ + obj_dir <- "_targets/objects" + dir.create(obj_dir, recursive = TRUE, showWarnings = FALSE) + obj_path <- file.path(obj_dir, target_name) + file.copy(cached_path, obj_path, overwrite = TRUE) + if (verbose) message("[tar_github_release] Restored: ", target_name) + } + } + } + + if (verbose) message("[tar_github_release] Download complete") + invisible(NULL) +} + +#' Upload targets to GitHub Release after tar_make() completes +#' @description Upload locally stored targets to GitHub releases +#' @param repo Repository in "owner/repo" format (default from environment or "AdamWilsonLab/emma_envdata") +#' @param tag Release tag to store objects (default from environment or "objects_current") +#' @param format Serialization format: "qs", "rds", or "parquet" (default: "qs") +#' @param cache_dir Cache directory (default: "data/target_outputs/.tar_cache") +#' @param which_targets Optional vector of specific target names to upload +#' @param verbose Logical for progress messages +#' @details Call this after tar_make() to upload all targets +#' @export +tar_upload_github_release <- function( + repo = NULL, + tag = NULL, + format = "qs", + cache_dir = "data/target_outputs/.tar_cache", + which_targets = NULL, + verbose = TRUE +) { + # Use environment variables as fallback, but allow explicit parameters + repo <- repo %||% Sys.getenv("TAR_GH_RELEASE_REPO") %||% "AdamWilsonLab/emma_envdata" + tag <- tag %||% Sys.getenv("TAR_GH_RELEASE_TAG") %||% "objects_current" + cache_dir <- cache_dir %||% Sys.getenv("TAR_GH_RELEASE_CACHE_DIR") %||% "data/target_outputs/.tar_cache" + + if (!nzchar(repo) || !nzchar(tag)) { + stop("GitHub release configuration not set. Provide repo and tag parameters or set environment variables.") + } + + # Ensure release exists + tryCatch({ + piggyback::pb_list(repo = repo, tag = tag) + }, error = function(e) { + if (verbose) message("[tar_github_release] Creating release: ", tag) + piggyback::pb_new_release(repo = repo, tag = tag) + }) + + # Get metadata to find file-format target paths + meta_df <- tryCatch({ + tar_meta() + }, error = function(e) { + if (verbose) message("[tar_github_release] Could not read targets metadata") + data.frame(name = character(0), format = character(0), path = list()) + }) + + # Get current assets on GitHub to check what exists + remote_assets <- tryCatch({ + piggyback::pb_list(repo = repo, tag = tag) + }, error = function(e) { + data.frame(file_name = character(0)) + }) + + # Get list of local target files + if (is.null(which_targets)) { + # Get all targets from _targets/objects/ (regular objects) + regular_files <- list.files("_targets/objects", full.names = TRUE, recursive = FALSE) + + # Also get file-format targets from _targets/workspaces/ + file_format_targets <- character(0) + if (dir.exists("_targets/workspaces")) { + ws_files <- list.files("_targets/workspaces", full.names = FALSE, recursive = FALSE) + # Filter to only include those that are file-format targets (have metadata) + for (ws_file in ws_files) { + target_meta <- meta_df[meta_df$name == ws_file, ] + if (nrow(target_meta) > 0 && target_meta$format[1] == "file") { + file_format_targets <- c(file_format_targets, file.path("_targets/workspaces", ws_file)) + } + } + } + + # Also get actual data files from data/target_outputs/ + data_output_files <- character(0) + if (dir.exists("data/target_outputs")) { + all_output_files <- list.files("data/target_outputs", full.names = TRUE, recursive = FALSE) + # Exclude cache directory + data_output_files <- all_output_files[!grepl("\\.tar_cache", all_output_files)] + } + + local_files <- c(regular_files, file_format_targets, data_output_files) + if (verbose) message("[tar_github_release] Found ", length(local_files), " local target files to upload") + } else { + # Find specific targets - check all locations + regular_files <- character(0) + file_format_targets <- character(0) + data_output_files <- character(0) + + for (target in which_targets) { + obj_file <- file.path("_targets/objects", target) + ws_file <- file.path("_targets/workspaces", target) + data_file <- file.path("data/target_outputs", target) + + if (file.exists(obj_file)) { + regular_files <- c(regular_files, obj_file) + } else if (file.exists(ws_file)) { + target_meta <- meta_df[meta_df$name == target, ] + if (nrow(target_meta) > 0 && target_meta$format[1] == "file") { + file_format_targets <- c(file_format_targets, ws_file) + } + } else if (file.exists(data_file)) { + data_output_files <- c(data_output_files, data_file) + } + } + local_files <- c(regular_files, file_format_targets, data_output_files) + } + + if (length(local_files) == 0) { + message("[tar_github_release] No targets to upload") + return(invisible(NULL)) + } + + # Upload each file + for (local_file in local_files) { + target_name <- basename(local_file) + + # Determine if this is a file-format target based on location + # Files in _targets/workspaces/ are file-format targets + is_file_target <- grepl("_targets/workspaces", local_file) + + if (is_file_target) { + # This is a file-format target in _targets/workspaces/ + # Use the file from workspaces as the source to upload + # Get extension from metadata or from actual file + target_meta <- meta_df[meta_df$name == target_name, ] + + # Try to get extension from metadata path + ext <- "" + if (nrow(target_meta) > 0) { + metadata_path <- target_meta$path[[1]] + # Handle case where path is a vector with multiple values + if (is.character(metadata_path) && length(metadata_path) > 0) { + # Take the first one and get the extension from it + ext <- tools::file_ext(metadata_path[1]) + } + } + + # If we couldn't get extension from metadata, skip this file + if (nchar(ext) == 0) { + if (verbose) message("[tar_github_release] Skipping file-format target (no extension found): ", target_name) + next + } + + # Create upload name - avoid double extensions + # If target name already ends with this extension, don't add it again + if (grepl(paste0("\\.", ext, "$"), target_name)) { + upload_name <- target_name + } else { + upload_name <- paste0(target_name, ".", ext) + } + + if (verbose) message("[tar_github_release] Uploading file-format target: ", upload_name, " from ", local_file) + + # Check if already exists on GitHub + exists_on_github <- any(remote_assets$file_name == upload_name) + if (exists_on_github) { + if (verbose) message("[tar_github_release] File already on GitHub, deleting old version: ", upload_name) + tryCatch({ + # Delete old version + old_asset <- remote_assets[remote_assets$file_name == upload_name, ] + if (nrow(old_asset) > 0) { + piggyback::pb_delete(repo = repo, tag = tag, file = upload_name) + Sys.sleep(1) + } + }, error = function(e) { + if (verbose) message("[tar_github_release] Could not delete old asset: ", conditionMessage(e)) + }) + } + + max_attempts <- 3 + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_upload( + file = local_file, + repo = repo, + tag = tag, + name = upload_name, + overwrite = FALSE + ) + if (verbose) message("[tar_github_release] Uploaded: ", upload_name) + Sys.sleep(1) + break + }, error = function(e) { + if (attempt < max_attempts) { + if (verbose) message("[tar_github_release] Upload attempt ", attempt, " failed: ", conditionMessage(e)) + Sys.sleep(2) + } else { + warning("[tar_github_release] Failed to upload after ", max_attempts, " attempts: ", conditionMessage(e)) + } + }) + } + } else { + # Regular objects or data output files + # Determine if it's from data/target_outputs or _targets/objects + is_data_output <- grepl("data/target_outputs", local_file) + + if (is_data_output) { + # Data output file - upload with its original name + upload_name <- basename(local_file) + if (verbose) message("[tar_github_release] Uploading data file: ", upload_name) + } else { + # Serialized object from _targets/objects + upload_name <- target_name + if (verbose) message("[tar_github_release] Uploading object: ", target_name) + } + + # Check if already exists on GitHub + exists_on_github <- any(remote_assets$file_name == upload_name) + if (exists_on_github) { + if (verbose) message("[tar_github_release] File already on GitHub, deleting old version: ", upload_name) + tryCatch({ + # Delete old version + piggyback::pb_delete(repo = repo, tag = tag, file = upload_name) + Sys.sleep(1) + }, error = function(e) { + if (verbose) message("[tar_github_release] Could not delete old asset: ", conditionMessage(e)) + }) + } + + max_attempts <- 3 + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_upload( + file = local_file, + repo = repo, + tag = tag, + name = upload_name, + overwrite = FALSE + ) + if (verbose) message("[tar_github_release] Uploaded: ", upload_name) + Sys.sleep(1) + break + }, error = function(e) { + if (attempt < max_attempts) { + if (verbose) message("[tar_github_release] Upload attempt ", attempt, " failed: ", conditionMessage(e)) + Sys.sleep(2) + } else { + warning("[tar_github_release] Failed to upload: ", conditionMessage(e)) + } + }) + } + } + } + + if (verbose) message("[tar_github_release] Upload complete") + invisible(NULL) +} + +#' Create GitHub Releases repository for targets +#' @description DEPRECATED - Use tar_upload_github_release() instead +#' @export +tar_github_release_repo <- function( + repo, + tag, + format = "qs", + cache_dir = "data/.tar_cache" +) { + stop("tar_github_release_repo() is deprecated. Use tar_upload_github_release() after tar_make() instead.") +} + diff --git a/R/upload_releases.R b/R/upload_releases.R new file mode 100644 index 00000000..fdef2283 --- /dev/null +++ b/R/upload_releases.R @@ -0,0 +1,160 @@ +#' @title Upload files to GitHub release +#' @description Creates/updates a GitHub release with specified files. +#' Skips files that already exist in the release. +#' @param files Character vector of file paths to upload +#' @param repo Repository in format "owner/repo" +#' @param release_tag Release tag (e.g., "static_current", "data_modis_vi_current") +#' @param release_name Human-readable release name (e.g., "Static Data - Current") +#' @param verbose Logical for messages +#' @return Character vector of uploaded file paths (invisibly) +#' @details +#' Requires piggyback package and GITHUB_TOKEN environment variable. +#' Uses piggyback::pb_upload() which requires gh CLI or authentication. +#' @export +upload_to_github_release <- function( + files, + repo, + release_tag, + release_name = release_tag, + verbose = TRUE, + ... #include to allow for targets dependencies without affecting function behavior +) { + + + # Handle NA or empty inputs + if (length(files) == 0 || all(is.na(files))) { + if (verbose) message("No files to upload") + return(invisible(character(0))) + } + + # Remove NA values + files <- files[!is.na(files)] + + + if (length(files) == 0) { + if (verbose) message("No files to upload (all were NA)") + return(invisible(character(0))) + } + + # Check for GITHUB_TOKEN + token <- Sys.getenv("GITHUB_TOKEN") + if (token == "") { + message("GITHUB_TOKEN environment variable not set. Upload may fail.") + } + + + # Filter to files that exist + files <- files[file.exists(files)] + if (length(files) == 0) { + message("No files found to upload") + return(invisible(character(0))) + } + + + # Ensure release exists (create it if needed) + tryCatch({ + piggyback::pb_new_release( + repo = repo, + tag = release_tag, + .token = token + ) + if (verbose) message("✓ Created release '", release_tag, "'") + }, error = function(e) { + # Release likely already exists, which is fine + if (verbose) message("Using existing release '", release_tag, "'") + }) + + + + + # List existing files in release + # pb_list returns NULL if empty (not an error) or a dataframe if files exist + existing <- tryCatch({ + piggyback::pb_list( + repo = repo, + tag = release_tag, + .token = token + ) + }, error = function(e) { + if (verbose) warning("Unable to list files in release: ", e$message) + data.frame() + }) + existing_names <- ifelse(nrow(existing) > 0, existing$file_name, character(0)) + + # Filter to files that don't already exist + files_to_upload <- files[basename(files) %not_in% existing_names] + + if (length(files_to_upload) == 0) { + if (verbose) message("All files already in release '", release_tag, "'") + return(invisible(character(0))) + } + + if (verbose) { + message("Uploading ", length(files_to_upload), " files to release '", release_tag, "'") + } + + # Upload each file + uploaded <- character(0) + for (file in files_to_upload) { + if (!file.exists(file)) { + warning("File not found: ", file) + next + } + + if (verbose) message(" Uploading: ", basename(file)) + + tryCatch({ + piggyback::pb_upload( + file = file, + repo = repo, + tag = release_tag, + .token = token, + show_progress = verbose + ) + + uploaded <- c(uploaded, file) + if (verbose) message(" ✓ Uploaded") + }, error = function(e) { + warning("Failed to upload: ", basename(file), " - ", e$message) + }) + } + + + # Verify uploaded files are now in the release + if (length(uploaded) > 0) { + if (verbose) message("Verifying uploaded files in release...") + + Sys.sleep(1) # Brief pause to ensure files are indexed + + tryCatch({ + release_files <- piggyback::pb_list( + repo = repo, + tag = release_tag, + .token = token + ) + + uploaded_names <- basename(uploaded) + if (!is.null(release_files) && nrow(release_files) > 0) { + verified <- uploaded_names %in% release_files$file_name + + if (all(verified)) { + if (verbose) message("✓ Verified: All ", length(uploaded), " files confirmed in release") + } else { + not_found <- uploaded_names[!verified] + stop("Verification failed: ", length(not_found), " file(s) not found in release: ", + paste(not_found, collapse = ", ")) + } + } else { + stop("Verification failed: Could not list files in release after upload") + } + }, error = function(e) { + stop("Could not verify uploads: ", e$message) + }) + } + + invisible(uploaded) +} + +#' Helper operator +#' @keywords internal +`%not_in%` <- Negate(`%in%`) diff --git a/R/vegetation_map.R b/R/vegetation_map.R index df37576e..315ee82a 100644 --- a/R/vegetation_map.R +++ b/R/vegetation_map.R @@ -8,7 +8,7 @@ #' @biomes list of biomes to keep get_vegmap <- function(vegmap_shp, biomes = c("Fynbos","Succulent Karoo","Albany Thicket")){ - + # Must manually download the following and put in the raw_data folder # 2018 National Vegetation Map # http://bgis.sanbi.org/SpatialDataset/Detail/1674 @@ -19,9 +19,8 @@ get_vegmap <- function(vegmap_shp, biomes = c("Fynbos","Succulent Karoo","Alban vegmap <- vegmap_za %>% filter(biome_18 %in% biomes ) %>% #filter to list above - st_make_valid() #some polygons had errors - this fixes them - -# st_write(vegmap,dsn = "data/vegmap.gpkg",append=F) + st_make_valid() |> #some polygons had errors - this fixes them + vect() return(vegmap) diff --git a/README.md b/README.md deleted file mode 100644 index ce63a50b..00000000 --- a/README.md +++ /dev/null @@ -1,130 +0,0 @@ - -![EMMA](img/EMMA%20Logo_RE_3.jpg) - -# Ecological Monitoring and Management Application (EMMA) - -This is the core repository for environmental data processing in the -Ecological Monitoring and Management Application [EMMA.io](EMMA.io). - - -# EMMA workflow overview - -The EMMA workflow consists of four modules, each with a separate Github repo: -1) The Environmental Data module (https://github.com/AdamWilsonLab/emma_envdata) -2) The Modelling and Change Detection module (https://github.com/AdamWilsonLab/emma_model) -3) The Change Classification module (https://github.com/AdamWilsonLab/emma_change_classification) -4) The Reporting module (https://github.com/AdamWilsonLab/emma_report) - - -## File structure - -The most important files are: - -``` r -├── _targets.R (data processing workflow and dependency management) -├── R/ -├──── [data_processing_functions] -├── data/ -├──── manual_download (files behind firewalls that must be manually downloaded) -├──── raw_data (raw data files downloaded by the workflow) -├──── processed_data (data processed and stored by the workflow) -└── Readme.Rmd (this file) -``` - -Files generated by the workflow are stored in the targets-runs branch. -The final output of the workflow is a set of parquet files stored as -Github releases with the tag “current”. - -# Workflow structure - -![](README_files/figure-gfm/unnamed-chunk-3-1.png) - -# Workflow Notes - -## Runtime and frequency - -Github places some constraints on actions, including memory limits and -run time limits. To prevent this workflow from taking too long to run -(and thereby losing all progress), there are a few key parameters that -can be changed. In the \_targets.R file, the argument “max_layers” -controls the maximum number of layers that rgee will attempt to download -in one action run. When initially setting up the repo, it may be -necessary to lower this value and increase the frequency that the -targets workflow is run (by adjusting the cron parameters in -targets.yaml). Github also limits the rates of requests, and so the file -release_data.R includes a call to Sys.sleep that can be adjusted to slow -down/speed up the process of pushing data to a Github release. - -# Data notes - - * MODIS NDVI values have been transformed to save space. To restore them to the original values (between -1 and 1), divide by 100 and subtract 1. - * Untransformed NDVI = (transformed NDVI / 100) - 1 - * Raw MODIS fire dates (tag:raw_fire_modis): values are either 0 (no fire) or the day of the year a fire was observed (1 through 366). - * Processed MODIS fire dates (tag: processed_fire_dates: values are either 0 (no fire) or the UNIX date (days since 1 Jan. 1970) a fire was observed. - -## Data layers - -- Continuous Heat-Insolation Load Index (CHILI; ALOS) -- Multi-Scale Topographic Position Index (MTPI; compares elevation to - surroundings; ALOS) -- Topographic Diversity (represents the variety of temperature, - moisture conditions; ALOS ) -- Mean annual air temperature (CHELSA Bio1) -- Mean diurnal air temperature range (CHELSA Bio2) -- Isothermality (ratio of diurnal variation to annual variation in - temperatures; CHELSA Bio3) -- Temperature seasonality(std. deviation of the monthly mean - temperatures; CHELSA Bio4) -- Mean daily maximum air temperature of the warmest month (CHELSA - Bio5) -- Mean daily minimum air temperature of the coldest month (CHELSA - Bio6) -- Annual range of air temperature (CHELSA Bio7) -- Mean daily mean air temperatures of the wettest quarter (CHELSA - Bio8) -- Mean daily mean air temperatures of the driest quarter (CHELSA Bio9) -- Mean daily mean air temperatures of the warmest quarter (CHELSA - Bio10) -- Mean daily mean air temperatures of the coldest quarter (CHELSA - Bio11) -- Annual precipitation amount (CHELSA Bio12) -- Precipitation amount of the wettest month (CHELSA Bio13) -- Precipitation amount of the driest month (CHELSA Bio14) -- Precipitation seasonality (CV of the monthly precipitation - estimates; CHELSA Bio15) -- Mean monthly precipitation amount of the wettest quarter (CHELSA - Bio16) -- Mean monthly precipitation amount of the driest quarter (CHELSA - Bio17) -- Mean monthly precipitation amount of the warmest quarter (CHELSA - Bio18) -- Mean monthly precipitation amount of the coldest quarter (CHELSA - Bio19) -- January (mid dry season) precipitation (CHELSA) -- July (mid wet season) precipitation (CHELSA) -- Interannual variability in cloud frequency (MODCF) -- Intraannual variability in cloud frequency (MODCF) -- Mean annual cloud frequency (MODCF) -- Cloud frequency seasonality concentration (sum(monthly concentration - vectors); MODCF) -- Elevation (NASA DEM) -- Soil electrical conductivity (soil_EC_mS_m, Cramer et al. 2019) -- Soil extractable K (soil_Ext_K\_cmol_kg, Cramer et al. 2019) -- Soil extractable NA (soil_Ext_Na_cmol_kg, Cramer et al. 2019) -- Soil extractable P(soil_Ext_P\_mg_kg, Cramer et al. 2019) -- Soil pH (Cramer et al. 2019) -- Total soil C (Cramer et al. 2019) -- Total soil N (Cramer et al. 2019) -- Time since fire (generated from MODIS active fire products and - CapeNature fire polygons) - -## Setting up the repo - - * This repo requires github credentials. To store those securely... - * Credentials are decrypted with the function decryp_secret.sh - -# Extras - - * Call `targets::tar_renv(extras = character(0))` to write a `_packages.R` file to expose hidden dependencies. - * Call `renv::init()` to initialize the `renv` lockfile `renv.lock` or `renv::snapshot()` to update it. - * Commit `renv.lock` to your Git repository. diff --git a/README.Rmd b/README.qmd similarity index 65% rename from README.Rmd rename to README.qmd index 1fe282d3..4cfe8f82 100644 --- a/README.Rmd +++ b/README.qmd @@ -10,6 +10,7 @@ knitr::opts_chunk$set( comment = "#>" ) library(tidyverse) +library(rstac) ``` ![EMMA](img/EMMA Logo_RE_3.jpg) @@ -44,6 +45,109 @@ targets::tar_glimpse() %>% webshot::webshot("img/network.html", "img/network.png") ``` +# Data Archive Summary + +```{r stac-summary, message=FALSE, warning=FALSE} + +# Connect to STAC catalog +stac_base_url <- "https://github.com/AdamWilsonLab/emma_envdata/releases/download/stac" +cat_url <- paste0(stac_base_url, "/catalog.json") + +tryCatch({ + # Load root catalog + cat <- stac(cat_url) + + # Get MODIS VI collection + modis_link <- cat$doc$links %>% + Filter(function(x) x$rel == "child" && grepl("MODIS.*VI|modis.*vi", x$title, ignore.case = TRUE), .) + + if (length(modis_link) > 0) { + collection_url <- paste0(stac_base_url, "/modis_vi/collection.json") + collection <- stac(collection_url) + + # Get all items + items <- stac_search(collection) %>% get_request() + + if (!is.null(items$features) && length(items$features) > 0) { + # Extract item metadata + items_table <- data.frame( + Month = sapply(items$features, function(x) x$id), + Start = sapply(items$features, function(x) x$properties$start_datetime), + End = sapply(items$features, function(x) x$properties$end_datetime), + stringsAsFactors = FALSE + ) %>% + mutate( + Start = as.Date(substr(Start, 1, 10)), + End = as.Date(substr(End, 1, 10)) + ) %>% + arrange(Start) + + # Display summary statistics + cat("## MODIS Enhanced Vegetation Index (EVI)\n\n") + + if (!is.null(collection$doc$description)) { + cat("**Collection Description:** ", collection$doc$description, "\n\n") + } + + cat("**Temporal Coverage:** ", min(items_table$Start), " to ", max(items_table$End), "\n\n") + cat("**Total Months Available:** ", nrow(items_table), "\n\n") + cat("**Last Updated:** ", max(items_table$End), "\n\n") + } else { + cat("No items found in MODIS VI collection\n") + } + } else { + cat("MODIS VI collection not found in STAC catalog\n") + } +}, error = function(e) { + cat("Could not access STAC catalog: ", e$message, "\n") +}) +``` + +### Available Data Files + +```{r stac-table, echo=FALSE} +if (exists("items_table")) { + knitr::kable( + items_table, + format = "markdown", + caption = "MODIS VI monthly data files in archive" + ) +} +``` + +### Accessing Data with rstac + +Users can programmatically access this data using the `rstac` R package: + +```{r, eval=FALSE} +library(rstac) +library(arrow) + +# Connect to STAC collection +stac_base_url <- "https://github.com/AdamWilsonLab/emma_envdata/releases/download/stac" +cat_url <- paste0(stac_base_url, "/catalog.json") +cat <- stac(cat_url) + +collection_url <- paste0(stac_base_url, "/modis_vi/collection.json") +collection <- stac(collection_url) + +# Search for items in a date range +results <- stac_search( + q = collection, + datetime = "2026-01-01/2026-12-31" +) %>% + get_request() + +# Download and read parquet files +if (!is.null(results$features)) { + for (item in results$features) { + url <- item$assets$data$href + df <- arrow::read_parquet(url) + # Process data... + } +} +``` + # Workflow Notes ## Runtime and frequency diff --git a/README_files/figure-gfm/unnamed-chunk-3-1.png b/README_files/figure-gfm/unnamed-chunk-3-1.png index 4dbfc023..ab241357 100644 Binary files a/README_files/figure-gfm/unnamed-chunk-3-1.png and b/README_files/figure-gfm/unnamed-chunk-3-1.png differ diff --git a/_targets.R b/_targets.R index d8714617..2b044cb8 100644 --- a/_targets.R +++ b/_targets.R @@ -1,304 +1,224 @@ -message("Starting tar_make()") -print("Starting tar_make() - print") - -library(targets) -library(tarchetypes) -library(visNetwork) -library(future) #not sure why this is needed, but we get an error in some of the files without it -library(googledrive) - -#If running this locally, make sure to set up github credentials using gitcreds::gitcreds_set() +# ============================================================================ +# EMMA Environmental Data Pipeline +# ============================================================================ +# This pipeline assembles environmental datasets for the EMMA project using +# targets for workflow orchestration. -#devtools::install_github(repo = "bmaitner/rgee", -# ref = "noninteractive_auth") +message("Starting tar_make()") -# Ensure things are clean - unlink(file.path("data/temp/"), recursive = TRUE, force = TRUE) - unlink(file.path("data/raw_data/", recursive = TRUE, force = TRUE)) - message(paste("Objects:",ls(),collapse = "\n")) +devtools::load_all() # load all functions in R +description_packages <- load_description_packages(verbose=TRUE) # Load all packages from DESCRIPTION and get list -# source all files in R folder - lapply(list.files("R",pattern="[.]R",full.names = T), source) - message(paste("Objects:",ls(),collapse = "\n")) # To make sure all packages are loaded +# check what system we are on + sys_info <- Sys.info(); message(paste("System info:",paste(names(sys_info), sys_info, sep="=", collapse = "; "))) + # if nodename includes "ccr.buffalo.edu", set working directory to /gscratch/scrubbed/... + if (grepl("ccr.buffalo.edu", sys_info[["nodename"]])) { + setwd("~/project/projects/emma/emma_envdata") + message(paste("Set working directory to:", getwd())) + } +#If running this locally, make sure to set up github credentials using gitcreds::gitcreds_set() options(tidyverse.quiet = TRUE) - #options(clustermq.scheduler = "multicore") - - tar_option_set(packages = c("cmdstanr", "posterior", "bayesplot", "tidyverse", - "stringr","knitr","sf","stars","units", - "cubelyr","rgee", "reticulate")) - -#set JSON token location (should be authorized for drive and earth engine) - json_token <- "secrets/ee-wilsonlab-emma-ef416058504a.json" - -# ee authentication - if(T) { - message("loading rgee") -# rgee::ee_install_set_pyenv('/usr/bin/python3','r-reticulate', confirm = F) - library(rgee) - #Initializing with service account key - service_account <- jsonlite::read_json(json_token)$client_email - credentials <- ee$ServiceAccountCredentials(service_account, json_token) - ee$Initialize(credentials = credentials) + # Ensure output directories exist early (before terra options) + dir.create("data/raw", recursive = TRUE, showWarnings = FALSE) + dir.create("data/temp", recursive = TRUE, showWarnings = FALSE) + dir.create("data/temp/terra", recursive = TRUE, showWarnings = FALSE) + dir.create("data/releases", recursive = TRUE, showWarnings = FALSE) + dir.create("data/target_outputs", recursive = TRUE, showWarnings = FALSE) + + # GitHub release repository configuration - releases are used to store target objects and publish final data + gh_repo_config <- list( + repo = "AdamWilsonLab/emma_envdata", + tag = "objects_current", + cache_dir = "data/target_outputs/.tar_cache" #this is local cache for speed + ) - #Setting up needed objects for rgee + # Store config as environment variables for upload function to use + Sys.setenv( + TAR_GH_RELEASE_REPO = gh_repo_config$repo, + TAR_GH_RELEASE_TAG = gh_repo_config$tag, + TAR_GH_RELEASE_FORMAT = gh_repo_config$format, + TAR_GH_RELEASE_CACHE_DIR = gh_repo_config$cache_dir + ) - message("Initializing rgee") + tar_option_set( + memory="transient", + garbage_collection = TRUE, #run gc() after each target to free memory + packages = description_packages, # Use all packages from DESCRIPTION file + repository = "local", # Store locally; manual upload after tar_make() completes + cue = tar_cue(mode = "thorough") # Recompute if any inputs change + ) - ee_Initialize(drive = TRUE, - gcs = FALSE, - use_oob = FALSE, - drive_cred_path = json_token, - gcs_cred_path = json_token, - ee_cred_path = json_token) + terraOptions(tempdir = "data/temp/terra", memfrac = 0.6) + # Set cleanup behavior based on execution environment + # In GitHub Actions, we want to clean up temp files to avoid filling up disk space. Locally, we may want to keep them for debugging or inspection. + cleanup_mode <- Sys.getenv("GITHUB_ACTIONS") == "true" + if (interactive()) { + message("Cleanup mode: ", if (cleanup_mode) "ENABLED (GitHub Actions)" else "DISABLED (Local server)") } -# # Sys.setenv(GOOGLE_APPLICATION_CREDENTIALS = "secrets/ee-wilsonlab-emma-ef416058504a.json") -# message("Starting tar_make()") -# print("Starting tar_make() - print") - -# library(targets) -# library(tarchetypes) -# library(visNetwork) -# library(future) #not sure why this is needed, but we get an error in some of the files without it -# options(gargle_verbosity = "debug") -# library(googledrive) -# library(jsonlite) - -# library(jsonlite) -# # tok <- fromJSON("secrets/ee-wilsonlab-emma-ef416058504a.json") -# # print(tok$scopes) # or tok$scopes - -# library(reticulate) -# # message("------ reticulate::py_discover_config() ------") -# # print(py_discover_config()) - -# # message("------ checking ee module availability ------") -# # print(py_module_available("ee")) - -# # message("------ py_config() output ------") -# # print(py_config()) - -# #If running this locally, make sure to set up github credentials using gitcreds::gitcreds_set() - -# #devtools::install_github(repo = "bmaitner/rgee", -# # ref = "noninteractive_auth") - -# # Ensure things are clean -# unlink(file.path("data/temp/"), recursive = TRUE, force = TRUE) -# unlink(file.path("data/raw_data/"), recursive = TRUE, force = TRUE) -# message(paste("Objects:",ls(),collapse = "\n")) - -# # source all files in R folder -# lapply(list.files("R",pattern="[.]R",full.names = T), source) -# message(paste("Objects:",ls(),collapse = "\n")) # To make sure all packages are loaded - - -# options(tidyverse.quiet = TRUE) -# #options(clustermq.scheduler = "multicore") - -# tar_option_set(packages = c("cmdstanr", "posterior", "bayesplot", "tidyverse", -# "stringr","knitr","sf","stars","units", -# "cubelyr","rgee", "reticulate")) - -# #set JSON token location (should be authorized for drive and earth engine) -# json_token <- "secrets/ee-wilsonlab-emma-ef416058504a.json" - -# # drive_auth(path = json_token) - -# # ee authentication -# if(T) { -# message("loading rgee") -# py_run_string("import ee") -# py_run_string("print(ee.__version__)") -# # rgee::ee_install_set_pyenv('/usr/bin/python3','r-reticulate', confirm = F) -# library(rgee) -# print(packageVersion("rgee")) -# options(rgee.verbose = TRUE) -# options(gargle_verbosity = "debug") -# #Initializing with service account key - - -# # unlink("~/.config/earthengine", recursive = TRUE, force = TRUE) -# #ee$Authenticate(auth_mode='appdefault', quiet=TRUE) -# message("Authentication is completed") -# # rgee::ee_clean_credentials() -# service_account <- jsonlite::read_json(json_token)$client_email -# credentials <- ee$ServiceAccountCredentials(service_account, json_token) -# ee$Initialize(credentials=credentials) -# message("Initialization is completed") - -# # point to your service-account JSON -# # Sys.setenv(GOOGLE_APPLICATION_CREDENTIALS = json_token) - -# # preload Drive & GCS creds headlessly -# #googledrive::drive_auth(path = json_token, cache = FALSE) -# #googleCloudStorageR::gcs_auth(json_file = json_token) -# #dir.create("~/.config/earthengine", recursive = TRUE, showWarnings = FALSE) -# message("Before ee_Initialize") - -# # App-Default auth for rgee (no browser) -# # drive_auth(path = json_token, cache = FALSE) -# # gargle::gargle_oauth_cache() -# # token <- gargle::credentials_service_account( -# # path = json_token, -# # scopes = NULL - -# # ) -# # googledrive::drive_auth(token = token) -# ee_Authenticate(auth_mode='appdefault', quiet=TRUE) # , scopes='https://www.googleapis.com/auth/cloud-platform', -# # ee_Initialize( -# # # user= "20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner", -# # # # user = "emma-envdata@ee-wilsonlab-emma.iam.gserviceaccount.com", -# # # credentials = "secrets/ee-wilsonlab-emma-ef416058504a.json", -# # credentials = "/github/home/.config/earthengine/", -# # # # drive = TRUE, -# # # # gcs = FALSE, -# # # project = "ee-wilsonlab-emma", -# # # # auth_mode = 'service_account', -# # auth_quiet = TRUE, -# # quiet = TRUE -# # ) -# #ee_clean_user_credentials() -# #ee_install_upgrade() -# # ee_Authenticate(auth_mode='appdefault', quiet=TRUE) - -# #ee_Authenticate() -# ee_Initialize() -# # #project = "ee-wilsonlab-emma", -# # #scopes='https://www.googleapis.com/auth/devstorage.full_control', -# # credentials=credentials, -# # auth_mode = "gcloud", -# # quiet = TRUE -# # ) #auth_mode="appdefault", quiet = TRUEㅣ, credentials=credentials, project = "ee-wilsonlab-emma", -# reticulate::py_last_error() -# message("ee_Initialize is completed") -# # unlink("~/.config/earthengine", recursive = TRUE, force = TRUE) -# # unlink("~/.rgee", recursive = TRUE, force = TRUE) -# # dir.create("~/.config/earthengine", recursive = TRUE, showWarnings = FALSE) -# # file.create("~/.config/earthengine/rgee_sessioninfo.txt") -# # options(rgee.session.info = FALSE) - -# #Setting up needed objects for rgee -# message("Initializing rgee") - -# # ee_Initialize( -# # service_account = "emma-envdata@ee-wilsonlab-emma.iam.gserviceaccount.com", -# # credentials = "secrets/ee-wilsonlab-emma-ef416058504a.json", -# # drive = TRUE, -# # gcs = TRUE -# # ) -# message("After ee_Initialize") -# # # 3) JSON에서 서비스 계정 이메일 추출 -# # key_path <- Sys.getenv("GOOGLE_APPLICATION_CREDENTIALS") -# # sa_email <- read_json(key_path)$client_email - -# # # 4) SaK(Service account Key)를 rgee 자격증명 폴더로 복사·검증 -# # ee_utils_sak_copy( -# # sakfile = key_path, -# # users = sa_email -# # ) -# # ee_utils_sak_validate( -# # users = sa_email, -# # quiet = TRUE -# # ) - -# # # 5) Earth Engine 비대화형 초기화 (서비스 계정 모드) -# # ee_Initialize( -# # email = sa_email, -# # project = "ee-wilsonlab-emma", -# # auth_mode = "service_account", -# # quiet = TRUE -# # ) - -# # # 6) rgee_sessioninfo.txt 생성 보장 -# # ee_sessioninfo( -# # email = sa_email, -# # user = sa_email -# # ) - -# # message("Earth Engine non-interactive initialization complete.") -# } - +# Ensure things are clean +# unlink(file.path("data/temp/"), recursive = TRUE, force = TRUE) +# unlink(file.path("data/raw_data/", recursive = TRUE, force = TRUE)) +# message(paste("Objects:",ls(),collapse = "\n")) -list( + # Set MODIS date range as variables or targets (customize as needed) + modis_start_date <- "2000-02-18" # or tar_target(...) + modis_start_date <- "2026-01-01" # or tar_target(...) + modis_end_date <- as.character(Sys.Date()) -# #Prep needed files # start +list( tar_target( - vegmap_shp, # 2018 National Vegetation Map http://bgis.sanbi.org/SpatialDataset/Detail/1674 - "data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp", + vegmap_shp, + download_vegmap_release( + repo = "AdamWilsonLab/emma_envdata", + tag = "vegmap2024", + file = "NVM2024final_Shapefile.zip", + local_dir = "data/manual_download/NVM2024", + shapefile_name = "NVM2024Final_IEM5_12_07012025.shp" + ), format = "file" ), tar_target( remnants_shp, "data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp", - format = "file" + format="file" ), tar_target( - sanbi_fires_shp, - st_read("data/manual_download/All_Fires/All_Fires_20_21_gw.shp") + capenature_fires_shp, + "data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp", + format="file" ), +# Get country boundary + tar_target( + country.parquet, + get_country(), + format = "file" + ), - tar_target( - country, - national_boundary() - ) -, +# Create domain file based on country boundary and vegmap + tar_target( + domain_boundary.parquet, + domain_define(vegmap_shp = vegmap_shp, country = country.parquet), + format = "file" + ), + +# Stable bounding box for downloads (50km buffer around domain) + tar_target( + domain_bbox.parquet, + make_domain_bbox(domain_boundary.parquet, buffer_m = 50000, out_file = "data/target_outputs/domain_bbox.parquet"), + format = "file", + cue = tar_cue(mode = "never") # Never re-downloads unless manually invalidated, even if analysis domain changes + ), + +# Domain raster with pixel IDs, remnants, and distance to remnants. This defines the model grid that is used for everything! + tar_target( + domain_nc, + domain_rasterize( + domain = sfarrow::st_read_parquet(domain_boundary.parquet), + remnants_shp = remnants_shp, + out_file = "data/target_outputs/domain.nc" + ), + format = "file", + cue = tar_cue(mode = "never") # Never rerun unless manually invalidated because this will trigger complete reprocessing of rs data + # tar_invalidate(domain_nc) # run this to force recompute, which will trigger redownloading all RS data from appeears - tar_target( - vegmap, - get_vegmap(vegmap_shp) ), + # Convert domain raster to geoparquet for spatial reference with coordinates and pid tar_target( - domain, - domain_define(vegmap = vegmap, country) - ) -, + domain_geoparquet, + domain_to_geoparquet( + domain_raster_file = domain_nc, + out_file = "data/target_outputs/domain.parquet", + verbose = TRUE + ), + format = "file" + ), +# Rasterize the vegetation map + tar_target( + vegmap_nc, + data_vegmap(domain_raster = domain_nc, + vegmap_shp = vegmap_shp, + out_file = "data/target_outputs/vegmap.nc"), + format = "file"), + + + # tar_target( + # protected_area_distance_release, + # process_release_protected_area_distance(template_release, + # out_file = "protected_area_distance.tif", + # temp_directory = "data/temp/protected_area", + # out_tag = "processed_static") + # ), + +# tar_target( +# alos_release, +# get_release_alos(temp_directory = "data/temp/raw_data/alos/", +# tag = "raw_static", +# domain = domain, +# json_token) +# ) +#, + +# Climate CHELSA bioclimatic variables (BIO1-BIO19) + tar_target( + climate_chelsa, + get_climate_chelsa( + domain = sfarrow::st_read_parquet(domain_boundary.parquet), + cleanup = cleanup_mode, + verbose = TRUE), + format = "file" + ), -# # # # Infrequent updates via releases + # tar_terra_rast( + # clouds_wilson_release, + # get_release_clouds_wilson(temp_directory = "data/temp/raw_data/clouds_wilson/", + # tag = "raw_static", + # domain, + # sleep_time = 180) + # ), + ##################### AppEEARS Static Data Processing ######################### + # Sequential targets for AppEEARS elevation: submit task, then poll for results + # Allows independent timeouts and retries for long-running API calls tar_target( - alos_release, - get_release_alos(temp_directory = "data/temp/raw_data/alos/", - tag = "raw_static", - domain = domain, - json_token) - ) -, - - tar_target( - climate_chelsa_release, - get_release_climate_chelsa(temp_directory = "data/temp/raw_data/climate_chelsa/", - tag = "raw_static", - domain = domain) - ) -, + elevation_task_id, + submit_elevation_task( + domain_vector = sfarrow::st_read_parquet(domain_boundary.parquet), + verbose = TRUE + ) + ), tar_target( - clouds_wilson_release, - get_release_clouds_wilson(temp_directory = "data/temp/raw_data/clouds_wilson/", - tag = "raw_static", - domain, - sleep_time = 180) + elevation, + download_elevation_results( + task_id = elevation_task_id, + domain_vector = sfarrow::st_read_parquet(domain_boundary.parquet), + domain_raster = domain_nc, + out_file = "data/target_outputs/elevation_nasadem.nc", + temp_directory = "data/temp/raw_data/elevation_nasadem/", + verbose = TRUE ), + format = "file" + ), - tar_target( - elevation_nasadem_release, - get_release_elevation_nasadem(temp_directory = "data/temp/raw_data/elevation_nasadem/", - tag = "raw_static", - domain) - ) -, + # Generate human-readable manifest of all targets for release documentation +# tar_target( +# release_manifest, +# generate_release_manifest(), +# format = "file" +# ) +# #, #Temporarily commented out, seems to be an issue with URL for landcover data at present # tar_target( @@ -308,12 +228,12 @@ list( # domain = domain) # ), # - tar_target( - precipitation_chelsa_release, - get_release_precipitation_chelsa(temp_directory = "data/temp/raw_data/precipitation_chelsa/", - tag = "raw_static", - domain = domain) - ), + # tar_target( + # precipitation_chelsa_release, + # get_release_precipitation_chelsa(temp_directory = "data/temp/raw_data/precipitation_chelsa/", + # tag = "raw_static", + # domain = domain) + # )#, # ## commented out soil_gcfr_release at present due to API/rdryad issues. # ## Emailed dryad folks on 2024/01/04, it seems the API update broke RDryad @@ -327,406 +247,390 @@ list( # # domain) # # ), # -# # # # # Frequent updates via releases - - tar_age( - fire_modis_release, - get_release_fire_modis(temp_directory = "data/temp/raw_data/fire_modis/", - tag = "raw_fire_modis", - domain = domain, - max_layers = 5, - sleep_time = 5, - json_token = json_token, - verbose = FALSE), - #age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - age = as.difftime(0, units = "hours") - ), - - tar_age( - kndvi_modis_release, - get_release_kndvi_modis(temp_directory = "data/temp/raw_data/kndvi_modis/", - tag = "raw_kndvi_modis", - domain = domain, - max_layers = 5, - sleep_time = 5, - json_token = json_token, - verbose = TRUE), - age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - #age = as.difftime(0, units = "hours") - ), - - tar_age( - ndvi_modis_release, - get_release_ndvi_modis(temp_directory = "data/temp/raw_data/ndvi_modis/", - tag = "raw_ndvi_modis", - domain = domain, - max_layers = 12, - sleep_time = 5, - json_token = json_token), - #age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - age = as.difftime(0, units = "hours") - ), - - tar_age( - ndvi_viirs_release, - get_release_ndvi_viirs(temp_directory = "data/temp/raw_data/ndvi_viirs/", - tag = "raw_ndvi_viirs", - domain, - max_layers = 3, - sleep_time = 30, - json_token = json_token), - age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - #age = as.difftime(0, units = "hours") - ), - - - tar_age( - ndvi_dates_modis_release, - get_release_ndvi_dates_modis(temp_directory = "data/temp/raw_data/ndvi_dates_modis/", - repo_tag = "raw_ndvi_dates_modis", - domain = domain, - max_layers = 5, - sleep_time = 10, - json_token = json_token), - #age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - age = as.difftime(0, units = "hours") - ), - - tar_age( - ndvi_dates_viirs_release, - get_release_ndvi_dates_viirs(temp_directory = "data/temp/raw_data/ndvi_dates_viirs/", - tag = "raw_ndvi_dates_viirs", - domain = domain, - max_layers = 3, - sleep_time = 30, - json_token = json_token), - age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - #age = as.difftime(0, units = "hours") - ), - - - - tar_age(mean_ndvi_release, - get_release_mean_ndvi_modis(temp_directory = "data/temp/raw_data/mean_ndvi_modis/", - tag = "current", - domain = domain, - sleep_time = 1, - json_token = json_token), - #age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - age = as.difftime(0, units = "hours") - ), - -# # # # tar_age( -# # # # ndwi_modis_release, -# # # # get_release_ndwi_modis(temp_directory = "data/temp/raw_data/NDWI_MODIS/", -# # # # tag = "current", -# # # # domain, -# # # # drive_cred_path = json_token), -# # # # age = as.difftime(7, units = "days") -# # # # #age = as.difftime(1, units = "days") -# # # # #age = as.difftime(0, units = "hours") -# # # # ), -# # # -# # # -# # # -# # # # # # Fixing projection via releases - - - tar_target( - correct_fire_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/fire_modis/", - input_tag = "raw_fire_modis", - output_tag = "clean_fire_modis", - max_layers = NULL, - sleep_time = 30, - verbose = TRUE, - ... = fire_modis_release) - ), - - tar_target( - correct_ndvi_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_modis/", - input_tag = "raw_ndvi_modis", - output_tag = "clean_ndvi_modis", - max_layers = NULL, - sleep_time = 30, - verbose = TRUE, - ... = ndvi_modis_release) - ), +##################### AppEEARS Dynamic Data Processing ######################### + +# tar_age( +# fire_modis_release, +# get_release_fire_modis_appeears(temp_directory = "data/temp/raw_data/fire_modis/", +# tag = "raw_fire_modis_nc", +# domain = domain, +# max_layers = 5, +# sleep_time = 5, +# verbose = TRUE), +# age = as.difftime(7, units = "days") +# #age = as.difftime(1, units = "days") +# #age = as.difftime(0, units = "hours"), +# cue = tar_cue(mode = if (run_mode == "update") "always" else "thorough") +# ), + + # ============================================================================ + # MODIS VI Download Pipeline (Dynamically Branched) + # ============================================================================ + + # Identify which monthly periods need to be downloaded tar_target( - correct_ndvi_dates_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_dates_modis/", - input_tag = "raw_ndvi_dates_modis", - output_tag = "clean_ndvi_dates_modis", - max_layers = NULL, - sleep_time = 30, - verbose = TRUE, - ... = ndvi_dates_modis_release) + modis_vi_to_download, + { + output_dir <- "data/target_outputs/modis_vi" + + # Check which monthly periods have already been downloaded + # identify_missing_vi() checks for existing NetCDF files + missing <- identify_missing_vi( + output_dir = output_dir, + dataset = "modis_vi", + start_date = modis_start_date, + end_date = modis_end_date + ) + + # Always include the current month to ensure up-to-date data + today <- Sys.Date() + current_month_start <- as.Date(paste0(format(today, "%Y-%m"), "-01")) + current_month_end <- as.Date(paste0(format(today + 31, "%Y-%m"), "-01")) - 1 + current_month_str <- format(current_month_start, "%Y-%m") + + # Check if current month is already in missing + current_in_missing <- any(missing$date_str == current_month_str) + + if (!current_in_missing) { + current_row <- data.frame( + month_start = current_month_start, + month_end = current_month_end, + date_str = current_month_str + ) + missing <- rbind(missing, current_row) + } + + if (nrow(missing) == 0) { + message("All monthly periods from ", modis_start_date, " to ", modis_end_date, " already downloaded") + # Return empty data frame with correct structure + data.frame( + month_start = as.Date(character(0)), + month_end = as.Date(character(0)), + date_str = character(0) + ) + } else { + message("Found ", nrow(missing), " missing monthly periods to download (current month always included)") + missing + } + } ), - + # Dynamically submit monthly AppEEARS tasks tar_target( - correct_ndvi_viirs_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_viirs/", - input_tag = "raw_ndvi_viirs", - output_tag = "clean_ndvi_viirs", - max_layers = 30, - sleep_time = 30, - verbose = TRUE, - ... = ndvi_viirs_release) + modis_vi_task_ids, + { + # Within this branch, modis_vi_to_download is auto-sliced to one row + submit_modis_vi( + domain_vector = sfarrow::st_read_parquet(domain_boundary.parquet), + month_start = modis_vi_to_download$month_start, + month_end = modis_vi_to_download$month_end + ) + }, + pattern = map(modis_vi_to_download), ), + # Download NetCDF files from AppEEARS (I/O only) + tar_target( + modis_vi_netcdf, + { + download_modis_vi_netcdf( + task_id = modis_vi_task_ids, + month_start = modis_vi_to_download$month_start, + temp_directory = "data/temp/raw_data/modis_vi_netcdf/", + cleanup = cleanup_mode, + verbose = TRUE + ) + }, + pattern = map(modis_vi_task_ids, modis_vi_to_download), + format = "file", + ), - tar_target( - correct_ndvi_dates_viirs_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_dates_viirs/", - input_tag = "raw_ndvi_dates_viirs", - output_tag = "clean_ndvi_dates_viirs", - max_layers = 30, - sleep_time = 30, - verbose = TRUE, - ... = ndvi_dates_viirs_release) - ), + # Process NetCDF to parquet format + tar_target( + modis_vi_parquet, + { + netcdf_to_parquet( + netcdf_directory = modis_vi_netcdf, + domain_raster = domain_nc, + month_start = modis_vi_to_download$month_start, + out_dir = "data/target_outputs/modis_vi/", + cleanup = cleanup_mode, + verbose = TRUE + ) + }, + pattern = map(modis_vi_netcdf, modis_vi_to_download), + format = "file" + ), - tar_target( - correct_kndvi_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/kndvi_modis/", - input_tag = "raw_kndvi_modis", - output_tag = "clean_kndvi_modis", - max_layers = 30, - sleep_time = 45, - verbose = TRUE, - ... = kndvi_modis_release) - ), # second chunk - -# # # Processing via release - - tar_target( - fire_doy_to_unix_date_release, - process_release_fire_doy_to_unix_date(input_tag = "clean_fire_modis", - output_tag = "processed_fire_dates", - temp_directory = "data/temp/processed_data/fire_dates/", - sleep_time = 20, - template_release = template_release, - ... = correct_fire_release_proj_and_extent) - ), - - tar_target( - burn_date_to_last_burned_date_release, - process_release_burn_date_to_last_burned_date(input_tag = "processed_fire_dates", - output_tag = "processed_most_recent_burn_dates", - temp_directory_input = "data/temp/processed_data/fire_dates/", - temp_directory_output = "data/temp/processed_data/most_recent_burn_dates/", - sleep_time = 180, - sanbi_sf = sanbi_fires_shp, - expiration_date = NULL, - ... = fire_doy_to_unix_date_release) + # Generate STAC Collection for MODIS VI dataset + tar_target( + modis_vi_stac, + generate_modis_vi_stac( + parquet_files = modis_vi_parquet, # Automatically aggregated from branched target + parquet_dir = "data/target_outputs/modis_vi", + stac_dir = "data/stac/modis_vi", + parent_catalog_path = "data/stac", + gh_repo = "AdamWilsonLab/emma_envdata", + gh_release_tag = "data_modis_vi_current", + verbose = TRUE ), + format = "file" + ), - - tar_target( - ndvi_relative_days_since_fire_release, - process_release_ndvi_relative_days_since_fire(temp_input_ndvi_date_folder = "data/temp/raw_data/ndvi_dates_modis/", - temp_input_fire_date_folder = "data/temp/processed_data/most_recent_burn_dates/", - temp_fire_output_folder = "data/temp/processed_data/ndvi_relative_time_since_fire/", - input_fire_dates_tag = "processed_most_recent_burn_dates", - input_modis_dates_tag = "clean_ndvi_dates_modis", - output_tag = "processed_ndvi_relative_days_since_fire", - sleep_time = 60, - ... = burn_date_to_last_burned_date_release, - ... = correct_ndvi_dates_release_proj_and_extent) - ), - - tar_target( - template_release, - get_release_template_raster(input_tag = "clean_ndvi_modis", - output_tag = "raw_static", - temp_directory = "data/temp/template", - ... = correct_ndvi_release_proj_and_extent) - ), - - tar_target( - remnants_release, - domain_remnants_release(domain = domain, - remnants_shp = remnants_shp, - template_release, - temp_directory = "data/temp/remnants", - out_file = "remnants.tif", - out_tag = "processed_static") - ), # 3-1 - - tar_target( - remnant_distance_release, - domain_distance_release(remnants_release = remnants_release, - out_file = "remnant_distance.tif", - temp_directory = "data/temp/remnants", - out_tag = "processed_static") - ), - - tar_target( - protected_area_distance_release, - process_release_protected_area_distance(template_release, - out_file = "protected_area_distance.tif", - temp_directory = "data/temp/protected_area", - out_tag = "processed_static") - ), - - tar_target( - projected_alos_release, - process_release_alos(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/alos/", - template_release = template_release, - sleep_time = 60, - ... = alos_release) - ), - - tar_target( - projected_climate_chelsa_release, - process_release_climate_chelsa(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/climate_chelsa/", - template_release = template_release, - ... = climate_chelsa_release) + # Generate parent STAC Catalog linking all datasets (MODIS VI, VIIRS VI, burned area, age, etc.) + tar_target( + emma_stac_catalog, + { + generate_emma_stac_catalog( + stac_base_dir = "data/stac", + dataset_collections = list( + modis_vi = "data/stac/modis_vi" + # Additional datasets will be added here as they become available: + # viirs_vi = "data/stac/viirs_vi", + # burned_area = "data/stac/burned_area", + # age = "data/stac/age" ), - - tar_target( - projected_clouds_wilson_release, - process_release_clouds_wilson(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/clouds_wilson/", - template_release = template_release, - sleep_time = 180, - ... = clouds_wilson_release) - ), # 3-2 - - tar_target( - projected_elevation_nasadem_release, - process_release_elevation_nasadem(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/elevation_nasadem/", - template_release = template_release, - sleep_time = 0, - ... = elevation_nasadem_release) - ), - - tar_target( - projected_landcover_za_release, - process_release_landcover_za(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/landcover_za/", - template_release, - sleep_time = 60, - ... = landcover_za_release) + gh_repo = "AdamWilsonLab/emma_envdata", + verbose = TRUE ) - , - - tar_target( - projected_precipitation_chelsa_release, - process_release_precipitation_chelsa(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/precipitation_chelsa/", - template_release, - sleep_time = 60, - ... = precipitation_chelsa_release) - - ), - - tar_target( - projected_soil_gcfr_release, - process_release_soil_gcfr(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/soil_gcfr/", - template_release, - sleep_time = 60, - ... = soil_gcfr_release) - - ), - - tar_target( - vegmap_modis_proj, - process_release_biome_raster(template_release = template_release, - vegmap_shp = vegmap_shp, - domain = domain, - temp_directory = "data/temp/raw_data/vegmap_raster/", - sleep_time = 10) - - ), - - - - -# # # # # Prep model data - - tar_target( - stable_data_release, - process_release_stable_data(temp_directory = "data/temp/processed_data/static/", - input_tag = "processed_static", - output_tag = "current", - sleep_time = 120, - ... = projected_precipitation_chelsa_release, - ... = projected_landcover_za_release, - ... = projected_elevation_nasadem_release, - ... = projected_clouds_wilson_release, - ... = projected_climate_chelsa_release, - ... = projected_alos_release, - ... = remnant_distance_release, - ... = protected_area_distance_release, - ... = projected_soil_gcfr_release) - ), - - tar_target( - ndvi_to_parquet_release, - process_release_dynamic_data_to_parquet(temp_directory = "data/temp/raw_data/ndvi_modis/", - input_tag = "clean_ndvi_modis", - output_tag = "current", - variable_name = "ndvi", - sleep_time = 30, - ... = correct_ndvi_release_proj_and_extent) - ), - - tar_target( - fire_dates_to_parquet_release, - process_release_dynamic_data_to_parquet(temp_directory = "data/temp/processed_data/ndvi_relative_time_since_fire/", - input_tag = "processed_ndvi_relative_days_since_fire", - output_tag = "current", - variable_name = "time_since_fire", - sleep_time = 30, - ... = ndvi_relative_days_since_fire_release) - ), + }, + format = "file", + deployment = "main" + ), - tar_target( - most_recent_fire_dates_to_parquet_release, - process_release_dynamic_data_to_parquet(temp_directory = "data/temp/processed_data/most_recent_burn_dates/", - input_tag = "processed_most_recent_burn_dates", - output_tag = "current", - variable_name = "most_recent_burn_dates", - sleep_time = 30, - ... = burn_date_to_last_burned_date_release) - ), -# periodically clean up google drive folder + # revise modis for viirs + + + +# # # # Processing via release + +# tar_target( +# fire_doy_to_unix_date_release, +# process_release_fire_doy_to_unix_date(input_tag = "clean_fire_modis", +# output_tag = "processed_fire_dates", +# temp_directory = "data/temp/processed_data/fire_dates/", +# sleep_time = 20, +# template_release = template_release, +# ... = correct_fire_release_proj_and_extent) +# ), + +# tar_target( +# burn_date_to_last_burned_date_release, +# process_release_burn_date_to_last_burned_date(input_tag = "processed_fire_dates", +# output_tag = "processed_most_recent_burn_dates", +# temp_directory_input = "data/temp/processed_data/fire_dates/", +# temp_directory_output = "data/temp/processed_data/most_recent_burn_dates/", +# sleep_time = 180, +# sanbi_sf = sanbi_fires_shp, +# expiration_date = NULL, +# ... = fire_doy_to_unix_date_release) +# ), + + +# tar_target( +# ndvi_relative_days_since_fire_release, +# process_release_ndvi_relative_days_since_fire(temp_input_ndvi_date_folder = "data/temp/raw_data/ndvi_dates_modis/", +# temp_input_fire_date_folder = "data/temp/processed_data/most_recent_burn_dates/", +# temp_fire_output_folder = "data/temp/processed_data/ndvi_relative_time_since_fire/", +# input_fire_dates_tag = "processed_most_recent_burn_dates", +# input_modis_dates_tag = "clean_ndvi_dates_modis", +# output_tag = "processed_ndvi_relative_days_since_fire", +# sleep_time = 60, +# ... = burn_date_to_last_burned_date_release, +# ... = correct_ndvi_dates_release_proj_and_extent) +# ), + +# tar_target( +# template_release, +# get_release_template_raster(input_tag = "clean_ndvi_modis", +# output_tag = "raw_static", +# temp_directory = "data/temp/template", +# ... = correct_ndvi_release_proj_and_extent) +# ), + + + +# tar_target( +# projected_alos_release, +# process_release_alos(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/alos/", +# template_release = template_release, +# sleep_time = 60, +# ... = alos_release) +# ), + +# tar_target( +# projected_climate_chelsa_release, +# process_release_climate_chelsa(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/climate_chelsa/", +# template_release = template_release, +# ... = climate_chelsa_release) +# ), + +# tar_target( +# projected_clouds_wilson_release, +# process_release_clouds_wilson(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/clouds_wilson/", +# template_release = template_release, +# sleep_time = 180, +# ... = clouds_wilson_release) +# ), # 3-2 + +# tar_target( +# projected_elevation_nasadem_release, +# process_release_elevation_nasadem(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/elevation_nasadem/", +# template_release = template_release, +# sleep_time = 0, +# ... = elevation_nasadem_release) +# ), + +# tar_target( +# projected_landcover_za_release, +# process_release_landcover_za(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/landcover_za/", +# template_release, +# sleep_time = 60, +# ... = landcover_za_release) +# ) +# , + +# tar_target( +# projected_precipitation_chelsa_release, +# process_release_precipitation_chelsa(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/precipitation_chelsa/", +# template_release, +# sleep_time = 60, +# ... = precipitation_chelsa_release) + +# ), + +# tar_target( +# projected_soil_gcfr_release, +# process_release_soil_gcfr(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/soil_gcfr/", +# template_release, +# sleep_time = 60, +# ... = soil_gcfr_release) + +# ), + +# tar_target( +# vegmap_modis_proj, +# process_release_biome_raster(template_release = template_release, +# vegmap_shp = vegmap_shp, +# domain = domain, +# temp_directory = "data/temp/raw_data/vegmap_raster/", +# sleep_time = 10) + +# ), + + + + +# # # # # # Prep model data + +# tar_target( +# stable_data_release, + +# tar_target( +# fire_dates_to_parquet_release, +# process_release_dynamic_data_to_parquet(temp_directory = "data/temp/processed_data/ndvi_relative_time_since_fire/", +# input_tag = "processed_ndvi_relative_days_since_fire", +# output_tag = "current", +# variable_name = "time_since_fire", +# sleep_time = 30, +# ... = ndvi_relative_days_since_fire_release) +# ), + +# tar_target( +# most_recent_fire_dates_to_parquet_release, +# process_release_dynamic_data_to_parquet(temp_directory = "data/temp/processed_data/most_recent_burn_dates/", +# input_tag = "processed_most_recent_burn_dates", +# output_tag = "current", +# variable_name = "most_recent_burn_dates", +# sleep_time = 30, +# ... = burn_date_to_last_burned_date_release) +# ) + + ##################### GitHub Release Uploads ######################### + + # Upload static data files (domain, elevation, climate, etc.) + # tar_target( + # upload_static_data, + # { + # upload_to_github_release( + # files = c( + # domain_boundary.parquet, + # elevation, + # climate_chelsa, + # vegmap_nc + # ), + # repo = "AdamWilsonLab/emma_envdata", + # release_tag = "static_current", + # release_name = "Static Data - Current", + # verbose = TRUE + # ) + # }, + # deployment = "main" + # ), + + # Upload dynamic MODIS VI data files + tar_target( + upload_modis_vi_data, + { + + # Get all parquet files from disk + parquet_files <- list.files( + "data/target_outputs/modis_vi", + pattern = "\\.parquet$", + full.names = TRUE + ) + + upload_to_github_release( + files = parquet_files, + repo = gh_repo_config$repo, + release_tag = "dynamic_modis_vi", + release_name = "Dynamic MODIS Vegetation Index", + verbose = TRUE, + modis_vi_parquet #include to force dependency on the parquet files being created before upload + ) + }, + deployment = "main" + ), - tar_age( - remove_ee_backup, - clean_up(), - #age = as.difftime(7, units = "days") - age = as.difftime(0, units = "hours") + # Upload STAC metadata catalog + tar_target( + upload_stac_catalog, + { + # Ensure STAC targets are complete before proceeding + stac_parent <- emma_stac_catalog + stac_modis_items <- modis_vi_stac + + stac_files <- c( + file.path("data/stac", "catalog.json"), + list.files("data/stac/modis_vi", pattern = "\\.json$", full.names = TRUE) + ) + + upload_to_github_release( + files = stac_files, + repo = gh_repo_config$repo, + release_tag = "stac", + release_name = "STAC Catalog - Current", + verbose = TRUE + ) + }, + deployment = "main" ) - ) - - - - -################################################################################ diff --git a/_targets/.gitignore b/_targets/.gitignore index a8c51cda..23ab7917 100644 --- a/_targets/.gitignore +++ b/_targets/.gitignore @@ -1,3 +1,9 @@ +# CAUTION: do not edit this file by hand! +# _targets/objects/ may have large data files, +# and _targets/meta/process may have sensitive information. +# It is good pratice to either commit nothing from _targets/, +# or if your data is not too sensitive, +# commit only _targets/meta/meta. * !.gitignore !meta diff --git a/_targets/meta/meta b/_targets/meta/meta new file mode 100644 index 00000000..aad44afd --- /dev/null +++ b/_targets/meta/meta @@ -0,0 +1,38 @@ +name|type|data|command|depend|seed|path|time|size|bytes|format|repository|iteration|parent|children|seconds|warnings|error +modis_vi_to_download|stem|c639e19bb42857e0|92e00a234ba7236a|a96d110c8e3f76f4|775029312||t20511.6129038579s|s178b|178|rds|local|vector||modis_vi_to_download_995445d06381534e|0.008|| +remnants_shp|stem|d03b72197917a3dc|4adc3961bf1f92a3|2c530c1562a7fbd1|977857804|data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp|t20445.6915274758s|s726393404b|726393404|file|local|vector|||0|| +vegmap_shp|stem|9cade294bcf5aff4|66bbc84b2758a527|2c530c1562a7fbd1|-979952299|data/manual_download/NVM2024/shapefile/NVM2024Final_IEM5_12_07012025.shp|t20465.9081331559s|s499322168b|499322168|file|local|vector|||0.006|| +country.parquet|stem|2f020da9d9337cd7|81ddbcfc163d4096|2c530c1562a7fbd1|1129261391|data/target_outputs/country.parquet|t20511.6130437355s|s4488713b|4488713|file|local|vector|||11.321|| +emma_stac_catalog|stem|d1d60756752f5367|b48d3e3359ec0799|2c530c1562a7fbd1|400305184|data/stac/catalog.json|t20511.6158712733s|s868b|868|file|local|vector|||0.008|| +capenature_fires_shp|stem|13d0029b14d0e2de|cb2c5823b318874b|2c530c1562a7fbd1|-1931602475|data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp|t19949.7370138889s|s15173392b|15173392|file|local|vector|||0.001|| +domain.parquet|stem|c46b7f544a0c0629|b81897df57a5dbef|f6a11d3d418e76d8|522092063|data/raw/domain.parquet|t20511.616036936s|s2564266b|2564266|file|local|vector|||14.121|This is an initial implementation of Parquet/Feather file support and geo metadata. This is tracking version 0.1.0 of the metadata (https://github.com/geopandas/geo-arrow-spec). This metadata specification may change and does not yet make stability promises. We do not yet recommend using this in a production setting unless you are able to rewrite your Parquet/Feather files.| +domain_bbox.parquet|stem|25cd0fd1894c1176|8ef5b89424c2d345|9c999260891eaabc|1651755667|data/target_outputs/domain_bbox.parquet|t20511.6254390934s|s15057b|15057|file|local|vector|||0.025|This is an initial implementation of Parquet/Feather file support and geo metadata. This is tracking version 0.1.0 of the metadata (https://github.com/geopandas/geo-arrow-spec). This metadata specification may change and does not yet make stability promises. We do not yet recommend using this in a production setting unless you are able to rewrite your Parquet/Feather files.| +modis_vi_netcdf|pattern|8d29f41e12b3a094|ed27e16bdccf6054||-764661159||||5462392|file|local|vector||modis_vi_netcdf_894e9f5957fbfb12|0|| +modis_vi_parquet|pattern|a605346000427f94|d4bd92bf6265c44c||-266669619||||6800341|file|local|vector||modis_vi_parquet_70688497b90c650e|42.263|| +domain_boundary.parquet|stem|c46b7f544a0c0629|b81897df57a5dbef|f6a11d3d418e76d8|399009199|data/raw/domain_boundary.parquet|t20511.6392432368s|s2564266b|2564266|file|local|vector|||14.106|This is an initial implementation of Parquet/Feather file support and geo metadata. This is tracking version 0.1.0 of the metadata (https://github.com/geopandas/geo-arrow-spec). This metadata specification may change and does not yet make stability promises. We do not yet recommend using this in a production setting unless you are able to rewrite your Parquet/Feather files.| +modis_vi_task_ids_b1c365f5dff1a632|branch|687af2168a0d2e07|43340e81c4f32ef4|e5b43c8dcc4ca607|872828479||t20511.6392802057s|s89b|89|rds|local|vector|modis_vi_task_ids||3.08|| +modis_vi_task_ids|pattern|a672dec49d64ca1c|43340e81c4f32ef4||593130349||||89|rds|local|vector||modis_vi_task_ids_b1c365f5dff1a632|3.08|| +elevation_task_id|stem|bbf44597b9b8b642|f9bd270f9407f46a|e5b43c8dcc4ca607|1108492909||t20511.6393319318s|s87b|87|rds|local|vector|||4.329|| +domain_nc|stem|f4a72cf2ce8f9389|263ac436e41580e5|ac33cc46697840b1|191087344|data/target_outputs/domain.nc|t20511.6411944969s|s2292195b|2292195|file|local|vector|||160.794|attribute variables are assumed to be spatially constant throughout all geometries. NAs introduced by coercion to integer range. NAs introduced by coercion to integer range| +modis_vi_netcdf_894e9f5957fbfb12|branch|61c838c6b1f9a5d2|ed27e16bdccf6054|f8d95ae6d5ca6228|-725027365|data/temp/raw_data/modis_vi_netcdf/|t20510.8522571188s|s5462392b|5462392|file|local|vector|modis_vi_netcdf||0.001|| +elevation|stem|99c75232029964be|dc3d519915a0e914|8af3afb7ef711469|223776802|data/target_outputs/elevation_nasadem.nc|t20511.6490582214s|s3257558b|3257558|file|local|vector|||25.126|| +vegmap_nc|stem|2528441099f91ef7|ff356bc5e06835c0|347faa175c3afcea|573083685|data/target_outputs/vegmap.nc|t20511.652485635s|s537402b|537402|file|local|vector|||108.018|attribute variables are assumed to be spatially constant throughout all geometries| +domain_geoparquet|stem|45c57037de90eda1|fc79eb843faac3e9|ca1ef0429e724a28|-1258951668|data/target_outputs/domain.parquet|t20511.653124704s|s9803528b|9803528|file|local|vector|||1.002|This is an initial implementation of Parquet/Feather file support and geo metadata. This is tracking version 0.1.0 of the metadata (https://github.com/geopandas/geo-arrow-spec). This metadata specification may change and does not yet make stability promises. We do not yet recommend using this in a production setting unless you are able to rewrite your Parquet/Feather files.| +release_tag|object|c03465355186ceda||||||||||||||| +existing|object|08d5f59e833de599||||||||||||||| +parquet_to_geotif|function|eadecbbe2fb012c7||||||||||||||| +verbose|object|988c41ba10911dc8||||||||||||||| +repo|object|8533b5ca41d7ca06||||||||||||||| +token|object|d5162055e1a864d2||||||||||||||| +upload_stac_catalog|stem|da959f195c649105|5f46be48ab8be538|a92bbb96ba84e4aa|2024368032||t20511.8058566013s|s104b|104|rds|local|vector|||13.323|Failed to create release: 'stac' already exists!. Matching or more recent version of data/stac/modis_vi/collection.json found on GH, not uploading.. Matching or more recent version of data/stac/modis_vi/modis_vi_202601.json found on GH, not uploading.. Matching or more recent version of data/stac/modis_vi/modis_vi_202602.json found on GH, not uploading.| +climate_chelsa|stem|cb28ff8939a1bcf0|6c9a1482b661fbcb|fcdcb4c5e838eac7|175391582|data/target_outputs//CHELSA_bio01_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio02_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio03_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio04_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio05_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio06_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio07_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio08_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio09_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio10_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio11_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio12_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio13_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio14_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio15_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio16_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio17_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio18_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio19_1981-2010_V.2.1.nc|t20511.8447175439s|s6813490b|6813490|file|local|vector|||588.198|| +modis_vi_parquet_70688497b90c650e|branch|b940f3b0d1e49d80|31a4ebcbe30ed2e5|c7aec36a60ec43ee|2111712832|data/target_outputs/modis_vi//dynamic_modis_vi_202602.gz.parquet|t20511.8451693136s|s6800341b|6800341|file|local|vector|modis_vi_parquet||38.902|| +modis_vi_stac|stem|b7fee518fb5439c2|3b0d676f7989d3ed|f2856d8e2c6e29c9|-118413829|data/stac/modis_vi/collection.json|t20511.8451706268s|s2240b|2240|file|local|vector|||0.01|| +gh_repo_config|object|148485602b17d22f +sys_info|object|ada53e2071fe586e +modis_start_date|object|f1911cd6006b2c3d +.Random.seed|object|80e117231c868546 +description_packages|object|a18d364edea3f253 +cleanup_mode|object|cc6a331fb3c0077c +modis_end_date|object|ec7a789eac228ba0 +upload_modis_vi_data|stem|44fd56b943ee89f6|69cf2b2ea9f8a205|43a5f4c7de3c6a13|925520158||t20511.84678456s|s46b|46|rds|local|vector|||14.141|Failed to create release: 'dynamic_modis_vi' already exists!| diff --git a/ccr_startup.sh b/ccr_startup.sh new file mode 100644 index 00000000..840233c0 --- /dev/null +++ b/ccr_startup.sh @@ -0,0 +1,28 @@ +#! /bin/bash + +# Connect to CCR and request an interactive job + +ssh vortex.ccr.buffalo.edu +salloc --cluster=faculty --qos=adamw --partition=adamw \ + --job-name=InteractiveJob --nodes=1 --ntasks=4 \ + --mem=10G -C INTEL --time=24:00:00 + +export GROUP="adamw" +export PROJECT_FOLDER="/projects/academic/"$GROUP +export APPTAINER_CACHEDIR="/vscratch/grp-adamw/"$USER"/singularity" +export SIF_PATH=$PROJECT_FOLDER"/users/"$USER"/singularity" +export SIF_FILE="AdamWilsonLab-emma_docker-latest.sif" + + +apptainer run \ + --bind $PROJECT_FOLDER:$PROJECT_FOLDER \ + --bind $APPTAINER_CACHEDIR/tmp:/tmp \ + --bind $APPTAINER_CACHEDIR/run:/run \ + $SIF_PATH/$SIF_FILE R + + + +# Test github actions locally +act -j targets \ + --platform ubuntu-latest=adamwilsonlab/emma:latest \ + --container-architecture linux/amd64 \ No newline at end of file diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.dbf b/data/manual_download/All_Fires/All_Fires_20_21_gw.dbf deleted file mode 100644 index 712fa7ae..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6b6256fd8c9c3b9943579d919ac4d2605a4a7c5b66ec19e5c590d28017fb6df -size 4455696 diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.lyr b/data/manual_download/All_Fires/All_Fires_20_21_gw.lyr deleted file mode 100644 index 91c7cbad..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.lyr and /dev/null differ diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.pdf b/data/manual_download/All_Fires/All_Fires_20_21_gw.pdf deleted file mode 100644 index ecda38f4..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.pdf and /dev/null differ diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.prj b/data/manual_download/All_Fires/All_Fires_20_21_gw.prj deleted file mode 100644 index a30c00a5..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.prj +++ /dev/null @@ -1 +0,0 @@ -GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.qml b/data/manual_download/All_Fires/All_Fires_20_21_gw.qml deleted file mode 100644 index a784974e..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.qml +++ /dev/null @@ -1,577 +0,0 @@ - - - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - generatedlayout - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RES_NAME - - 2 - diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.qpj b/data/manual_download/All_Fires/All_Fires_20_21_gw.qpj deleted file mode 100644 index 5fbc831e..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.qpj +++ /dev/null @@ -1 +0,0 @@ -GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]] diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.sbn b/data/manual_download/All_Fires/All_Fires_20_21_gw.sbn deleted file mode 100644 index fb296b86..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.sbn and /dev/null differ diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.sbx b/data/manual_download/All_Fires/All_Fires_20_21_gw.sbx deleted file mode 100644 index 15303df9..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.sbx and /dev/null differ diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.shp b/data/manual_download/All_Fires/All_Fires_20_21_gw.shp deleted file mode 100644 index e729e422..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acafbdd28da2f5329a16bfa4bc69e7c77baad88f9cc43dbc1a925672e230b8e5 -size 14277344 diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.shx b/data/manual_download/All_Fires/All_Fires_20_21_gw.shx deleted file mode 100644 index 9d0c67a7..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.shx and /dev/null differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.cpg b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.cpg new file mode 100644 index 00000000..3ad133c0 --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.cpg @@ -0,0 +1 @@ +UTF-8 \ No newline at end of file diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.dbf b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.dbf new file mode 100644 index 00000000..4a2ce1e6 --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.dbf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a0a89f91aea8c4c393f11a356ecbb87a7eb0b6c379a395fd4fdb8f9b11e343d +size 3752962 diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.lyr b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.lyr new file mode 100644 index 00000000..f4ba38cf Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.lyr differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.pdf b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.pdf new file mode 100644 index 00000000..2024f82b Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.pdf differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.prj b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.prj new file mode 100644 index 00000000..f45cbadf --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.qml b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.qml new file mode 100644 index 00000000..8026a13c --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.qml @@ -0,0 +1,972 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "RES_NAME" + + 2 + diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbn b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbn new file mode 100644 index 00000000..bc393860 Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbn differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbx b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbx new file mode 100644 index 00000000..c98d69a1 Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbx differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp new file mode 100644 index 00000000..3c62efb3 --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c9d77abce418d99fe169e64914d7779dc3d5db38c221a0396166ab46515c53c +size 15173392 diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp.xml b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp.xml new file mode 100644 index 00000000..02e803eb --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp.xml @@ -0,0 +1,2 @@ + +20240726134913001.0FALSECalculateField All_Fires_23_24_merge_fields1 AREA [Area_ha] VB #CalculateField All_Fires_23_24_merge_fields Area_ha [AREA] VB #CalculateField All_Fires_23_24_merge_fields RES_CODE Left( [FIRE_CODE],4 ) VB #CalculateField All_Fires_23_24_merge_fields yr_temp Mid( [FIRE_CODE],9,4 ) VB #CalculateField All_Fires_23_24_merge_fields mnth_temp Mid( [FIRE_CODE],6,2 ) VB #CalculateField All_Fires_23_24_merge_fields MONTH [mnth_temp] VB #CalculateField All_Fires_23_24_merge_fields YEAR [yr_temp] VB #CalculateField All_Fires_23_24_merge_fields Yr_mnth "[yr_temp] +"-" + [mnth_temp]" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Witzenberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Boland Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Kogelberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Garden Route Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Karoo Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Anysberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Overberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Langeberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "De Hoop Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Peninsula Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Ceder-Berg Landscape Unit" VB #Sort All_Fires_23_24_merge_fields D:\1_GIS_work\9_00_CNC2024_1161_Fires\1_FINAL\All_fires_23_24_gw.shp "YEAR ASCENDING" URRepairGeometry All_fires_23_24_gw DELETE_NULLRepairGeometry All_fires_23_24_gw DELETE_NULLCalculateField All_fires_23_24_gw FIRE_CODE "DEHP/02/1992/01" VB #CalculateField All_fires_23_24_gw LOCAL_DESC "Witklip Infanta" VB #CalculateField All_fires_23_24_gw LOCAL_DESC "Buffelsfontein" VB #CalculateField All_fires_23_24_gw FIRE_CODE "DEHP/02/1992/02" VB #All_fires_23_24_gw0020.000file://\\CAPWKSLAP165\D$\1_GIS_work\9_00_CNC2024_1161_Fires\1_FINAL\All_fires_23_24_gw.shpLocal Area NetworkGeographicGCS_WGS_1984Angular Unit: Degree (0.017453)<GeographicCoordinateSystem xsi:type='typens:GeographicCoordinateSystem' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://www.esri.com/schemas/ArcGIS/10.8'><WKT>GEOGCS[&quot;GCS_WGS_1984&quot;,DATUM[&quot;D_WGS_1984&quot;,SPHEROID[&quot;WGS_1984&quot;,6378137.0,298.257223563]],PRIMEM[&quot;Greenwich&quot;,0.0],UNIT[&quot;Degree&quot;,0.0174532925199433],AUTHORITY[&quot;EPSG&quot;,4326]]</WKT><XOrigin>-400</XOrigin><YOrigin>-400</YOrigin><XYScale>11258999068426.238</XYScale><ZOrigin>-100000</ZOrigin><ZScale>10000</ZScale><MOrigin>-100000</MOrigin><MScale>10000</MScale><XYTolerance>8.983152841195215e-09</XYTolerance><ZTolerance>0.001</ZTolerance><MTolerance>0.001</MTolerance><HighPrecision>true</HighPrecision><LeftLongitude>-180</LeftLongitude><WKID>4326</WKID><LatestWKID>4326</LatestWKID></GeographicCoordinateSystem>20240805112217002024080511221700 Version 6.2 (Build 9200) ; Esri ArcGIS 10.8.1.14362All_fires_23_24_gwShapefile0.000datasetEPSG6.14(3.0.1)0SimpleFALSE0FALSEFALSEAll_fires_23_24_gwFeature Class0FIDFIDOID400Internal feature number.EsriSequential unique whole numbers that are automatically generated.ShapeShapeGeometry000Feature geometry.EsriCoordinates defining the features.IDIDDouble16160FIRE_CODEFIRE_CODEString1600FILE_NAMEFILE_NAMEString1600FIREWEBFIREWEBString1600RES_CODERES_CODEString500LAND_UNITLAND_UNITString5000MONTHMONTHInteger550YEARYEARInteger10100RES_CENTRERES_CENTREString25400RES_NAMERES_NAMEString10000LOCAL_DESCLOCAL_DESCString10000DATE_STARTDATE_STARTString1500DATE_EXTINDATE_EXTINString1500DATE_WITHDDATE_WITHDString1500REPORT_OFFREPORT_OFFString7500POLIC_CASEPOLIC_CASEString5000IGNITIONCAIGNITIONCAString5000Yr_mnthYr_mnthString1000Area_haArea_haDouble1900RESCODE_LURESCODE_LUString100020240805 diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shx b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shx new file mode 100644 index 00000000..6b52ca09 Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shx differ diff --git a/data/manual_download/README.md b/data/manual_download/README.md new file mode 100644 index 00000000..32b307d4 --- /dev/null +++ b/data/manual_download/README.md @@ -0,0 +1,3 @@ +# Raw Data + +This folder contains files that cannot be programmatically downloaded (such as those from BGIS) diff --git a/decrypt_secret.sh b/decrypt_secret.sh new file mode 100644 index 00000000..81deface --- /dev/null +++ b/decrypt_secret.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +# Decrypt the file + +mkdir -p $HOME/.config/earthengine/ndef/ + +# --batch to prevent interactive command +# --yes to assume "yes" for questions + +gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ +--output $HOME/.config/earthengine/ndef/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com $HOME/emma_envdata/scratch_code/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com.gpg + +gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ +--output $HOME/.config/earthengine/ndef/credentials $HOME/emma_envdata/scratch_code/credentials.gpg diff --git a/docs/APPEEARS_SETUP.md b/docs/APPEEARS_SETUP.md new file mode 100644 index 00000000..74abefde --- /dev/null +++ b/docs/APPEEARS_SETUP.md @@ -0,0 +1,110 @@ +# AppEEARS Setup Guide + +This project now uses NASA AppEEARS instead of Google Earth Engine for satellite data access. + +## Prerequisites + +1. **NASA EarthData Account**: Register at https://urs.earthdata.nasa.gov/ +2. **AppEEARS Access**: Approve AppEEARS application at https://appeears.earthdatacloud.nasa.gov/ + +## Local Setup + +Set environment variables in your `.Renviron` file: + +```r +# Edit .Renviron +usethis::edit_r_environ() + +# Add these lines: +EARTHDATA_USER=your_username +EARTHDATA_PASSWORD=your_password +``` + +Restart R session for changes to take effect. + +## GitHub Actions Setup + +Add secrets to your repository: + +1. Go to repository Settings → Secrets and variables → Actions +2. Add two secrets: + - `EARTHDATA_USER`: Your NASA EarthData username + - `EARTHDATA_PASSWORD`: Your NASA EarthData password + +## Verify Setup + +Test authentication in R: + +```r +library(appeears) +rs_login( + user = Sys.getenv("EARTHDATA_USER"), + password = Sys.getenv("EARTHDATA_PASSWORD") +) + +# List available products +rs_products() +``` + +## Migration Notes + +### Changes from rgee to AppEEARS + +- **Authentication**: Simple username/password instead of service account JSON +- **Output format**: Monthly NetCDF files instead of individual GeoTIFFs +- **Storage efficiency**: ~20% reduction in file sizes +- **Simpler CI/CD**: No Python/conda dependencies required + +### Product Mapping + +| Current (rgee) | AppEEARS Product | Status | +|----------------|------------------|--------| +| MODIS Fire (MCD64A1) | MCD64A1.061 | ✅ Migrated | +| MODIS NDVI (MOD13A1) | MOD13A1.061 | ✅ Migrated | +| VIIRS NDVI | VNP13A1.001 | 🔄 Pending | +| KNDVI | Calculate from reflectances | 🔄 Pending | +| CHELSA Climate | Direct download (unchanged) | ✅ No change | +| NASADEM | NASADEM.001 | 🔄 Pending | + +### Release Tags + +NetCDF outputs use new tag names to distinguish from GeoTIFF: + +- `raw_fire_modis_nc` - Raw fire monthly NetCDF +- `raw_ndvi_modis_nc` - Raw NDVI monthly NetCDF +- etc. + +### File Naming Convention + +Monthly NetCDF files follow the pattern: `{product}_{collection}_{YYYY-MM}.nc` + +Examples: +- `fire_MCD64A1_2025-12.nc` +- `ndvi_MOD13A1_2025-12.nc` + +## Troubleshooting + +### Authentication Errors + +If you see "EARTHDATA credentials not found": +1. Check environment variables are set: `Sys.getenv("EARTHDATA_USER")` +2. Restart R session after setting `.Renviron` +3. Verify credentials at https://urs.earthdata.nasa.gov/ + +### AppEEARS Task Failures + +Check task status: +```r +appeears::rs_status(task_id = "your_task_id") +``` + +Common issues: +- Date range too large (split into smaller requests) +- Invalid area of interest (ensure valid WGS84 coordinates) +- Service temporarily unavailable (retry after delay) + +## Resources + +- [AppEEARS Documentation](https://appeears.earthdatacloud.nasa.gov/help) +- [appeears R package](https://docs.ropensci.org/appeears/) +- [NASA EarthData](https://earthdata.nasa.gov/) diff --git a/emma-targets.Rproj b/emma-targets.Rproj index aad884da..699e3ae1 100644 --- a/emma-targets.Rproj +++ b/emma-targets.Rproj @@ -1,4 +1,5 @@ Version: 1.0 +ProjectId: d3bc4aff-88e6-458a-b2fc-6bc8e9e06f1c RestoreWorkspace: No SaveWorkspace: No diff --git a/emma_envdata.code-workspace b/emma_envdata.code-workspace new file mode 100644 index 00000000..876a1499 --- /dev/null +++ b/emma_envdata.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/img/network.png b/img/network.png new file mode 100644 index 00000000..a74d2d3f Binary files /dev/null and b/img/network.png differ diff --git a/R/clean_up.R b/old/clean_up.R similarity index 100% rename from R/clean_up.R rename to old/clean_up.R diff --git a/R/domain_remnants.R b/old/domain_remnants.R similarity index 100% rename from R/domain_remnants.R rename to old/domain_remnants.R diff --git a/R/domain_remnants_release.R b/old/domain_remnants_release.R similarity index 100% rename from R/domain_remnants_release.R rename to old/domain_remnants_release.R diff --git a/R/get_domain.R b/old/get_domain.R similarity index 100% rename from R/get_domain.R rename to old/get_domain.R diff --git a/old/get_modis_vi.R b/old/get_modis_vi.R new file mode 100644 index 00000000..220598ec --- /dev/null +++ b/old/get_modis_vi.R @@ -0,0 +1,624 @@ + +#' @title Submit monthly MODIS VI request via AppEEARS +#' @description Submits an AppEEARS area request for MOD13A1.061 and MYD13A1.061 +#' EVI, and QA (500m resolution, 16-day composite) for a monthly period. +#' @author EMMA Team +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param month_start Start date for the month (YYYY-MM-DD) +#' @param month_end End date for the month (YYYY-MM-DD) +#' @param verbose Logical for progress messages +#' @return Character string with AppEEARS task ID +#' @export +submit_modis_vi <- function( + domain_vector, + month_start, + month_end, + verbose = TRUE +) { + + # Convert domain vector to sf, fix geometry, simplify, merge, and reproject to WGS84 + domain_sf <- st_as_sf(domain_vector) %>% + st_simplify(dTolerance = 100, preserveTopology = TRUE) %>% + st_buffer(0) %>% + st_make_valid() %>% + st_transform(crs = 4326) %>% + geojsonsf::sf_geojson(simplify = FALSE) %>% + jsonlite::fromJSON() + + # Validate dates + month_start <- as.Date(month_start) + month_end <- as.Date(month_end) + + if (verbose) { + message("AppEEARS MODIS VI monthly request: ", format(month_start, "%Y-%m-%d"), + " to ", format(month_end, "%Y-%m-%d")) + } + + # Resolve layer names dynamically (same as full-range version) + evi_layer <- "_500m_16_days_EVI" + qa_layer <- "_500m_16_days_VI_Quality" + date_layer <- "_500m_16_days_composite_day_of_the_year" + + try({ + lyr <- appeears::rs_layers("MOD13A1.061") + cand_cols <- intersect(c("Layer", "Name", "layer", "name"), names(lyr)) + if (length(cand_cols)) { + vals <- unlist(lapply(cand_cols, function(cc) lyr[[cc]])) + evi_cand <- vals[grepl("EVI", vals, ignore.case = TRUE)][1] + qa_cand <- vals[grepl("VI.*Quality|Quality", vals, ignore.case = TRUE)][1] + date_cand <- vals[grepl("composite_day_of_the_year", vals, ignore.case = TRUE)][1] + if (!is.na(evi_cand)) evi_layer <- evi_cand + if (!is.na(qa_cand)) qa_layer <- qa_cand + if (!is.na(date_cand)) date_layer <- date_cand + } + }, silent = TRUE) + + if (verbose) message("Using layers: ", evi_layer, ", ", qa_layer, ", ", date_layer) + + # Build request payload for monthly period + req <- list( + task_type = "area", + task_name = paste0("MODIS_VI_", format(month_start, "%Y%m"), "_", format(Sys.time(), "%H%M%S")), + params = list( + dates = list(list( + startDate = format(month_start, "%m-%d-%Y"), + endDate = format(month_end, "%m-%d-%Y") + )), + layers = list( + # MOD13A1.061 (Terra) + list(product = "MOD13A1.061", layer = evi_layer), + list(product = "MOD13A1.061", layer = qa_layer), + list(product = "MOD13A1.061", layer = date_layer), + # MYD13A1.061 (Aqua) + list(product = "MYD13A1.061", layer = evi_layer), + list(product = "MYD13A1.061", layer = qa_layer), + list(product = "MYD13A1.061", layer = date_layer) + ), + output = list( + format = list(type = "netcdf4"), + projection = "native" + ), + geo = domain_sf + ) + ) + + # Submit task + if (verbose) message("Submitting AppEEARS MODIS VI monthly task...") + task <- appeears::rs_request( + request = req, + user = Sys.getenv("EARTHDATA_USER"), + transfer = FALSE, + verbose = verbose + ) + + task_id <- task$get_task_id() + if (verbose) message("Task submitted with ID: ", task_id) + + task_id +} + + +#' @title Download and process MODIS VI for a monthly period +#' @description Polls for completion of AppEEARS task and downloads results, +#' then processes into a NetCDF file with EVI and QA variables for that monthly period. +#' @author EMMA Team +#' @param task_id Character string with AppEEARS task ID +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param domain_raster A SpatRaster (domain.tif) defining the output grid and mask +#' @param month_start Start date for monthly period (YYYY-MM-DD) +#' @param out_dir Output directory for monthly NetCDF files +#' @param temp_directory Temporary working directory for downloads +#' @param verbose Logical for progress messages +#' @return Character path to output NetCDF file (format: modis_vi_YYYYMM_monthly.nc) +#' @details +#' Implements AppEEARS polling with timeout protection and QA masking. +#' Output is a single month of data; multiple outputs are aggregated separately. +#' @export +download_modis_vi <- function( + task_id, + domain_vector, + domain_raster, + month_start, + out_dir = "data/target_outputs/modis_vi", + temp_directory = "data/temp/raw_data/modis_vi_month/", + cleanup = TRUE, + verbose = TRUE +) { + + terra_tmp <- file.path(getwd(), "data/temp/terra") + month_start <- as.Date(month_start) + # Convert to YYYYMM format used in filenames + yyyymm <- format(month_start, "%Y%m") + file_name <- sprintf("modis_vi_%s_monthly.nc", yyyymm) + + # Clean and create temp directory + unlink(temp_directory, recursive = TRUE, force = TRUE) + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + + # Clean terra temp + unlink(terra_tmp, recursive = TRUE, force = TRUE) + dir.create(terra_tmp, recursive = TRUE, showWarnings = FALSE) + terraOptions(tempdir = terra_tmp, memfrac = 0.8) + + # Poll for task completion + if (verbose) message("Polling task ", task_id, " for completion...") + + max_retries <- 120 # 2 hours at 60s intervals + retry_count <- 0 + task_status <- "pending" + + repeat { + retry_count <- retry_count + 1 + + # Check task status + task_info <- appeears::rs_list_task(task_id = task_id, user = Sys.getenv("EARTHDATA_USER")) + task_status <- task_info$status + + if (task_status == "done") { + if (verbose) message("Task completed successfully") + break + } + + if (task_status %in% c("failed", "error")) { + stop("AppEEARS task ", task_id, " failed with status: ", task_status) + } + + if (retry_count >= max_retries) { + stop("Task ", task_id, " polling timed out after ", max_retries, " minutes") + } + + if (verbose && retry_count %% 10 == 0) { + message("Task status: ", task_status, " (", retry_count, "/", max_retries, ")") + } + + Sys.sleep(60) + } + + # Download results + if (verbose) message("Downloading files for task: ", task_id) + appeears::rs_transfer( + task_id = task_id, + user = Sys.getenv("EARTHDATA_USER"), + path = temp_directory, + verbose = verbose + ) + + # Load the NetCDF files + nc_paths <- list.files(temp_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) + if (length(nc_paths) == 0) { + # No data available for this month (common for edge cases, polar regions, etc.) + if (verbose) message("No NetCDF files returned from AppEEARS for month ", file_name, " - writing skip marker") + + # Create a lightweight skip marker file instead of fake data + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + skip_file <- file.path(out_dir, paste0("modis_vi_", yyyymm, "_monthly.skip")) + + writeLines( + c( + paste("Month:", yyyymm), + paste("Task ID:", task_id), + paste("Reason: No NetCDF files returned from AppEEARS"), + paste("Note: Possible causes - polar region, cloud cover, instrument malfunction, or outside data availability period"), + paste("Timestamp:", Sys.time()) + ), + skip_file + ) + + if (verbose) message("Created skip marker: ", skip_file) + + # Cleanup + if(cleanup) { + unlink(temp_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + } + + return(skip_file) + } + + if (verbose) message("Reading ", length(nc_paths), " NetCDF files from AppEEARS") + + +# Vargas et al.,15 pixels with any of the following QA flags were removed: +# not confidently clear, adjacent to cloud, cloud shadow, snow or ice, thin cirrus cloud, +# high aerosol loading, solar zenith angle >65 deg, and not over land. + + # Apply QA mask to VI layers + qa_lookup <- list.files( + temp_directory, + pattern = "(VI-Quality-lookup).*\\.csv$", + full.names = TRUE, + recursive = TRUE + ) + if (!length(qa_lookup)) { + stop("QA lookup table (VI_Quality*.csv) not found in temp_directory; cannot mask VI data") + } + + extract_keep <- function(path) { + tab <- tryCatch(read.csv(path, stringsAsFactors = FALSE), error = function(e) NULL) + if (is.null(tab)) return(NULL) + + # Find required columns (case-insensitive) + value_col <- names(tab)[grepl("^value$", tolower(names(tab)))][1] + modland_col <- names(tab)[grepl("modland", tolower(names(tab)))][1] + adj_cloud_col <- names(tab)[grepl("adjacent.*cloud", tolower(names(tab)))][1] + snow_col <- names(tab)[grepl("possible.*snow|snow.*ice", tolower(names(tab)))][1] + shadow_col <- names(tab)[grepl("possible.*shadow", tolower(names(tab)))][1] + land_col <- names(tab)[grepl("land/water|land.*water", tolower(names(tab)))][1] + aerosol_col <- names(tab)[grepl("aerosol", tolower(names(tab)))][1] + + # Check all required columns are present + required_cols <- c(value_col, modland_col, adj_cloud_col, snow_col, shadow_col, land_col, aerosol_col) + if (any(is.na(required_cols))) { + warning("QA lookup missing required columns. Found: value=", !is.na(value_col), + ", modland=", !is.na(modland_col), ", adj_cloud=", !is.na(adj_cloud_col), + ", snow=", !is.na(snow_col), ", shadow=", !is.na(shadow_col), + ", land=", !is.na(land_col), ", aerosol=", !is.na(aerosol_col)) + return(NULL) + } + + # Filter for pixels that meet ALL QA criteria: + # 1. VI produced with good quality OR VI produced but check other QA (conservative approach) + # 2. No adjacent cloud detected + # 3. No cloud shadow (possible shadow = No) + # 4. No snow/ice (possible snow/ice = No) + # 5. Over land (not ocean or water) + # 6. Not high aerosol loading + keep <- (grepl("vi produced", tolower(tab[[modland_col]]))) & + (grepl("^no$", tolower(tab[[adj_cloud_col]]))) & + (grepl("^no$", tolower(tab[[shadow_col]]))) & + (grepl("^no$", tolower(tab[[snow_col]]))) & + (grepl("land", tolower(tab[[land_col]]))) & + (!grepl("high", tolower(tab[[aerosol_col]]))) + + tab[[value_col]][keep & !is.na(tab[[value_col]])] + } + + keep_values <- unique(unlist(lapply(qa_lookup, extract_keep))) + if (!length(keep_values)) { + stop("No 'good quality' entries found in any QA table; refusing to proceed") + } + + mask_vi_with_qa <- function(stack, domain_template, product_name = "terra") { + evi_idx <- which(grepl("EVI", names(stack), ignore.case = TRUE))[1] # Take first EVI layer + qa_idx <- which(grepl("Quality", names(stack), ignore.case = TRUE))[1] # Take first QA layer + date_idx <- which(grepl("composite_day_of_the_year", names(stack), ignore.case = TRUE))[1] # Take first date layer + + if (is.na(evi_idx) || is.na(qa_idx) || is.na(date_idx)) { + message("Skipping file: missing EVI (", !is.na(evi_idx), "), QA (", !is.na(qa_idx), "), or date (", !is.na(date_idx), ") layer") + return(NULL) + } + + qa_r <- stack[[qa_idx]] + keep_mask <- terra::app(qa_r, function(x) x %in% keep_values) + + # Mask, project, and scale EVI + evi <- terra::mask(stack[[evi_idx]], keep_mask, maskvalue = FALSE) |> + terra::project(domain_template, method = "average") |> + terra::app(function(x) x * 100) + + # Mask and project date (composite day of year) + date <- terra::mask(stack[[date_idx]], keep_mask, maskvalue = FALSE) |> + terra::project(domain_template, method = "mode") + + # Name variables with product suffix + names(evi) <- paste0("evi_", product_name) + names(date) <- paste0("date_", product_name) + + c(date, evi) # Return: date layer first, then EVI + } + + # Project to domain grid + domain_template <- if (is.character(domain_raster)) terra::rast(domain_raster) else domain_raster + + # Process all files, detecting product from file metadata and extracting time info + # AppEEARS downloads files grouped by product (MOD13A1 files, then MYD13A1 files) + all_layers <- list() + all_times <- numeric() # Store time values (days since epoch) + file_counter <- 0 + + for (nc_path in nc_paths) { + file_counter <- file_counter + 1 + rast_obj <- terra::rast(nc_path) + + # Detect product and extract time dimension + product_name <- "terra" + nc_times <- NULL + + tryCatch({ + nc <- ncdf4::nc_open(nc_path) + # Check global attributes for product name + global_attrs <- names(ncdf4::ncatt_get(nc, 0)) + + for (attr_name in global_attrs) { + attr_val <- ncdf4::ncatt_get(nc, 0, attr_name)$value + if (!is.null(attr_val) && is.character(attr_val)) { + if (grepl("MYD13", attr_val, ignore.case = TRUE)) { + product_name <- "aqua" + break + } else if (grepl("MOD13", attr_val, ignore.case = TRUE)) { + product_name <- "terra" + break + } + } + } + + # Extract time values from NetCDF + if ("time" %in% names(nc$dim)) { + nc_times <- ncdf4::ncvar_get(nc, "time") + if (!is.null(nc_times) && length(nc_times) > 0) { + all_times <- c(all_times, nc_times) + } + } + + ncdf4::nc_close(nc) + }, error = function(e) { + # If reading file fails, use file order heuristic + if (file_counter > 1) product_name <<- "aqua" + }) + + masked_layers <- mask_vi_with_qa(rast_obj, domain_template, product_name = product_name) + if (!is.null(masked_layers)) { + all_layers[[length(all_layers) + 1]] <- masked_layers + } + } + + # Combine all layers into single stack + if (length(all_layers) == 0) { + stop("No valid EVI/date layers found after QA masking") + } + + raster_stack <- do.call(c, all_layers) + + # Mask to domain + mask_layer <- if ("domain" %in% names(domain_template)) domain_template[["domain"]] else domain_template + masked_stack <- terra::mask(raster_stack, mask_layer) + + # Add pixel ID layer + if (!"pid" %in% names(domain_template)) { + stop("domain_raster must include a 'pid' layer") + } + pid_raster <- terra::mask(domain_template[["pid"]], mask_layer) + names(pid_raster) <- "pid" + output_stack <- c(masked_stack, pid_raster) + + # Write to NetCDF using ncdf4 to ensure separate variables + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + out_file <- file.path(out_dir, file_name) + unlink(out_file) + + if (verbose) message("Writing NetCDF with daily time dimension and date-based observation placement: ", out_file) + + # Get dimensions and coordinates from output_stack + nrow <- nrow(output_stack) + ncol <- ncol(output_stack) + crs <- terra::crs(output_stack) + + # Get actual x and y coordinates from the raster itself + # These are the coordinates of the cell centers in row/column order + x_coords <- terra::xFromCol(output_stack, col = 1:ncol) + y_coords <- terra::yFromRow(output_stack, row = 1:nrow) + + # Create daily time dimension for entire month + # Calculate the number of days in the month by finding last day of month + year_int <- as.integer(format(month_start, "%Y")) + month_int <- as.integer(format(month_start, "%m")) + if (month_int < 12) { + next_month_first <- as.Date(paste0(year_int, "-", sprintf("%02d", month_int + 1), "-01")) + } else { + next_month_first <- as.Date(paste0(year_int + 1, "-01-01")) + } + last_day_of_month <- next_month_first - 1 + days_in_month <- as.integer(format(last_day_of_month, "%d")) + time_coords <- seq(0, days_in_month - 1, by = 1) + time_units <- paste0("days since ", format(month_start, "%Y-%m-%d")) + + if (verbose) message("Using daily time dimension with ", days_in_month, " days") + + # Note: terra raster y coordinates are top-to-bottom; NetCDF expects bottom-to-top + # We will handle the flip during matrix write, coordinates stay in raster order + + # Create dimensions with actual coordinates (using UDUNITS-compliant units) + x_dim <- ncdf4::ncdim_def("x", "m", vals = x_coords) + y_dim <- ncdf4::ncdim_def("y", "m", vals = y_coords) + time_dim <- ncdf4::ncdim_def("time", time_units, vals = time_coords, unlim = TRUE) + + # Create variables for each unique variable name + var_list <- list() + unique_var_names <- unique(names(output_stack)) + + for (var_name in unique_var_names) { + if (var_name == "pid") { + var_list[[var_name]] <- ncdf4::ncvar_def( + name = var_name, + units = "1", + dim = list(x_dim, y_dim), + missval = NA_real_, + compression = 9 + ) + } else if (var_name %in% c("date_terra", "date_aqua", "evi_terra", "evi_aqua")) { + var_list[[var_name]] <- ncdf4::ncvar_def( + name = var_name, + units = if (grepl("evi", var_name, ignore.case = TRUE)) "1" else "1", + dim = list(time_dim, x_dim, y_dim), + missval = NA_real_, + compression = 9 + ) + } + } + + # Create NetCDF file + nc <- ncdf4::nc_create(out_file, var_list) + + # Function to convert day-of-year to day-of-month for the given month + doy_to_dom <- function(doy, year_val, month_val) { + if (is.na(doy) || !is.finite(doy)) return(NA_integer_) + # Create date from day-of-year + date <- as.Date(paste0(year_val, "-01-01")) + (as.integer(doy) - 1) + # Check if it falls in the target month + if (lubridate::month(date) == month_val) { + return(lubridate::mday(date)) + } else { + return(NA_integer_) + } + } + + # Get indices for date layers + date_terra_idx <- which(names(output_stack) == "date_terra") + date_aqua_idx <- which(names(output_stack) == "date_aqua") + evi_terra_idx <- which(names(output_stack) == "evi_terra") + evi_aqua_idx <- which(names(output_stack) == "evi_aqua") + + # Write each variable's data using date fields for temporal placement + for (var_name in unique_var_names) { + if (var_name == "pid") { + # pid is constant across time + matching_indices <- which(names(output_stack) == var_name) + layer_data <- terra::as.matrix(output_stack[[matching_indices[1]]], wide = TRUE) + layer_data <- layer_data[nrow(layer_data):1, ] + layer_data <- t(layer_data) + ncdf4::ncvar_put(nc, var_name, layer_data) + } else if (var_name %in% c("date_terra", "date_aqua", "evi_terra", "evi_aqua")) { + # Time-varying variables: place observations using date fields + daily_array <- array(NA_real_, dim = c(ncol, nrow, days_in_month)) + + # Determine which date field and observation index to use + if (var_name %in% c("evi_terra", "date_terra")) { + date_idx <- date_terra_idx + obs_idx <- if (var_name == "evi_terra") evi_terra_idx else date_terra_idx + } else { + date_idx <- date_aqua_idx + obs_idx <- if (var_name == "evi_aqua") evi_aqua_idx else date_aqua_idx + } + + # For each observation, place it at the correct daily time slot based on date field + if (length(obs_idx) > 0 && length(date_idx) > 0) { + for (obs_seq in seq_along(obs_idx)) { + if (obs_seq <= length(date_idx)) { + obs_layer <- terra::as.matrix(output_stack[[obs_idx[obs_seq]]], wide = TRUE) + date_layer <- terra::as.matrix(output_stack[[date_idx[obs_seq]]], wide = TRUE) + + # Reverse rows and transpose to match NetCDF order + obs_layer <- obs_layer[nrow(obs_layer):1, ] + obs_layer <- t(obs_layer) + date_layer <- date_layer[nrow(date_layer):1, ] + date_layer <- t(date_layer) + + # Convert day-of-year to day-of-month (vectorized apply to matrix) + dom_matrix <- apply(date_layer, c(1, 2), function(x) { + doy_to_dom(x, lubridate::year(month_start), lubridate::month(month_start)) + }) + + # Place observations at correct day-of-month indices + for (x in 1:ncol) { + for (y in 1:nrow) { + if (!is.na(obs_layer[x, y]) && !is.na(dom_matrix[x, y])) { + dom_val <- as.integer(dom_matrix[x, y]) + if (dom_val >= 1 && dom_val <= days_in_month) { + daily_array[x, y, dom_val] <- obs_layer[x, y] + } + } + } + } + } + } + } + + ncdf4::ncvar_put(nc, var_name, daily_array) + } + } + + # Close file temporarily to add grid_mapping variable properly + ncdf4::nc_close(nc) + + # Reopen file for writing and add grid_mapping variable + nc <- ncdf4::nc_open(out_file, write = TRUE) + + # Add global attributes + ncdf4::ncatt_put(nc, 0, "title", paste0("MODIS Terra/Aqua EVI for month ", yyyymm, " resampled to domain")) + ncdf4::ncatt_put(nc, 0, "source", "MOD13A1.061 (Terra) and MYD13A1.061 (Aqua) via AppEEARS") + ncdf4::ncatt_put(nc, 0, "temporal_resolution", "Daily time dimension; observations placed according to composite day-of-year (16-day composites)") + ncdf4::ncatt_put(nc, 0, "time_structure", "Irregular: each pixel has observations on days corresponding to date_terra and date_aqua values; missing days are NA") + ncdf4::ncatt_put(nc, 0, "spatial_resolution", "500m native, resampled to domain grid") + ncdf4::ncatt_put(nc, 0, "month", yyyymm) + ncdf4::ncatt_put(nc, 0, "history", paste0("created: ", Sys.time())) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + ncdf4::ncatt_put(nc, 0, "note_evi_scaling", "EVI values are scaled by 100 for storage. Divide by 100 to recover original values.") + ncdf4::ncatt_put(nc, 0, "scale_factor_evi", 0.01) + ncdf4::ncatt_put(nc, 0, "qa_filter", "Pixels retained: VI produced with good/checkable quality, adjacent cloud=No, cloud shadow=No, snow/ice=No, over land, aerosol loading not high. Excludes: not confidently clear, adjacent to cloud, cloud shadow, snow or ice, high aerosol loading, not over land. Note: Solar zenith angle >65 deg filter not implemented in current QA table version.") + + # Get CRS information per CF-1.8 grid_mapping specification + crs_str <- as.character(crs) + + if (!is.na(crs)) { + # Get WKT in latest format (OGC WKT 2) + crs_wkt <- terra::crs(output_stack, proj = TRUE) + + if (!is.null(crs_wkt) && nchar(crs_wkt) > 0) { + # Per CF-1.8 Section 5.6.1, store CRS WKT following OGC WKT-CRS standard + # This attribute is recognized by GDAL, QGIS, and other geospatial tools + ncdf4::ncatt_put(nc, 0, "crs_wkt", crs_wkt) + + # Extract and store EPSG code if available (for quick reference and validation) + epsg <- tryCatch(as.numeric(gsub("EPSG:", "", crs_str)), error = function(e) NA) + if (!is.na(epsg)) { + ncdf4::ncatt_put(nc, 0, "crs_epsg", as.integer(epsg)) + } + } + } + + # Add coordinate variable attributes per CF-1.8 + # Coordinate variable attributes per CF-1.8 Section 4.1-4.4 and 5.6 + ncdf4::ncatt_put(nc, "time", "axis", "T") + ncdf4::ncatt_put(nc, "time", "long_name", "Time of composite") + ncdf4::ncatt_put(nc, "time", "standard_name", "time") + + ncdf4::ncatt_put(nc, "x", "axis", "X") + ncdf4::ncatt_put(nc, "x", "long_name", "X coordinate of projection") + ncdf4::ncatt_put(nc, "x", "units", "m") + ncdf4::ncatt_put(nc, "x", "standard_name", "projection_x_coordinate") + + ncdf4::ncatt_put(nc, "y", "axis", "Y") + ncdf4::ncatt_put(nc, "y", "long_name", "Y coordinate of projection") + ncdf4::ncatt_put(nc, "y", "units", "m") + ncdf4::ncatt_put(nc, "y", "standard_name", "projection_y_coordinate") + + # Add metadata to each data variable + for (var_name in unique_var_names) { + if (var_name != "pid") { + ncdf4::ncatt_put(nc, var_name, "coordinates", "time x y") + } + + # Add units and descriptive names per CF-1.8 Section 3.1 and Appendix A + if (grepl("evi", var_name, ignore.case = TRUE)) { + ncdf4::ncatt_put(nc, var_name, "units", "1") # Dimensionless + ncdf4::ncatt_put(nc, var_name, "long_name", paste0("Enhanced Vegetation Index (scaled by 100) - ", toupper(sub("evi_", "", var_name)))) + ncdf4::ncatt_put(nc, var_name, "scale_factor", 0.01) # Divide by 100 to recover original + ncdf4::ncatt_put(nc, var_name, "valid_min", 0) + ncdf4::ncatt_put(nc, var_name, "valid_max", 10000) + } else if (grepl("date", var_name, ignore.case = TRUE)) { + ncdf4::ncatt_put(nc, var_name, "units", "day") # Day of year (1-366), not absolute time + ncdf4::ncatt_put(nc, var_name, "long_name", paste0("Composite day of year - ", toupper(sub("date_", "", var_name)))) + ncdf4::ncatt_put(nc, var_name, "valid_min", 1) + ncdf4::ncatt_put(nc, var_name, "valid_max", 366) + } + } + + # Add units to pid variable + ncdf4::ncatt_put(nc, "pid", "units", "1") + ncdf4::ncatt_put(nc, "pid", "long_name", "Pixel ID") + ncdf4::ncatt_put(nc, "pid", "coordinates", "x y") + + # Close the NetCDF file + ncdf4::nc_close(nc) + + # Cleanup + if(cleanup) { + unlink(temp_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + } + + if (verbose) message("MODIS VI monthly data saved to: ", out_file) + out_file +} diff --git a/R/get_release_elevation_nasadem.R b/old/get_release_elevation_nasadem.R similarity index 100% rename from R/get_release_elevation_nasadem.R rename to old/get_release_elevation_nasadem.R diff --git a/R/get_release_fire_modis.R b/old/get_release_fire_modis.R similarity index 100% rename from R/get_release_fire_modis.R rename to old/get_release_fire_modis.R diff --git a/R/get_release_mean_ndvi_modis.R b/old/get_release_mean_ndvi_modis.R similarity index 100% rename from R/get_release_mean_ndvi_modis.R rename to old/get_release_mean_ndvi_modis.R diff --git a/R/get_release_ndvi_dates_modis.R b/old/get_release_ndvi_dates_modis.R similarity index 100% rename from R/get_release_ndvi_dates_modis.R rename to old/get_release_ndvi_dates_modis.R diff --git a/R/get_release_ndvi_dates_viirs.R b/old/get_release_ndvi_dates_viirs.R similarity index 100% rename from R/get_release_ndvi_dates_viirs.R rename to old/get_release_ndvi_dates_viirs.R diff --git a/R/get_release_ndvi_modis.R b/old/get_release_ndvi_modis.R similarity index 100% rename from R/get_release_ndvi_modis.R rename to old/get_release_ndvi_modis.R diff --git a/R/get_release_ndvi_viirs.R b/old/get_release_ndvi_viirs.R similarity index 100% rename from R/get_release_ndvi_viirs.R rename to old/get_release_ndvi_viirs.R diff --git a/R/get_release_ndwi_modis.R b/old/get_release_ndwi_modis.R similarity index 100% rename from R/get_release_ndwi_modis.R rename to old/get_release_ndwi_modis.R diff --git a/old/hexgrid.R b/old/hexgrid.R new file mode 100644 index 00000000..582b16e8 --- /dev/null +++ b/old/hexgrid.R @@ -0,0 +1,13 @@ +hexgrid <- st_make_grid( + domain, + cellsize = c(500,500), + offset = st_bbox(domain)[c("xmin", "ymin")], + crs = st_crs(domain), + what = "polygons", + square = FALSE, + flat_topped = FALSE + ) |> + st_as_sf() |> + st_intersection(domain) |> # keep all hexagons that intersect domain, not just those with centroids in domain + mutate(pid = row_number()) + diff --git a/qgis/emma.qgz b/qgis/emma.qgz new file mode 100644 index 00000000..d9955518 Binary files /dev/null and b/qgis/emma.qgz differ diff --git a/renv.lock b/renv.lock index 7d3133c1..cbe0c560 100644 --- a/renv.lock +++ b/renv.lock @@ -1,76 +1,8605 @@ { "R": { - "Version": "4.1.2", + "Version": "4.5.2", "Repositories": [ { "Name": "CRAN", - "URL": "https://cloud.r-project.org" + "URL": "https://lib.stat.cmu.edu/R/CRAN" } ] }, "Packages": { + "BH": { + "Package": "BH", + "Version": "1.90.0-1", + "Source": "Repository", + "Type": "Package", + "Title": "Boost C++ Header Files", + "Date": "2025-12-13", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"John W.\", \"Emerson\", role = \"aut\"), person(\"Michael J.\", \"Kane\", role = \"aut\", comment = c(ORCID = \"0000-0003-1899-6662\")))", + "Description": "Boost provides free peer-reviewed portable C++ source libraries. A large part of Boost is provided as C++ template code which is resolved entirely at compile-time without linking. This package aims to provide the most useful subset of Boost libraries for template use among CRAN packages. By placing these libraries in this package, we offer a more efficient distribution system for CRAN as replication of this code in the sources of other packages is avoided. As of release 1.84.0-0, the following Boost libraries are included: 'accumulators' 'algorithm' 'align' 'any' 'atomic' 'beast' 'bimap' 'bind' 'circular_buffer' 'compute' 'concept' 'config' 'container' 'date_time' 'detail' 'dynamic_bitset' 'exception' 'flyweight' 'foreach' 'functional' 'fusion' 'geometry' 'graph' 'heap' 'icl' 'integer' 'interprocess' 'intrusive' 'io' 'iostreams' 'iterator' 'lambda2' 'math' 'move' 'mp11' 'mpl' 'multiprecision' 'numeric' 'pending' 'phoenix' 'polygon' 'preprocessor' 'process' 'propery_tree' 'qvm' 'random' 'range' 'scope_exit' 'smart_ptr' 'sort' 'spirit' 'tuple' 'type_traits' 'typeof' 'unordered' 'url' 'utility' 'uuid'.", + "License": "BSL-1.0", + "URL": "https://github.com/eddelbuettel/bh, https://dirk.eddelbuettel.com/code/bh.html", + "BugReports": "https://github.com/eddelbuettel/bh/issues", + "NeedsCompilation": "no", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), John W. Emerson [aut], Michael J. Kane [aut] (ORCID: )", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" + }, + "DBI": { + "Package": "DBI", + "Version": "1.3.0", + "Source": "Repository", + "Title": "R Database Interface", + "Date": "2026-02-11", + "Authors@R": "c( person(\"R Special Interest Group on Databases (R-SIG-DB)\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"R Consortium\", role = \"fnd\") )", + "Description": "A database interface definition for communication between R and relational database management systems. All classes in this package are virtual and need to be extended by the various R/DBMS implementations.", + "License": "LGPL (>= 2.1)", + "URL": "https://dbi.r-dbi.org, https://github.com/r-dbi/DBI", + "BugReports": "https://github.com/r-dbi/DBI/issues", + "Depends": [ + "methods", + "R (>= 3.0.0)" + ], + "Suggests": [ + "arrow", + "blob", + "callr", + "covr", + "DBItest (>= 1.8.2)", + "dbplyr", + "downlit", + "dplyr", + "glue", + "hms", + "knitr", + "magrittr", + "nanoarrow (>= 0.3.0.1)", + "otel", + "otelsdk", + "RMariaDB", + "rmarkdown", + "rprojroot", + "RSQLite (>= 1.1-2)", + "testthat (>= 3.0.0)", + "vctrs", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/Needs/check": "r-dbi/DBItest", + "Config/Needs/website": "r-dbi/DBItest, r-dbi/dbitemplate, adbi, AzureKusto, bigrquery, DatabaseConnector, dittodb, duckdb, implyr, lazysf, odbc, pool, RAthena, IMSMWU/RClickhouse, RH2, RJDBC, RMariaDB, RMySQL, RPostgres, RPostgreSQL, RPresto, RSQLite, sergeant, sparklyr, withr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "no", + "Author": "R Special Interest Group on Databases (R-SIG-DB) [aut], Hadley Wickham [aut], Kirill Müller [aut, cre] (ORCID: ), R Consortium [fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, "KernSmooth": { "Package": "KernSmooth", - "Version": "2.23-20", + "Version": "2.23-26", "Source": "Repository", - "Repository": "CRAN", - "Hash": "8dcfa99b14c296bc9f1fd64d52fd3ce7" + "Priority": "recommended", + "Date": "2024-12-10", + "Title": "Functions for Kernel Smoothing Supporting Wand & Jones (1995)", + "Authors@R": "c(person(\"Matt\", \"Wand\", role = \"aut\", email = \"Matt.Wand@uts.edu.au\"), person(\"Cleve\", \"Moler\", role = \"ctb\", comment = \"LINPACK routines in src/d*\"), person(\"Brian\", \"Ripley\", role = c(\"trl\", \"cre\", \"ctb\"), email = \"Brian.Ripley@R-project.org\", comment = \"R port and updates\"))", + "Note": "Maintainers are not available to give advice on using a package they did not author.", + "Depends": [ + "R (>= 2.5.0)", + "stats" + ], + "Suggests": [ + "MASS", + "carData" + ], + "Description": "Functions for kernel smoothing (and density estimation) corresponding to the book: Wand, M.P. and Jones, M.C. (1995) \"Kernel Smoothing\".", + "License": "Unlimited", + "ByteCompile": "yes", + "NeedsCompilation": "yes", + "Author": "Matt Wand [aut], Cleve Moler [ctb] (LINPACK routines in src/d*), Brian Ripley [trl, cre, ctb] (R port and updates)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "MASS": { "Package": "MASS", - "Version": "7.3-54", + "Version": "7.3-65", "Source": "Repository", - "Repository": "CRAN", - "Hash": "0e59129db205112e3963904db67fd0dc" + "Priority": "recommended", + "Date": "2025-02-19", + "Revision": "$Rev: 3681 $", + "Depends": [ + "R (>= 4.4.0)", + "grDevices", + "graphics", + "stats", + "utils" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "lattice", + "nlme", + "nnet", + "survival" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Brian.Ripley@R-project.org\"), person(\"Bill\", \"Venables\", role = c(\"aut\", \"cph\")), person(c(\"Douglas\", \"M.\"), \"Bates\", role = \"ctb\"), person(\"Kurt\", \"Hornik\", role = \"trl\", comment = \"partial port ca 1998\"), person(\"Albrecht\", \"Gebhardt\", role = \"trl\", comment = \"partial port ca 1998\"), person(\"David\", \"Firth\", role = \"ctb\", comment = \"support functions for polr\"))", + "Description": "Functions and datasets to support Venables and Ripley, \"Modern Applied Statistics with S\" (4th edition, 2002).", + "Title": "Support Functions and Datasets for Venables and Ripley's MASS", + "LazyData": "yes", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "Contact": "", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], Bill Venables [aut, cph], Douglas M. Bates [ctb], Kurt Hornik [trl] (partial port ca 1998), Albrecht Gebhardt [trl] (partial port ca 1998), David Firth [ctb] (support functions for polr)", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" }, "Matrix": { "Package": "Matrix", - "Version": "1.3-4", + "Version": "1.7-4", + "Source": "Repository", + "VersionNote": "do also bump src/version.h, inst/include/Matrix/version.h", + "Date": "2025-08-27", + "Priority": "recommended", + "Title": "Sparse and Dense Matrix Classes and Methods", + "Description": "A rich hierarchy of sparse and dense matrix classes, including general, symmetric, triangular, and diagonal matrices with numeric, logical, or pattern entries. Efficient methods for operating on such matrices, often wrapping the 'BLAS', 'LAPACK', and 'SuiteSparse' libraries.", + "License": "GPL (>= 2) | file LICENCE", + "URL": "https://Matrix.R-forge.R-project.org", + "BugReports": "https://R-forge.R-project.org/tracker/?atid=294&group_id=61", + "Contact": "Matrix-authors@R-project.org", + "Authors@R": "c(person(\"Douglas\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"Martin\", \"Maechler\", role = c(\"aut\", \"cre\"), email = \"mmaechler+Matrix@gmail.com\", comment = c(ORCID = \"0000-0002-8685-9910\")), person(\"Mikael\", \"Jagan\", role = \"aut\", comment = c(ORCID = \"0000-0002-3542-2938\")), person(\"Timothy A.\", \"Davis\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7614-6899\", \"SuiteSparse libraries\", \"collaborators listed in dir(system.file(\\\"doc\\\", \\\"SuiteSparse\\\", package=\\\"Matrix\\\"), pattern=\\\"License\\\", full.names=TRUE, recursive=TRUE)\")), person(\"George\", \"Karypis\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2753-1437\", \"METIS library\", \"Copyright: Regents of the University of Minnesota\")), person(\"Jason\", \"Riedy\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4345-4200\", \"GNU Octave's condest() and onenormest()\", \"Copyright: Regents of the University of California\")), person(\"Jens\", \"Oehlschlägel\", role = \"ctb\", comment = \"initial nearPD()\"), person(\"R Core Team\", role = \"ctb\", comment = c(ROR = \"02zz1nj61\", \"base R's matrix implementation\")))", + "Depends": [ + "R (>= 4.4)", + "methods" + ], + "Imports": [ + "grDevices", + "graphics", + "grid", + "lattice", + "stats", + "utils" + ], + "Suggests": [ + "MASS", + "datasets", + "sfsmisc", + "tools" + ], + "Enhances": [ + "SparseM", + "graph" + ], + "LazyData": "no", + "LazyDataNote": "not possible, since we use data/*.R and our S4 classes", + "BuildResaveData": "no", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Douglas Bates [aut] (ORCID: ), Martin Maechler [aut, cre] (ORCID: ), Mikael Jagan [aut] (ORCID: ), Timothy A. Davis [ctb] (ORCID: , SuiteSparse libraries, collaborators listed in dir(system.file(\"doc\", \"SuiteSparse\", package=\"Matrix\"), pattern=\"License\", full.names=TRUE, recursive=TRUE)), George Karypis [ctb] (ORCID: , METIS library, Copyright: Regents of the University of Minnesota), Jason Riedy [ctb] (ORCID: , GNU Octave's condest() and onenormest(), Copyright: Regents of the University of California), Jens Oehlschlägel [ctb] (initial nearPD()), R Core Team [ctb] (ROR: , base R's matrix implementation)", + "Maintainer": "Martin Maechler ", + "Repository": "CRAN" + }, + "R6": { + "Package": "R6", + "Version": "2.6.1", + "Source": "Repository", + "Title": "Encapsulated Classes with Reference Semantics", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Creates classes with reference semantics, similar to R's built-in reference classes. Compared to reference classes, R6 classes are simpler and lighter-weight, and they are not built on S4 classes so they do not require the methods package. These classes allow public and private members, and they support inheritance, even when the classes are defined in different packages.", + "License": "MIT + file LICENSE", + "URL": "https://r6.r-lib.org, https://github.com/r-lib/R6", + "BugReports": "https://github.com/r-lib/R6/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Suggests": [ + "lobstr", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate, ggplot2, microbenchmark, scales", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "RApiSerialize": { + "Package": "RApiSerialize", + "Version": "0.1.4", + "Source": "Repository", + "Type": "Package", + "Title": "R API Serialization", + "Date": "2024-09-28", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Ei-ji\", \"Nakama\", role = \"aut\", comment = \"Code in package Rhpc\"), person(\"Junji\", \"Nakano\", role = \"aut\", comment = \"Code in package Rhpc\"), person(\"R Core\", role = \"aut\", comment = \"Code in R file src/main/serialize.c\"))", + "Description": "Access to the internal R serialization code is provided for use by other packages at the C function level by using the registration of native function mechanism. Client packages simply include a single header file RApiSerializeAPI.h provided by this package. This packages builds on the Rhpc package by Ei-ji Nakama and Junji Nakano which also includes a (partial) copy of the file src/main/serialize.c from R itself. The R Core group is the original author of the serialization code made available by this package.", + "URL": "https://github.com/eddelbuettel/rapiserialize, https://dirk.eddelbuettel.com/code/rapiserialize.html", + "BugReports": "https://github.com/eddelbuettel/rapiserialize/issues", + "License": "GPL (>= 2)", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (), Ei-ji Nakama [aut] (Code in package Rhpc), Junji Nakano [aut] (Code in package Rhpc), R Core [aut] (Code in R file src/main/serialize.c)", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" + }, + "RColorBrewer": { + "Package": "RColorBrewer", + "Version": "1.1-3", + "Source": "Repository", + "Date": "2022-04-03", + "Title": "ColorBrewer Palettes", + "Authors@R": "c(person(given = \"Erich\", family = \"Neuwirth\", role = c(\"aut\", \"cre\"), email = \"erich.neuwirth@univie.ac.at\"))", + "Author": "Erich Neuwirth [aut, cre]", + "Maintainer": "Erich Neuwirth ", + "Depends": [ + "R (>= 2.0.0)" + ], + "Description": "Provides color schemes for maps (and other graphics) designed by Cynthia Brewer as described at http://colorbrewer2.org.", + "License": "Apache License 2.0", + "NeedsCompilation": "no", + "Repository": "CRAN" + }, + "Rcpp": { + "Package": "Rcpp", + "Version": "1.1.1", + "Source": "Repository", + "Title": "Seamless R and C++ Integration", + "Date": "2026-01-07", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"JJ\", \"Allaire\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Kevin\", \"Ushey\", role = \"aut\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Qiang\", \"Kou\", role = \"aut\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Nathan\", \"Russell\", role = \"aut\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"John\", \"Chambers\", role = \"aut\"))", + "Description": "The 'Rcpp' package provides R functions as well as C++ classes which offer a seamless integration of R and C++. Many R data types and objects can be mapped back and forth to C++ equivalents which facilitates both writing of new code as well as easier integration of third-party libraries. Documentation about 'Rcpp' is provided by several vignettes included in this package, via the 'Rcpp Gallery' site at , the paper by Eddelbuettel and Francois (2011, ), the book by Eddelbuettel (2013, ) and the paper by Eddelbuettel and Balamuta (2018, ); see 'citation(\"Rcpp\")' for details.", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "methods", + "utils" + ], + "Suggests": [ + "tinytest", + "inline", + "rbenchmark", + "pkgKitten (>= 0.1.2)" + ], + "URL": "https://www.rcpp.org, https://dirk.eddelbuettel.com/code/rcpp.html, https://github.com/RcppCore/Rcpp", + "License": "GPL (>= 2)", + "BugReports": "https://github.com/RcppCore/Rcpp/issues", + "MailingList": "rcpp-devel@lists.r-forge.r-project.org", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "VignetteBuilder": "Rcpp", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Romain Francois [aut] (ORCID: ), JJ Allaire [aut] (ORCID: ), Kevin Ushey [aut] (ORCID: ), Qiang Kou [aut] (ORCID: ), Nathan Russell [aut], Iñaki Ucar [aut] (ORCID: ), Doug Bates [aut] (ORCID: ), John Chambers [aut]", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" + }, + "RcppInt64": { + "Package": "RcppInt64", + "Version": "0.0.5", + "Source": "Repository", + "Type": "Package", + "Title": "'Rcpp'-Based Helper Functions to Pass 'Int64' and 'nanotime' Values Between 'R' and 'C++'", + "Date": "2024-04-30", + "Authors@R": "c(person(given = \"Dirk\", family = \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")))", + "Description": "'Int64' values can be created and accessed via the 'bit64' package and its 'integer64' class which package the 'int64' representation cleverly into a 'double'. The 'nanotime' packages builds on this to support nanosecond-resolution timestamps. This packages helps conversions between 'R' and 'C++' via several helper functions provided via a single header file. A complete example client package is included as an illustration.", + "URL": "https://github.com/eddelbuettel/rcppint64", + "BugReports": "https://github.com/eddelbuettel/rcppint64/issues", + "License": "GPL (>= 2)", + "Imports": [ + "Rcpp (>= 1.0.8)" + ], + "LinkingTo": [ + "Rcpp" + ], + "Suggests": [ + "tinytest", + "bit64", + "nanotime" + ], + "RoxygenNote": "6.0.1", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] ()", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" + }, + "RcppParallel": { + "Package": "RcppParallel", + "Version": "5.1.11-1", + "Source": "Repository", + "Type": "Package", + "Title": "Parallel Programming Tools for 'Rcpp'", + "Authors@R": "c( person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@rstudio.com\"), person(\"Romain\", \"Francois\", role = c(\"aut\", \"cph\")), person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\"), person(\"Gregory\", \"Vandenbrouck\", role = \"aut\"), person(\"Marcus\", \"Geelnard\", role = c(\"aut\", \"cph\"), comment = \"TinyThread library, https://tinythreadpp.bitsnbites.eu/\"), person(\"Hamada S.\", \"Badr\", email = \"badr@jhu.edu\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0002-9808-2344\")), person(family = \"Posit, PBC\", role = \"cph\"), person(family = \"Intel\", role = c(\"aut\", \"cph\"), comment = \"Intel TBB library, https://www.threadingbuildingblocks.org/\"), person(family = \"Microsoft\", role = \"cph\") )", + "Description": "High level functions for parallel programming with 'Rcpp'. For example, the 'parallelFor()' function can be used to convert the work of a standard serial \"for\" loop into a parallel one and the 'parallelReduce()' function can be used for accumulating aggregate or other values.", + "Depends": [ + "R (>= 3.0.2)" + ], + "Suggests": [ + "Rcpp", + "RUnit", + "knitr", + "rmarkdown" + ], + "SystemRequirements": "GNU make, Intel TBB, Windows: cmd.exe and cscript.exe, Solaris: g++ is required", + "License": "GPL (>= 3)", + "URL": "https://rcppcore.github.io/RcppParallel/, https://github.com/RcppCore/RcppParallel", + "BugReports": "https://github.com/RcppCore/RcppParallel/issues", + "Biarch": "TRUE", + "RoxygenNote": "7.1.1", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "JJ Allaire [aut], Romain Francois [aut, cph], Kevin Ushey [aut, cre], Gregory Vandenbrouck [aut], Marcus Geelnard [aut, cph] (TinyThread library, https://tinythreadpp.bitsnbites.eu/), Hamada S. Badr [ctb] (ORCID: ), Posit, PBC [cph], Intel [aut, cph] (Intel TBB library, https://www.threadingbuildingblocks.org/), Microsoft [cph]", + "Maintainer": "Kevin Ushey ", + "Repository": "CRAN" + }, + "RcppTOML": { + "Package": "RcppTOML", + "Version": "0.2.3", + "Source": "Repository", + "Type": "Package", + "Title": "'Rcpp' Bindings to Parser for \"Tom's Obvious Markup Language\"", + "Date": "2025-03-08", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Mark\", \"Gillard\", role = \"aut\", comment = \"Author of 'toml++' header library\"))", + "Description": "The configuration format defined by 'TOML' (which expands to \"Tom's Obvious Markup Language\") specifies an excellent format (described at ) suitable for both human editing as well as the common uses of a machine-readable format. This package uses 'Rcpp' to connect to the 'toml++' parser written by Mark Gillard to R.", + "SystemRequirements": "A C++17 compiler", + "BugReports": "https://github.com/eddelbuettel/rcpptoml/issues", + "URL": "http://dirk.eddelbuettel.com/code/rcpp.toml.html", + "Imports": [ + "Rcpp (>= 1.0.8)" + ], + "Depends": [ + "R (>= 3.3.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "Suggests": [ + "tinytest" + ], + "License": "GPL (>= 2)", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (), Mark Gillard [aut] (Author of 'toml++' header library)", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" + }, + "S7": { + "Package": "S7", + "Version": "0.2.1", + "Source": "Repository", + "Title": "An Object Oriented System Meant to Become a Successor to S3 and S4", + "Authors@R": "c( person(\"Object-Oriented Programming Working Group\", role = \"cph\"), person(\"Davis\", \"Vaughan\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Tomasz\", \"Kalinowski\", role = \"aut\"), person(\"Will\", \"Landau\", role = \"aut\"), person(\"Michael\", \"Lawrence\", role = \"aut\"), person(\"Martin\", \"Maechler\", role = \"aut\", comment = c(ORCID = \"0000-0002-8685-9910\")), person(\"Luke\", \"Tierney\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")) )", + "Description": "A new object oriented programming system designed to be a successor to S3 and S4. It includes formal class, generic, and method specification, and a limited form of multiple dispatch. It has been designed and implemented collaboratively by the R Consortium Object-Oriented Programming Working Group, which includes representatives from R-Core, 'Bioconductor', 'Posit'/'tidyverse', and the wider R community.", + "License": "MIT + file LICENSE", + "URL": "https://rconsortium.github.io/S7/, https://github.com/RConsortium/S7", + "BugReports": "https://github.com/RConsortium/S7/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "utils" + ], + "Suggests": [ + "bench", + "callr", + "covr", + "knitr", + "methods", + "rmarkdown", + "testthat (>= 3.2.0)", + "tibble" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "sloop", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "external-generic", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Object-Oriented Programming Working Group [cph], Davis Vaughan [aut], Jim Hester [aut] (ORCID: ), Tomasz Kalinowski [aut], Will Landau [aut], Michael Lawrence [aut], Martin Maechler [aut] (ORCID: ), Luke Tierney [aut], Hadley Wickham [aut, cre] (ORCID: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "V8": { + "Package": "V8", + "Version": "8.0.1", + "Source": "Repository", + "Type": "Package", + "Title": "Embedded JavaScript and WebAssembly Engine for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"George\", \"Stagg\", role = \"ctb\", comment = c(ORCID = \"0009-0006-3173-9846\")), person(\"Jan Marvin\", \"Garbuszus\", role = \"ctb\"))", + "Description": "An R interface to V8 : Google's open source JavaScript and WebAssembly engine. This package can be compiled either with V8 or NodeJS when built as a shared library.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/V8", + "BugReports": "https://github.com/jeroen/v8/issues", + "SystemRequirements": "On Linux you can build against libv8-dev (Debian) or v8-devel (Fedora). We also provide static libv8 binaries for most platforms, see the README for details.", + "NeedsCompilation": "yes", + "VignetteBuilder": "knitr", + "Imports": [ + "Rcpp (>= 0.12.12)", + "jsonlite (>= 1.0)", + "curl (>= 1.0)", + "utils" + ], + "LinkingTo": [ + "Rcpp" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown" + ], + "RoxygenNote": "7.3.1", + "Language": "en-US", + "Encoding": "UTF-8", + "Biarch": "true", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), George Stagg [ctb] (ORCID: ), Jan Marvin Garbuszus [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "abind": { + "Package": "abind", + "Version": "1.4-8", + "Source": "Repository", + "Date": "2024-09-08", + "Title": "Combine Multidimensional Arrays", + "Authors@R": "c(person(\"Tony\", \"Plate\", email = \"tplate@acm.org\", role = c(\"aut\", \"cre\")), person(\"Richard\", \"Heiberger\", role = c(\"aut\")))", + "Maintainer": "Tony Plate ", + "Description": "Combine multidimensional arrays into a single array. This is a generalization of 'cbind' and 'rbind'. Works with vectors, matrices, and higher-dimensional arrays (aka tensors). Also provides functions 'adrop', 'asub', and 'afill' for manipulating, extracting and replacing data in arrays.", + "Depends": [ + "R (>= 1.5.0)" + ], + "Imports": [ + "methods", + "utils" + ], + "License": "MIT + file LICENSE", + "NeedsCompilation": "no", + "Author": "Tony Plate [aut, cre], Richard Heiberger [aut]", + "Repository": "CRAN" + }, + "appeears": { + "Package": "appeears", + "Version": "1.2", "Source": "Repository", + "Title": "Interface to 'AppEEARS' NASA Web Services", + "Authors@R": "c(person( family = \"Hufkens\", given = \"Koen\", email = \"koen.hufkens@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5070-8109\") ), person( family = \"Campitelli\", given = \"Elio\", email = \"elio.campitelli@cima.fcen.uba.ar\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0002-7742-9230\") ), person(given = \"BlueGreen Labs\", role = c(\"cph\", \"fnd\")) )", + "Description": "Programmatic interface to the NASA Application for Extracting and Exploring Analysis Ready Samples services (AppEEARS; ). The package provides easy access to analysis ready earth observation data in R.", + "URL": "https://github.com/bluegreen-labs/appeears, https://bluegreen-labs.github.io/appeears/", + "BugReports": "https://github.com/bluegreen-labs/appeears/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "httr", + "keyring", + "memoise", + "getPass", + "R6", + "sf", + "jsonlite", + "geojsonio", + "rstudioapi" + ], + "License": "AGPL-3", + "ByteCompile": "true", + "RoxygenNote": "7.3.3", + "Suggests": [ + "rmarkdown", + "covr", + "testthat", + "terra", + "ncdf4", + "knitr", + "rlang", + "dplyr", + "ggplot2", + "patchwork" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Koen Hufkens [aut, cre] (ORCID: ), Elio Campitelli [ctb] (ORCID: ), BlueGreen Labs [cph, fnd]", + "Maintainer": "Koen Hufkens ", + "Repository": "CRAN" + }, + "arrow": { + "Package": "arrow", + "Version": "23.0.1.1", + "Source": "Repository", + "Title": "Integration to 'Apache' 'Arrow'", + "Authors@R": "c( person(\"Neal\", \"Richardson\", email = \"neal.p.richardson@gmail.com\", role = c(\"aut\")), person(\"Ian\", \"Cook\", email = \"ianmcook@gmail.com\", role = c(\"aut\")), person(\"Nic\", \"Crane\", email = \"thisisnic@gmail.com\", role = c(\"aut\")), person(\"Dewey\", \"Dunnington\", role = c(\"aut\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Romain\", \"Fran\\u00e7ois\", role = c(\"aut\"), comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Jonathan\", \"Keane\", email = \"jkeane@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Bryce\", \"Mecum\", email = \"brycemecum@gmail.com\", role = c(\"aut\")), person(\"Drago\\u0219\", \"Moldovan-Gr\\u00fcnfeld\", email = \"dragos.mold@gmail.com\", role = c(\"aut\")), person(\"Jeroen\", \"Ooms\", email = \"jeroen@berkeley.edu\", role = c(\"aut\")), person(\"Jacob\", \"Wujciak-Jens\", email = \"jacob@wujciak.de\", role = c(\"aut\")), person(\"Javier\", \"Luraschi\", email = \"javier@rstudio.com\", role = c(\"ctb\")), person(\"Karl\", \"Dunkle Werner\", email = \"karldw@users.noreply.github.com\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0003-0523-7309\")), person(\"Jeffrey\", \"Wong\", email = \"jeffreyw@netflix.com\", role = c(\"ctb\")), person(\"Apache Arrow\", email = \"dev@arrow.apache.org\", role = c(\"aut\", \"cph\")) )", + "Description": "'Apache' 'Arrow' is a cross-language development platform for in-memory data. It specifies a standardized language-independent columnar memory format for flat and hierarchical data, organized for efficient analytic operations on modern hardware. This package provides an interface to the 'Arrow C++' library.", + "Depends": [ + "R (>= 4.1)" + ], + "License": "Apache License (>= 2.0)", + "URL": "https://github.com/apache/arrow/, https://arrow.apache.org/docs/r/", + "BugReports": "https://github.com/apache/arrow/issues", + "Encoding": "UTF-8", + "Language": "en-US", + "SystemRequirements": "C++20; for AWS S3 support on Linux, libcurl and openssl (optional); cmake >= 3.26 (build-time only, and only for full source build)", + "Biarch": "true", + "Imports": [ + "assertthat", + "bit64 (>= 0.9-7)", + "glue", + "methods", + "purrr", + "R6", + "rlang (>= 1.0.0)", + "stats", + "tidyselect (>= 1.0.0)", + "utils", + "vctrs" + ], + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "3", + "Config/build/bootstrap": "TRUE", + "Suggests": [ + "blob", + "curl", + "cli", + "DBI", + "dbplyr", + "decor", + "distro", + "dplyr", + "duckdb (>= 0.2.8)", + "hms", + "jsonlite", + "knitr", + "lubridate", + "pillar", + "pkgload", + "reticulate", + "rmarkdown", + "stringi", + "stringr", + "sys", + "testthat (>= 3.1.0)", + "tibble", + "tzdb", + "withr" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.2)" + ], + "Collate": "'arrowExports.R' 'enums.R' 'arrow-object.R' 'type.R' 'array-data.R' 'arrow-datum.R' 'array.R' 'arrow-info.R' 'arrow-package.R' 'arrow-tabular.R' 'buffer.R' 'chunked-array.R' 'io.R' 'compression.R' 'scalar.R' 'compute.R' 'config.R' 'csv.R' 'dataset.R' 'dataset-factory.R' 'dataset-format.R' 'dataset-partition.R' 'dataset-scan.R' 'dataset-write.R' 'dictionary.R' 'dplyr-across.R' 'dplyr-arrange.R' 'dplyr-by.R' 'dplyr-collect.R' 'dplyr-count.R' 'dplyr-datetime-helpers.R' 'dplyr-distinct.R' 'dplyr-eval.R' 'dplyr-filter.R' 'dplyr-funcs-agg.R' 'dplyr-funcs-augmented.R' 'dplyr-funcs-conditional.R' 'dplyr-funcs-datetime.R' 'dplyr-funcs-doc.R' 'dplyr-funcs-math.R' 'dplyr-funcs-simple.R' 'dplyr-funcs-string.R' 'dplyr-funcs-type.R' 'expression.R' 'dplyr-funcs.R' 'dplyr-glimpse.R' 'dplyr-group-by.R' 'dplyr-join.R' 'dplyr-mutate.R' 'dplyr-select.R' 'dplyr-slice.R' 'dplyr-summarize.R' 'dplyr-union.R' 'record-batch.R' 'table.R' 'dplyr.R' 'duckdb.R' 'extension.R' 'feather.R' 'field.R' 'filesystem.R' 'flight.R' 'install-arrow.R' 'ipc-stream.R' 'json.R' 'memory-pool.R' 'message.R' 'metadata.R' 'parquet.R' 'python.R' 'query-engine.R' 'record-batch-reader.R' 'record-batch-writer.R' 'reexports-bit64.R' 'reexports-tidyselect.R' 'schema.R' 'udf.R' 'util.R'", + "NeedsCompilation": "yes", + "Author": "Neal Richardson [aut], Ian Cook [aut], Nic Crane [aut], Dewey Dunnington [aut] (ORCID: ), Romain François [aut] (ORCID: ), Jonathan Keane [aut, cre], Bryce Mecum [aut], Dragoș Moldovan-Grünfeld [aut], Jeroen Ooms [aut], Jacob Wujciak-Jens [aut], Javier Luraschi [ctb], Karl Dunkle Werner [ctb] (ORCID: ), Jeffrey Wong [ctb], Apache Arrow [aut, cph]", + "Maintainer": "Jonathan Keane ", + "Repository": "CRAN" + }, + "askpass": { + "Package": "askpass", + "Version": "1.2.1", + "Source": "Repository", + "Type": "Package", + "Title": "Password Entry Utilities for R, Git, and SSH", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Cross-platform utilities for prompting the user for credentials or a passphrase, for example to authenticate with a server or read a protected key. Includes native programs for MacOS and Windows, hence no 'tcltk' is required. Password entry can be invoked in two different ways: directly from R via the askpass() function, or indirectly as password-entry back-end for 'ssh-agent' or 'git-credential' via the SSH_ASKPASS and GIT_ASKPASS environment variables. Thereby the user can be prompted for credentials or a passphrase if needed when R calls out to git or ssh.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.r-universe.dev/askpass", + "BugReports": "https://github.com/r-lib/askpass/issues", + "Encoding": "UTF-8", + "Imports": [ + "sys (>= 2.1)" + ], + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "assertthat": { + "Package": "assertthat", + "Version": "0.2.1", + "Source": "Repository", + "Title": "Easy Pre and Post Assertions", + "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", c(\"aut\", \"cre\"))", + "Description": "An extension to stopifnot() that makes it easy to declare the pre and post conditions that you code should satisfy, while also producing friendly error messages so that your users know what's gone wrong.", + "License": "GPL-3", + "Imports": [ + "tools" + ], + "Suggests": [ + "testthat", + "covr" + ], + "RoxygenNote": "6.0.1", + "Collate": "'assert-that.r' 'on-failure.r' 'assertions-file.r' 'assertions-scalar.R' 'assertions.r' 'base.r' 'base-comparison.r' 'base-is.r' 'base-logical.r' 'base-misc.r' 'utils.r' 'validate-that.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "backports": { + "Package": "backports", + "Version": "1.5.0", + "Source": "Repository", + "Type": "Package", + "Title": "Reimplementations of Functions Introduced Since R-3.0.0", + "Authors@R": "c( person(\"Michel\", \"Lang\", NULL, \"michellang@gmail.com\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Duncan\", \"Murdoch\", NULL, \"murdoch.duncan@gmail.com\", role = c(\"aut\")), person(\"R Core Team\", role = \"aut\"))", + "Maintainer": "Michel Lang ", + "Description": "Functions introduced or changed since R v3.0.0 are re-implemented in this package. The backports are conditionally exported in order to let R resolve the function name to either the implemented backport, or the respective base version, if available. Package developers can make use of new functions or arguments by selectively importing specific backports to support older installations.", + "URL": "https://github.com/r-lib/backports", + "BugReports": "https://github.com/r-lib/backports/issues", + "License": "GPL-2 | GPL-3", + "NeedsCompilation": "yes", + "ByteCompile": "yes", + "Depends": [ + "R (>= 3.0.0)" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Author": "Michel Lang [cre, aut] (), Duncan Murdoch [aut], R Core Team [aut]", + "Repository": "CRAN" + }, + "base64enc": { + "Package": "base64enc", + "Version": "0.1-6", + "Source": "Repository", + "Title": "Tools for 'base64' Encoding", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.nz, ORCID: )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.nz\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" + ], + "Enhances": [ + "png" + ], + "Description": "Tools for handling 'base64' encoding. It is more flexible than the orphaned 'base64' package.", + "License": "GPL-2 | GPL-3", + "URL": "https://www.rforge.net/base64enc", + "BugReports": "https://github.com/s-u/base64enc/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "base64url": { + "Package": "base64url", + "Version": "1.4", + "Source": "Repository", + "Type": "Package", + "Title": "Fast and URL-Safe Base64 Encoder and Decoder", + "Authors@R": "c( person(\"Michel\", \"Lang\", NULL, \"michellang@gmail.com\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0001-9754-0393\")), person(NULL, \"Apache Foundation\", NULL, NULL, role = c(\"ctb\", \"cph\")), person(NULL, \"Free Software Foundation\", NULL, NULL, role = c(\"ctb\", \"cph\")) )", + "Description": "In contrast to RFC3548, the 62nd character (\"+\") is replaced with \"-\", the 63rd character (\"/\") is replaced with \"_\". Furthermore, the encoder does not fill the string with trailing \"=\". The resulting encoded strings comply to the regular expression pattern \"[A-Za-z0-9_-]\" and thus are safe to use in URLs or for file names. The package also comes with a simple base32 encoder/decoder suited for case insensitive file systems.", + "URL": "https://github.com/mllg/base64url", + "BugReports": "https://github.com/mllg/base64url/issues", + "NeedsCompilation": "yes", + "License": "GPL-3", + "Encoding": "UTF-8", + "Imports": [ + "backports (>= 1.1.0)" + ], + "Suggests": [ + "base64enc", + "checkmate", + "knitr", + "microbenchmark", + "openssl", + "rmarkdown", + "testthat" + ], + "RoxygenNote": "6.0.1", + "VignetteBuilder": "knitr", + "Author": "Michel Lang [cre, aut] (), Apache Foundation [ctb, cph], Free Software Foundation [ctb, cph]", + "Maintainer": "Michel Lang ", + "Repository": "CRAN" + }, + "biglm": { + "Package": "biglm", + "Version": "0.9-3", + "Source": "Repository", + "Type": "Package", + "Title": "Bounded Memory Linear and Generalized Linear Models", + "Author": "Thomas Lumley", + "Maintainer": "Thomas Lumley ", + "Description": "Regression for data too large to fit in memory.", + "License": "GPL", + "Suggests": [ + "RSQLite", + "RODBC" + ], + "Depends": [ + "DBI", + "methods" + ], + "Enhances": [ + "leaps" + ], + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "bit": { + "Package": "bit", + "Version": "4.6.0", + "Source": "Repository", + "Title": "Classes and Methods for Fast Memory-Efficient Boolean Selections", + "Authors@R": "c( person(\"Michael\", \"Chirico\", email = \"MichaelChirico4@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Jens\", \"Oehlschlägel\", role = \"aut\"), person(\"Brian\", \"Ripley\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "testthat (>= 3.0.0)", + "roxygen2", + "knitr", + "markdown", + "rmarkdown", + "microbenchmark", + "bit64 (>= 4.0.0)", + "ff (>= 4.0.0)" + ], + "Description": "Provided are classes for boolean and skewed boolean vectors, fast boolean methods, fast unique and non-unique integer sorting, fast set operations on sorted and unsorted sets of integers, and foundations for ff (range index, compression, chunked processing).", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "ByteCompile": "yes", + "Encoding": "UTF-8", + "URL": "https://github.com/r-lib/bit", + "VignetteBuilder": "knitr, rmarkdown", + "RoxygenNote": "7.3.2", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Michael Chirico [aut, cre], Jens Oehlschlägel [aut], Brian Ripley [ctb]", + "Maintainer": "Michael Chirico ", + "Repository": "CRAN" + }, + "bit64": { + "Package": "bit64", + "Version": "4.6.0-1", + "Source": "Repository", + "Title": "A S3 Class for Vectors of 64bit Integers", + "Authors@R": "c( person(\"Michael\", \"Chirico\", email = \"michaelchirico4@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Jens\", \"Oehlschlägel\", role = \"aut\"), person(\"Leonardo\", \"Silvestri\", role = \"ctb\"), person(\"Ofek\", \"Shilon\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.4.0)", + "bit (>= 4.0.0)" + ], + "Description": "Package 'bit64' provides serializable S3 atomic 64bit (signed) integers. These are useful for handling database keys and exact counting in +-2^63. WARNING: do not use them as replacement for 32bit integers, integer64 are not supported for subscripting by R-core and they have different semantics when combined with double, e.g. integer64 + double => integer64. Class integer64 can be used in vectors, matrices, arrays and data.frames. Methods are available for coercion from and to logicals, integers, doubles, characters and factors as well as many elementwise and summary functions. Many fast algorithmic operations such as 'match' and 'order' support inter- active data exploration and manipulation and optionally leverage caching.", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "ByteCompile": "yes", + "URL": "https://github.com/r-lib/bit64", + "Encoding": "UTF-8", + "Imports": [ + "graphics", + "methods", + "stats", + "utils" + ], + "Suggests": [ + "testthat (>= 3.0.3)", + "withr" + ], + "Config/testthat/edition": "3", + "Config/needs/development": "testthat", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Michael Chirico [aut, cre], Jens Oehlschlägel [aut], Leonardo Silvestri [ctb], Ofek Shilon [ctb]", + "Maintainer": "Michael Chirico ", + "Repository": "CRAN" + }, + "blob": { + "Package": "blob", + "Version": "1.3.0", + "Source": "Repository", + "Title": "A Simple S3 Class for Representing Vectors of Binary Data ('BLOBS')", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = \"cre\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "R's raw vector is useful for storing a single binary object. What if you want to put a vector of them in a data frame? The 'blob' package provides the blob object, a list of raw vectors, suitable for use as a column in data frame.", + "License": "MIT + file LICENSE", + "URL": "https://blob.tidyverse.org, https://github.com/tidyverse/blob", + "BugReports": "https://github.com/tidyverse/blob/issues", + "Imports": [ + "methods", + "rlang", + "vctrs (>= 0.2.1)" + ], + "Suggests": [ + "covr", + "crayon", + "pillar (>= 1.2.1)", + "testthat (>= 3.0.0)" + ], + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "false", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Kirill Müller [cre], RStudio [cph, fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "brew": { + "Package": "brew", + "Version": "1.0-10", + "Source": "Repository", + "Type": "Package", + "Title": "Templating Framework for Report Generation", + "Authors@R": "c( person(\"Jeffrey\", \"Horner\", role = c(\"aut\", \"cph\")), person(\"Greg\", \"Hunt\", , \"greg@firmansyah.com\", role = c(\"aut\", \"cre\", \"cph\")) )", + "Description": "Implements a templating framework for mixing text and R code for report generation. brew template syntax is similar to PHP, Ruby's erb module, Java Server Pages, and Python's psp module.", + "License": "GPL (>= 2)", + "URL": "https://github.com/gregfrog/brew", + "BugReports": "https://github.com/gregfrog/brew/issues", + "Suggests": [ + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Encoding": "UTF-8", "Repository": "CRAN", - "Hash": "4ed05e9c9726267e4a5872e09c04587c" + "NeedsCompilation": "no", + "Author": "Jeffrey Horner [aut, cph], Greg Hunt [aut, cre, cph]", + "Maintainer": "Greg Hunt " + }, + "brio": { + "Package": "brio", + "Version": "1.1.5", + "Source": "Repository", + "Title": "Basic R Input Output", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Functions to handle basic input output, these functions always read and write UTF-8 (8-bit Unicode Transformation Format) files and provide more explicit control over line endings.", + "License": "MIT + file LICENSE", + "URL": "https://brio.r-lib.org, https://github.com/r-lib/brio", + "BugReports": "https://github.com/r-lib/brio/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (), Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "broom": { + "Package": "broom", + "Version": "1.0.12", + "Source": "Repository", + "Type": "Package", + "Title": "Convert Statistical Objects into Tidy Tibbles", + "Authors@R": "c( person(\"David\", \"Robinson\", , \"admiral.david@gmail.com\", role = \"aut\"), person(\"Alex\", \"Hayes\", , \"alexpghayes@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-4985-5160\")), person(\"Simon\", \"Couch\", , \"simon.couch@posit.co\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-5676-5107\")), person(\"Emil\", \"Hvitfeldt\", , \"emil.hvitfeldt@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0679-1945\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Indrajeet\", \"Patil\", , \"patilindrajeet.science@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1995-6531\")), person(\"Derek\", \"Chiu\", , \"dchiu@bccrc.ca\", role = \"ctb\"), person(\"Matthieu\", \"Gomez\", , \"mattg@princeton.edu\", role = \"ctb\"), person(\"Boris\", \"Demeshev\", , \"boris.demeshev@gmail.com\", role = \"ctb\"), person(\"Dieter\", \"Menne\", , \"dieter.menne@menne-biomed.de\", role = \"ctb\"), person(\"Benjamin\", \"Nutter\", , \"nutter@battelle.org\", role = \"ctb\"), person(\"Luke\", \"Johnston\", , \"luke.johnston@mail.utoronto.ca\", role = \"ctb\"), person(\"Ben\", \"Bolker\", , \"bolker@mcmaster.ca\", role = \"ctb\"), person(\"Francois\", \"Briatte\", , \"f.briatte@gmail.com\", role = \"ctb\"), person(\"Jeffrey\", \"Arnold\", , \"jeffrey.arnold@gmail.com\", role = \"ctb\"), person(\"Jonah\", \"Gabry\", , \"jsg2201@columbia.edu\", role = \"ctb\"), person(\"Luciano\", \"Selzer\", , \"luciano.selzer@gmail.com\", role = \"ctb\"), person(\"Gavin\", \"Simpson\", , \"ucfagls@gmail.com\", role = \"ctb\"), person(\"Jens\", \"Preussner\", , \"jens.preussner@mpi-bn.mpg.de\", role = \"ctb\"), person(\"Jay\", \"Hesselberth\", , \"jay.hesselberth@gmail.com\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"ctb\"), person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = \"ctb\"), person(\"Alessandro\", \"Gasparini\", , \"ag475@leicester.ac.uk\", role = \"ctb\"), person(\"Lukasz\", \"Komsta\", , \"lukasz.komsta@umlub.pl\", role = \"ctb\"), person(\"Frederick\", \"Novometsky\", role = \"ctb\"), person(\"Wilson\", \"Freitas\", role = \"ctb\"), person(\"Michelle\", \"Evans\", role = \"ctb\"), person(\"Jason Cory\", \"Brunson\", , \"cornelioid@gmail.com\", role = \"ctb\"), person(\"Simon\", \"Jackson\", , \"drsimonjackson@gmail.com\", role = \"ctb\"), person(\"Ben\", \"Whalley\", , \"ben.whalley@plymouth.ac.uk\", role = \"ctb\"), person(\"Karissa\", \"Whiting\", , \"karissa.whiting@gmail.com\", role = \"ctb\"), person(\"Yves\", \"Rosseel\", , \"yrosseel@gmail.com\", role = \"ctb\"), person(\"Michael\", \"Kuehn\", , \"mkuehn10@gmail.com\", role = \"ctb\"), person(\"Jorge\", \"Cimentada\", , \"cimentadaj@gmail.com\", role = \"ctb\"), person(\"Erle\", \"Holgersen\", , \"erle.holgersen@gmail.com\", role = \"ctb\"), person(\"Karl\", \"Dunkle Werner\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0523-7309\")), person(\"Ethan\", \"Christensen\", , \"christensen.ej@gmail.com\", role = \"ctb\"), person(\"Steven\", \"Pav\", , \"shabbychef@gmail.com\", role = \"ctb\"), person(\"Paul\", \"PJ\", , \"pjpaul.stephens@gmail.com\", role = \"ctb\"), person(\"Ben\", \"Schneider\", , \"benjamin.julius.schneider@gmail.com\", role = \"ctb\"), person(\"Patrick\", \"Kennedy\", , \"pkqstr@protonmail.com\", role = \"ctb\"), person(\"Lily\", \"Medina\", , \"lilymiru@gmail.com\", role = \"ctb\"), person(\"Brian\", \"Fannin\", , \"captain@pirategrunt.com\", role = \"ctb\"), person(\"Jason\", \"Muhlenkamp\", , \"jason.muhlenkamp@gmail.com\", role = \"ctb\"), person(\"Matt\", \"Lehman\", role = \"ctb\"), person(\"Bill\", \"Denney\", , \"wdenney@humanpredictions.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Nic\", \"Crane\", role = \"ctb\"), person(\"Andrew\", \"Bates\", role = \"ctb\"), person(\"Vincent\", \"Arel-Bundock\", , \"vincent.arel-bundock@umontreal.ca\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2042-7063\")), person(\"Hideaki\", \"Hayashi\", role = \"ctb\"), person(\"Luis\", \"Tobalina\", role = \"ctb\"), person(\"Annie\", \"Wang\", , \"anniewang.uc@gmail.com\", role = \"ctb\"), person(\"Wei Yang\", \"Tham\", , \"weiyang.tham@gmail.com\", role = \"ctb\"), person(\"Clara\", \"Wang\", , \"clara.wang.94@gmail.com\", role = \"ctb\"), person(\"Abby\", \"Smith\", , \"als1@u.northwestern.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3207-0375\")), person(\"Jasper\", \"Cooper\", , \"jaspercooper@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8639-3188\")), person(\"E Auden\", \"Krauska\", , \"krauskae@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-1466-5850\")), person(\"Alex\", \"Wang\", , \"x249wang@uwaterloo.ca\", role = \"ctb\"), person(\"Malcolm\", \"Barrett\", , \"malcolmbarrett@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Charles\", \"Gray\", , \"charlestigray@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9978-011X\")), person(\"Jared\", \"Wilber\", role = \"ctb\"), person(\"Vilmantas\", \"Gegzna\", , \"GegznaV@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9500-5167\")), person(\"Eduard\", \"Szoecs\", , \"eduardszoecs@gmail.com\", role = \"ctb\"), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Angus\", \"Moore\", , \"angusmoore9@gmail.com\", role = \"ctb\"), person(\"Nick\", \"Williams\", , \"ntwilliams.personal@gmail.com\", role = \"ctb\"), person(\"Marius\", \"Barth\", , \"marius.barth.uni.koeln@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-3421-6665\")), person(\"Bruna\", \"Wundervald\", , \"brunadaviesw@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8163-220X\")), person(\"Joyce\", \"Cahoon\", , \"joyceyu48@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7217-4702\")), person(\"Grant\", \"McDermott\", , \"grantmcd@uoregon.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0001-7883-8573\")), person(\"Kevin\", \"Zarca\", , \"kevin.zarca@gmail.com\", role = \"ctb\"), person(\"Shiro\", \"Kuriwaki\", , \"shirokuriwaki@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5687-2647\")), person(\"Lukas\", \"Wallrich\", , \"lukas.wallrich@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2121-5177\")), person(\"James\", \"Martherus\", , \"james@martherus.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8285-3300\")), person(\"Chuliang\", \"Xiao\", , \"cxiao@umich.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8466-9398\")), person(\"Joseph\", \"Larmarange\", , \"joseph@larmarange.net\", role = \"ctb\"), person(\"Max\", \"Kuhn\", , \"max@posit.co\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", , \"michal2992@gmail.com\", role = \"ctb\"), person(\"Hakon\", \"Malmedal\", , \"hmalmedal@gmail.com\", role = \"ctb\"), person(\"Clara\", \"Wang\", role = \"ctb\"), person(\"Sergio\", \"Oller\", , \"sergioller@gmail.com\", role = \"ctb\"), person(\"Luke\", \"Sonnet\", , \"luke.sonnet@gmail.com\", role = \"ctb\"), person(\"Jim\", \"Hester\", , \"jim.hester@posit.co\", role = \"ctb\"), person(\"Ben\", \"Schneider\", , \"benjamin.julius.schneider@gmail.com\", role = \"ctb\"), person(\"Bernie\", \"Gray\", , \"bfgray3@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9190-6032\")), person(\"Mara\", \"Averick\", , \"mara@posit.co\", role = \"ctb\"), person(\"Aaron\", \"Jacobs\", , \"atheriel@gmail.com\", role = \"ctb\"), person(\"Andreas\", \"Bender\", , \"bender.at.R@gmail.com\", role = \"ctb\"), person(\"Sven\", \"Templer\", , \"sven.templer@gmail.com\", role = \"ctb\"), person(\"Paul-Christian\", \"Buerkner\", , \"paul.buerkner@gmail.com\", role = \"ctb\"), person(\"Matthew\", \"Kay\", , \"mjskay@umich.edu\", role = \"ctb\"), person(\"Erwan\", \"Le Pennec\", , \"lepennec@gmail.com\", role = \"ctb\"), person(\"Johan\", \"Junkka\", , \"johan.junkka@umu.se\", role = \"ctb\"), person(\"Hao\", \"Zhu\", , \"haozhu233@gmail.com\", role = \"ctb\"), person(\"Benjamin\", \"Soltoff\", , \"soltoffbc@uchicago.edu\", role = \"ctb\"), person(\"Zoe\", \"Wilkinson Saldana\", , \"zoewsaldana@gmail.com\", role = \"ctb\"), person(\"Tyler\", \"Littlefield\", , \"tylurp1@gmail.com\", role = \"ctb\"), person(\"Charles T.\", \"Gray\", , \"charlestigray@gmail.com\", role = \"ctb\"), person(\"Shabbh E.\", \"Banks\", role = \"ctb\"), person(\"Serina\", \"Robinson\", , \"robi0916@umn.edu\", role = \"ctb\"), person(\"Roger\", \"Bivand\", , \"Roger.Bivand@nhh.no\", role = \"ctb\"), person(\"Riinu\", \"Ots\", , \"riinuots@gmail.com\", role = \"ctb\"), person(\"Nicholas\", \"Williams\", , \"ntwilliams.personal@gmail.com\", role = \"ctb\"), person(\"Nina\", \"Jakobsen\", role = \"ctb\"), person(\"Michael\", \"Weylandt\", , \"michael.weylandt@gmail.com\", role = \"ctb\"), person(\"Lisa\", \"Lendway\", , \"llendway@macalester.edu\", role = \"ctb\"), person(\"Karl\", \"Hailperin\", , \"khailper@gmail.com\", role = \"ctb\"), person(\"Josue\", \"Rodriguez\", , \"jerrodriguez@ucdavis.edu\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", , \"jenny@posit.co\", role = \"ctb\"), person(\"Chris\", \"Jarvis\", , \"Christopher1.jarvis@gmail.com\", role = \"ctb\"), person(\"Greg\", \"Macfarlane\", , \"gregmacfarlane@gmail.com\", role = \"ctb\"), person(\"Brian\", \"Mannakee\", , \"bmannakee@gmail.com\", role = \"ctb\"), person(\"Drew\", \"Tyre\", , \"atyre2@unl.edu\", role = \"ctb\"), person(\"Shreyas\", \"Singh\", , \"shreyas.singh.298@gmail.com\", role = \"ctb\"), person(\"Laurens\", \"Geffert\", , \"laurensgeffert@gmail.com\", role = \"ctb\"), person(\"Hong\", \"Ooi\", , \"hongooi@microsoft.com\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", , \"henrikb@braju.com\", role = \"ctb\"), person(\"Eduard\", \"Szocs\", , \"eduardszoecs@gmail.com\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", , \"davidhughjones@gmail.com\", role = \"ctb\"), person(\"Matthieu\", \"Stigler\", , \"Matthieu.Stigler@gmail.com\", role = \"ctb\"), person(\"Hugo\", \"Tavares\", , \"hm533@cam.ac.uk\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9373-2726\")), person(\"R. Willem\", \"Vervoort\", , \"Willemvervoort@gmail.com\", role = \"ctb\"), person(\"Brenton M.\", \"Wiernik\", , \"brenton@wiernik.org\", role = \"ctb\"), person(\"Josh\", \"Yamamoto\", , \"joshuayamamoto5@gmail.com\", role = \"ctb\"), person(\"Jasme\", \"Lee\", role = \"ctb\"), person(\"Taren\", \"Sanders\", , \"taren.sanders@acu.edu.au\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4504-6008\")), person(\"Ilaria\", \"Prosdocimi\", , \"prosdocimi.ilaria@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0001-8565-094X\")), person(\"Daniel D.\", \"Sjoberg\", , \"danield.sjoberg@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0862-2018\")), person(\"Alex\", \"Reinhart\", , \"areinhar@stat.cmu.edu\", role = \"ctb\", comment = c(ORCID = \"0000-0002-6658-514X\")) )", + "Description": "Summarizes key information about statistical objects in tidy tibbles. This makes it easy to report results, create plots and consistently work with large numbers of models at once. Broom provides three verbs that each provide different types of information about a model. tidy() summarizes information about model components such as coefficients of a regression. glance() reports information about an entire model, such as goodness of fit measures like AIC and BIC. augment() adds information about individual observations to a dataset, such as fitted values or influence measures.", + "License": "MIT + file LICENSE", + "URL": "https://broom.tidymodels.org/, https://github.com/tidymodels/broom", + "BugReports": "https://github.com/tidymodels/broom/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "backports", + "cli", + "dplyr (>= 1.0.0)", + "generics (>= 0.0.2)", + "glue", + "lifecycle", + "purrr", + "rlang (>= 1.1.0)", + "stringr", + "tibble (>= 3.0.0)", + "tidyr (>= 1.0.0)" + ], + "Suggests": [ + "AER", + "AUC", + "bbmle", + "betareg (>= 3.2-1)", + "biglm", + "binGroup", + "boot", + "btergm (>= 1.10.6)", + "car (>= 3.1-2)", + "carData", + "caret", + "cluster", + "cmprsk", + "coda", + "covr", + "drc", + "e1071", + "emmeans", + "epiR (>= 2.0.85)", + "ergm (>= 3.10.4)", + "fixest (>= 0.9.0)", + "gam (>= 1.15)", + "gee", + "geepack", + "ggplot2", + "glmnet", + "glmnetUtils", + "gmm", + "Hmisc", + "interp", + "irlba", + "joineRML", + "Kendall", + "knitr", + "ks", + "Lahman", + "lavaan (>= 0.6.18)", + "leaps", + "lfe", + "lm.beta", + "lme4", + "lmodel2", + "lmtest (>= 0.9.38)", + "lsmeans", + "maps", + "margins", + "MASS", + "mclust", + "mediation", + "metafor", + "mfx", + "mgcv", + "mlogit", + "modeldata", + "modeltests (>= 0.1.6)", + "muhaz", + "multcomp", + "network", + "nnet", + "ordinal", + "plm", + "poLCA", + "psych", + "quantreg", + "rmarkdown", + "robust", + "robustbase", + "rsample", + "sandwich", + "spatialreg", + "spdep (>= 1.1)", + "speedglm", + "spelling", + "stats4", + "survey", + "survival (>= 3.6-4)", + "systemfit", + "testthat (>= 3.0.0)", + "tseries", + "vars", + "zoo" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "Collate": "'aaa-documentation-helper.R' 'null-and-default.R' 'aer.R' 'auc.R' 'base.R' 'bbmle.R' 'betareg.R' 'biglm.R' 'bingroup.R' 'boot.R' 'broom-package.R' 'broom.R' 'btergm.R' 'car.R' 'caret.R' 'cluster.R' 'cmprsk.R' 'data-frame.R' 'deprecated-0-7-0.R' 'drc.R' 'emmeans.R' 'epiR.R' 'ergm.R' 'fixest.R' 'gam.R' 'geepack.R' 'glmnet-cv-glmnet.R' 'glmnet-glmnet.R' 'gmm.R' 'hmisc.R' 'import-standalone-obj-type.R' 'import-standalone-types-check.R' 'joinerml.R' 'kendall.R' 'ks.R' 'lavaan.R' 'leaps.R' 'lfe.R' 'list-irlba.R' 'list-optim.R' 'list-svd.R' 'list-xyz.R' 'list.R' 'lm-beta.R' 'lmodel2.R' 'lmtest.R' 'maps.R' 'margins.R' 'mass-fitdistr.R' 'mass-negbin.R' 'mass-polr.R' 'mass-ridgelm.R' 'stats-lm.R' 'mass-rlm.R' 'mclust.R' 'mediation.R' 'metafor.R' 'mfx.R' 'mgcv.R' 'mlogit.R' 'muhaz.R' 'multcomp.R' 'nnet.R' 'nobs.R' 'ordinal-clm.R' 'ordinal-clmm.R' 'plm.R' 'polca.R' 'psych.R' 'stats-nls.R' 'quantreg-nlrq.R' 'quantreg-rq.R' 'quantreg-rqs.R' 'robust-glmrob.R' 'robust-lmrob.R' 'robustbase-glmrob.R' 'robustbase-lmrob.R' 'sp.R' 'spdep.R' 'speedglm-speedglm.R' 'speedglm-speedlm.R' 'stats-anova.R' 'stats-arima.R' 'stats-decompose.R' 'stats-factanal.R' 'stats-glm.R' 'stats-htest.R' 'stats-kmeans.R' 'stats-loess.R' 'stats-mlm.R' 'stats-prcomp.R' 'stats-smooth.spline.R' 'stats-summary-lm.R' 'stats-time-series.R' 'survey.R' 'survival-aareg.R' 'survival-cch.R' 'survival-coxph.R' 'survival-pyears.R' 'survival-survdiff.R' 'survival-survexp.R' 'survival-survfit.R' 'survival-survreg.R' 'systemfit.R' 'tseries.R' 'utilities.R' 'vars.R' 'zoo.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "David Robinson [aut], Alex Hayes [aut] (ORCID: ), Simon Couch [aut] (ORCID: ), Emil Hvitfeldt [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Indrajeet Patil [ctb] (ORCID: ), Derek Chiu [ctb], Matthieu Gomez [ctb], Boris Demeshev [ctb], Dieter Menne [ctb], Benjamin Nutter [ctb], Luke Johnston [ctb], Ben Bolker [ctb], Francois Briatte [ctb], Jeffrey Arnold [ctb], Jonah Gabry [ctb], Luciano Selzer [ctb], Gavin Simpson [ctb], Jens Preussner [ctb], Jay Hesselberth [ctb], Hadley Wickham [ctb], Matthew Lincoln [ctb], Alessandro Gasparini [ctb], Lukasz Komsta [ctb], Frederick Novometsky [ctb], Wilson Freitas [ctb], Michelle Evans [ctb], Jason Cory Brunson [ctb], Simon Jackson [ctb], Ben Whalley [ctb], Karissa Whiting [ctb], Yves Rosseel [ctb], Michael Kuehn [ctb], Jorge Cimentada [ctb], Erle Holgersen [ctb], Karl Dunkle Werner [ctb] (ORCID: ), Ethan Christensen [ctb], Steven Pav [ctb], Paul PJ [ctb], Ben Schneider [ctb], Patrick Kennedy [ctb], Lily Medina [ctb], Brian Fannin [ctb], Jason Muhlenkamp [ctb], Matt Lehman [ctb], Bill Denney [ctb] (ORCID: ), Nic Crane [ctb], Andrew Bates [ctb], Vincent Arel-Bundock [ctb] (ORCID: ), Hideaki Hayashi [ctb], Luis Tobalina [ctb], Annie Wang [ctb], Wei Yang Tham [ctb], Clara Wang [ctb], Abby Smith [ctb] (ORCID: ), Jasper Cooper [ctb] (ORCID: ), E Auden Krauska [ctb] (ORCID: ), Alex Wang [ctb], Malcolm Barrett [ctb] (ORCID: ), Charles Gray [ctb] (ORCID: ), Jared Wilber [ctb], Vilmantas Gegzna [ctb] (ORCID: ), Eduard Szoecs [ctb], Frederik Aust [ctb] (ORCID: ), Angus Moore [ctb], Nick Williams [ctb], Marius Barth [ctb] (ORCID: ), Bruna Wundervald [ctb] (ORCID: ), Joyce Cahoon [ctb] (ORCID: ), Grant McDermott [ctb] (ORCID: ), Kevin Zarca [ctb], Shiro Kuriwaki [ctb] (ORCID: ), Lukas Wallrich [ctb] (ORCID: ), James Martherus [ctb] (ORCID: ), Chuliang Xiao [ctb] (ORCID: ), Joseph Larmarange [ctb], Max Kuhn [ctb], Michal Bojanowski [ctb], Hakon Malmedal [ctb], Clara Wang [ctb], Sergio Oller [ctb], Luke Sonnet [ctb], Jim Hester [ctb], Ben Schneider [ctb], Bernie Gray [ctb] (ORCID: ), Mara Averick [ctb], Aaron Jacobs [ctb], Andreas Bender [ctb], Sven Templer [ctb], Paul-Christian Buerkner [ctb], Matthew Kay [ctb], Erwan Le Pennec [ctb], Johan Junkka [ctb], Hao Zhu [ctb], Benjamin Soltoff [ctb], Zoe Wilkinson Saldana [ctb], Tyler Littlefield [ctb], Charles T. Gray [ctb], Shabbh E. Banks [ctb], Serina Robinson [ctb], Roger Bivand [ctb], Riinu Ots [ctb], Nicholas Williams [ctb], Nina Jakobsen [ctb], Michael Weylandt [ctb], Lisa Lendway [ctb], Karl Hailperin [ctb], Josue Rodriguez [ctb], Jenny Bryan [ctb], Chris Jarvis [ctb], Greg Macfarlane [ctb], Brian Mannakee [ctb], Drew Tyre [ctb], Shreyas Singh [ctb], Laurens Geffert [ctb], Hong Ooi [ctb], Henrik Bengtsson [ctb], Eduard Szocs [ctb], David Hugh-Jones [ctb], Matthieu Stigler [ctb], Hugo Tavares [ctb] (ORCID: ), R. Willem Vervoort [ctb], Brenton M. Wiernik [ctb], Josh Yamamoto [ctb], Jasme Lee [ctb], Taren Sanders [ctb] (ORCID: ), Ilaria Prosdocimi [ctb] (ORCID: ), Daniel D. Sjoberg [ctb] (ORCID: ), Alex Reinhart [ctb] (ORCID: )", + "Maintainer": "Emil Hvitfeldt ", + "Repository": "CRAN" + }, + "bslib": { + "Package": "bslib", + "Version": "0.10.0", + "Source": "Repository", + "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", + "Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )", + "Description": "Simplifies custom 'CSS' styling of both 'shiny' and 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 and 5 as well as their various 'Bootswatch' themes. An interactive widget is also provided for previewing themes in real time.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib", + "BugReports": "https://github.com/rstudio/bslib/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ + "base64enc", + "cachem", + "fastmap (>= 1.1.1)", + "grDevices", + "htmltools (>= 0.5.8)", + "jquerylib (>= 0.1.3)", + "jsonlite", + "lifecycle", + "memoise (>= 2.0.1)", + "mime", + "rlang", + "sass (>= 0.4.9)" + ], + "Suggests": [ + "brand.yml", + "bsicons", + "curl", + "fontawesome", + "future", + "ggplot2", + "knitr", + "lattice", + "magrittr", + "rappdirs", + "rmarkdown (>= 2.7)", + "shiny (>= 1.11.1)", + "testthat", + "thematic", + "tools", + "utils", + "withr", + "yaml" + ], + "Config/Needs/deploy": "BH, chiflights22, colourpicker, commonmark, cpp11, cpsievert/chiflights22, cpsievert/histoslider, dplyr, DT, ggplot2, ggridges, gt, hexbin, histoslider, htmlwidgets, lattice, leaflet, lubridate, markdown, modelr, plotly, reactable, reshape2, rprojroot, rsconnect, rstudio/shiny, scales, styler, tibble", + "Config/Needs/routine": "chromote, desc, renv", + "Config/Needs/website": "brio, crosstalk, dplyr, DT, ggplot2, glue, htmlwidgets, leaflet, lorem, palmerpenguins, plotly, purrr, rprojroot, rstudio/htmltools, scales, stringr, tidyr, webshot2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-code-editor.R' 'input-dark-mode.R' 'input-submit.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'toast.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (ORCID: ), Joe Cheng [aut], Garrick Aden-Buie [aut] (ORCID: ), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "cachem": { + "Package": "cachem", + "Version": "1.1.0", + "Source": "Repository", + "Title": "Cache R Objects with Automatic Pruning", + "Description": "Key-value stores with automatic pruning. Caches can limit either their total size or the age of the oldest object (or both), automatically pruning objects to maintain the constraints.", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", c(\"aut\", \"cre\")), person(family = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")))", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "ByteCompile": "true", + "URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem", + "Imports": [ + "rlang", + "fastmap (>= 1.2.0)" + ], + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.2.3", + "Config/Needs/routine": "lobstr", + "Config/Needs/website": "pkgdown", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "callr": { + "Package": "callr", + "Version": "3.7.6", + "Source": "Repository", + "Title": "Call R from R", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Ascent Digital Services\", role = c(\"cph\", \"fnd\")) )", + "Description": "It is sometimes useful to perform a computation in a separate R process, without affecting the current R process at all. This packages does exactly that.", + "License": "MIT + file LICENSE", + "URL": "https://callr.r-lib.org, https://github.com/r-lib/callr", + "BugReports": "https://github.com/r-lib/callr/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "processx (>= 3.6.1)", + "R6", + "utils" + ], + "Suggests": [ + "asciicast (>= 2.3.1)", + "cli (>= 1.1.0)", + "mockery", + "ps", + "rprojroot", + "spelling", + "testthat (>= 3.2.0)", + "withr (>= 2.3.0)" + ], + "Config/Needs/website": "r-lib/asciicast, glue, htmlwidgets, igraph, tibble, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.1.9000", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre, cph] (), Winston Chang [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "cellranger": { + "Package": "cellranger", + "Version": "1.1.0", + "Source": "Repository", + "Title": "Translate Spreadsheet Cell Ranges to Rows and Columns", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@stat.ubc.ca\", c(\"cre\", \"aut\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", \"ctb\") )", + "Description": "Helper functions to work with spreadsheets and the \"A1:D10\" style of cell range specification.", + "Depends": [ + "R (>= 3.0.0)" + ], + "License": "MIT + file LICENSE", + "LazyData": "true", + "URL": "https://github.com/rsheets/cellranger", + "BugReports": "https://github.com/rsheets/cellranger/issues", + "Suggests": [ + "covr", + "testthat (>= 1.0.0)", + "knitr", + "rmarkdown" + ], + "RoxygenNote": "5.0.1.9000", + "VignetteBuilder": "knitr", + "Imports": [ + "rematch", + "tibble" + ], + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [cre, aut], Hadley Wickham [ctb]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" }, "class": { "Package": "class", - "Version": "7.3-19", + "Version": "7.3-23", "Source": "Repository", - "Repository": "CRAN", - "Hash": "1593b7beb067c8381c0d24e38bd778e0" + "Priority": "recommended", + "Date": "2025-01-01", + "Depends": [ + "R (>= 3.0.0)", + "stats", + "utils" + ], + "Imports": [ + "MASS" + ], + "Authors@R": "c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\"), email = \"Brian.Ripley@R-project.org\"), person(\"William\", \"Venables\", role = \"cph\"))", + "Description": "Various functions for classification, including k-nearest neighbour, Learning Vector Quantization and Self-Organizing Maps.", + "Title": "Functions for Classification", + "ByteCompile": "yes", + "License": "GPL-2 | GPL-3", + "URL": "http://www.stats.ox.ac.uk/pub/MASS4/", + "NeedsCompilation": "yes", + "Author": "Brian Ripley [aut, cre, cph], William Venables [cph]", + "Maintainer": "Brian Ripley ", + "Repository": "CRAN" + }, + "classInt": { + "Package": "classInt", + "Version": "0.4-11", + "Source": "Repository", + "Date": "2025-01-06", + "Title": "Choose Univariate Class Intervals", + "Authors@R": "c( person(\"Roger\", \"Bivand\", role=c(\"aut\", \"cre\"), email=\"Roger.Bivand@nhh.no\", comment=c(ORCID=\"0000-0003-2392-6140\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment=c(ORCID=\"0000-0002-5759-428X\")), person(\"Richard\", \"Dunlap\", role=\"ctb\"), person(\"Diego\", \"Hernangómez\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8457-4658\")), person(\"Hisaji\", \"Ono\", role=\"ctb\"), person(\"Josiah\", \"Parry\", role = \"ctb\", comment = c(ORCID = \"0000-0001-9910-865X\")), person(\"Matthieu\", \"Stigler\", role=\"ctb\", comment =c(ORCID=\"0000-0002-6802-4290\")))", + "Depends": [ + "R (>= 2.2)" + ], + "Imports": [ + "grDevices", + "stats", + "graphics", + "e1071", + "class", + "KernSmooth" + ], + "Suggests": [ + "spData (>= 0.2.6.2)", + "units", + "knitr", + "rmarkdown", + "tinytest" + ], + "NeedsCompilation": "yes", + "Description": "Selected commonly used methods for choosing univariate class intervals for mapping or other graphics purposes.", + "License": "GPL (>= 2)", + "URL": "https://r-spatial.github.io/classInt/, https://github.com/r-spatial/classInt/", + "BugReports": "https://github.com/r-spatial/classInt/issues/", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "VignetteBuilder": "knitr", + "Author": "Roger Bivand [aut, cre] (), Bill Denney [ctb] (), Richard Dunlap [ctb], Diego Hernangómez [ctb] (), Hisaji Ono [ctb], Josiah Parry [ctb] (), Matthieu Stigler [ctb] ()", + "Maintainer": "Roger Bivand ", + "Repository": "CRAN" + }, + "cli": { + "Package": "cli", + "Version": "3.6.5", + "Source": "Repository", + "Title": "Helpers for Developing Command Line Interfaces", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"gabor@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kirill\", \"Müller\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", , \"salim-b@pm.me\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A suite of tools to build attractive command line interfaces ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs, etc. Supports custom themes via a 'CSS'-like language. It also contains a number of lower level 'CLI' elements: rules, boxes, trees, and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI colors and text styles as well.", + "License": "MIT + file LICENSE", + "URL": "https://cli.r-lib.org, https://github.com/r-lib/cli", + "BugReports": "https://github.com/r-lib/cli/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "utils" + ], + "Suggests": [ + "callr", + "covr", + "crayon", + "digest", + "glue (>= 1.6.0)", + "grDevices", + "htmltools", + "htmlwidgets", + "knitr", + "methods", + "processx", + "ps (>= 1.3.4.9000)", + "rlang (>= 1.0.2.9003)", + "rmarkdown", + "rprojroot", + "rstudioapi", + "testthat (>= 3.2.0)", + "tibble", + "whoami", + "withr" + ], + "Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc, fansi, prettyunits, sessioninfo, tidyverse/tidytemplate, usethis, vctrs", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Hadley Wickham [ctb], Kirill Müller [ctb], Salim Brüggemann [ctb] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "clipr": { + "Package": "clipr", + "Version": "0.8.0", + "Source": "Repository", + "Type": "Package", + "Title": "Read and Write from the System Clipboard", + "Authors@R": "c( person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4387-3384\")), person(\"Louis\", \"Maddox\", role = \"ctb\"), person(\"Steve\", \"Simpson\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\") )", + "Description": "Simple utility functions to read from and write to the Windows, OS X, and X11 clipboards.", + "License": "GPL-3", + "URL": "https://github.com/mdlincoln/clipr, http://matthewlincoln.net/clipr/", + "BugReports": "https://github.com/mdlincoln/clipr/issues", + "Imports": [ + "utils" + ], + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "rstudioapi (>= 0.5)", + "testthat (>= 2.0.0)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.1.2", + "SystemRequirements": "xclip (https://github.com/astrand/xclip) or xsel (http://www.vergenet.net/~conrad/software/xsel/) for accessing the X11 clipboard, or wl-clipboard (https://github.com/bugaevc/wl-clipboard) for systems using Wayland.", + "NeedsCompilation": "no", + "Author": "Matthew Lincoln [aut, cre] (), Louis Maddox [ctb], Steve Simpson [ctb], Jennifer Bryan [ctb]", + "Maintainer": "Matthew Lincoln ", + "Repository": "CRAN" }, "codetools": { "Package": "codetools", - "Version": "0.2-18", + "Version": "0.2-20", "Source": "Repository", - "Repository": "CRAN", - "Hash": "019388fc48e48b3da0d3a76ff94608a8" + "Priority": "recommended", + "Author": "Luke Tierney ", + "Description": "Code analysis tools for R.", + "Title": "Code Analysis Tools for R", + "Depends": [ + "R (>= 2.1)" + ], + "Maintainer": "Luke Tierney ", + "URL": "https://gitlab.com/luke-tierney/codetools", + "License": "GPL", + "NeedsCompilation": "no", + "Repository": "CRAN" + }, + "colourvalues": { + "Package": "colourvalues", + "Version": "0.3.11", + "Source": "Repository", + "Type": "Package", + "Title": "Assigns Colours to Values", + "Date": "2025-11-29", + "Authors@R": "c( person(\"David\", \"Cooley\", ,\"dcooley@symbolix.com.au\", role = c(\"aut\", \"cre\")) )", + "Description": "Maps one of the viridis colour palettes, or a user-specified palette to values. Viridis colour maps are created by Stéfan van der Walt and Nathaniel Smith, and were set as the default palette for the 'Python' 'Matplotlib' library . Other palettes available in this library have been derived from 'RColorBrewer' and 'colorspace' packages.", + "License": "GPL-3", + "URL": "https://symbolixau.github.io/colourvalues/", + "BugReports": "https://github.com/SymbolixAU/colourvalues/issues", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.3.0)" + ], + "SystemRequirements": "C++17", + "LinkingTo": [ + "BH (>= 1.81.0)", + "Rcpp (>= 1.1.0)" + ], + "Imports": [ + "graphics", + "Rcpp (>= 1.1.0)" + ], + "RoxygenNote": "7.3.3", + "Suggests": [ + "covr", + "microbenchmark", + "scales", + "testthat", + "viridisLite" + ], + "NeedsCompilation": "yes", + "Author": "David Cooley [aut, cre]", + "Maintainer": "David Cooley ", + "Repository": "CRAN" + }, + "commonmark": { + "Package": "commonmark", + "Version": "2.0.0", + "Source": "Repository", + "Type": "Package", + "Title": "High Performance CommonMark and Github Markdown Rendering in R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", ,\"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"John MacFarlane\", role = \"cph\", comment = \"Author of cmark\"))", + "Description": "The CommonMark specification defines a rationalized version of markdown syntax. This package uses the 'cmark' reference implementation for converting markdown text into various formats including html, latex and groff man. In addition it exposes the markdown parse tree in xml format. Also includes opt-in support for GFM extensions including tables, autolinks, and strikethrough text.", + "License": "BSD_2_clause + file LICENSE", + "URL": "https://docs.ropensci.org/commonmark/ https://ropensci.r-universe.dev/commonmark", + "BugReports": "https://github.com/r-lib/commonmark/issues", + "Suggests": [ + "curl", + "testthat", + "xml2" + ], + "RoxygenNote": "7.3.2", + "Language": "en-US", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), John MacFarlane [cph] (Author of cmark)", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "conflicted": { + "Package": "conflicted", + "Version": "1.2.0", + "Source": "Repository", + "Title": "An Alternative Conflict Resolution Strategy", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "R's default conflict management system gives the most recently loaded package precedence. This can make it hard to detect conflicts, particularly when they arise because a package update creates ambiguity that did not previously exist. 'conflicted' takes a different approach, making every conflict an error and forcing you to choose which function to use.", + "License": "MIT + file LICENSE", + "URL": "https://conflicted.r-lib.org/, https://github.com/r-lib/conflicted", + "BugReports": "https://github.com/r-lib/conflicted/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "memoise", + "rlang (>= 1.0.0)" + ], + "Suggests": [ + "callr", + "covr", + "dplyr", + "Matrix", + "methods", + "pkgload", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "cpp11": { + "Package": "cpp11", + "Version": "0.5.3", + "Source": "Repository", + "Title": "A C++11 Interface for R's C Interface", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", email = \"davis@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Jim\",\"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Benjamin\", \"Kietzman\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a header only, C++11 interface to R's C interface. Compared to other approaches 'cpp11' strives to be safe against long jumps from the C API as well as C++ exceptions, conform to normal R function semantics and supports interaction with 'ALTREP' vectors.", + "License": "MIT + file LICENSE", + "URL": "https://cpp11.r-lib.org, https://github.com/r-lib/cpp11", + "BugReports": "https://github.com/r-lib/cpp11/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "bench", + "brio", + "callr", + "cli", + "covr", + "decor", + "desc", + "ggplot2", + "glue", + "knitr", + "lobstr", + "mockery", + "progress", + "rmarkdown", + "scales", + "Rcpp", + "testthat (>= 3.2.0)", + "tibble", + "utils", + "vctrs", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/Needs/cpp11/cpp_register": "brio, cli, decor, desc, glue, tibble, vctrs", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Davis Vaughan [aut, cre] (ORCID: ), Jim Hester [aut] (ORCID: ), Romain François [aut] (ORCID: ), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.3", + "Source": "Repository", + "Title": "Colored Terminal Output", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Brodie\", \"Gaslam\", , \"brodie.gaslam@yahoo.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The crayon package is now superseded. Please use the 'cli' package for new projects. Colored terminal output on terminals that support 'ANSI' color and highlight codes. It also works in 'Emacs' 'ESS'. 'ANSI' color support is automatically detected. Colors and highlighting can be combined and nested. New styles can also be created easily. This package was inspired by the 'chalk' 'JavaScript' project.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.github.io/crayon/, https://github.com/r-lib/crayon", + "BugReports": "https://github.com/r-lib/crayon/issues", + "Imports": [ + "grDevices", + "methods", + "utils" + ], + "Suggests": [ + "mockery", + "rstudioapi", + "testthat", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Collate": "'aaa-rstudio-detect.R' 'aaaa-rematch2.R' 'aab-num-ansi-colors.R' 'aac-num-ansi-colors.R' 'ansi-256.R' 'ansi-palette.R' 'combine.R' 'string.R' 'utils.R' 'crayon-package.R' 'disposable.R' 'enc-utils.R' 'has_ansi.R' 'has_color.R' 'link.R' 'styles.R' 'machinery.R' 'parts.R' 'print.R' 'style-var.R' 'show.R' 'string_operations.R'", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Brodie Gaslam [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "credentials": { + "Package": "credentials", + "Version": "2.0.3", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for Managing SSH and Git Credentials", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Setup and retrieve HTTPS and SSH credentials for use with 'git' and other services. For HTTPS remotes the package interfaces the 'git-credential' utility which 'git' uses to store HTTP usernames and passwords. For SSH remotes we provide convenient functions to find or generate appropriate SSH keys. The package both helps the user to setup a local git installation, and also provides a back-end for git/ssh client libraries to authenticate with existing user credentials.", + "License": "MIT + file LICENSE", + "SystemRequirements": "git (optional)", + "Encoding": "UTF-8", + "Imports": [ + "openssl (>= 1.3)", + "sys (>= 2.1)", + "curl", + "jsonlite", + "askpass" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown" + ], + "RoxygenNote": "7.2.1", + "VignetteBuilder": "knitr", + "Language": "en-US", + "URL": "https://docs.ropensci.org/credentials/ https://r-lib.r-universe.dev/credentials", + "BugReports": "https://github.com/r-lib/credentials/issues", + "NeedsCompilation": "no", + "Author": "Jeroen Ooms [aut, cre] (ORCID: )", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "crosstalk": { + "Package": "crosstalk", + "Version": "1.2.2", + "Source": "Repository", + "Type": "Package", + "Title": "Inter-Widget Interactivity for HTML Widgets", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Kristopher Michael\", \"Kowal\", role = c(\"ctb\", \"cph\"), comment = \"es5-shim library\"), person(, \"es5-shim contributors\", role = c(\"ctb\", \"cph\"), comment = \"es5-shim library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\") )", + "Description": "Provides building blocks for allowing HTML widgets to communicate with each other, with Shiny or without (i.e. static .html files). Currently supports linked brushing and filtering.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/crosstalk/, https://github.com/rstudio/crosstalk", + "BugReports": "https://github.com/rstudio/crosstalk/issues", + "Imports": [ + "htmltools (>= 0.3.6)", + "jsonlite", + "lazyeval", + "R6" + ], + "Suggests": [ + "bslib", + "ggplot2", + "sass", + "shiny", + "testthat (>= 2.1.0)" + ], + "Config/Needs/website": "jcheng5/d3scatter, DT, leaflet, rmarkdown", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Brian Reavis [ctb, cph] (selectize.js library), Kristopher Michael Kowal [ctb, cph] (es5-shim library), es5-shim contributors [ctb, cph] (es5-shim library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "crul": { + "Package": "crul", + "Version": "1.6.0", + "Source": "Repository", + "Title": "HTTP Client", + "Description": "A simple HTTP client, with tools for making HTTP requests, and mocking HTTP requests. The package is built on R6, and takes inspiration from Ruby's 'faraday' gem (). The package name is a play on curl, the widely used command line tool for HTTP, and this package is built on top of the R package 'curl', an interface to 'libcurl' ().", + "License": "MIT + file LICENSE", + "Authors@R": "c( person(\"Scott\", \"Chamberlain\", role = c(\"aut\", \"cre\"), email = \"myrmecocystus@gmail.com\", comment = c(ORCID = \"0000-0003-1444-9135\")) )", + "URL": "https://docs.ropensci.org/crul/, https://github.com/ropensci/crul, https://books.ropensci.org/http-testing/", + "BugReports": "https://github.com/ropensci/crul/issues", + "Encoding": "UTF-8", + "Language": "en-US", + "Imports": [ + "curl (>= 3.3)", + "R6 (>= 2.2.0)", + "urltools (>= 1.6.0)", + "httpcode (>= 0.2.0)", + "jsonlite", + "mime", + "rlang", + "lifecycle" + ], + "Suggests": [ + "testthat (>= 3.0.0)", + "roxygen2 (>= 7.1.1)", + "fauxpas (>= 0.1.0)", + "webmockr (>= 2.2.0)", + "withr", + "knitr", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "X-schema.org-applicationCategory": "Web", + "X-schema.org-keywords": "http, https, API, web-services, curl, download, libcurl, async, mocking, caching", + "X-schema.org-isPartOf": "https://ropensci.org", + "NeedsCompilation": "no", + "Author": "Scott Chamberlain [aut, cre] (ORCID: )", + "Maintainer": "Scott Chamberlain ", + "Repository": "CRAN" + }, + "curl": { + "Package": "curl", + "Version": "7.0.0", + "Source": "Repository", + "Type": "Package", + "Title": "A Modern and Flexible Web Client for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Posit Software, PBC\", role = \"cph\"))", + "Description": "Bindings to 'libcurl' for performing fully configurable HTTP/FTP requests where responses can be processed in memory, on disk, or streaming via the callback or connection interfaces. Some knowledge of 'libcurl' is recommended; for a more-user-friendly web client see the 'httr2' package which builds on this package with http specific tools and logic.", + "License": "MIT + file LICENSE", + "SystemRequirements": "libcurl (>= 7.73): libcurl-devel (rpm) or libcurl4-openssl-dev (deb)", + "URL": "https://jeroen.r-universe.dev/curl", + "BugReports": "https://github.com/jeroen/curl/issues", + "Suggests": [ + "spelling", + "testthat (>= 1.0.0)", + "knitr", + "jsonlite", + "later", + "rmarkdown", + "httpuv (>= 1.4.4)", + "webutils" + ], + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 3.0.0)" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Hadley Wickham [ctb], Posit Software, PBC [cph]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "data.table": { + "Package": "data.table", + "Version": "1.18.2.1", + "Source": "Repository", + "Title": "Extension of `data.frame`", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "bit64 (>= 4.0.0)", + "bit (>= 4.0.4)", + "R.utils (>= 2.13.0)", + "xts", + "zoo (>= 1.8-1)", + "yaml", + "knitr", + "markdown" + ], + "Description": "Fast aggregation of large data (e.g. 100GB in RAM), fast ordered joins, fast add/modify/delete of columns by group using no copies at all, list columns, friendly and fast character-separated-value read/write. Offers a natural and flexible syntax, for faster development.", + "License": "MPL-2.0 | file LICENSE", + "URL": "https://r-datatable.com, https://Rdatatable.gitlab.io/data.table, https://github.com/Rdatatable/data.table", + "BugReports": "https://github.com/Rdatatable/data.table/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "ByteCompile": "TRUE", + "Authors@R": "c( person(\"Tyson\",\"Barrett\", role=c(\"aut\",\"cre\"), email=\"t.barrett88@gmail.com\", comment = c(ORCID=\"0000-0002-2137-1391\")), person(\"Matt\",\"Dowle\", role=\"aut\", email=\"mattjdowle@gmail.com\"), person(\"Arun\",\"Srinivasan\", role=\"aut\", email=\"asrini@pm.me\"), person(\"Jan\",\"Gorecki\", role=\"aut\", email=\"j.gorecki@wit.edu.pl\"), person(\"Michael\",\"Chirico\", role=\"aut\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\")), person(\"Toby\",\"Hocking\", role=\"aut\", email=\"toby.hocking@r-project.org\", comment = c(ORCID=\"0000-0002-3146-0865\")), person(\"Benjamin\",\"Schwendinger\",role=\"aut\", comment = c(ORCID=\"0000-0003-3315-8114\")), person(\"Ivan\", \"Krylov\", role=\"aut\", email=\"ikrylov@disroot.org\", comment = c(ORCID=\"0000-0002-0172-3812\")), person(\"Pasha\",\"Stetsenko\", role=\"ctb\"), person(\"Tom\",\"Short\", role=\"ctb\"), person(\"Steve\",\"Lianoglou\", role=\"ctb\"), person(\"Eduard\",\"Antonyan\", role=\"ctb\"), person(\"Markus\",\"Bonsch\", role=\"ctb\"), person(\"Hugh\",\"Parsonage\", role=\"ctb\"), person(\"Scott\",\"Ritchie\", role=\"ctb\"), person(\"Kun\",\"Ren\", role=\"ctb\"), person(\"Xianying\",\"Tan\", role=\"ctb\"), person(\"Rick\",\"Saporta\", role=\"ctb\"), person(\"Otto\",\"Seiskari\", role=\"ctb\"), person(\"Xianghui\",\"Dong\", role=\"ctb\"), person(\"Michel\",\"Lang\", role=\"ctb\"), person(\"Watal\",\"Iwasaki\", role=\"ctb\"), person(\"Seth\",\"Wenchel\", role=\"ctb\"), person(\"Karl\",\"Broman\", role=\"ctb\"), person(\"Tobias\",\"Schmidt\", role=\"ctb\"), person(\"David\",\"Arenburg\", role=\"ctb\"), person(\"Ethan\",\"Smith\", role=\"ctb\"), person(\"Francois\",\"Cocquemas\", role=\"ctb\"), person(\"Matthieu\",\"Gomez\", role=\"ctb\"), person(\"Philippe\",\"Chataignon\", role=\"ctb\"), person(\"Nello\",\"Blaser\", role=\"ctb\"), person(\"Dmitry\",\"Selivanov\", role=\"ctb\"), person(\"Andrey\",\"Riabushenko\", role=\"ctb\"), person(\"Cheng\",\"Lee\", role=\"ctb\"), person(\"Declan\",\"Groves\", role=\"ctb\"), person(\"Daniel\",\"Possenriede\", role=\"ctb\"), person(\"Felipe\",\"Parages\", role=\"ctb\"), person(\"Denes\",\"Toth\", role=\"ctb\"), person(\"Mus\",\"Yaramaz-David\", role=\"ctb\"), person(\"Ayappan\",\"Perumal\", role=\"ctb\"), person(\"James\",\"Sams\", role=\"ctb\"), person(\"Martin\",\"Morgan\", role=\"ctb\"), person(\"Michael\",\"Quinn\", role=\"ctb\"), person(given=\"@javrucebo\", role=\"ctb\", comment=\"GitHub user\"), person(\"Marc\",\"Halperin\", role=\"ctb\"), person(\"Roy\",\"Storey\", role=\"ctb\"), person(\"Manish\",\"Saraswat\", role=\"ctb\"), person(\"Morgan\",\"Jacob\", role=\"ctb\"), person(\"Michael\",\"Schubmehl\", role=\"ctb\"), person(\"Davis\",\"Vaughan\", role=\"ctb\"), person(\"Leonardo\",\"Silvestri\", role=\"ctb\"), person(\"Jim\",\"Hester\", role=\"ctb\"), person(\"Anthony\",\"Damico\", role=\"ctb\"), person(\"Sebastian\",\"Freundt\", role=\"ctb\"), person(\"David\",\"Simons\", role=\"ctb\"), person(\"Elliott\",\"Sales de Andrade\", role=\"ctb\"), person(\"Cole\",\"Miller\", role=\"ctb\"), person(\"Jens Peder\",\"Meldgaard\", role=\"ctb\"), person(\"Vaclav\",\"Tlapak\", role=\"ctb\"), person(\"Kevin\",\"Ushey\", role=\"ctb\"), person(\"Dirk\",\"Eddelbuettel\", role=\"ctb\"), person(\"Tony\",\"Fischetti\", role=\"ctb\"), person(\"Ofek\",\"Shilon\", role=\"ctb\"), person(\"Vadim\",\"Khotilovich\", role=\"ctb\"), person(\"Hadley\",\"Wickham\", role=\"ctb\"), person(\"Bennet\",\"Becker\", role=\"ctb\"), person(\"Kyle\",\"Haynes\", role=\"ctb\"), person(\"Boniface Christian\",\"Kamgang\", role=\"ctb\"), person(\"Olivier\",\"Delmarcell\", role=\"ctb\"), person(\"Josh\",\"O'Brien\", role=\"ctb\"), person(\"Dereck\",\"de Mezquita\", role=\"ctb\"), person(\"Michael\",\"Czekanski\", role=\"ctb\"), person(\"Dmitry\", \"Shemetov\", role=\"ctb\"), person(\"Nitish\", \"Jha\", role=\"ctb\"), person(\"Joshua\", \"Wu\", role=\"ctb\"), person(\"Iago\", \"Giné-Vázquez\", role=\"ctb\"), person(\"Anirban\", \"Chetia\", role=\"ctb\"), person(\"Doris\", \"Amoakohene\", role=\"ctb\"), person(\"Angel\", \"Feliz\", role=\"ctb\"), person(\"Michael\",\"Young\", role=\"ctb\"), person(\"Mark\", \"Seeto\", role=\"ctb\"), person(\"Philippe\", \"Grosjean\", role=\"ctb\"), person(\"Vincent\", \"Runge\", role=\"ctb\"), person(\"Christian\", \"Wia\", role=\"ctb\"), person(\"Elise\", \"Maigné\", role=\"ctb\"), person(\"Vincent\", \"Rocher\", role=\"ctb\"), person(\"Vijay\", \"Lulla\", role=\"ctb\"), person(\"Aljaž\", \"Sluga\", role=\"ctb\"), person(\"Bill\", \"Evans\", role=\"ctb\"), person(\"Reino\", \"Bruner\", role=\"ctb\"), person(given=\"@badasahog\", role=\"ctb\", comment=\"GitHub user\"), person(\"Vinit\", \"Thakur\", role=\"ctb\"), person(\"Mukul\", \"Kumar\", role=\"ctb\"), person(\"Ildikó\", \"Czeller\", role=\"ctb\"), person(\"Manmita\", \"Das\", role=\"ctb\") )", + "NeedsCompilation": "yes", + "Author": "Tyson Barrett [aut, cre] (ORCID: ), Matt Dowle [aut], Arun Srinivasan [aut], Jan Gorecki [aut], Michael Chirico [aut] (ORCID: ), Toby Hocking [aut] (ORCID: ), Benjamin Schwendinger [aut] (ORCID: ), Ivan Krylov [aut] (ORCID: ), Pasha Stetsenko [ctb], Tom Short [ctb], Steve Lianoglou [ctb], Eduard Antonyan [ctb], Markus Bonsch [ctb], Hugh Parsonage [ctb], Scott Ritchie [ctb], Kun Ren [ctb], Xianying Tan [ctb], Rick Saporta [ctb], Otto Seiskari [ctb], Xianghui Dong [ctb], Michel Lang [ctb], Watal Iwasaki [ctb], Seth Wenchel [ctb], Karl Broman [ctb], Tobias Schmidt [ctb], David Arenburg [ctb], Ethan Smith [ctb], Francois Cocquemas [ctb], Matthieu Gomez [ctb], Philippe Chataignon [ctb], Nello Blaser [ctb], Dmitry Selivanov [ctb], Andrey Riabushenko [ctb], Cheng Lee [ctb], Declan Groves [ctb], Daniel Possenriede [ctb], Felipe Parages [ctb], Denes Toth [ctb], Mus Yaramaz-David [ctb], Ayappan Perumal [ctb], James Sams [ctb], Martin Morgan [ctb], Michael Quinn [ctb], @javrucebo [ctb] (GitHub user), Marc Halperin [ctb], Roy Storey [ctb], Manish Saraswat [ctb], Morgan Jacob [ctb], Michael Schubmehl [ctb], Davis Vaughan [ctb], Leonardo Silvestri [ctb], Jim Hester [ctb], Anthony Damico [ctb], Sebastian Freundt [ctb], David Simons [ctb], Elliott Sales de Andrade [ctb], Cole Miller [ctb], Jens Peder Meldgaard [ctb], Vaclav Tlapak [ctb], Kevin Ushey [ctb], Dirk Eddelbuettel [ctb], Tony Fischetti [ctb], Ofek Shilon [ctb], Vadim Khotilovich [ctb], Hadley Wickham [ctb], Bennet Becker [ctb], Kyle Haynes [ctb], Boniface Christian Kamgang [ctb], Olivier Delmarcell [ctb], Josh O'Brien [ctb], Dereck de Mezquita [ctb], Michael Czekanski [ctb], Dmitry Shemetov [ctb], Nitish Jha [ctb], Joshua Wu [ctb], Iago Giné-Vázquez [ctb], Anirban Chetia [ctb], Doris Amoakohene [ctb], Angel Feliz [ctb], Michael Young [ctb], Mark Seeto [ctb], Philippe Grosjean [ctb], Vincent Runge [ctb], Christian Wia [ctb], Elise Maigné [ctb], Vincent Rocher [ctb], Vijay Lulla [ctb], Aljaž Sluga [ctb], Bill Evans [ctb], Reino Bruner [ctb], @badasahog [ctb] (GitHub user), Vinit Thakur [ctb], Mukul Kumar [ctb], Ildikó Czeller [ctb], Manmita Das [ctb]", + "Maintainer": "Tyson Barrett ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "dbplyr": { + "Package": "dbplyr", + "Version": "2.5.2", + "Source": "Repository", + "Type": "Package", + "Title": "A 'dplyr' Back End for Databases", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Edgar\", \"Ruiz\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A 'dplyr' back end for databases that allows you to work with remote database tables as if they are in-memory data frames. Basic features works with any database that has a 'DBI' back end; more advanced features require 'SQL' translation to be provided by the package author.", + "License": "MIT + file LICENSE", + "URL": "https://dbplyr.tidyverse.org/, https://github.com/tidyverse/dbplyr", + "BugReports": "https://github.com/tidyverse/dbplyr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "blob (>= 1.2.0)", + "cli (>= 3.6.1)", + "DBI (>= 1.1.3)", + "dplyr (>= 1.1.2)", + "glue (>= 1.6.2)", + "lifecycle (>= 1.0.3)", + "magrittr", + "methods", + "pillar (>= 1.9.0)", + "purrr (>= 1.0.1)", + "R6 (>= 2.2.2)", + "rlang (>= 1.1.1)", + "tibble (>= 3.2.1)", + "tidyr (>= 1.3.0)", + "tidyselect (>= 1.2.1)", + "utils", + "vctrs (>= 0.6.3)", + "withr (>= 2.5.0)" + ], + "Suggests": [ + "bit64", + "covr", + "knitr", + "Lahman", + "nycflights13", + "odbc (>= 1.4.2)", + "RMariaDB (>= 1.2.2)", + "rmarkdown", + "RPostgres (>= 1.4.5)", + "RPostgreSQL", + "RSQLite (>= 2.3.8)", + "testthat (>= 3.1.10)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Encoding": "UTF-8", + "Language": "en-gb", + "RoxygenNote": "7.3.3", + "Collate": "'db-sql.R' 'utils-check.R' 'import-standalone-types-check.R' 'import-standalone-obj-type.R' 'utils.R' 'sql.R' 'escape.R' 'translate-sql-cut.R' 'translate-sql-quantile.R' 'translate-sql-string.R' 'translate-sql-paste.R' 'translate-sql-helpers.R' 'translate-sql-window.R' 'translate-sql-conditional.R' 'backend-.R' 'backend-access.R' 'backend-hana.R' 'backend-hive.R' 'backend-impala.R' 'verb-copy-to.R' 'backend-mssql.R' 'backend-mysql.R' 'backend-odbc.R' 'backend-oracle.R' 'backend-postgres.R' 'backend-postgres-old.R' 'backend-redshift.R' 'backend-snowflake.R' 'backend-spark-sql.R' 'backend-sqlite.R' 'backend-teradata.R' 'build-sql.R' 'data-cache.R' 'data-lahman.R' 'data-nycflights13.R' 'db-escape.R' 'db-io.R' 'db.R' 'dbplyr.R' 'explain.R' 'ident.R' 'import-standalone-s3-register.R' 'join-by-compat.R' 'join-cols-compat.R' 'lazy-join-query.R' 'lazy-ops.R' 'lazy-query.R' 'lazy-select-query.R' 'lazy-set-op-query.R' 'memdb.R' 'optimise-utils.R' 'pillar.R' 'progress.R' 'sql-build.R' 'query-join.R' 'query-select.R' 'query-semi-join.R' 'query-set-op.R' 'query.R' 'reexport.R' 'remote.R' 'rows.R' 'schema.R' 'simulate.R' 'sql-clause.R' 'sql-expr.R' 'src-sql.R' 'src_dbi.R' 'table-name.R' 'tbl-lazy.R' 'tbl-sql.R' 'test-frame.R' 'testthat.R' 'tidyeval-across.R' 'tidyeval.R' 'translate-sql.R' 'utils-format.R' 'verb-arrange.R' 'verb-compute.R' 'verb-count.R' 'verb-distinct.R' 'verb-do-query.R' 'verb-do.R' 'verb-expand.R' 'verb-fill.R' 'verb-filter.R' 'verb-group_by.R' 'verb-head.R' 'verb-joins.R' 'verb-mutate.R' 'verb-pivot-longer.R' 'verb-pivot-wider.R' 'verb-pull.R' 'verb-select.R' 'verb-set-ops.R' 'verb-slice.R' 'verb-summarise.R' 'verb-uncount.R' 'verb-window.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Maximilian Girlich [aut], Edgar Ruiz [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "desc": { + "Package": "desc", + "Version": "1.4.3", + "Source": "Repository", + "Title": "Manipulate DESCRIPTION Files", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", role = \"aut\"), person(\"Jim\", \"Hester\", , \"james.f.hester@gmail.com\", role = \"aut\"), person(\"Maëlle\", \"Salmon\", role = \"ctb\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Maintainer": "Gábor Csárdi ", + "Description": "Tools to read, write, create, and manipulate DESCRIPTION files. It is intended for packages that create or manipulate other packages.", + "License": "MIT + file LICENSE", + "URL": "https://desc.r-lib.org/, https://github.com/r-lib/desc", + "BugReports": "https://github.com/r-lib/desc/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "cli", + "R6", + "utils" + ], + "Suggests": [ + "callr", + "covr", + "gh", + "spelling", + "testthat", + "whoami", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "Collate": "'assertions.R' 'authors-at-r.R' 'built.R' 'classes.R' 'collate.R' 'constants.R' 'deps.R' 'desc-package.R' 'description.R' 'encoding.R' 'find-package-root.R' 'latex.R' 'non-oo-api.R' 'package-archives.R' 'read.R' 'remotes.R' 'str.R' 'syntax_checks.R' 'urls.R' 'utils.R' 'validate.R' 'version.R'", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Kirill Müller [aut], Jim Hester [aut], Maëlle Salmon [ctb] (), Posit Software, PBC [cph, fnd]", + "Repository": "CRAN" + }, + "devtools": { + "Package": "devtools", + "Version": "2.4.6", + "Source": "Repository", + "Title": "Tools to Make Developing R Packages Easier", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Collection of package development tools.", + "License": "MIT + file LICENSE", + "URL": "https://devtools.r-lib.org/, https://github.com/r-lib/devtools", + "BugReports": "https://github.com/r-lib/devtools/issues", + "Depends": [ + "R (>= 4.1)", + "usethis (>= 3.2.1)" + ], + "Imports": [ + "cli (>= 3.6.5)", + "desc (>= 1.4.3)", + "ellipsis (>= 0.3.2)", + "fs (>= 1.6.6)", + "lifecycle (>= 1.0.4)", + "memoise (>= 2.0.1)", + "miniUI (>= 0.1.2)", + "pkgbuild (>= 1.4.8)", + "pkgdown (>= 2.1.3)", + "pkgload (>= 1.4.1)", + "profvis (>= 0.4.0)", + "rcmdcheck (>= 1.4.0)", + "remotes (>= 2.5.0)", + "rlang (>= 1.1.6)", + "roxygen2 (>= 7.3.3)", + "rversions (>= 2.1.2)", + "sessioninfo (>= 1.2.3)", + "stats", + "testthat (>= 3.2.3)", + "tools", + "urlchecker (>= 1.0.1)", + "utils", + "withr (>= 3.0.2)" + ], + "Suggests": [ + "BiocManager (>= 1.30.18)", + "callr (>= 3.7.1)", + "covr (>= 3.5.1)", + "curl (>= 4.3.2)", + "digest (>= 0.6.29)", + "DT (>= 0.23)", + "foghorn (>= 1.4.2)", + "gh (>= 1.3.0)", + "gmailr (>= 1.0.1)", + "httr (>= 1.4.3)", + "knitr (>= 1.39)", + "lintr (>= 3.0.0)", + "MASS", + "mockery (>= 0.4.3)", + "pingr (>= 2.0.1)", + "rhub (>= 1.1.1)", + "rmarkdown (>= 2.14)", + "rstudioapi (>= 0.13)", + "spelling (>= 2.2)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut], Jennifer Bryan [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "diffobj": { + "Package": "diffobj", + "Version": "0.3.6", + "Source": "Repository", + "Type": "Package", + "Title": "Diffs for R Objects", + "Description": "Generate a colorized diff of two R objects for an intuitive visualization of their differences.", + "Authors@R": "c( person( \"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\", role=c(\"aut\", \"cre\")), person( \"Michael B.\", \"Allen\", email=\"ioplex@gmail.com\", role=c(\"ctb\", \"cph\"), comment=\"Original C implementation of Myers Diff Algorithm\"))", + "Depends": [ + "R (>= 3.1.0)" + ], + "License": "GPL-2 | GPL-3", + "URL": "https://github.com/brodieG/diffobj", + "BugReports": "https://github.com/brodieG/diffobj/issues", + "RoxygenNote": "7.2.3", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Suggests": [ + "knitr", + "rmarkdown" + ], + "Collate": "'capt.R' 'options.R' 'pager.R' 'check.R' 'finalizer.R' 'misc.R' 'html.R' 'styles.R' 's4.R' 'core.R' 'diff.R' 'get.R' 'guides.R' 'hunks.R' 'layout.R' 'myerssimple.R' 'rdiff.R' 'rds.R' 'set.R' 'subset.R' 'summmary.R' 'system.R' 'text.R' 'tochar.R' 'trim.R' 'word.R'", + "Imports": [ + "crayon (>= 1.3.2)", + "tools", + "methods", + "utils", + "stats" + ], + "NeedsCompilation": "yes", + "Author": "Brodie Gaslam [aut, cre], Michael B. Allen [ctb, cph] (Original C implementation of Myers Diff Algorithm)", + "Maintainer": "Brodie Gaslam ", + "Repository": "CRAN" + }, + "digest": { + "Package": "digest", + "Version": "0.6.39", + "Source": "Repository", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Antoine\", \"Lucas\", role=\"ctb\", comment = c(ORCID = \"0000-0002-8059-9767\")), person(\"Jarek\", \"Tuszynski\", role=\"ctb\"), person(\"Henrik\", \"Bengtsson\", role=\"ctb\", comment = c(ORCID = \"0000-0002-7579-5165\")), person(\"Simon\", \"Urbanek\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2297-1732\")), person(\"Mario\", \"Frasca\", role=\"ctb\"), person(\"Bryan\", \"Lewis\", role=\"ctb\"), person(\"Murray\", \"Stokely\", role=\"ctb\"), person(\"Hannes\", \"Muehleisen\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8552-0029\")), person(\"Duncan\", \"Murdoch\", role=\"ctb\"), person(\"Jim\", \"Hester\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Wush\", \"Wu\", role=\"ctb\", comment = c(ORCID = \"0000-0001-5180-0567\")), person(\"Qiang\", \"Kou\", role=\"ctb\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Thierry\", \"Onkelinx\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8804-4216\")), person(\"Michel\", \"Lang\", role=\"ctb\", comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Viliam\", \"Simko\", role=\"ctb\"), person(\"Kurt\", \"Hornik\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"Radford\", \"Neal\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2473-3407\")), person(\"Kendon\", \"Bell\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9093-8312\")), person(\"Matthew\", \"de Queljoe\", role=\"ctb\"), person(\"Dmitry\", \"Selivanov\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0492-6647\")), person(\"Ion\", \"Suruceanu\", role=\"ctb\", comment = c(ORCID = \"0009-0005-6446-4909\")), person(\"Bill\", \"Denney\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5759-428X\")), person(\"Dirk\", \"Schumacher\", role=\"ctb\"), person(\"András\", \"Svraka\", role=\"ctb\", comment = c(ORCID = \"0009-0008-8480-1329\")), person(\"Sergey\", \"Fedorov\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5970-7233\")), person(\"Will\", \"Landau\", role=\"ctb\", comment = c(ORCID = \"0000-0003-1878-3253\")), person(\"Floris\", \"Vanderhaeghe\", role=\"ctb\", comment = c(ORCID = \"0000-0002-6378-6229\")), person(\"Kevin\", \"Tappe\", role=\"ctb\"), person(\"Harris\", \"McGehee\", role=\"ctb\"), person(\"Tim\", \"Mastny\", role=\"ctb\"), person(\"Aaron\", \"Peikert\", role=\"ctb\", comment = c(ORCID = \"0000-0001-7813-818X\")), person(\"Mark\", \"van der Loo\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9807-4686\")), person(\"Chris\", \"Muir\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2555-3878\")), person(\"Moritz\", \"Beller\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4852-0526\")), person(\"Sebastian\", \"Campbell\", role=\"ctb\", comment = c(ORCID = \"0009-0000-5948-4503\")), person(\"Winston\", \"Chang\", role=\"ctb\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Dean\", \"Attali\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5645-3493\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Kevin\", \"Ushey\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Carl\", \"Pearson\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0701-7860\")))", + "Date": "2025-11-19", + "Title": "Create Compact Hash Digests of R Objects", + "Description": "Implementation of a function 'digest()' for the creation of hash digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32', 'xxhash', 'murmurhash', 'spookyhash', 'blake3', 'crc32c', 'xxh3_64', and 'xxh3_128' algorithms) permitting easy comparison of R language objects, as well as functions such as 'hmac()' to create hash-based message authentication code. Please note that this package is not meant to be deployed for cryptographic purposes for which more comprehensive (and widely tested) libraries such as 'OpenSSL' should be used.", + "URL": "https://github.com/eddelbuettel/digest, https://eddelbuettel.github.io/digest/, https://dirk.eddelbuettel.com/code/digest.html", + "BugReports": "https://github.com/eddelbuettel/digest/issues", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "utils" + ], + "License": "GPL (>= 2)", + "Suggests": [ + "tinytest", + "simplermarkdown", + "rbenchmark" + ], + "VignetteBuilder": "simplermarkdown", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (ORCID: ), Antoine Lucas [ctb] (ORCID: ), Jarek Tuszynski [ctb], Henrik Bengtsson [ctb] (ORCID: ), Simon Urbanek [ctb] (ORCID: ), Mario Frasca [ctb], Bryan Lewis [ctb], Murray Stokely [ctb], Hannes Muehleisen [ctb] (ORCID: ), Duncan Murdoch [ctb], Jim Hester [ctb] (ORCID: ), Wush Wu [ctb] (ORCID: ), Qiang Kou [ctb] (ORCID: ), Thierry Onkelinx [ctb] (ORCID: ), Michel Lang [ctb] (ORCID: ), Viliam Simko [ctb], Kurt Hornik [ctb] (ORCID: ), Radford Neal [ctb] (ORCID: ), Kendon Bell [ctb] (ORCID: ), Matthew de Queljoe [ctb], Dmitry Selivanov [ctb] (ORCID: ), Ion Suruceanu [ctb] (ORCID: ), Bill Denney [ctb] (ORCID: ), Dirk Schumacher [ctb], András Svraka [ctb] (ORCID: ), Sergey Fedorov [ctb] (ORCID: ), Will Landau [ctb] (ORCID: ), Floris Vanderhaeghe [ctb] (ORCID: ), Kevin Tappe [ctb], Harris McGehee [ctb], Tim Mastny [ctb], Aaron Peikert [ctb] (ORCID: ), Mark van der Loo [ctb] (ORCID: ), Chris Muir [ctb] (ORCID: ), Moritz Beller [ctb] (ORCID: ), Sebastian Campbell [ctb] (ORCID: ), Winston Chang [ctb] (ORCID: ), Dean Attali [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Kevin Ushey [ctb] (ORCID: ), Carl Pearson [ctb] (ORCID: )", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" + }, + "downlit": { + "Package": "downlit", + "Version": "0.4.5", + "Source": "Repository", + "Title": "Syntax Highlighting and Automatic Linking", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Syntax highlighting of R code, specifically designed for the needs of 'RMarkdown' packages like 'pkgdown', 'hugodown', and 'bookdown'. It includes linking of function calls to their documentation on the web, and automatic translation of ANSI escapes in output to the equivalent HTML.", + "License": "MIT + file LICENSE", + "URL": "https://downlit.r-lib.org/, https://github.com/r-lib/downlit", + "BugReports": "https://github.com/r-lib/downlit/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "brio", + "desc", + "digest", + "evaluate", + "fansi", + "memoise", + "rlang", + "vctrs", + "withr", + "yaml" + ], + "Suggests": [ + "covr", + "htmltools", + "jsonlite", + "MASS", + "MassSpecWavelet", + "pkgload", + "rmarkdown", + "testthat (>= 3.0.0)", + "xml2" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "dplyr": { + "Package": "dplyr", + "Version": "1.2.0", + "Source": "Repository", + "Type": "Package", + "Title": "A Grammar of Data Manipulation", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Kirill\", \"Müller\", role = \"aut\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A fast, consistent tool for working with data frame like objects, both in memory and out of memory.", + "License": "MIT + file LICENSE", + "URL": "https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr", + "BugReports": "https://github.com/tidyverse/dplyr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli (>= 3.6.2)", + "generics", + "glue (>= 1.3.2)", + "lifecycle (>= 1.0.5)", + "magrittr (>= 1.5)", + "methods", + "pillar (>= 1.9.0)", + "R6", + "rlang (>= 1.1.7)", + "tibble (>= 3.2.0)", + "tidyselect (>= 1.2.0)", + "utils", + "vctrs (>= 0.7.1)" + ], + "Suggests": [ + "broom", + "covr", + "DBI", + "dbplyr (>= 2.2.1)", + "ggplot2", + "knitr", + "Lahman", + "lobstr", + "nycflights13", + "purrr", + "rmarkdown", + "RSQLite", + "stringi (>= 1.7.6)", + "testthat (>= 3.1.5)", + "tidyr (>= 1.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Romain François [aut] (ORCID: ), Lionel Henry [aut], Kirill Müller [aut] (ORCID: ), Davis Vaughan [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "dtplyr": { + "Package": "dtplyr", + "Version": "1.3.3", + "Source": "Repository", + "Title": "Data Table Back-End for 'dplyr'", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"cre\", \"aut\")), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Mark\", \"Fairbanks\", role = \"aut\"), person(\"Ryan\", \"Dickerson\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a data.table backend for 'dplyr'. The goal of 'dtplyr' is to allow you to write 'dplyr' code that is automatically translated to the equivalent, but usually much faster, data.table code.", + "License": "MIT + file LICENSE", + "URL": "https://dtplyr.tidyverse.org, https://github.com/tidyverse/dtplyr", + "BugReports": "https://github.com/tidyverse/dtplyr/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "data.table (>= 1.13.0)", + "dplyr (>= 1.1.0)", + "glue", + "lifecycle", + "rlang (>= 1.0.4)", + "tibble", + "tidyselect (>= 1.2.0)", + "vctrs (>= 0.4.1)" + ], + "Suggests": [ + "bench", + "covr", + "knitr", + "rmarkdown", + "testthat (>= 3.1.2)", + "tidyr (>= 1.1.0)", + "waldo (>= 0.3.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [cre, aut], Maximilian Girlich [aut], Mark Fairbanks [aut], Ryan Dickerson [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "e1071": { + "Package": "e1071", + "Version": "1.7-17", + "Source": "Repository", + "Title": "Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien", + "Imports": [ + "graphics", + "grDevices", + "class", + "stats", + "methods", + "utils", + "proxy" + ], + "Suggests": [ + "cluster", + "mlbench", + "nnet", + "randomForest", + "rpart", + "SparseM", + "xtable", + "Matrix", + "MASS", + "slam" + ], + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")), person(given = \"Evgenia\", family = \"Dimitriadou\", role = c(\"aut\",\"cph\")), person(given = \"Kurt\", family = \"Hornik\", role = \"aut\", email = \"Kurt.Hornik@R-project.org\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(given = \"Andreas\", family = \"Weingessel\", role = \"aut\"), person(given = \"Friedrich\", family = \"Leisch\", role = \"aut\"), person(given = \"Chih-Chung\", family = \"Chang\", role = c(\"ctb\",\"cph\"), comment = \"libsvm C++-code\"), person(given = \"Chih-Chen\", family = \"Lin\", role = c(\"ctb\",\"cph\"), comment = \"libsvm C++-code\"))", + "Description": "Functions for latent class analysis, short time Fourier transform, fuzzy clustering, support vector machines, shortest path computation, bagged clustering, naive Bayes classifier, generalized k-nearest neighbour ...", + "License": "GPL-2 | GPL-3", + "LazyLoad": "yes", + "NeedsCompilation": "yes", + "Author": "David Meyer [aut, cre] (ORCID: ), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (ORCID: ), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code)", + "Maintainer": "David Meyer ", + "Repository": "CRAN" + }, + "ellipsis": { + "Package": "ellipsis", + "Version": "0.3.2", + "Source": "Repository", + "Title": "Tools for Working with ...", + "Description": "The ellipsis is a powerful tool for extending functions. Unfortunately this power comes at a cost: misspelled arguments will be silently ignored. The ellipsis package provides a collection of functions to catch problems and alert the user.", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = \"cph\") )", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "URL": "https://ellipsis.r-lib.org, https://github.com/r-lib/ellipsis", + "BugReports": "https://github.com/r-lib/ellipsis/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ + "rlang (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "testthat" + ], + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], RStudio [cph]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "evaluate": { + "Package": "evaluate", + "Version": "1.0.5", + "Source": "Repository", + "Type": "Package", + "Title": "Parsing and Evaluation Tools that Provide More Details than the Default", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Yihui\", \"Xie\", role = \"aut\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Michael\", \"Lawrence\", role = \"ctb\"), person(\"Thomas\", \"Kluyver\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Adam\", \"Ryczkowski\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Michel\", \"Lang\", role = \"ctb\"), person(\"Karolis\", \"Koncevičius\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Parsing and evaluation tools that make it easy to recreate the command line behaviour of R.", + "License": "MIT + file LICENSE", + "URL": "https://evaluate.r-lib.org/, https://github.com/r-lib/evaluate", + "BugReports": "https://github.com/r-lib/evaluate/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "covr", + "ggplot2 (>= 3.3.6)", + "lattice", + "methods", + "pkgload", + "ragg (>= 1.4.0)", + "rlang (>= 1.1.5)", + "knitr", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Yihui Xie [aut] (ORCID: ), Michael Lawrence [ctb], Thomas Kluyver [ctb], Jeroen Ooms [ctb], Barret Schloerke [ctb], Adam Ryczkowski [ctb], Hiroaki Yutani [ctb], Michel Lang [ctb], Karolis Koncevičius [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "fansi": { + "Package": "fansi", + "Version": "1.0.7", + "Source": "Repository", + "Title": "ANSI Control Sequence Aware String Functions", + "Description": "Counterparts to R string manipulation functions that account for the effects of ANSI text formatting control sequences.", + "Authors@R": "c( person(\"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\", role=c(\"aut\", \"cre\")), person(\"Elliott\", \"Sales De Andrade\", role=\"ctb\"), person(given=\"R Core Team\", email=\"R-core@r-project.org\", role=\"cph\", comment=\"UTF8 byte length calcs from src/util.c\" ), person(\"Michael\",\"Chirico\", role=\"ctb\", email=\"michaelchirico4@gmail.com\", comment = c(ORCID=\"0000-0003-0787-087X\") ), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database derivative data in src/width.c\") )", + "Depends": [ + "R (>= 3.1.0)" + ], + "License": "GPL-2 | GPL-3", + "URL": "https://github.com/brodieG/fansi", + "BugReports": "https://github.com/brodieG/fansi/issues", + "VignetteBuilder": "knitr", + "Suggests": [ + "unitizer", + "knitr", + "rmarkdown" + ], + "Imports": [ + "grDevices", + "utils" + ], + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Collate": "'constants.R' 'fansi-package.R' 'internal.R' 'load.R' 'misc.R' 'nchar.R' 'strwrap.R' 'strtrim.R' 'strsplit.R' 'substr2.R' 'trimws.R' 'tohtml.R' 'unhandled.R' 'normalize.R' 'sgr.R'", + "NeedsCompilation": "yes", + "Author": "Brodie Gaslam [aut, cre], Elliott Sales De Andrade [ctb], R Core Team [cph] (UTF8 byte length calcs from src/util.c), Michael Chirico [ctb] (ORCID: ), Unicode, Inc. [cph, dtc] (Unicode Character Database derivative data in src/width.c)", + "Maintainer": "Brodie Gaslam ", + "Repository": "CRAN" + }, + "farver": { + "Package": "farver", + "Version": "2.1.2", + "Source": "Repository", + "Type": "Package", + "Title": "High Performance Colour Space Manipulation", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Berendea\", \"Nicolae\", role = \"aut\", comment = \"Author of the ColorSpace C++ library\"), person(\"Romain\", \"François\", , \"romain@purrple.cat\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The encoding of colour can be handled in many different ways, using different colour spaces. As different colour spaces have different uses, efficient conversion between these representations are important. The 'farver' package provides a set of functions that gives access to very fast colour space conversion and comparisons implemented in C++, and offers speed improvements over the 'convertColor' function in the 'grDevices' package.", + "License": "MIT + file LICENSE", + "URL": "https://farver.data-imaginist.com, https://github.com/thomasp85/farver", + "BugReports": "https://github.com/thomasp85/farver/issues", + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (), Berendea Nicolae [aut] (Author of the ColorSpace C++ library), Romain François [aut] (), Posit, PBC [cph, fnd]", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "fastmap": { + "Package": "fastmap", + "Version": "1.2.0", + "Source": "Repository", + "Title": "Fast Data Structures", + "Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\") )", + "Description": "Fast implementation of data structures, including a key-value store, stack, and queue. Environments are commonly used as key-value stores in R, but every time a new key is used, it is added to R's global symbol table, causing a small amount of memory leakage. This can be problematic in cases where many different keys are used. Fastmap avoids this memory leak issue by implementing the map using data structures in C++.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat (>= 2.1.1)" + ], + "URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap", + "BugReports": "https://github.com/r-lib/fastmap/issues", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "filelock": { + "Package": "filelock", + "Version": "1.0.3", + "Source": "Repository", + "Title": "Portable File Locking", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Place an exclusive or shared lock on a file. It uses 'LockFile' on Windows and 'fcntl' locks on Unix-like systems.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.github.io/filelock/, https://github.com/r-lib/filelock", + "BugReports": "https://github.com/r-lib/filelock/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Suggests": [ + "callr (>= 2.0.0)", + "covr", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "fontawesome": { + "Package": "fontawesome", + "Version": "0.5.3", + "Source": "Repository", + "Type": "Package", + "Title": "Easily Work with 'Font Awesome' Icons", + "Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown' documents and 'Shiny' apps. These icons can be inserted into HTML content through inline 'SVG' tags or 'i' tags. There is also a utility function for exporting 'Font Awesome' icons as 'PNG' images for those situations where raster graphics are needed.", + "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome font\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/fontawesome, https://rstudio.github.io/fontawesome/", + "BugReports": "https://github.com/rstudio/fontawesome/issues", + "Encoding": "UTF-8", + "ByteCompile": "true", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "rlang (>= 1.0.6)", + "htmltools (>= 0.5.1.1)" + ], + "Suggests": [ + "covr", + "dplyr (>= 1.0.8)", + "gt (>= 0.9.0)", + "knitr (>= 1.31)", + "testthat (>= 3.0.0)", + "rsvg" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Richard Iannone [aut, cre] (), Christophe Dervieux [ctb] (), Winston Chang [ctb], Dave Gandy [ctb, cph] (Font-Awesome font), Posit Software, PBC [cph, fnd]", + "Maintainer": "Richard Iannone ", + "Repository": "CRAN" + }, + "forcats": { + "Package": "forcats", + "Version": "1.0.1", + "Source": "Repository", + "Title": "Tools for Working with Categorical Variables (Factors)", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Helpers for reordering factor levels (including moving specified levels to front, ordering by first appearance, reversing, and randomly shuffling), and tools for modifying factor levels (including collapsing rare levels into other, 'anonymising', and manually 'recoding').", + "License": "MIT + file LICENSE", + "URL": "https://forcats.tidyverse.org/, https://github.com/tidyverse/forcats", + "BugReports": "https://github.com/tidyverse/forcats/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "glue", + "lifecycle", + "magrittr", + "rlang (>= 1.0.0)", + "tibble" + ], + "Suggests": [ + "covr", + "dplyr", + "ggplot2", + "knitr", + "readr", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "fs": { + "Package": "fs", + "Version": "1.6.6", + "Source": "Repository", + "Title": "Cross-Platform File System Operations Based on 'libuv'", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A cross-platform interface to file system operations, built on top of the 'libuv' C library.", + "License": "MIT + file LICENSE", + "URL": "https://fs.r-lib.org, https://github.com/r-lib/fs", + "BugReports": "https://github.com/r-lib/fs/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "covr", + "crayon", + "knitr", + "pillar (>= 1.0.0)", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "tibble (>= 1.1.0)", + "vctrs (>= 0.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "SystemRequirements": "GNU make", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut], Hadley Wickham [aut], Gábor Csárdi [aut, cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "gargle": { + "Package": "gargle", + "Version": "1.6.1", + "Source": "Repository", + "Title": "Utilities for Working with Google APIs", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Craig\", \"Citro\", , \"craigcitro@google.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Google Inc\", role = \"cph\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides utilities for working with Google APIs . This includes functions and classes for handling common credential types and for preparing, executing, and processing HTTP requests.", + "License": "MIT + file LICENSE", + "URL": "https://gargle.r-lib.org, https://github.com/r-lib/gargle", + "BugReports": "https://github.com/r-lib/gargle/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.1)", + "fs (>= 1.3.1)", + "glue (>= 1.3.0)", + "httr (>= 1.4.5)", + "jsonlite", + "lifecycle (>= 0.2.0)", + "openssl", + "rappdirs", + "rlang (>= 1.1.0)", + "stats", + "utils", + "withr" + ], + "Suggests": [ + "aws.ec2metadata", + "aws.signature", + "covr", + "httpuv", + "knitr", + "rmarkdown", + "sodium", + "spelling", + "testthat (>= 3.1.7)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [aut, cre] (ORCID: ), Craig Citro [aut], Hadley Wickham [aut] (ORCID: ), Google Inc [cph], Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "gdalraster": { + "Package": "gdalraster", + "Version": "2.4.0", + "Source": "Repository", + "Title": "Bindings to 'GDAL'", + "Authors@R": "c( person(\"Chris\", \"Toney\", email = \"jctoney@gmail.com\", role = c(\"aut\", \"cre\"), comment = \"R interface/additional functionality\"), person(\"Michael D.\",\"Sumner\", role = c(\"ctb\")), person(\"Frank\", \"Warmerdam\", role = c(\"ctb\", \"cph\"), comment = \"GDAL API documentation; src/progress_r.cpp from gdal/port/cpl_progress.cpp\"), person(\"Even\", \"Rouault\", role = c(\"ctb\", \"cph\"), comment = \"GDAL API documentation\"), person(\"Marius\", \"Appel\", role = c(\"ctb\", \"cph\"), comment = \"configure.ac based on https://github.com/appelmar/gdalcubes\"), person(\"Daniel\", \"James\", role = c(\"ctb\", \"cph\"), comment = \"Boost combine hashes method in src/cmb_table.h\"), person(\"Peter\", \"Dimov\", role = c(\"ctb\", \"cph\"), comment = \"Boost combine hashes method in src/cmb_table.h\"))", + "Description": "API bindings to the Geospatial Data Abstraction Library ('GDAL', ). Implements the 'GDAL' Raster and Vector Data Models. Bindings are implemented with 'Rcpp' modules. Exposed C++ classes and stand-alone functions wrap much of the 'GDAL' API and provide additional functionality. Calling signatures resemble the native C, C++ and Python APIs provided by the 'GDAL' project. Class 'GDALRaster' encapsulates a 'GDALDataset' and its raster band objects. Class 'GDALVector' encapsulates an 'OGRLayer' and the 'GDALDataset' that contains it. Initial bindings are provided to the unified 'gdal' command line interface added in 'GDAL' 3.11. C++ stand-alone functions provide bindings to most 'GDAL' \"traditional\" raster and vector utilities, including 'OGR' facilities for vector geoprocessing, several algorithms, as well as the Geometry API ('GEOS' via 'GDAL' headers), the Spatial Reference Systems API, and methods for coordinate transformation. Bindings to the Virtual Systems Interface ('VSI') API implement standard file system operations abstracted for URLs, cloud storage services, 'Zip'/'GZip'/'7z'/'RAR', in-memory files, as well as regular local file systems. This provides a single interface for operating on file system objects that works the same for any storage backend. A custom raster calculator evaluates a user-defined R expression on a layer or stack of layers, with pixel x/y available as variables in the expression. Raster 'combine()' identifies and counts unique pixel combinations across multiple input layers, with optional raster output of the pixel-level combination IDs. Basic plotting capability is provided for raster and vector display. 'gdalraster' leans toward minimalism and the use of simple, lightweight objects for holding raw data. Currently, only minimal S3 class interfaces have been implemented for selected R objects that contain spatial data. 'gdalraster' may be useful in applications that need scalable, low-level I/O, or prefer a direct 'GDAL' API.", + "License": "MIT + file LICENSE", + "Copyright": "See file inst/COPYRIGHTS for details.", + "URL": "https://firelab.github.io/gdalraster/, https://github.com/firelab/gdalraster", + "BugReports": "https://github.com/firelab/gdalraster/issues", + "Depends": [ + "R (>= 4.2.0)" + ], + "Imports": [ + "bit64", + "graphics", + "grDevices", + "methods", + "nanoarrow", + "Rcpp (>= 1.0.7)", + "stats", + "tools", + "utils", + "wk", + "xml2", + "yyjsonr" + ], + "LinkingTo": [ + "nanoarrow", + "Rcpp", + "RcppInt64" + ], + "Suggests": [ + "gt", + "knitr", + "rmarkdown", + "scales", + "testthat (>= 3.0.0)" + ], + "NeedsCompilation": "yes", + "SystemRequirements": "C++17, GDAL (>= 3.1.0, built against GEOS)", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "Author": "Chris Toney [aut, cre] (R interface/additional functionality), Michael D. Sumner [ctb], Frank Warmerdam [ctb, cph] (GDAL API documentation; src/progress_r.cpp from gdal/port/cpl_progress.cpp), Even Rouault [ctb, cph] (GDAL API documentation), Marius Appel [ctb, cph] (configure.ac based on https://github.com/appelmar/gdalcubes), Daniel James [ctb, cph] (Boost combine hashes method in src/cmb_table.h), Peter Dimov [ctb, cph] (Boost combine hashes method in src/cmb_table.h)", + "Maintainer": "Chris Toney ", + "Repository": "CRAN" + }, + "generics": { + "Package": "generics", + "Version": "0.1.4", + "Source": "Repository", + "Title": "Common S3 Generics not Provided by Base R Methods Related to Model Fitting", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Max\", \"Kuhn\", , \"max@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", + "Description": "In order to reduce potential package dependencies and conflicts, generics provides a number of commonly used S3 generics.", + "License": "MIT + file LICENSE", + "URL": "https://generics.r-lib.org, https://github.com/r-lib/generics", + "BugReports": "https://github.com/r-lib/generics/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "covr", + "pkgload", + "testthat (>= 3.0.0)", + "tibble", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Max Kuhn [aut], Davis Vaughan [aut], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "geojson": { + "Package": "geojson", + "Version": "0.3.5", + "Source": "Repository", + "Type": "Package", + "Title": "Classes for 'GeoJSON'", + "Description": "Classes for 'GeoJSON' to make working with 'GeoJSON' easier. Includes S3 classes for 'GeoJSON' classes with brief summary output, and a few methods such as extracting and adding bounding boxes, properties, and coordinate reference systems; working with newline delimited 'GeoJSON'; and serializing to/from 'Geobuf' binary 'GeoJSON' format.", + "Authors@R": "c( person(\"Scott\", \"Chamberlain\", role = c(\"aut\"), email = \"myrmecocystus@gmail.com\", comment = c(ORCID=\"0000-0003-1444-9135\")), person(\"Jeroen\", \"Ooms\", role = \"aut\"), person(\"Michael\", \"Sumner\", role = \"cre\", email = \"mdsumner@gmail.com\") )", + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/geojson/, https://github.com/ropensci/geojson", + "BugReports": "https://github.com/ropensci/geojson/issues", + "LazyData": "true", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Imports": [ + "methods", + "sp", + "jsonlite (>= 1.6)", + "protolite (>= 1.8)", + "jqr (>= 1.1.0)", + "magrittr", + "lazyeval" + ], + "Suggests": [ + "tibble", + "testthat", + "knitr", + "rmarkdown", + "sf", + "stringi", + "covr" + ], + "X-schema.org-applicationCategory": "Geospatial", + "X-schema.org-keywords": "geojson, geospatial, conversion, data, input-output, bbox, polygon, geobuf", + "X-schema.org-isPartOf": "https://ropensci.org", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Scott Chamberlain [aut] (), Jeroen Ooms [aut], Michael Sumner [cre]", + "Maintainer": "Michael Sumner ", + "Repository": "CRAN" + }, + "geojsonio": { + "Package": "geojsonio", + "Version": "0.11.3", + "Source": "Repository", + "Title": "Convert Data from and to 'GeoJSON' or 'TopoJSON'", + "Authors@R": "c( person(\"Scott\", \"Chamberlain\", , \"myrmecocystus@gmail.com\", role = c(\"aut\")), person(\"Andy\", \"Teucher\", , \"andy.teucher@gmail.com\", role = \"aut\"), person(\"Michael\", \"Mahoney\", , \"mike.mahoney.218@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-2402-304X\")) )", + "Description": "Convert data to 'GeoJSON' or 'TopoJSON' from various R classes, including vectors, lists, data frames, shape files, and spatial classes. 'geojsonio' does not aim to replace packages like 'sp', 'rgdal', 'rgeos', but rather aims to be a high level client to simplify conversions of data from and to 'GeoJSON' and 'TopoJSON'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/ropensci/geojsonio, https://docs.ropensci.org/geojsonio/", + "BugReports": "https://github.com/ropensci/geojsonio/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "crul", + "geojson (>= 0.2.0)", + "geojsonsf", + "jqr", + "jsonlite (>= 0.9.21)", + "magrittr", + "methods", + "readr (>= 0.2.2)", + "sf (>= 0.6)", + "sp", + "V8" + ], + "Suggests": [ + "covr", + "DBI", + "gistr", + "leaflet", + "maps", + "RPostgres", + "testthat (>= 3.0.0)", + "withr" + ], + "Enhances": [ + "RColorBrewer" + ], + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "X-schema.org-applicationCategory": "Geospatial", + "X-schema.org-isPartOf": "https://ropensci.org", + "X-schema.org-keywords": "geojson, topojson, geospatial, conversion, data, input-output", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Scott Chamberlain [aut], Andy Teucher [aut], Michael Mahoney [aut, cre] ()", + "Maintainer": "Michael Mahoney ", + "Repository": "CRAN" + }, + "geojsonsf": { + "Package": "geojsonsf", + "Version": "2.0.5", + "Source": "Repository", + "Type": "Package", + "Title": "GeoJSON to Simple Feature Converter", + "Date": "2025-11-25", + "Authors@R": "c( person(\"David\", \"Cooley\", ,\"dcooley@symbolix.com.au\", role = c(\"aut\", \"cre\")), person(\"Andy\", \"Teucher\", ,\"andy.teucher@gmail.com\", role = \"ctb\") )", + "Description": "Converts Between GeoJSON and simple feature objects.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/SymbolixAU/geojsonsf", + "BugReports": "https://github.com/SymbolixAU/geojsonsf/issues", + "Encoding": "UTF-8", + "LazyData": "true", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "Rcpp (>= 1.1.0)" + ], + "LinkingTo": [ + "geometries (>= 0.2.5)", + "jsonify (>= 1.2.3)", + "rapidjsonr (>= 1.2.1)", + "Rcpp", + "sfheaders (>= 0.4.5)" + ], + "RoxygenNote": "7.3.3", + "Suggests": [ + "covr", + "jsonify", + "knitr", + "rmarkdown", + "tinytest" + ], + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "David Cooley [aut, cre], Andy Teucher [ctb]", + "Maintainer": "David Cooley ", + "Repository": "CRAN" + }, + "geometries": { + "Package": "geometries", + "Version": "0.2.5", + "Source": "Repository", + "Type": "Package", + "Title": "Convert Between R Objects and Geometric Structures", + "Date": "2025-11-23", + "Authors@R": "c( person(\"David\", \"Cooley\", ,\"david.cooley.au@gmail.com\", role = c(\"aut\", \"cre\")) )", + "Description": "Geometry shapes in 'R' are typically represented by matrices (points, lines), with more complex shapes being lists of matrices (polygons). 'Geometries' will convert various 'R' objects into these shapes. Conversion functions are available at both the 'R' level, and through 'Rcpp'.", + "License": "MIT + file LICENSE", + "URL": "https://dcooley.github.io/geometries/", + "BugReports": "https://github.com/dcooley/geometries/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ + "Rcpp (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "tinytest" + ], + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "David Cooley [aut, cre]", + "Maintainer": "David Cooley ", + "Repository": "CRAN" + }, + "geotargets": { + "Package": "geotargets", + "Version": "0.3.1", + "Source": "Repository", + "Title": "'targets' Extensions for Geographic Spatial Formats", + "Authors@R": "c( person( given = \"Nicholas\", family = \"Tierney\", email = \"nicholas.tierney@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-1460-8722\") ), person( given = \"Eric\", family = \"Scott\", role = c(\"aut\"), comment = c(ORCID = \"0000-0002-7430-7879\") ), person( given = \"Andrew\", family = \"Brown\", role = c(\"aut\"), comment = c(ORCID = \"0000-0002-4565-533X\") ) )", + "Description": "Provides extensions for various geographic spatial file formats, such as shape files and rasters. Currently provides support for the 'terra' geographic spatial formats. See the vignettes for worked examples, demonstrations, and explanations of how to use the various package extensions.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Language": "en-GB", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "targets (>= 1.8.0)", + "rlang (>= 1.1.3)", + "cli (>= 3.6.2)", + "terra (>= 1.8-10)", + "withr (>= 3.0.0)", + "zip", + "lifecycle", + "gdalraster (>= 2.0.0)" + ], + "Suggests": [ + "crew (>= 0.9.2)", + "knitr", + "ncmeta", + "rmarkdown", + "sf", + "stars", + "testthat (>= 3.0.0)", + "fs", + "spelling" + ], + "Config/testthat/edition": "3", + "URL": "https://github.com/ropensci/geotargets, https://docs.ropensci.org/geotargets/", + "BugReports": "https://github.com/ropensci/geotargets/issues", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Nicholas Tierney [aut, cre] (ORCID: ), Eric Scott [aut] (ORCID: ), Andrew Brown [aut] (ORCID: )", + "Maintainer": "Nicholas Tierney ", + "Repository": "CRAN" + }, + "gert": { + "Package": "gert", + "Version": "2.3.1", + "Source": "Repository", + "Type": "Package", + "Title": "Simple Git Client for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Jennifer\", \"Bryan\", role = \"ctb\", email = \"jenny@posit.co\", comment = c(ORCID = \"0000-0002-6983-2759\")))", + "Description": "Simple git client for R based on 'libgit2' with support for SSH and HTTPS remotes. All functions in 'gert' use basic R data types (such as vectors and data-frames) for their arguments and return values. User credentials are shared with command line 'git' through the git-credential store and ssh keys stored on disk or ssh-agent.", + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/gert/, https://ropensci.r-universe.dev/gert", + "BugReports": "https://github.com/r-lib/gert/issues", + "Imports": [ + "askpass", + "credentials (>= 1.2.1)", + "openssl (>= 2.0.3)", + "rstudioapi (>= 0.11)", + "sys", + "zip (>= 2.1.0)" + ], + "Suggests": [ + "spelling", + "knitr", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "libgit2 (>= 1.0): libgit2-devel (rpm) or libgit2-dev (deb)", + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Jennifer Bryan [ctb] (ORCID: )", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "getPass": { + "Package": "getPass", + "Version": "0.2-4", + "Source": "Repository", + "Type": "Package", + "Title": "Masked User Input", + "Description": "A micro-package for reading \"passwords\", i.e. reading user input with masking, so that the input is not displayed as it is typed. Currently we have support for 'RStudio', the command line (every OS), and any platform where 'tcltk' is present.", + "License": "BSD 2-clause License + file LICENSE", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ + "utils", + "rstudioapi (>= 0.5)" + ], + "NeedsCompilation": "yes", + "ByteCompile": "yes", + "Authors@R": "c( person(\"Drew\", \"Schmidt\", role=c(\"aut\", \"cre\"), email=\"wrathematics@gmail.com\"), person(\"Wei-Chen\", \"Chen\", role=\"aut\"), person(\"Gabor\", \"Csardi\", role=\"ctb\", comment=\"Improved terminal detection\"), person(\"Rich\", \"FitzJohn\", role=\"ctb\") )", + "URL": "https://github.com/wrathematics/getPass", + "BugReports": "https://github.com/wrathematics/getPass/issues", + "Maintainer": "Drew Schmidt ", + "RoxygenNote": "6.0.1", + "Author": "Drew Schmidt [aut, cre], Wei-Chen Chen [aut], Gabor Csardi [ctb] (Improved terminal detection), Rich FitzJohn [ctb]", + "Repository": "CRAN" + }, + "ggplot2": { + "Package": "ggplot2", + "Version": "4.0.2", + "Source": "Repository", + "Title": "Create Elegant Data Visualisations Using the Grammar of Graphics", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Winston\", \"Chang\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Lionel\", \"Henry\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Kohske\", \"Takahashi\", role = \"aut\"), person(\"Claus\", \"Wilke\", role = \"aut\", comment = c(ORCID = \"0000-0002-7470-9261\")), person(\"Kara\", \"Woo\", role = \"aut\", comment = c(ORCID = \"0000-0002-5125-4188\")), person(\"Hiroaki\", \"Yutani\", role = \"aut\", comment = c(ORCID = \"0000-0002-3385-7233\")), person(\"Dewey\", \"Dunnington\", role = \"aut\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Teun\", \"van den Brand\", role = \"aut\", comment = c(ORCID = \"0000-0002-9335-7468\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A system for 'declaratively' creating graphics, based on \"The Grammar of Graphics\". You provide the data, tell 'ggplot2' how to map variables to aesthetics, what graphical primitives to use, and it takes care of the details.", + "License": "MIT + file LICENSE", + "URL": "https://ggplot2.tidyverse.org, https://github.com/tidyverse/ggplot2", + "BugReports": "https://github.com/tidyverse/ggplot2/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli", + "grDevices", + "grid", + "gtable (>= 0.3.6)", + "isoband", + "lifecycle (> 1.0.1)", + "rlang (>= 1.1.0)", + "S7", + "scales (>= 1.4.0)", + "stats", + "vctrs (>= 0.6.0)", + "withr (>= 2.5.0)" + ], + "Suggests": [ + "broom", + "covr", + "dplyr", + "ggplot2movies", + "hexbin", + "Hmisc", + "hms", + "knitr", + "mapproj", + "maps", + "MASS", + "mgcv", + "multcomp", + "munsell", + "nlme", + "profvis", + "quantreg", + "quarto", + "ragg (>= 1.2.6)", + "RColorBrewer", + "roxygen2", + "rpart", + "sf (>= 0.7-3)", + "svglite (>= 2.1.2)", + "testthat (>= 3.1.5)", + "tibble", + "vdiffr (>= 1.0.6)", + "xml2" + ], + "Enhances": [ + "sp" + ], + "VignetteBuilder": "quarto", + "Config/Needs/website": "ggtext, tidyr, forcats, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "Collate": "'ggproto.R' 'ggplot-global.R' 'aaa-.R' 'aes-colour-fill-alpha.R' 'aes-evaluation.R' 'aes-group-order.R' 'aes-linetype-size-shape.R' 'aes-position.R' 'all-classes.R' 'compat-plyr.R' 'utilities.R' 'aes.R' 'annotation-borders.R' 'utilities-checks.R' 'legend-draw.R' 'geom-.R' 'annotation-custom.R' 'annotation-logticks.R' 'scale-type.R' 'layer.R' 'make-constructor.R' 'geom-polygon.R' 'geom-map.R' 'annotation-map.R' 'geom-raster.R' 'annotation-raster.R' 'annotation.R' 'autolayer.R' 'autoplot.R' 'axis-secondary.R' 'backports.R' 'bench.R' 'bin.R' 'coord-.R' 'coord-cartesian-.R' 'coord-fixed.R' 'coord-flip.R' 'coord-map.R' 'coord-munch.R' 'coord-polar.R' 'coord-quickmap.R' 'coord-radial.R' 'coord-sf.R' 'coord-transform.R' 'data.R' 'docs_layer.R' 'facet-.R' 'facet-grid-.R' 'facet-null.R' 'facet-wrap.R' 'fortify-map.R' 'fortify-models.R' 'fortify-spatial.R' 'fortify.R' 'stat-.R' 'geom-abline.R' 'geom-rect.R' 'geom-bar.R' 'geom-tile.R' 'geom-bin2d.R' 'geom-blank.R' 'geom-boxplot.R' 'geom-col.R' 'geom-path.R' 'geom-contour.R' 'geom-point.R' 'geom-count.R' 'geom-crossbar.R' 'geom-segment.R' 'geom-curve.R' 'geom-defaults.R' 'geom-ribbon.R' 'geom-density.R' 'geom-density2d.R' 'geom-dotplot.R' 'geom-errorbar.R' 'geom-freqpoly.R' 'geom-function.R' 'geom-hex.R' 'geom-histogram.R' 'geom-hline.R' 'geom-jitter.R' 'geom-label.R' 'geom-linerange.R' 'geom-pointrange.R' 'geom-quantile.R' 'geom-rug.R' 'geom-sf.R' 'geom-smooth.R' 'geom-spoke.R' 'geom-text.R' 'geom-violin.R' 'geom-vline.R' 'ggplot2-package.R' 'grob-absolute.R' 'grob-dotstack.R' 'grob-null.R' 'grouping.R' 'properties.R' 'margins.R' 'theme-elements.R' 'guide-.R' 'guide-axis.R' 'guide-axis-logticks.R' 'guide-axis-stack.R' 'guide-axis-theta.R' 'guide-legend.R' 'guide-bins.R' 'guide-colorbar.R' 'guide-colorsteps.R' 'guide-custom.R' 'guide-none.R' 'guide-old.R' 'guides-.R' 'guides-grid.R' 'hexbin.R' 'import-standalone-obj-type.R' 'import-standalone-types-check.R' 'labeller.R' 'labels.R' 'layer-sf.R' 'layout.R' 'limits.R' 'performance.R' 'plot-build.R' 'plot-construction.R' 'plot-last.R' 'plot.R' 'position-.R' 'position-collide.R' 'position-dodge.R' 'position-dodge2.R' 'position-identity.R' 'position-jitter.R' 'position-jitterdodge.R' 'position-nudge.R' 'position-stack.R' 'quick-plot.R' 'reshape-add-margins.R' 'save.R' 'scale-.R' 'scale-alpha.R' 'scale-binned.R' 'scale-brewer.R' 'scale-colour.R' 'scale-continuous.R' 'scale-date.R' 'scale-discrete-.R' 'scale-expansion.R' 'scale-gradient.R' 'scale-grey.R' 'scale-hue.R' 'scale-identity.R' 'scale-linetype.R' 'scale-linewidth.R' 'scale-manual.R' 'scale-shape.R' 'scale-size.R' 'scale-steps.R' 'scale-view.R' 'scale-viridis.R' 'scales-.R' 'stat-align.R' 'stat-bin.R' 'stat-summary-2d.R' 'stat-bin2d.R' 'stat-bindot.R' 'stat-binhex.R' 'stat-boxplot.R' 'stat-connect.R' 'stat-contour.R' 'stat-count.R' 'stat-density-2d.R' 'stat-density.R' 'stat-ecdf.R' 'stat-ellipse.R' 'stat-function.R' 'stat-identity.R' 'stat-manual.R' 'stat-qq-line.R' 'stat-qq.R' 'stat-quantilemethods.R' 'stat-sf-coordinates.R' 'stat-sf.R' 'stat-smooth-methods.R' 'stat-smooth.R' 'stat-sum.R' 'stat-summary-bin.R' 'stat-summary-hex.R' 'stat-summary.R' 'stat-unique.R' 'stat-ydensity.R' 'summarise-plot.R' 'summary.R' 'theme.R' 'theme-defaults.R' 'theme-current.R' 'theme-sub.R' 'utilities-break.R' 'utilities-grid.R' 'utilities-help.R' 'utilities-patterns.R' 'utilities-resolution.R' 'utilities-tidy-eval.R' 'zxx.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Lionel Henry [aut], Thomas Lin Pedersen [aut, cre] (ORCID: ), Kohske Takahashi [aut], Claus Wilke [aut] (ORCID: ), Kara Woo [aut] (ORCID: ), Hiroaki Yutani [aut] (ORCID: ), Dewey Dunnington [aut] (ORCID: ), Teun van den Brand [aut] (ORCID: ), Posit, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "gh": { + "Package": "gh", + "Version": "1.5.0", + "Source": "Repository", + "Title": "'GitHub' 'API'", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"cre\", \"ctb\")), person(\"Jennifer\", \"Bryan\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Minimal client to access the 'GitHub' 'API'.", + "License": "MIT + file LICENSE", + "URL": "https://gh.r-lib.org/, https://github.com/r-lib/gh#readme", + "BugReports": "https://github.com/r-lib/gh/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.1)", + "gitcreds", + "glue", + "httr2 (>= 1.0.6)", + "ini", + "jsonlite", + "lifecycle", + "rlang (>= 1.0.0)" + ], + "Suggests": [ + "connectcreds", + "covr", + "knitr", + "rmarkdown", + "rprojroot", + "spelling", + "testthat (>= 3.0.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-29", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [cre, ctb], Jennifer Bryan [aut], Hadley Wickham [aut], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "gitcreds": { + "Package": "gitcreds", + "Version": "0.1.2", + "Source": "Repository", + "Title": "Query 'git' Credentials from 'R'", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "Query, set, delete credentials from the 'git' credential store. Manage 'GitHub' tokens and other 'git' credentials. This package is to be used by other packages that need to authenticate to 'GitHub' and/or other 'git' repositories.", + "License": "MIT + file LICENSE", + "URL": "https://gitcreds.r-lib.org/, https://github.com/r-lib/gitcreds", + "BugReports": "https://github.com/r-lib/gitcreds/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Suggests": [ + "codetools", + "covr", + "knitr", + "mockery", + "oskeyring", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.1.9000", + "SystemRequirements": "git", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "glue": { + "Package": "glue", + "Version": "1.8.0", + "Source": "Repository", + "Title": "Interpreted String Literals", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "An implementation of interpreted string literals, inspired by Python's Literal String Interpolation and Docstrings and Julia's Triple-Quoted String Literals .", + "License": "MIT + file LICENSE", + "URL": "https://glue.tidyverse.org/, https://github.com/tidyverse/glue", + "BugReports": "https://github.com/tidyverse/glue/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "methods" + ], + "Suggests": [ + "crayon", + "DBI (>= 1.2.0)", + "dplyr", + "knitr", + "magrittr", + "rlang", + "rmarkdown", + "RSQLite", + "testthat (>= 3.2.0)", + "vctrs (>= 0.3.0)", + "waldo (>= 0.5.3)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "bench, forcats, ggbeeswarm, ggplot2, R.utils, rprintf, tidyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (), Jennifer Bryan [aut, cre] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "googledrive": { + "Package": "googledrive", + "Version": "2.1.2", + "Source": "Repository", + "Title": "An Interface to Google Drive", + "Authors@R": "c( person(\"Lucy\", \"D'Agostino McGowan\", , role = \"aut\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Manage Google Drive files from R.", + "License": "MIT + file LICENSE", + "URL": "https://googledrive.tidyverse.org, https://github.com/tidyverse/googledrive", + "BugReports": "https://github.com/tidyverse/googledrive/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "gargle (>= 1.6.0)", + "glue (>= 1.4.2)", + "httr", + "jsonlite", + "lifecycle", + "magrittr", + "pillar (>= 1.9.0)", + "purrr (>= 1.0.1)", + "rlang (>= 1.0.2)", + "tibble (>= 2.0.0)", + "utils", + "uuid", + "vctrs (>= 0.3.0)", + "withr" + ], + "Suggests": [ + "curl", + "dplyr (>= 1.0.0)", + "knitr", + "rmarkdown", + "spelling", + "testthat (>= 3.1.5)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Lucy D'Agostino McGowan [aut], Jennifer Bryan [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "googlesheets4": { + "Package": "googlesheets4", + "Version": "1.1.2", + "Source": "Repository", + "Title": "Access Google Sheets using the Sheets API V4", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Interact with Google Sheets through the Sheets API v4 . \"API\" is an acronym for \"application programming interface\"; the Sheets API allows users to interact with Google Sheets programmatically, instead of via a web browser. The \"v4\" refers to the fact that the Sheets API is currently at version 4. This package can read and write both the metadata and the cell data in a Sheet.", + "License": "MIT + file LICENSE", + "URL": "https://googlesheets4.tidyverse.org, https://github.com/tidyverse/googlesheets4", + "BugReports": "https://github.com/tidyverse/googlesheets4/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cellranger", + "cli (>= 3.0.0)", + "curl", + "gargle (>= 1.6.0)", + "glue (>= 1.3.0)", + "googledrive (>= 2.1.0)", + "httr", + "ids", + "lifecycle", + "magrittr", + "methods", + "purrr", + "rematch2", + "rlang (>= 1.0.2)", + "tibble (>= 2.1.1)", + "utils", + "vctrs (>= 0.2.3)", + "withr" + ], + "Suggests": [ + "readr", + "rmarkdown", + "spelling", + "testthat (>= 3.1.7)" + ], + "ByteCompile": "true", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "gridExtra": { + "Package": "gridExtra", + "Version": "2.3", + "Source": "Repository", + "Authors@R": "c(person(\"Baptiste\", \"Auguie\", email = \"baptiste.auguie@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Anton\", \"Antonov\", email = \"tonytonov@gmail.com\", role = c(\"ctb\")))", + "License": "GPL (>= 2)", + "Title": "Miscellaneous Functions for \"Grid\" Graphics", + "Type": "Package", + "Description": "Provides a number of user-level functions to work with \"grid\" graphics, notably to arrange multiple grid-based plots on a page, and draw tables.", + "VignetteBuilder": "knitr", + "Imports": [ + "gtable", + "grid", + "grDevices", + "graphics", + "utils" + ], + "Suggests": [ + "ggplot2", + "egg", + "lattice", + "knitr", + "testthat" + ], + "RoxygenNote": "6.0.1", + "NeedsCompilation": "no", + "Author": "Baptiste Auguie [aut, cre], Anton Antonov [ctb]", + "Maintainer": "Baptiste Auguie ", + "Repository": "CRAN" + }, + "gtable": { + "Package": "gtable", + "Version": "0.3.6", + "Source": "Repository", + "Title": "Arrange 'Grobs' in Tables", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to make it easier to work with \"tables\" of 'grobs'. The 'gtable' package defines a 'gtable' grob class that specifies a grid along with a list of grobs and their placement in the grid. Further the package makes it easy to manipulate and combine 'gtable' objects so that complex compositions can be built up sequentially.", + "License": "MIT + file LICENSE", + "URL": "https://gtable.r-lib.org, https://github.com/r-lib/gtable", + "BugReports": "https://github.com/r-lib/gtable/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "cli", + "glue", + "grid", + "lifecycle", + "rlang (>= 1.1.0)", + "stats" + ], + "Suggests": [ + "covr", + "ggplot2", + "knitr", + "profvis", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2024-10-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Thomas Lin Pedersen [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "haven": { + "Package": "haven", + "Version": "2.5.5", + "Source": "Repository", + "Title": "Import and Export 'SPSS', 'Stata' and 'SAS' Files", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Evan\", \"Miller\", role = c(\"aut\", \"cph\"), comment = \"Author of included ReadStat code\"), person(\"Danny\", \"Smith\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Import foreign statistical formats into R via the embedded 'ReadStat' C library, .", + "License": "MIT + file LICENSE", + "URL": "https://haven.tidyverse.org, https://github.com/tidyverse/haven, https://github.com/WizardMac/ReadStat", + "BugReports": "https://github.com/tidyverse/haven/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "forcats (>= 0.2.0)", + "hms", + "lifecycle", + "methods", + "readr (>= 0.1.0)", + "rlang (>= 0.4.0)", + "tibble", + "tidyselect", + "vctrs (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "crayon", + "fs", + "knitr", + "pillar (>= 1.4.0)", + "rmarkdown", + "testthat (>= 3.0.0)", + "utf8" + ], + "LinkingTo": [ + "cpp11" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make, zlib: zlib1g-dev (deb), zlib-devel (rpm)", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Evan Miller [aut, cph] (Author of included ReadStat code), Danny Smith [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "here": { + "Package": "here", + "Version": "1.0.2", + "Source": "Repository", + "Title": "A Simpler Way to Find Your Files", + "Date": "2025-09-06", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Jennifer\", family = \"Bryan\", role = \"ctb\", email = \"jenny@rstudio.com\", comment = c(ORCID = \"0000-0002-6983-2759\")))", + "Description": "Constructs paths to your project's files. Declare the relative path of a file within your project with 'i_am()'. Use the 'here()' function as a drop-in replacement for 'file.path()', it will always locate the files relative to your project root.", + "License": "MIT + file LICENSE", + "URL": "https://here.r-lib.org/, https://github.com/r-lib/here", + "BugReports": "https://github.com/r-lib/here/issues", + "Imports": [ + "rprojroot (>= 2.1.0)" + ], + "Suggests": [ + "conflicted", + "covr", + "fs", + "knitr", + "palmerpenguins", + "plyr", + "readr", + "rlang", + "rmarkdown", + "testthat", + "uuid", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Jennifer Bryan [ctb] (ORCID: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "highr": { + "Package": "highr", + "Version": "0.11", + "Source": "Repository", + "Type": "Package", + "Title": "Syntax Highlighting for R Source Code", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Yixuan\", \"Qiu\", role = \"aut\"), person(\"Christopher\", \"Gandrud\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\") )", + "Description": "Provides syntax highlighting for R source code. Currently it supports LaTeX and HTML output. Source code of other languages is supported via Andre Simon's highlight package ().", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "xfun (>= 0.18)" + ], + "Suggests": [ + "knitr", + "markdown", + "testit" + ], + "License": "GPL", + "URL": "https://github.com/yihui/highr", + "BugReports": "https://github.com/yihui/highr/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), Yixuan Qiu [aut], Christopher Gandrud [ctb], Qiang Li [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" + }, + "hms": { + "Package": "hms", + "Version": "1.1.4", + "Source": "Repository", + "Title": "Pretty Time of Day", + "Date": "2025-10-11", + "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"R Consortium\", role = \"fnd\"), person(\"Posit Software, PBC\", role = \"fnd\", comment = c(ROR = \"03wc8by49\")) )", + "Description": "Implements an S3 class for storing and formatting time-of-day values, based on the 'difftime' class.", + "License": "MIT + file LICENSE", + "URL": "https://hms.tidyverse.org/, https://github.com/tidyverse/hms", + "BugReports": "https://github.com/tidyverse/hms/issues", + "Imports": [ + "cli", + "lifecycle", + "methods", + "pkgconfig", + "rlang (>= 1.0.2)", + "vctrs (>= 0.3.8)" + ], + "Suggests": [ + "crayon", + "lubridate", + "pillar (>= 1.1.0)", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), R Consortium [fnd], Posit Software, PBC [fnd] (ROR: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "hoardr": { + "Package": "hoardr", + "Version": "0.5.5", + "Source": "Repository", + "Type": "Package", + "Title": "Manage Cached Files", + "Description": "Suite of tools for managing cached files, targeting use in other R packages. Uses 'rappdirs' for cross-platform paths. Provides utilities to manage cache directories, including targeting files by path or by key; cached directories can be compressed and uncompressed easily to save disk space.", + "Authors@R": "c(person(\"Scott\", \"Chamberlain\", role = \"aut\", comment = c(ORCID=\"0000-0003-2542-2202\")), person(\"Tamás\", \"Stirling\", role = c(\"ctb\", \"cre\"), email = \"stirling.tamas@gmail.com\"))", + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/hoardr/, https://github.com/ropensci/hoardr", + "BugReports": "https://github.com/ropensci/hoardr/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Imports": [ + "R6", + "rappdirs", + "digest" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown" + ], + "RoxygenNote": "7.3.2", + "X-schema.org-applicationCategory": "Data", + "X-schema.org-keywords": "caching, data, files, xml, pdf", + "X-schema.org-isPartOf": "https://ropensci.org", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Scott Chamberlain [aut] (), Tamás Stirling [ctb, cre]", + "Maintainer": "Tamás Stirling ", + "Repository": "CRAN" + }, + "htmltools": { + "Package": "htmltools", + "Version": "0.5.9", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for HTML", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools for HTML generation and output.", + "License": "GPL (>= 2)", + "URL": "https://github.com/rstudio/htmltools, https://rstudio.github.io/htmltools/", + "BugReports": "https://github.com/rstudio/htmltools/issues", + "Depends": [ + "R (>= 2.14.1)" + ], + "Imports": [ + "base64enc", + "digest", + "fastmap (>= 1.1.0)", + "grDevices", + "rlang (>= 1.0.0)", + "utils" + ], + "Suggests": [ + "Cairo", + "markdown", + "ragg", + "shiny", + "testthat", + "withr" + ], + "Enhances": [ + "knitr" + ], + "Config/Needs/check": "knitr", + "Config/Needs/website": "rstudio/quillt, bench", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R' 'html_print.R' 'htmltools-package.R' 'images.R' 'known_tags.R' 'selector.R' 'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R' 'template.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Winston Chang [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "htmlwidgets": { + "Package": "htmlwidgets", + "Version": "1.6.4", + "Source": "Repository", + "Type": "Package", + "Title": "HTML Widgets for R", + "Authors@R": "c( person(\"Ramnath\", \"Vaidyanathan\", role = c(\"aut\", \"cph\")), person(\"Yihui\", \"Xie\", role = \"aut\"), person(\"JJ\", \"Allaire\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Kenton\", \"Russell\", role = c(\"aut\", \"cph\")), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A framework for creating HTML widgets that render in various contexts including the R console, 'R Markdown' documents, and 'Shiny' web applications.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/ramnathv/htmlwidgets", + "BugReports": "https://github.com/ramnathv/htmlwidgets/issues", + "Imports": [ + "grDevices", + "htmltools (>= 0.5.7)", + "jsonlite (>= 0.9.16)", + "knitr (>= 1.8)", + "rmarkdown", + "yaml" + ], + "Suggests": [ + "testthat" + ], + "Enhances": [ + "shiny (>= 1.1)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Ramnath Vaidyanathan [aut, cph], Yihui Xie [aut], JJ Allaire [aut], Joe Cheng [aut], Carson Sievert [aut, cre] (), Kenton Russell [aut, cph], Ellis Hughes [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "httpcode": { + "Package": "httpcode", + "Version": "0.3.0", + "Source": "Repository", + "Title": "'HTTP' Status Code Helper", + "Description": "Find and explain the meaning of 'HTTP' status codes. Functions included for searching for codes by full or partial number, by message, and get appropriate dog and cat images for many status codes.", + "Authors@R": "person(\"Scott\", \"Chamberlain\", role = c(\"aut\",\"cre\"), email = \"myrmecocystus@gmail.com\", comment = c(ORCID = \"0000-0003-1444-9135\"))", + "License": "MIT + file LICENSE", + "URL": "https://github.com/sckott/httpcode", + "BugReports": "https://github.com/sckott/httpcode/issues", + "Encoding": "UTF-8", + "Language": "en-US", + "Suggests": [ + "testthat" + ], + "RoxygenNote": "7.1.0", + "NeedsCompilation": "no", + "Author": "Scott Chamberlain [aut, cre] ()", + "Maintainer": "Scott Chamberlain ", + "Repository": "CRAN" + }, + "httpuv": { + "Package": "httpuv", + "Version": "1.6.16", + "Source": "Repository", + "Type": "Package", + "Title": "HTTP and WebSocket Server Library", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit, PBC\", \"fnd\", role = \"cph\"), person(\"Hector\", \"Corrada Bravo\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Andrzej\", \"Krzemienski\", role = \"cph\", comment = \"optional.hpp\"), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file\"), person(\"Niels\", \"Provos\", role = \"cph\", comment = \"libuv subcomponent: tree.h\"), person(\"Internet Systems Consortium, Inc.\", role = \"cph\", comment = \"libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c\"), person(\"Alexander\", \"Chemeris\", role = \"cph\", comment = \"libuv subcomponent: stdint-msvc2008.h (from msinttypes)\"), person(\"Google, Inc.\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Sony Mobile Communcations AB\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Berkeley Software Design Inc.\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Kenneth\", \"MacKay\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016)\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Steve\", \"Reid\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"James\", \"Brown\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"Bob\", \"Trower\", role = \"aut\", comment = \"base64 implementation\"), person(\"Alexander\", \"Peslyak\", role = \"aut\", comment = \"MD5 implementation\"), person(\"Trantor Standard Systems\", role = \"cph\", comment = \"base64 implementation\"), person(\"Igor\", \"Sysoev\", role = \"cph\", comment = \"http-parser\") )", + "Description": "Provides low-level socket and protocol support for handling HTTP and WebSocket requests directly from within R. It is primarily intended as a building block for other packages, rather than making it particularly easy to create complete web applications using httpuv alone. httpuv is built on top of the libuv and http-parser C libraries, both of which were developed by Joyent, Inc. (See LICENSE file for libuv and http-parser license information.)", + "License": "GPL (>= 2) | file LICENSE", + "URL": "https://github.com/rstudio/httpuv", + "BugReports": "https://github.com/rstudio/httpuv/issues", + "Depends": [ + "R (>= 2.15.1)" + ], + "Imports": [ + "later (>= 0.8.0)", + "promises", + "R6", + "Rcpp (>= 1.0.7)", + "utils" + ], + "Suggests": [ + "callr", + "curl", + "jsonlite", + "testthat", + "websocket" + ], + "LinkingTo": [ + "later", + "Rcpp" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make, zlib", + "Collate": "'RcppExports.R' 'httpuv.R' 'random_port.R' 'server.R' 'staticServer.R' 'static_paths.R' 'utils.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Winston Chang [aut, cre], Posit, PBC fnd [cph], Hector Corrada Bravo [ctb], Jeroen Ooms [ctb], Andrzej Krzemienski [cph] (optional.hpp), libuv project contributors [cph] (libuv library, see src/libuv/AUTHORS file), Joyent, Inc. and other Node contributors [cph] (libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file), Niels Provos [cph] (libuv subcomponent: tree.h), Internet Systems Consortium, Inc. [cph] (libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c), Alexander Chemeris [cph] (libuv subcomponent: stdint-msvc2008.h (from msinttypes)), Google, Inc. [cph] (libuv subcomponent: pthread-fixes.c), Sony Mobile Communcations AB [cph] (libuv subcomponent: pthread-fixes.c), Berkeley Software Design Inc. [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Kenneth MacKay [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016) [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Steve Reid [aut] (SHA-1 implementation), James Brown [aut] (SHA-1 implementation), Bob Trower [aut] (base64 implementation), Alexander Peslyak [aut] (MD5 implementation), Trantor Standard Systems [cph] (base64 implementation), Igor Sysoev [cph] (http-parser)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "httr": { + "Package": "httr", + "Version": "1.4.8", + "Source": "Repository", + "Title": "Tools for Working with URLs and HTTP", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Useful tools for working with HTTP organised by HTTP verbs (GET(), POST(), etc). Configuration functions make it easy to control additional request components (authenticate(), add_headers() and so on).", + "License": "MIT + file LICENSE", + "URL": "https://httr.r-lib.org/, https://github.com/r-lib/httr", + "BugReports": "https://github.com/r-lib/httr/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "curl (>= 5.1.0)", + "jsonlite", + "mime", + "openssl (>= 0.8)", + "R6" + ], + "Suggests": [ + "covr", + "httpuv", + "jpeg", + "knitr", + "png", + "readr", + "rmarkdown", + "testthat (>= 0.8.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "httr2": { + "Package": "httr2", + "Version": "1.2.2", + "Source": "Repository", + "Title": "Perform HTTP Requests and Process the Responses", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Maximilian\", \"Girlich\", role = \"ctb\") )", + "Description": "Tools for creating and modifying HTTP requests, then performing them and processing the results. 'httr2' is a modern re-imagining of 'httr' that uses a pipe-based interface and solves more of the problems that API wrapping packages face.", + "License": "MIT + file LICENSE", + "URL": "https://httr2.r-lib.org, https://github.com/r-lib/httr2", + "BugReports": "https://github.com/r-lib/httr2/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "curl (>= 6.4.0)", + "glue", + "lifecycle", + "magrittr", + "openssl", + "R6", + "rappdirs", + "rlang (>= 1.1.0)", + "vctrs (>= 0.6.3)", + "withr" + ], + "Suggests": [ + "askpass", + "bench", + "clipr", + "covr", + "docopt", + "httpuv", + "jose", + "jsonlite", + "knitr", + "later (>= 1.4.0)", + "nanonext", + "otel (>= 0.2.0)", + "otelsdk (>= 0.2.0)", + "paws.common (>= 0.8.0)", + "promises", + "rmarkdown", + "testthat (>= 3.1.8)", + "tibble", + "webfakes (>= 1.4.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "resp-stream, req-perform", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], Maximilian Girlich [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "ids": { + "Package": "ids", + "Version": "1.0.1", + "Source": "Repository", + "Title": "Generate Random Identifiers", + "Authors@R": "person(\"Rich\", \"FitzJohn\", role = c(\"aut\", \"cre\"), email = \"rich.fitzjohn@gmail.com\")", + "Description": "Generate random or human readable and pronounceable identifiers.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/richfitz/ids", + "BugReports": "https://github.com/richfitz/ids/issues", + "Imports": [ + "openssl", + "uuid" + ], + "Suggests": [ + "knitr", + "rcorpora", + "rmarkdown", + "testthat" + ], + "RoxygenNote": "6.0.1", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Rich FitzJohn [aut, cre]", + "Maintainer": "Rich FitzJohn ", + "Repository": "CRAN" + }, + "igraph": { + "Package": "igraph", + "Version": "2.2.2", + "Source": "Repository", + "Title": "Network Analysis and Visualization", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Tamás\", \"Nepusz\", , \"ntamas@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-1451-338X\")), person(\"Vincent\", \"Traag\", role = \"aut\", comment = c(ORCID = \"0000-0003-3170-3879\")), person(\"Szabolcs\", \"Horvát\", , \"szhorvat@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-3100-523X\")), person(\"Fabio\", \"Zanini\", , \"fabio.zanini@unsw.edu.au\", role = \"aut\", comment = c(ORCID = \"0000-0001-7097-8539\")), person(\"Daniel\", \"Noom\", role = \"aut\"), person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Michael\", \"Antonov\", role = \"ctb\"), person(\"Chan Zuckerberg Initiative\", role = \"fnd\", comment = c(ROR = \"02qenvm24\")), person(\"David\", \"Schoch\", , \"david.schoch@cynkra.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-2952-4812\")), person(\"Maëlle\", \"Salmon\", , \"maelle@cynkra.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-2815-0399\")) )", + "Description": "Routines for simple graphs and network analysis. It can handle large graphs very well and provides functions for generating random and regular graphs, graph visualization, centrality methods and much more.", + "License": "GPL (>= 2)", + "URL": "https://r.igraph.org/, https://igraph.org/, https://igraph.discourse.group/", + "BugReports": "https://github.com/igraph/rigraph/issues", + "Depends": [ + "methods", + "R (>= 3.5.0)" + ], + "Imports": [ + "cli", + "graphics", + "grDevices", + "lifecycle", + "magrittr", + "Matrix", + "pkgconfig (>= 2.0.0)", + "rlang (>= 1.1.0)", + "stats", + "utils", + "vctrs" + ], + "Suggests": [ + "ape (>= 5.7-0.1)", + "callr", + "decor", + "digest", + "igraphdata", + "knitr", + "rgl (>= 1.3.14)", + "rmarkdown", + "scales", + "stats4", + "tcltk", + "testthat", + "vdiffr", + "withr" + ], + "Enhances": [ + "graph" + ], + "LinkingTo": [ + "cpp11 (>= 0.5.0)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "false", + "Config/build/never-clean": "true", + "Config/comment/compilation-database": "Generate manually with pkgload:::generate_db() for faster pkgload::load_all()", + "Config/Needs/build": "r-lib/roxygen2, devtools, irlba, pkgconfig, igraph/igraph.r2cdocs, moodymudskipper/devtag", + "Config/Needs/coverage": "covr", + "Config/Needs/website": "here, readr, tibble, xmlparsedata, xml2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "aaa-auto, vs-es, scan, vs-operators, weakref, watts.strogatz.game", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "SystemRequirements": "libxml2 (optional), glpk (>= 4.57, optional)", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut] (ORCID: ), Tamás Nepusz [aut] (ORCID: ), Vincent Traag [aut] (ORCID: ), Szabolcs Horvát [aut] (ORCID: ), Fabio Zanini [aut] (ORCID: ), Daniel Noom [aut], Kirill Müller [aut, cre] (ORCID: ), Michael Antonov [ctb], Chan Zuckerberg Initiative [fnd] (ROR: ), David Schoch [aut] (ORCID: ), Maëlle Salmon [aut] (ORCID: )", + "Maintainer": "Kirill Müller ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "ini": { + "Package": "ini", + "Version": "0.3.1", + "Source": "Repository", + "Type": "Package", + "Title": "Read and Write '.ini' Files", + "Date": "2018-05-19", + "Author": "David Valentim Dias", + "Maintainer": "David Valentim Dias ", + "Description": "Parse simple '.ini' configuration files to an structured list. Users can manipulate this resulting list with lapply() functions. This same structured list can be used to write back to file after modifications.", + "License": "GPL-3", + "URL": "https://github.com/dvdscripter/ini", + "BugReports": "https://github.com/dvdscripter/ini/issues", + "LazyData": "FALSE", + "RoxygenNote": "6.0.1", + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Repository": "CRAN" + }, + "isoband": { + "Package": "isoband", + "Version": "0.3.0", + "Source": "Repository", + "Title": "Generate Isolines and Isobands from Regularly Spaced Elevation Grids", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Claus O.\", \"Wilke\", , \"wilke@austin.utexas.edu\", role = \"aut\", comment = c(\"Original author\", ORCID = \"0000-0002-7470-9261\")), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A fast C++ implementation to generate contour lines (isolines) and contour polygons (isobands) from regularly spaced grids containing elevation data.", + "License": "MIT + file LICENSE", + "URL": "https://isoband.r-lib.org, https://github.com/r-lib/isoband", + "BugReports": "https://github.com/r-lib/isoband/issues", + "Imports": [ + "cli", + "grid", + "rlang", + "utils" + ], + "Suggests": [ + "covr", + "ggplot2", + "knitr", + "magick", + "bench", + "rmarkdown", + "sf", + "testthat (>= 3.0.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-12-05", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/build/compilation-database": "true", + "LinkingTo": [ + "cpp11" + ], + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut] (ORCID: ), Claus O. Wilke [aut] (Original author, ORCID: ), Thomas Lin Pedersen [aut, cre] (ORCID: ), Posit, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "janitor": { + "Package": "janitor", + "Version": "2.2.1", + "Source": "Repository", + "Title": "Simple Tools for Examining and Cleaning Dirty Data", + "Authors@R": "c(person(\"Sam\", \"Firke\", email = \"samuel.firke@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Bill\", \"Denney\", email = \"wdenney@humanpredictions.com\", role = \"ctb\"), person(\"Chris\", \"Haid\", email = \"chrishaid@gmail.com\", role = \"ctb\"), person(\"Ryan\", \"Knight\", email = \"ryangknight@gmail.com\", role = \"ctb\"), person(\"Malte\", \"Grosser\", email = \"malte.grosser@gmail.com\", role = \"ctb\"), person(\"Jonathan\", \"Zadra\", email = \"jonathan.zadra@sorensonimpact.com\", role = \"ctb\"))", + "Description": "The main janitor functions can: perfectly format data.frame column names; provide quick counts of variable combinations (i.e., frequency tables and crosstabs); and explore duplicate records. Other janitor functions nicely format the tabulation results. These tabulate-and-report functions approximate popular features of SPSS and Microsoft Excel. This package follows the principles of the \"tidyverse\" and works well with the pipe function %>%. janitor was built with beginning-to-intermediate R users in mind and is optimized for user-friendliness.", + "URL": "https://github.com/sfirke/janitor, https://sfirke.github.io/janitor/", + "BugReports": "https://github.com/sfirke/janitor/issues", + "Depends": [ + "R (>= 3.1.2)" + ], + "Imports": [ + "dplyr (>= 1.0.0)", + "hms", + "lifecycle", + "lubridate", + "magrittr", + "purrr", + "rlang", + "stringi", + "stringr", + "snakecase (>= 0.9.2)", + "tidyselect (>= 1.0.0)", + "tidyr (>= 0.7.0)" + ], + "License": "MIT + file LICENSE", + "RoxygenNote": "7.2.3", + "Suggests": [ + "dbplyr", + "knitr", + "rmarkdown", + "RSQLite", + "sf", + "testthat (>= 3.0.0)", + "tibble", + "tidygraph" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Sam Firke [aut, cre], Bill Denney [ctb], Chris Haid [ctb], Ryan Knight [ctb], Malte Grosser [ctb], Jonathan Zadra [ctb]", + "Maintainer": "Sam Firke ", + "Repository": "CRAN" + }, + "jpeg": { + "Package": "jpeg", + "Version": "0.1-11", + "Source": "Repository", + "Title": "Read and write JPEG images", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, )", + "Authors@R": "person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.org\", ORCID=\"0000-0003-2297-1732\"))", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" + ], + "Description": "This package provides an easy and simple way to read, write and display bitmap images stored in the JPEG format. It can read and write both files and in-memory raw vectors.", + "License": "GPL-2 | GPL-3", + "SystemRequirements": "libjpeg", + "URL": "https://www.rforge.net/jpeg/", + "BugReports": "https://github.com/s-u/jpeg/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "jqr": { + "Package": "jqr", + "Version": "1.4.0", + "Source": "Repository", + "Title": "Client for 'jq', a 'JSON' Processor", + "Description": "Client for 'jq', a 'JSON' processor (), written in C. 'jq' allows the following with 'JSON' data: index into, parse, do calculations, cut up and filter, change key names and values, perform conditionals and comparisons, and more.", + "Depends": [ + "R (>= 3.1.2)" + ], + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Language": "en-US", + "LazyData": "true", + "Authors@R": "c(person(\"Rich\", \"FitzJohn\", role = \"aut\", email = \"rich.fitzjohn@gmail.com\"), person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\"), person(\"Scott\", \"Chamberlain\", role = \"aut\", email = \"myrmecocystus@gmail.com\"), person(\"Stefan Milton Bache\", role = \"aut\", email = \"stefan@stefanbache.dk\"))", + "URL": "https://docs.ropensci.org/jqr/ https://ropensci.r-universe.dev/jqr", + "BugReports": "https://github.com/ropensci/jqr/issues", + "SystemRequirements": "libjq: jq-devel (rpm) or libjq-dev (deb)", + "Imports": [ + "magrittr", + "lazyeval" + ], + "Suggests": [ + "jsonlite", + "testthat" + ], + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "Rich FitzJohn [aut], Jeroen Ooms [aut, cre], Scott Chamberlain [aut], Stefan Milton Bache [aut]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "jquerylib": { + "Package": "jquerylib", + "Version": "0.1.4", + "Source": "Repository", + "Title": "Obtain 'jQuery' as an HTML Dependency Object", + "Authors@R": "c( person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"), person(family = \"RStudio\", role = \"cph\"), person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\") )", + "Description": "Obtain any major version of 'jQuery' () and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown'). Most R users don't need to use this package directly, but other R packages (e.g. 'shiny', 'rmarkdown', etc.) depend on this package to avoid bundling redundant copies of 'jQuery'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "RoxygenNote": "7.0.2", + "Imports": [ + "htmltools" + ], + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], RStudio [cph], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "jsonify": { + "Package": "jsonify", + "Version": "1.2.3", + "Source": "Repository", + "Type": "Package", + "Title": "Convert Between 'R' Objects and Javascript Object Notation (JSON)", + "Date": "2025-11-24", + "Authors@R": "c( person(\"David\", \"Cooley\", ,\"dcooley@symbolix.com.au\", role = c(\"aut\", \"cre\")), person(\"Chris\", \"Muir\", role = \"ctb\"), person(\"Brendan\", \"Knapp\", role = \"ctb\", comment = c(ORCID = \"0000-0003-3284-4972\")) )", + "Description": "Conversions between 'R' objects and Javascript Object Notation (JSON) using the 'rapidjsonr' library .", + "License": "MIT + file LICENSE", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "Rcpp (>= 1.1.0)" + ], + "LinkingTo": [ + "rapidjsonr (>= 1.2.1)", + "Rcpp" + ], + "RoxygenNote": "7.3.2", + "Suggests": [ + "covr", + "testthat", + "knitr", + "rmarkdown" + ], + "Encoding": "UTF-8", + "URL": "https://symbolixau.github.io/jsonify/, https://github.com/SymbolixAU/jsonify", + "BugReports": "https://github.com/SymbolixAU/jsonify/issues", + "NeedsCompilation": "yes", + "Author": "David Cooley [aut, cre], Chris Muir [ctb], Brendan Knapp [ctb] (ORCID: )", + "Maintainer": "David Cooley ", + "Repository": "CRAN" + }, + "jsonlite": { + "Package": "jsonlite", + "Version": "2.0.0", + "Source": "Repository", + "Title": "A Simple and Robust JSON Parser and Generator for R", + "License": "MIT + file LICENSE", + "Depends": [ + "methods" + ], + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Duncan\", \"Temple Lang\", role = \"ctb\"), person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))", + "URL": "https://jeroen.r-universe.dev/jsonlite https://arxiv.org/abs/1403.2805", + "BugReports": "https://github.com/jeroen/jsonlite/issues", + "Maintainer": "Jeroen Ooms ", + "VignetteBuilder": "knitr, R.rsp", + "Description": "A reasonably fast JSON parser and generator, optimized for statistical data and the web. Offers simple, flexible tools for working with JSON in R, and is particularly powerful for building pipelines and interacting with a web API. The implementation is based on the mapping described in the vignette (Ooms, 2014). In addition to converting JSON data from/to R objects, 'jsonlite' contains functions to stream, validate, and prettify JSON data. The unit tests included with the package verify that all edge cases are encoded and decoded consistently for use with dynamic data in systems and applications.", + "Suggests": [ + "httr", + "vctrs", + "testthat", + "knitr", + "rmarkdown", + "R.rsp", + "sf" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Duncan Temple Lang [ctb], Lloyd Hilaiel [cph] (author of bundled libyajl)", + "Repository": "CRAN" + }, + "kableExtra": { + "Package": "kableExtra", + "Version": "1.4.0", + "Source": "Repository", + "Type": "Package", + "Title": "Construct Complex Table with 'kable' and Pipe Syntax", + "Authors@R": "c( person('Hao', 'Zhu', email = 'haozhu233@gmail.com', role = c('aut', 'cre'), comment = c(ORCID = '0000-0002-3386-6076')), person('Thomas', 'Travison', role = 'ctb'), person('Timothy', 'Tsai', role = 'ctb'), person('Will', 'Beasley', email = 'wibeasley@hotmail.com', role = 'ctb'), person('Yihui', 'Xie', email = 'xie@yihui.name', role = 'ctb'), person('GuangChuang', 'Yu', email = 'guangchuangyu@gmail.com', role = 'ctb'), person('Stéphane', 'Laurent', role = 'ctb'), person('Rob', 'Shepherd', role = 'ctb'), person('Yoni', 'Sidi', role = 'ctb'), person('Brian', 'Salzer', role = 'ctb'), person('George', 'Gui', role = 'ctb'), person('Yeliang', 'Fan', role = 'ctb'), person('Duncan', 'Murdoch', role = 'ctb'), person('Vincent', 'Arel-Bundock', role = 'ctb'), person('Bill', 'Evans', role = 'ctb') )", + "Description": "Build complex HTML or 'LaTeX' tables using 'kable()' from 'knitr' and the piping syntax from 'magrittr'. Function 'kable()' is a light weight table generator coming from 'knitr'. This package simplifies the way to manipulate the HTML or 'LaTeX' codes generated by 'kable()' and allows users to construct complex tables and customize styles using a readable syntax.", + "License": "MIT + file LICENSE", + "URL": "http://haozhu233.github.io/kableExtra/, https://github.com/haozhu233/kableExtra", + "BugReports": "https://github.com/haozhu233/kableExtra/issues", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "knitr (>= 1.33)", + "magrittr", + "stringr (>= 1.0)", + "xml2 (>= 1.1.1)", + "rmarkdown (>= 1.6.0)", + "scales", + "viridisLite", + "stats", + "grDevices", + "htmltools", + "rstudioapi", + "tools", + "digest", + "graphics", + "svglite" + ], + "Suggests": [ + "testthat", + "magick", + "tinytex", + "formattable", + "sparkline", + "webshot2" + ], + "Config/testthat/edition": "3", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Language": "en-US", + "NeedsCompilation": "no", + "Author": "Hao Zhu [aut, cre] (), Thomas Travison [ctb], Timothy Tsai [ctb], Will Beasley [ctb], Yihui Xie [ctb], GuangChuang Yu [ctb], Stéphane Laurent [ctb], Rob Shepherd [ctb], Yoni Sidi [ctb], Brian Salzer [ctb], George Gui [ctb], Yeliang Fan [ctb], Duncan Murdoch [ctb], Vincent Arel-Bundock [ctb], Bill Evans [ctb]", + "Maintainer": "Hao Zhu ", + "Repository": "CRAN" + }, + "keyring": { + "Package": "keyring", + "Version": "1.4.1", + "Source": "Repository", + "Title": "Access the System Credential Store from R", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Alec\", \"Wong\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Platform independent 'API' to access the operating system's credential store. Currently supports: 'Keychain' on 'macOS', Credential Store on 'Windows', the Secret Service 'API' on 'Linux', and simple, platform independent stores implemented with environment variables or encrypted files. Additional storage back-ends can be added easily.", + "License": "MIT + file LICENSE", + "URL": "https://keyring.r-lib.org/, https://github.com/r-lib/keyring", + "BugReports": "https://github.com/r-lib/keyring/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "askpass", + "filelock", + "R6", + "tools", + "utils", + "yaml" + ], + "Suggests": [ + "callr", + "covr", + "openssl", + "testthat (>= 3.0.0)", + "withr" + ], + "Biarch": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-30", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "SystemRequirements": "Optional: libsecret on Linux (libsecret-1-dev on Debian/Ubuntu, libsecret-devel on Fedora/CentOS)", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Alec Wong [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "knitr": { + "Package": "knitr", + "Version": "1.51", + "Source": "Repository", + "Type": "Package", + "Title": "A General-Purpose Package for Dynamic Report Generation in R", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Abhraneel\", \"Sarma\", role = \"ctb\"), person(\"Adam\", \"Vogt\", role = \"ctb\"), person(\"Alastair\", \"Andrew\", role = \"ctb\"), person(\"Alex\", \"Zvoleff\", role = \"ctb\"), person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"), person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"), person(\"Aron\", \"Atkins\", role = \"ctb\"), person(\"Aaron\", \"Wolen\", role = \"ctb\"), person(\"Ashley\", \"Manton\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")), person(\"Ben\", \"Baumer\", role = \"ctb\"), person(\"Brian\", \"Diggs\", role = \"ctb\"), person(\"Brian\", \"Zhang\", role = \"ctb\"), person(\"Bulat\", \"Yapparov\", role = \"ctb\"), person(\"Cassio\", \"Pereira\", role = \"ctb\"), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person(\"David\", \"Hall\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", role = \"ctb\"), person(\"David\", \"Robinson\", role = \"ctb\"), person(\"Doug\", \"Hemken\", role = \"ctb\"), person(\"Duncan\", \"Murdoch\", role = \"ctb\"), person(\"Elio\", \"Campitelli\", role = \"ctb\"), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Emily\", \"Riederer\", role = \"ctb\"), person(\"Fabian\", \"Hirschmann\", role = \"ctb\"), person(\"Fitch\", \"Simeon\", role = \"ctb\"), person(\"Forest\", \"Fang\", role = \"ctb\"), person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"), person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"), person(\"Gregoire\", \"Detrez\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Hao\", \"Zhu\", role = \"ctb\"), person(\"Heewon\", \"Jeon\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Hodges\", \"Daniel\", role = \"ctb\"), person(\"Jacob\", \"Bien\", role = \"ctb\"), person(\"Jake\", \"Burkhead\", role = \"ctb\"), person(\"James\", \"Manton\", role = \"ctb\"), person(\"Jared\", \"Lander\", role = \"ctb\"), person(\"Jason\", \"Punyon\", role = \"ctb\"), person(\"Javier\", \"Luraschi\", role = \"ctb\"), person(\"Jeff\", \"Arnold\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", role = \"ctb\"), person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"), person(\"Jeremy\", \"Stephens\", role = \"ctb\"), person(\"Jim\", \"Hester\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Johannes\", \"Ranke\", role = \"ctb\"), person(\"John\", \"Honaker\", role = \"ctb\"), person(\"John\", \"Muschelli\", role = \"ctb\"), person(\"Jonathan\", \"Keane\", role = \"ctb\"), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Johan\", \"Toloe\", role = \"ctb\"), person(\"Jonathan\", \"Sidi\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Julien\", \"Barnier\", role = \"ctb\"), person(\"Kaiyin\", \"Zhong\", role = \"ctb\"), person(\"Kamil\", \"Slowikowski\", role = \"ctb\"), person(\"Karl\", \"Forner\", role = \"ctb\"), person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"), person(\"Kirill\", \"Mueller\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Lorenz\", \"Walthert\", role = \"ctb\"), person(\"Lucas\", \"Gallindo\", role = \"ctb\"), person(\"Marius\", \"Hofert\", role = \"ctb\"), person(\"Martin\", \"Modrák\", role = \"ctb\"), person(\"Michael\", \"Chirico\", role = \"ctb\"), person(\"Michael\", \"Friendly\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", role = \"ctb\"), person(\"Michel\", \"Kuhlmann\", role = \"ctb\"), person(\"Miller\", \"Patrick\", role = \"ctb\"), person(\"Nacho\", \"Caballero\", role = \"ctb\"), person(\"Nick\", \"Salkowski\", role = \"ctb\"), person(\"Niels Richard\", \"Hansen\", role = \"ctb\"), person(\"Noam\", \"Ross\", role = \"ctb\"), person(\"Obada\", \"Mahdi\", role = \"ctb\"), person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")), person(\"Pedro\", \"Faria\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\"), person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"), person(\"Rodrigo\", \"Copetti\", role = \"ctb\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Ruaridh\", \"Williamson\", role = \"ctb\"), person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")), person(\"Scott\", \"Kostyshak\", role = \"ctb\"), person(\"Sebastian\", \"Meyer\", role = \"ctb\"), person(\"Sietse\", \"Brouwer\", role = \"ctb\"), person(c(\"Simon\", \"de\"), \"Bernard\", role = \"ctb\"), person(\"Sylvain\", \"Rousseau\", role = \"ctb\"), person(\"Taiyun\", \"Wei\", role = \"ctb\"), person(\"Thibaut\", \"Assus\", role = \"ctb\"), person(\"Thibaut\", \"Lamadon\", role = \"ctb\"), person(\"Thomas\", \"Leeper\", role = \"ctb\"), person(\"Tim\", \"Mastny\", role = \"ctb\"), person(\"Tom\", \"Torsney-Weir\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = \"ctb\"), person(\"Viktoras\", \"Veitas\", role = \"ctb\"), person(\"Weicheng\", \"Zhu\", role = \"ctb\"), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Zachary\", \"Foster\", role = \"ctb\"), person(\"Zhian N.\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a general-purpose tool for dynamic report generation in R using Literate Programming techniques.", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "evaluate (>= 0.15)", + "highr (>= 0.11)", + "methods", + "tools", + "xfun (>= 0.52)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "bslib", + "DBI (>= 0.4-1)", + "digest", + "formatR", + "gifski", + "gridSVG", + "htmlwidgets (>= 0.7)", + "jpeg", + "JuliaCall (>= 0.11.1)", + "magick", + "litedown", + "markdown (>= 1.3)", + "otel", + "otelsdk", + "png", + "ragg", + "reticulate (>= 1.4)", + "rgl (>= 0.95.1201)", + "rlang", + "rmarkdown", + "sass", + "showtext", + "styler (>= 1.2.0)", + "targets (>= 0.6.0)", + "testit", + "tibble", + "tikzDevice (>= 0.10)", + "tinytex (>= 0.56)", + "webshot", + "rstudioapi", + "svglite" + ], + "License": "GPL", + "URL": "https://yihui.org/knitr/", + "BugReports": "https://github.com/yihui/knitr/issues", + "Encoding": "UTF-8", + "VignetteBuilder": "litedown, knitr", + "SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).", + "Collate": "'block.R' 'cache.R' 'citation.R' 'hooks-html.R' 'plot.R' 'utils.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'otel.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (ORCID: , URL: https://yihui.org), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (ORCID: ), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (ORCID: ), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (ORCID: ), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" + }, + "labeling": { + "Package": "labeling", + "Version": "0.4.3", + "Source": "Repository", + "Type": "Package", + "Title": "Axis Labeling", + "Date": "2023-08-29", + "Author": "Justin Talbot,", + "Maintainer": "Nuno Sempere ", + "Description": "Functions which provide a range of axis labeling algorithms.", + "License": "MIT + file LICENSE | Unlimited", + "Collate": "'labeling.R'", + "NeedsCompilation": "no", + "Imports": [ + "stats", + "graphics" + ], + "Repository": "CRAN" + }, + "later": { + "Package": "later", + "Version": "1.4.7", + "Source": "Repository", + "Type": "Package", + "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", + "License": "MIT + file LICENSE", + "URL": "https://later.r-lib.org, https://github.com/r-lib/later", + "BugReports": "https://github.com/r-lib/later/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "Rcpp (>= 1.0.10)", + "rlang" + ], + "Suggests": [ + "knitr", + "nanonext", + "promises", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-07-18", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Maintainer": "Charlie Gao ", + "Repository": "CRAN" }, "lattice": { "Package": "lattice", - "Version": "0.20-45", + "Version": "0.22-7", "Source": "Repository", - "Repository": "CRAN", - "Hash": "b64cdbb2b340437c4ee047a1f4c4377b" + "Date": "2025-03-31", + "Priority": "recommended", + "Title": "Trellis Graphics for R", + "Authors@R": "c(person(\"Deepayan\", \"Sarkar\", role = c(\"aut\", \"cre\"), email = \"deepayan.sarkar@r-project.org\", comment = c(ORCID = \"0000-0003-4107-1553\")), person(\"Felix\", \"Andrews\", role = \"ctb\"), person(\"Kevin\", \"Wright\", role = \"ctb\", comment = \"documentation\"), person(\"Neil\", \"Klepeis\", role = \"ctb\"), person(\"Johan\", \"Larsson\", role = \"ctb\", comment = \"miscellaneous improvements\"), person(\"Zhijian (Jason)\", \"Wen\", role = \"cph\", comment = \"filled contour code\"), person(\"Paul\", \"Murrell\", role = \"ctb\", email = \"paul@stat.auckland.ac.nz\"), person(\"Stefan\", \"Eng\", role = \"ctb\", comment = \"violin plot improvements\"), person(\"Achim\", \"Zeileis\", role = \"ctb\", comment = \"modern colors\"), person(\"Alexandre\", \"Courtiol\", role = \"ctb\", comment = \"generics for larrows, lpolygon, lrect and lsegments\") )", + "Description": "A powerful and elegant high-level data visualization system inspired by Trellis graphics, with an emphasis on multivariate data. Lattice is sufficient for typical graphics needs, and is also flexible enough to handle most nonstandard requirements. See ?Lattice for an introduction.", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "KernSmooth", + "MASS", + "latticeExtra", + "colorspace" + ], + "Imports": [ + "grid", + "grDevices", + "graphics", + "stats", + "utils" + ], + "Enhances": [ + "chron", + "zoo" + ], + "LazyLoad": "yes", + "LazyData": "yes", + "License": "GPL (>= 2)", + "URL": "https://lattice.r-forge.r-project.org/", + "BugReports": "https://github.com/deepayan/lattice/issues", + "NeedsCompilation": "yes", + "Author": "Deepayan Sarkar [aut, cre] (), Felix Andrews [ctb], Kevin Wright [ctb] (documentation), Neil Klepeis [ctb], Johan Larsson [ctb] (miscellaneous improvements), Zhijian (Jason) Wen [cph] (filled contour code), Paul Murrell [ctb], Stefan Eng [ctb] (violin plot improvements), Achim Zeileis [ctb] (modern colors), Alexandre Courtiol [ctb] (generics for larrows, lpolygon, lrect and lsegments)", + "Maintainer": "Deepayan Sarkar ", + "Repository": "CRAN" }, - "mgcv": { - "Package": "mgcv", - "Version": "1.8-38", + "lazyeval": { + "Package": "lazyeval", + "Version": "0.2.2", "Source": "Repository", - "Repository": "CRAN", - "Hash": "be3c61ffbb1e3d3b3df214d192ac5444" + "Title": "Lazy (Non-Standard) Evaluation", + "Description": "An alternative approach to non-standard evaluation using formulas. Provides a full implementation of LISP style 'quasiquotation', making it easier to generate code with other code.", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", ,\"hadley@rstudio.com\", c(\"aut\", \"cre\")), person(\"RStudio\", role = \"cph\") )", + "License": "GPL-3", + "LazyData": "true", + "Depends": [ + "R (>= 3.1.0)" + ], + "Suggests": [ + "knitr", + "rmarkdown (>= 0.2.65)", + "testthat", + "covr" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "6.1.1", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], RStudio [cph]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, - "nlme": { - "Package": "nlme", - "Version": "3.1-153", + "leafem": { + "Package": "leafem", + "Version": "0.2.5", "Source": "Repository", - "Repository": "CRAN", - "Hash": "2d632e0d963a653a0329756ce701ecdd" + "Title": "'leaflet' Extensions for 'mapview'", + "Authors@R": "c(person(given = \"Tim\", family = \"Appelhans\", role = c(\"cre\", \"aut\"), email = \"tim.appelhans@gmail.com\"), person(given = \"Christoph\", family = \"Reudenbach\", role = \"ctb\", email = \"reudenbach@geo.uni-marburg.de\"), person(given = \"Kenton\", family = \"Russell\", role = \"ctb\"), person(given = \"Jochen\", family = \"Darley\", role = \"ctb\", email = \"Debugger@jedimasters.de\"), person(given = \"Daniel\", family = \"Montague\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.EasyButton plugin\"), person(given = \"Lorenzo\", family = \"Busetto\", role = c(\"ctb\"), email = \"lbusett@gmail.com\"), person(given = \"Luigi\", family = \"Ranghetti\", role = c(\"ctb\")), person(given = \"Miles\", family = \"McBain\", role = c(\"ctb\")), person(given = \"Sebastian\", family = \"Gatscha\", role = \"ctb\", email = \"sebastian_gatscha@gmx.at\"), person(given = \"Björn\", family = \"Harrtell\", role = c(\"ctb\", \"cph\"), comment = \"FlatGeobuf plugin\"), person(given = \"Daniel\", family = \"Dufour\", role = c(\"ctb\", \"cph\"), comment = \"georaster-layer-for-leaflet\"), person(given = \"Yeedle\", family = \"Neuwirth\", role = \"ctb\"), person(given = \"Derek\", family = \"Friend\", role = \"ctb\", email = \"dafriend.r@gmail.com\"), person(given = \"Kevin\", family = \"Cazelles\", role = \"ctb\", email = \"kevin.cazelles@gmail.com\", comment = c(ORCID = \"0000-0001-6619-9874\")))", + "Maintainer": "Tim Appelhans ", + "Description": "Provides extensions for packages 'leaflet' & 'mapdeck', many of which are used by package 'mapview'. Focus is on functionality readily available in Geographic Information Systems such as 'Quantum GIS'. Includes functions to display coordinates of mouse pointer position, query image values via mouse pointer and zoom-to-layer buttons. Additionally, provides a feature type agnostic function to add points, lines, polygons to a map.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-spatial/leafem, https://r-spatial.github.io/leafem/", + "BugReports": "https://github.com/r-spatial/leafem/issues", + "Depends": [ + "R (>= 3.1.0)" + ], + "Imports": [ + "base64enc", + "geojsonsf", + "htmltools (>= 0.3)", + "htmlwidgets", + "jsonlite", + "leaflet (>= 2.0.1)", + "methods", + "raster", + "sf", + "png" + ], + "Suggests": [ + "clipr", + "fontawesome", + "leafgl", + "lwgeom", + "mapdeck", + "plainview", + "stars", + "terra", + "tools" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Tim Appelhans [cre, aut], Christoph Reudenbach [ctb], Kenton Russell [ctb], Jochen Darley [ctb], Daniel Montague [ctb, cph] (Leaflet.EasyButton plugin), Lorenzo Busetto [ctb], Luigi Ranghetti [ctb], Miles McBain [ctb], Sebastian Gatscha [ctb], Björn Harrtell [ctb, cph] (FlatGeobuf plugin), Daniel Dufour [ctb, cph] (georaster-layer-for-leaflet), Yeedle Neuwirth [ctb], Derek Friend [ctb], Kevin Cazelles [ctb] (ORCID: )", + "Repository": "CRAN" + }, + "leaflet": { + "Package": "leaflet", + "Version": "2.2.3", + "Source": "Repository", + "Type": "Package", + "Title": "Create Interactive Web Maps with the JavaScript 'Leaflet' Library", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Bhaskar\", \"Karambelkar\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kenton\", \"Russell\", role = \"ctb\"), person(\"Kent\", \"Johnson\", role = \"ctb\"), person(\"Vladimir\", \"Agafonkin\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet library\"), person(\"CloudMade\", role = \"cph\", comment = \"Leaflet library\"), person(\"Leaflet contributors\", role = \"ctb\", comment = \"Leaflet library\"), person(\"Brandon Copeland\", role = c(\"ctb\", \"cph\"), comment = \"leaflet-measure plugin\"), person(\"Joerg Dietrich\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.Terminator plugin\"), person(\"Benjamin Becquet\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.MagnifyingGlass plugin\"), person(\"Norkart AS\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.MiniMap plugin\"), person(\"L. Voogdt\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.awesome-markers plugin\"), person(\"Daniel Montague\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet.EasyButton plugin\"), person(\"Kartena AB\", role = c(\"ctb\", \"cph\"), comment = \"Proj4Leaflet plugin\"), person(\"Robert Kajic\", role = c(\"ctb\", \"cph\"), comment = \"leaflet-locationfilter plugin\"), person(\"Mapbox\", role = c(\"ctb\", \"cph\"), comment = \"leaflet-omnivore plugin\"), person(\"Michael Bostock\", role = c(\"ctb\", \"cph\"), comment = \"topojson\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Create and customize interactive maps using the 'Leaflet' JavaScript library and the 'htmlwidgets' package. These maps can be used directly from the R console, from 'RStudio', in Shiny applications and R Markdown documents.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/leaflet/, https://github.com/rstudio/leaflet", + "BugReports": "https://github.com/rstudio/leaflet/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "crosstalk", + "htmltools", + "htmlwidgets (>= 1.5.4)", + "jquerylib", + "leaflet.providers (>= 2.0.0)", + "magrittr", + "methods", + "png", + "raster (>= 3.6.3)", + "RColorBrewer", + "rlang", + "scales (>= 1.0.0)", + "sf (>= 0.9-6)", + "stats", + "viridisLite", + "xfun" + ], + "Suggests": [ + "knitr", + "maps", + "purrr", + "R6", + "RJSONIO", + "rmarkdown", + "s2", + "shiny (>= 1.0.0)", + "sp", + "terra", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "dplyr, ncdf4, rnaturalearth, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Barret Schloerke [aut] (ORCID: ), Bhaskar Karambelkar [aut], Yihui Xie [aut], Garrick Aden-Buie [aut, cre] (ORCID: ), Hadley Wickham [ctb], Kenton Russell [ctb], Kent Johnson [ctb], Vladimir Agafonkin [ctb, cph] (Leaflet library), CloudMade [cph] (Leaflet library), Leaflet contributors [ctb] (Leaflet library), Brandon Copeland [ctb, cph] (leaflet-measure plugin), Joerg Dietrich [ctb, cph] (Leaflet.Terminator plugin), Benjamin Becquet [ctb, cph] (Leaflet.MagnifyingGlass plugin), Norkart AS [ctb, cph] (Leaflet.MiniMap plugin), L. Voogdt [ctb, cph] (Leaflet.awesome-markers plugin), Daniel Montague [ctb, cph] (Leaflet.EasyButton plugin), Kartena AB [ctb, cph] (Proj4Leaflet plugin), Robert Kajic [ctb, cph] (leaflet-locationfilter plugin), Mapbox [ctb, cph] (leaflet-omnivore plugin), Michael Bostock [ctb, cph] (topojson), Posit Software, PBC [cph, fnd]", + "Maintainer": "Garrick Aden-Buie ", + "Repository": "CRAN" + }, + "leaflet.providers": { + "Package": "leaflet.providers", + "Version": "2.0.0", + "Source": "Repository", + "Type": "Package", + "Title": "Leaflet Providers", + "Authors@R": "c( person(\"Leslie\", \"Huang\", , \"lesliehuang@nyu.edu\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = c(\"ctb\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Leaflet Providers contributors\", role = c(\"ctb\", \"cph\"), comment = \"Leaflet Providers plugin\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Contains third-party map tile provider information from 'Leaflet.js', , to be used with the 'leaflet' R package. Additionally, 'leaflet.providers' enables users to retrieve up-to-date provider information between package updates.", + "License": "BSD_2_clause + file LICENSE", + "URL": "https://rstudio.github.io/leaflet.providers/, https://github.com/rstudio/leaflet.providers", + "BugReports": "https://github.com/rstudio/leaflet.providers/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ + "htmltools" + ], + "Suggests": [ + "jsonlite", + "testthat (>= 3.0.0)", + "V8" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "Collate": "'providers_data.R' 'get_current_providers.R' 'leaflet.providers-package.R' 'zzz.R'", + "NeedsCompilation": "no", + "Author": "Leslie Huang [aut], Barret Schloerke [ctb, cre] (), Leaflet Providers contributors [ctb, cph] (Leaflet Providers plugin), Posit Software, PBC [cph, fnd]", + "Maintainer": "Barret Schloerke ", + "Repository": "CRAN" + }, + "lifecycle": { + "Package": "lifecycle", + "Version": "1.0.5", + "Source": "Repository", + "Title": "Manage the Life Cycle of your Package Functions", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Manage the life cycle of your exported functions with shared conventions, documentation badges, and user-friendly deprecation warnings.", + "License": "MIT + file LICENSE", + "URL": "https://lifecycle.r-lib.org/, https://github.com/r-lib/lifecycle", + "BugReports": "https://github.com/r-lib/lifecycle/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "knitr", + "lintr (>= 3.1.0)", + "rmarkdown", + "testthat (>= 3.0.1)", + "tibble", + "tidyverse", + "tools", + "vctrs", + "withr", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, usethis", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" + }, + "lubridate": { + "Package": "lubridate", + "Version": "1.9.5", + "Source": "Repository", + "Type": "Package", + "Title": "Make Dealing with Dates a Little Easier", + "Authors@R": "c( person(\"Vitalie\", \"Spinu\", , \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Garrett\", \"Grolemund\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Davis\", \"Vaughan\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Imanuel\", \"Costigan\", role = \"ctb\"), person(\"Jason\", \"Law\", role = \"ctb\"), person(\"Doug\", \"Mitarotonda\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Jonathan\", \"Boiser\", role = \"ctb\"), person(\"Chel Hee\", \"Lee\", role = \"ctb\") )", + "Maintainer": "Vitalie Spinu ", + "Description": "Functions to work with date-times and time-spans: fast and user friendly parsing of date-time data, extraction and updating of components of a date-time (years, months, days, hours, minutes, and seconds), algebraic manipulation on date-time and time-span objects. The 'lubridate' package has a consistent and memorable syntax that makes working with dates easy and fun.", + "License": "MIT + file LICENSE", + "URL": "https://lubridate.tidyverse.org, https://github.com/tidyverse/lubridate", + "BugReports": "https://github.com/tidyverse/lubridate/issues", + "Depends": [ + "methods", + "R (>= 3.2)" + ], + "Imports": [ + "generics", + "timechange (>= 0.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "testthat (>= 2.1.0)", + "vctrs (>= 0.6.5)" + ], + "Enhances": [ + "chron", + "data.table", + "timeDate", + "tis", + "zoo" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "Collate": "'Dates.r' 'POSIXt.r' 'util.r' 'parse.r' 'timespans.r' 'intervals.r' 'difftimes.r' 'durations.r' 'periods.r' 'accessors-date.R' 'accessors-day.r' 'accessors-dst.r' 'accessors-hour.r' 'accessors-minute.r' 'accessors-month.r' 'accessors-quarter.r' 'accessors-second.r' 'accessors-tz.r' 'accessors-week.r' 'accessors-year.r' 'am-pm.r' 'time-zones.r' 'numeric.r' 'coercion.r' 'constants.r' 'cyclic_encoding.r' 'data.r' 'decimal-dates.r' 'deprecated.r' 'format_ISO8601.r' 'guess.r' 'hidden.r' 'instants.r' 'leap-years.r' 'ops-addition.r' 'ops-compare.r' 'ops-division.r' 'ops-integer-division.r' 'ops-m+.r' 'ops-modulo.r' 'ops-multiplication.r' 'ops-subtraction.r' 'package.r' 'pretty.r' 'round.r' 'stamp.r' 'tzdir.R' 'update.r' 'vctrs.R' 'zzz.R'", + "NeedsCompilation": "yes", + "Author": "Vitalie Spinu [aut, cre], Garrett Grolemund [aut], Hadley Wickham [aut], Davis Vaughan [ctb], Ian Lyttle [ctb], Imanuel Costigan [ctb], Jason Law [ctb], Doug Mitarotonda [ctb], Joseph Larmarange [ctb], Jonathan Boiser [ctb], Chel Hee Lee [ctb]", + "Repository": "CRAN" + }, + "magrittr": { + "Package": "magrittr", + "Version": "2.0.4", + "Source": "Repository", + "Type": "Package", + "Title": "A Forward-Pipe Operator for R", + "Authors@R": "c( person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"), comment = \"Original author and creator of magrittr\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"cre\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. There is flexible support for the type of right-hand side expressions. For more information, see package vignette. To quote Rene Magritte, \"Ceci n'est pas un pipe.\"", + "License": "MIT + file LICENSE", + "URL": "https://magrittr.tidyverse.org, https://github.com/tidyverse/magrittr", + "BugReports": "https://github.com/tidyverse/magrittr/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "Yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of magrittr), Hadley Wickham [aut], Lionel Henry [cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" + }, + "memoise": { + "Package": "memoise", + "Version": "2.0.1", + "Source": "Repository", + "Title": "'Memoisation' of Functions", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Jim\", family = \"Hester\", role = \"aut\"), person(given = \"Winston\", family = \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"), person(given = \"Kirill\", family = \"Müller\", role = \"aut\", email = \"krlmlr+r@mailbox.org\"), person(given = \"Daniel\", family = \"Cook\", role = \"aut\", email = \"danielecook@gmail.com\"), person(given = \"Mark\", family = \"Edmondson\", role = \"ctb\", email = \"r@sunholo.com\"))", + "Description": "Cache the results of a function so that when you call it again with the same arguments it returns the previously computed value.", + "License": "MIT + file LICENSE", + "URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise", + "BugReports": "https://github.com/r-lib/memoise/issues", + "Imports": [ + "rlang (>= 0.4.10)", + "cachem" + ], + "Suggests": [ + "digest", + "aws.s3", + "covr", + "googleAuthR", + "googleCloudStorageR", + "httr", + "testthat" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill Müller [aut], Daniel Cook [aut], Mark Edmondson [ctb]", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "mime": { + "Package": "mime", + "Version": "0.13", + "Source": "Repository", + "Type": "Package", + "Title": "Map Filenames to MIME Types", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"Beilei\", \"Bian\", role = \"ctb\") )", + "Description": "Guesses the MIME type from a filename extension using the data derived from /etc/mime.types in UNIX-type systems.", + "Imports": [ + "tools" + ], + "License": "GPL", + "URL": "https://github.com/yihui/mime", + "BugReports": "https://github.com/yihui/mime/issues", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre] (, https://yihui.org), Jeffrey Horner [ctb], Beilei Bian [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" + }, + "miniUI": { + "Package": "miniUI", + "Version": "0.1.2", + "Source": "Repository", + "Type": "Package", + "Title": "Shiny UI Widgets for Small Screens", + "Authors@R": "c( person(\"Joe\", \"Cheng\", role = c(\"cre\", \"aut\"), email = \"joe@posit.co\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides UI widget and layout functions for writing Shiny apps that work well on small screens.", + "License": "GPL-3", + "URL": "https://github.com/rstudio/miniUI", + "BugReports": "https://github.com/rstudio/miniUI/issues", + "Imports": [ + "shiny (>= 0.13)", + "htmltools (>= 0.3)", + "utils" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Joe Cheng [cre, aut], Posit Software, PBC [cph, fnd] (03wc8by49)", + "Maintainer": "Joe Cheng ", + "Repository": "CRAN" + }, + "modelr": { + "Package": "modelr", + "Version": "0.1.11", + "Source": "Repository", + "Title": "Modelling Functions that Work with the Pipe", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Functions for modelling that help you seamlessly integrate modelling into a pipeline of data manipulation and visualisation.", + "License": "GPL-3", + "URL": "https://modelr.tidyverse.org, https://github.com/tidyverse/modelr", + "BugReports": "https://github.com/tidyverse/modelr/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ + "broom", + "magrittr", + "purrr (>= 0.2.2)", + "rlang (>= 1.0.6)", + "tibble", + "tidyr (>= 0.8.0)", + "tidyselect", + "vctrs" + ], + "Suggests": [ + "compiler", + "covr", + "ggplot2", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.2.3", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "nanoarrow": { + "Package": "nanoarrow", + "Version": "0.8.0", + "Source": "Repository", + "Title": "Interface to the 'nanoarrow' 'C' Library", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\", \"cre\"), email = \"dewey@dunnington.ca\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(\"Apache Arrow\", email = \"dev@arrow.apache.org\", role = c(\"aut\", \"cph\")), person(\"Apache Software Foundation\", email = \"dev@arrow.apache.org\", role = c(\"cph\")) )", + "Description": "Provides an 'R' interface to the 'nanoarrow' 'C' library and the 'Apache Arrow' application binary interface. Functions to import and export 'ArrowArray', 'ArrowSchema', and 'ArrowArrayStream' 'C' structures to and from 'R' objects are provided alongside helpers to facilitate zero-copy data transfer among 'R' bindings to libraries implementing the 'Arrow' 'C' data interface.", + "License": "Apache License (>= 2)", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "URL": "https://arrow.apache.org/nanoarrow/latest/r/, https://github.com/apache/arrow-nanoarrow", + "BugReports": "https://github.com/apache/arrow-nanoarrow/issues", + "Suggests": [ + "arrow (>= 9.0.0)", + "bit64", + "blob", + "dplyr", + "hms", + "jsonlite", + "reticulate", + "rlang", + "testthat (>= 3.0.0)", + "tibble", + "vctrs", + "withr" + ], + "SystemRequirements": "libzstd (optional)", + "Config/testthat/edition": "3", + "Config/build/bootstrap": "TRUE", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut, cre] (ORCID: ), Apache Arrow [aut, cph], Apache Software Foundation [cph]", + "Maintainer": "Dewey Dunnington ", + "Repository": "CRAN" + }, + "ncdf4": { + "Package": "ncdf4", + "Version": "1.24", + "Source": "Repository", + "Date": "2025-03-25", + "Title": "Interface to Unidata netCDF (Version 4 or Earlier) Format Data Files", + "Authors@R": "person(given=\"David\", family=\"Pierce\", email=\"dpierce@ucsd.edu\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-2453-9030\"))", + "Description": "Provides a high-level R interface to data files written using Unidata's netCDF library (version 4 or earlier), which are binary data files that are portable across platforms and include metadata information in addition to the data sets. Using this package, netCDF files (either version 4 or \"classic\" version 3) can be opened and data sets read in easily. It is also easy to create new netCDF dimensions, variables, and files, in either version 3 or 4 format, and manipulate existing netCDF files. This package replaces the former ncdf package, which only worked with netcdf version 3 files. For various reasons the names of the functions have had to be changed from the names in the ncdf package. The old ncdf package is still available at the URL given below, if you need to have backward compatibility. It should be possible to have both the ncdf and ncdf4 packages installed simultaneously without a problem. However, the ncdf package does not provide an interface for netcdf version 4 files.", + "SystemRequirements": "netcdf library version 4.1 or later", + "License": "GPL (>= 3)", + "URL": "https://cirrus.ucsd.edu/~pierce/ncdf/", + "NeedsCompilation": "yes", + "Author": "David Pierce [aut, cre] ()", + "Maintainer": "David Pierce ", + "Repository": "CRAN" + }, + "openssl": { + "Package": "openssl", + "Version": "2.3.5", + "Source": "Repository", + "Type": "Package", + "Title": "Toolkit for Encryption, Signatures and Certificates Based on OpenSSL", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Oliver\", \"Keyes\", role = \"ctb\"))", + "Description": "Bindings to OpenSSL libssl and libcrypto, plus custom SSH key parsers. Supports RSA, DSA and EC curves P-256, P-384, P-521, and curve25519. Cryptographic signatures can either be created and verified manually or via x509 certificates. AES can be used in cbc, ctr or gcm mode for symmetric encryption; RSA for asymmetric (public key) encryption or EC for Diffie Hellman. High-level envelope functions combine RSA and AES for encrypting arbitrary sized data. Other utilities include key generators, hash functions (md5, sha1, sha256, etc), base64 encoder, a secure random number generator, and 'bignum' math methods for manually performing crypto calculations on large multibyte integers.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/openssl", + "BugReports": "https://github.com/jeroen/openssl/issues", + "SystemRequirements": "OpenSSL >= 1.0.2", + "VignetteBuilder": "knitr", + "Imports": [ + "askpass" + ], + "Suggests": [ + "curl", + "testthat (>= 2.1.0)", + "digest", + "knitr", + "rmarkdown", + "jsonlite", + "jose", + "sodium" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (ORCID: ), Oliver Keyes [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "otel": { + "Package": "otel", + "Version": "0.2.0", + "Source": "Repository", + "Title": "OpenTelemetry R API", + "Authors@R": "person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\"))", + "Description": "High-quality, ubiquitous, and portable telemetry to enable effective observability. OpenTelemetry is a collection of tools, APIs, and SDKs used to instrument, generate, collect, and export telemetry data (metrics, logs, and traces) for analysis in order to understand your software's performance and behavior. This package implements the OpenTelemetry API: . Use this package as a dependency if you want to instrument your R package for OpenTelemetry.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "cli", + "glue", + "jsonlite", + "otelsdk", + "processx", + "shiny", + "spelling", + "testthat (>= 3.0.0)", + "utils", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "URL": "https://otel.r-lib.org, https://github.com/r-lib/otel", + "Additional_repositories": "https://github.com/r-lib/otelsdk/releases/download/devel", + "BugReports": "https://github.com/r-lib/otel/issues", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "piggyback": { + "Package": "piggyback", + "Version": "0.1.5", + "Source": "Repository", + "Title": "Managing Larger Data on a GitHub Repository", + "Description": "Because larger (> 50 MB) data files cannot easily be committed to git, a different approach is required to manage data associated with an analysis in a GitHub repository. This package provides a simple work-around by allowing larger (up to 2 GB) data files to piggyback on a repository as assets attached to individual GitHub releases. These files are not handled by git in any way, but instead are uploaded, downloaded, or edited directly by calls through the GitHub API. These data files can be versioned manually by creating different releases. This approach works equally well with public or private repositories. Data can be uploaded and downloaded programmatically from scripts. No authentication is required to download data from public repositories.", + "Authors@R": "c(person(\"Carl\", \"Boettiger\", email = \"cboettig@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0002-1642-628X\")), person(\"Tan\", \"Ho\", role = c(\"aut\"), comment = c(ORCID = \"0000-0001-8388-5155\")), person(\"Mark\", \"Padgham\", role = c(\"ctb\"), comment = c(ORCID = \"0000-0003-2172-5265\")), person(c('Jeffrey', 'O'), 'Hanson', role = c(\"ctb\"), comment = c(ORCID = \"0000-0002-4716-6134\")), person(\"Kevin\", 'Kuo', role = c(\"ctb\"), comment = c(ORCID = \"0000-0001-7803-7901\")) )", + "URL": "https://github.com/ropensci/piggyback", + "BugReports": "https://github.com/ropensci/piggyback/issues", + "License": "GPL-3", + "Encoding": "UTF-8", + "ByteCompile": "true", + "Imports": [ + "cli", + "glue", + "gh", + "httr", + "jsonlite", + "fs", + "lubridate", + "memoise" + ], + "Suggests": [ + "spelling", + "readr", + "covr", + "testthat", + "knitr", + "rmarkdown", + "gert", + "withr", + "magrittr" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.2.1", + "Language": "en-US", + "NeedsCompilation": "no", + "Author": "Carl Boettiger [aut, cre, cph] (), Tan Ho [aut] (), Mark Padgham [ctb] (), Jeffrey O Hanson [ctb] (), Kevin Kuo [ctb] ()", + "Maintainer": "Carl Boettiger ", + "Repository": "CRAN" + }, + "pillar": { + "Package": "pillar", + "Version": "1.11.1", + "Source": "Repository", + "Title": "Coloured Formatting for Columns", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\"), person(given = \"RStudio\", role = \"cph\"))", + "Description": "Provides 'pillar' and 'colonnade' generics designed for formatting columns of data using the full range of colours provided by modern terminals.", + "License": "MIT + file LICENSE", + "URL": "https://pillar.r-lib.org/, https://github.com/r-lib/pillar", + "BugReports": "https://github.com/r-lib/pillar/issues", + "Imports": [ + "cli (>= 2.3.0)", + "glue", + "lifecycle", + "rlang (>= 1.0.2)", + "utf8 (>= 1.1.0)", + "utils", + "vctrs (>= 0.5.0)" + ], + "Suggests": [ + "bit64", + "DBI", + "debugme", + "DiagrammeR", + "dplyr", + "formattable", + "ggplot2", + "knitr", + "lubridate", + "nanotime", + "nycflights13", + "palmerpenguins", + "rmarkdown", + "scales", + "stringi", + "survival", + "testthat (>= 3.1.1)", + "tibble", + "units (>= 0.7.2)", + "vdiffr", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "format_multi_fuzz, format_multi_fuzz_2, format_multi, ctl_colonnade, ctl_colonnade_1, ctl_colonnade_2", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/gha/extra-packages": "units=?ignore-before-r=4.3.0", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], RStudio [cph]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "pkgbuild": { + "Package": "pkgbuild", + "Version": "1.4.8", + "Source": "Repository", + "Title": "Find Tools Needed to Build R Packages", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides functions used to build R packages. Locates compilers needed to build R packages on various platforms and ensures the PATH is configured appropriately so R can use them.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/pkgbuild, https://pkgbuild.r-lib.org", + "BugReports": "https://github.com/r-lib/pkgbuild/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "callr (>= 3.2.0)", + "cli (>= 3.4.0)", + "desc", + "processx", + "R6" + ], + "Suggests": [ + "covr", + "cpp11", + "knitr", + "Rcpp", + "rmarkdown", + "testthat (>= 3.2.0)", + "withr (>= 2.3.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-30", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "pkgconfig": { + "Package": "pkgconfig", + "Version": "2.0.3", + "Source": "Repository", + "Title": "Private Configuration for 'R' Packages", + "Author": "Gábor Csárdi", + "Maintainer": "Gábor Csárdi ", + "Description": "Set configuration options on a per-package basis. Options set by a given package only apply to that package, other packages are unaffected.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "Imports": [ + "utils" + ], + "Suggests": [ + "covr", + "testthat", + "disposables (>= 1.0.3)" + ], + "URL": "https://github.com/r-lib/pkgconfig#readme", + "BugReports": "https://github.com/r-lib/pkgconfig/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "CRAN" + }, + "pkgdown": { + "Package": "pkgdown", + "Version": "2.2.0", + "Source": "Repository", + "Title": "Make Static HTML Documentation for a Package", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jay\", \"Hesselberth\", role = \"aut\", comment = c(ORCID = \"0000-0002-6299-179X\")), person(\"Maëlle\", \"Salmon\", role = \"aut\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(\"Olivier\", \"Roy\", role = \"aut\"), person(\"Salim\", \"Brüggemann\", role = \"aut\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Generate an attractive and useful website from a source package. 'pkgdown' converts your documentation, vignettes, 'README', and more to 'HTML' making it easy to share information about your package online.", + "License": "MIT + file LICENSE", + "URL": "https://pkgdown.r-lib.org/, https://github.com/r-lib/pkgdown", + "BugReports": "https://github.com/r-lib/pkgdown/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "bslib (>= 0.5.1)", + "callr (>= 3.7.3)", + "cli (>= 3.6.1)", + "desc (>= 1.4.0)", + "downlit (>= 0.4.4)", + "fontawesome", + "fs (>= 1.4.0)", + "httr2 (>= 1.0.2)", + "jsonlite", + "lifecycle", + "openssl", + "purrr (>= 1.0.0)", + "ragg (>= 1.4.0)", + "rlang (>= 1.1.4)", + "rmarkdown (>= 2.27)", + "tibble", + "whisker", + "withr (>= 2.4.3)", + "xml2 (>= 1.3.1)", + "yaml (>= 2.3.9)" + ], + "Suggests": [ + "covr", + "diffviewer", + "evaluate (>= 0.24.0)", + "gert", + "gt", + "htmltools", + "htmlwidgets", + "knitr (>= 1.50)", + "magick", + "methods", + "pkgload (>= 1.0.2)", + "quarto", + "rsconnect", + "rstudioapi", + "rticles", + "sass", + "testthat (>= 3.1.3)", + "tools" + ], + "VignetteBuilder": "knitr, quarto", + "Config/Needs/website": "usethis, servr", + "Config/potools/style": "explicit", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "build-article, build-quarto-article, build-reference, build", + "Config/usethis/last-upkeep": "2025-09-07", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "pandoc", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Jay Hesselberth [aut] (ORCID: ), Maëlle Salmon [aut] (ORCID: ), Olivier Roy [aut], Salim Brüggemann [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "pkgload": { + "Package": "pkgload", + "Version": "1.5.0", + "Source": "Repository", + "Title": "Simulate Package Installation and Attach", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Core team\", role = \"ctb\", comment = \"Some namespace and vignette code extracted from base R\") )", + "Description": "Simulates the process of installing a package and then attaching it. This is a key part of the 'devtools' package as it allows you to rapidly iterate while developing a package.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/pkgload, https://pkgload.r-lib.org", + "BugReports": "https://github.com/r-lib/pkgload/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "cli (>= 3.3.0)", + "desc", + "fs", + "glue", + "lifecycle", + "methods", + "pkgbuild", + "processx", + "rlang (>= 1.1.1)", + "rprojroot", + "utils" + ], + "Suggests": [ + "bitops", + "jsonlite", + "mathjaxr", + "pak", + "Rcpp", + "remotes", + "rstudioapi", + "testthat (>= 3.2.1.1)", + "usethis", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate, ggplot2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "dll", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Winston Chang [aut], Jim Hester [aut], Lionel Henry [aut, cre], Posit Software, PBC [cph, fnd], R Core team [ctb] (Some namespace and vignette code extracted from base R)", + "Maintainer": "Lionel Henry ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "png": { + "Package": "png", + "Version": "0.1-8", + "Source": "Repository", + "Title": "Read and write PNG images", + "Author": "Simon Urbanek ", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" + ], + "Description": "This package provides an easy and simple way to read, write and display bitmap images stored in the PNG format. It can read and write both files and in-memory raw vectors.", + "License": "GPL-2 | GPL-3", + "SystemRequirements": "libpng", + "URL": "http://www.rforge.net/png/", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "praise": { + "Package": "praise", + "Version": "1.0.0", + "Source": "Repository", + "Title": "Praise Users", + "Author": "Gabor Csardi, Sindre Sorhus", + "Maintainer": "Gabor Csardi ", + "Description": "Build friendly R packages that praise their users if they have done something good, or they just need it to feel better.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "URL": "https://github.com/gaborcsardi/praise", + "BugReports": "https://github.com/gaborcsardi/praise/issues", + "Suggests": [ + "testthat" + ], + "Collate": "'adjective.R' 'adverb.R' 'exclamation.R' 'verb.R' 'rpackage.R' 'package.R'", + "NeedsCompilation": "no", + "Repository": "CRAN" + }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.2.0", + "Source": "Repository", + "Title": "Pretty, Human Readable Formatting of Quantities", + "Authors@R": "c( person(\"Gabor\", \"Csardi\", email=\"csardi.gabor@gmail.com\", role=c(\"aut\", \"cre\")), person(\"Bill\", \"Denney\", email=\"wdenney@humanpredictions.com\", role=c(\"ctb\"), comment=c(ORCID=\"0000-0002-5759-428X\")), person(\"Christophe\", \"Regouby\", email=\"christophe.regouby@free.fr\", role=c(\"ctb\")) )", + "Description": "Pretty, human readable formatting of quantities. Time intervals: '1337000' -> '15d 11h 23m 20s'. Vague time intervals: '2674000' -> 'about a month ago'. Bytes: '1337' -> '1.34 kB'. Rounding: '99' with 3 significant digits -> '99.0' p-values: '0.00001' -> '<0.0001'. Colors: '#FF0000' -> 'red'. Quantities: '1239437' -> '1.24 M'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/prettyunits", + "BugReports": "https://github.com/r-lib/prettyunits/issues", + "Depends": [ + "R(>= 2.10)" + ], + "Suggests": [ + "codetools", + "covr", + "testthat" + ], + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Gabor Csardi [aut, cre], Bill Denney [ctb] (), Christophe Regouby [ctb]", + "Maintainer": "Gabor Csardi ", + "Repository": "CRAN" + }, + "processx": { + "Package": "processx", + "Version": "3.8.6", + "Source": "Repository", + "Title": "Execute and Control System Processes", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Ascent Digital Services\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to run system processes in the background. It can check if a background process is running; wait on a background process to finish; get the exit status of finished processes; kill background processes. It can read the standard output and error of the processes, using non-blocking connections. 'processx' can poll a process for standard output or error, with a timeout. It can also poll several processes at once.", + "License": "MIT + file LICENSE", + "URL": "https://processx.r-lib.org, https://github.com/r-lib/processx", + "BugReports": "https://github.com/r-lib/processx/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "ps (>= 1.2.0)", + "R6", + "utils" + ], + "Suggests": [ + "callr (>= 3.7.3)", + "cli (>= 3.3.0)", + "codetools", + "covr", + "curl", + "debugme", + "parallel", + "rlang (>= 1.0.2)", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1.9000", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre, cph] (), Winston Chang [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "profvis": { + "Package": "profvis", + "Version": "0.4.0", + "Source": "Repository", + "Title": "Interactive Visualizations for Profiling R Code", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Javier\", \"Luraschi\", role = \"aut\"), person(\"Timothy\", \"Mastny\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/htmlwidgets/lib/jquery/AUTHORS.txt\"), person(\"Mike\", \"Bostock\", role = c(\"ctb\", \"cph\"), comment = \"D3 library\"), person(, \"D3 contributors\", role = \"ctb\", comment = \"D3 library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\") )", + "Description": "Interactive visualizations for profiling R code.", + "License": "MIT + file LICENSE", + "URL": "https://profvis.r-lib.org, https://github.com/r-lib/profvis", + "BugReports": "https://github.com/r-lib/profvis/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "htmlwidgets (>= 0.3.2)", + "rlang (>= 1.1.0)", + "vctrs" + ], + "Suggests": [ + "htmltools", + "knitr", + "rmarkdown", + "shiny", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, rmarkdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Winston Chang [aut], Javier Luraschi [aut], Timothy Mastny [aut], Posit Software, PBC [cph, fnd], jQuery Foundation [cph] (jQuery library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/htmlwidgets/lib/jquery/AUTHORS.txt), Mike Bostock [ctb, cph] (D3 library), D3 contributors [ctb] (D3 library), Ivan Sagalaev [ctb, cph] (highlight.js library)", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "progress": { + "Package": "progress", + "Version": "1.2.3", + "Source": "Repository", + "Title": "Terminal Progress Bars", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Rich\", \"FitzJohn\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Configurable Progress bars, they may include percentage, elapsed time, and/or the estimated completion time. They work in terminals, in 'Emacs' 'ESS', 'RStudio', 'Windows' 'Rgui' and the 'macOS' 'R.app'. The package also provides a 'C++' 'API', that works with or without 'Rcpp'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/progress#readme, http://r-lib.github.io/progress/", + "BugReports": "https://github.com/r-lib/progress/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "crayon", + "hms", + "prettyunits", + "R6" + ], + "Suggests": [ + "Rcpp", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Rich FitzJohn [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "promises": { + "Package": "promises", + "Version": "1.5.0", + "Source": "Repository", + "Type": "Package", + "Title": "Abstractions for Promise-Based Asynchronous Programming", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides fundamental abstractions for doing asynchronous programming in R using promises. Asynchronous programming is useful for allowing a single R process to orchestrate multiple tasks in the background while also attending to something else. Semantics are similar to 'JavaScript' promises, but with a syntax that is idiomatic R.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/promises/, https://github.com/rstudio/promises", + "BugReports": "https://github.com/rstudio/promises/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "fastmap (>= 1.1.0)", + "later", + "lifecycle", + "magrittr (>= 1.5)", + "otel (>= 0.2.0)", + "R6", + "rlang" + ], + "Suggests": [ + "future (>= 1.21.0)", + "knitr", + "mirai", + "otelsdk (>= 0.2.0)", + "purrr", + "Rcpp", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "vembedr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "rsconnect, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-27", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Joe Cheng [aut], Barret Schloerke [aut, cre] (ORCID: ), Winston Chang [aut] (ORCID: ), Charlie Gao [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Barret Schloerke ", + "Repository": "CRAN" + }, + "protolite": { + "Package": "protolite", + "Version": "2.3.1", + "Source": "Repository", + "Type": "Package", + "Title": "Highly Optimized Protocol Buffer Serializers", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Pure C++ implementations for reading and writing several common data formats based on Google protocol-buffers. Currently supports 'rexp.proto' for serialized R objects, 'geobuf.proto' for binary geojson, and 'mvt.proto' for vector tiles. This package uses the auto-generated C++ code by protobuf-compiler, hence the entire serialization is optimized at compile time. The 'RProtoBuf' package on the other hand uses the protobuf runtime library to provide a general- purpose toolkit for reading and writing arbitrary protocol-buffer data in R.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/jeroen/protolite https://jeroen.r-universe.dev/protolite", + "BugReports": "https://github.com/jeroen/protolite/issues", + "SystemRequirements": "libprotobuf and protobuf-compiler", + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ + "Rcpp (>= 0.12.12)", + "jsonlite" + ], + "Suggests": [ + "spelling", + "curl", + "testthat", + "sf" + ], + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.1", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "proxy": { + "Package": "proxy", + "Version": "0.4-29", + "Source": "Repository", + "Type": "Package", + "Title": "Distance and Similarity Measures", + "Authors@R": "c(person(given = \"David\", family = \"Meyer\", role = c(\"aut\", \"cre\"), email = \"David.Meyer@R-project.org\", comment = c(ORCID = \"0000-0002-5196-3048\")),\t person(given = \"Christian\", family = \"Buchta\", role = \"aut\"))", + "Description": "Provides an extensible framework for the efficient calculation of auto- and cross-proximities, along with implementations of the most popular ones.", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "stats", + "utils" + ], + "Suggests": [ + "cba" + ], + "Collate": "registry.R database.R dist.R similarities.R dissimilarities.R util.R seal.R", + "License": "GPL-2 | GPL-3", + "NeedsCompilation": "yes", + "Author": "David Meyer [aut, cre] (ORCID: ), Christian Buchta [aut]", + "Maintainer": "David Meyer ", + "Repository": "CRAN" + }, + "ps": { + "Package": "ps", + "Version": "1.9.1", + "Source": "Repository", + "Title": "List, Query, Manipulate System Processes", + "Authors@R": "c( person(\"Jay\", \"Loden\", role = \"aut\"), person(\"Dave\", \"Daeschler\", role = \"aut\"), person(\"Giampaolo\", \"Rodola'\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "List, query and manipulate all system processes, on 'Windows', 'Linux' and 'macOS'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/ps, https://ps.r-lib.org/", + "BugReports": "https://github.com/r-lib/ps/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "utils" + ], + "Suggests": [ + "callr", + "covr", + "curl", + "pillar", + "pingr", + "processx (>= 3.1.0)", + "R6", + "rlang", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Biarch": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Jay Loden [aut], Dave Daeschler [aut], Giampaolo Rodola' [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "purrr": { + "Package": "purrr", + "Version": "1.2.1", + "Source": "Repository", + "Title": "Functional Programming Tools", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"https://ror.org/03wc8by49\")) )", + "Description": "A complete and consistent functional programming toolkit for R.", + "License": "MIT + file LICENSE", + "URL": "https://purrr.tidyverse.org/, https://github.com/tidyverse/purrr", + "BugReports": "https://github.com/tidyverse/purrr/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.6.1)", + "lifecycle (>= 1.0.3)", + "magrittr (>= 1.5.0)", + "rlang (>= 1.1.1)", + "vctrs (>= 0.6.3)" + ], + "Suggests": [ + "carrier (>= 0.3.0)", + "covr", + "dplyr (>= 0.7.8)", + "httr", + "knitr", + "lubridate", + "mirai (>= 2.5.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble", + "tidyselect" + ], + "LinkingTo": [ + "cli" + ], + "VignetteBuilder": "knitr", + "Biarch": "true", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate, tidyr", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (ORCID: ), Lionel Henry [aut], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "qs": { + "Package": "qs", + "Version": "0.27.3", + "Source": "Repository", + "Type": "Package", + "Title": "Quick Serialization of R Objects", + "Date": "2025-3-7", + "Authors@R": "c( person(\"Travers\", \"Ching\", email = \"traversc@gmail.com\", role = c(\"aut\", \"cre\", \"cph\")), person(\"Yann\", \"Collet\", role = c(\"ctb\", \"cph\"), comment = \"Yann Collet is the author of the bundled zstd, lz4 and xxHash code\"), person(\"Facebook, Inc.\", role = \"cph\", comment = \"Facebook is the copyright holder of the bundled zstd code\"), person(\"Reichardt\", \"Tino\", role = c(\"ctb\", \"cph\"), comment = \"Contributor/copyright holder of zstd bundled code\"), person(\"Skibinski\", \"Przemyslaw\", role = c(\"ctb\", \"cph\"), comment = \"Contributor/copyright holder of zstd bundled code\"), person(\"Mori\", \"Yuta\", role = c(\"ctb\", \"cph\"), comment = \"Contributor/copyright holder of zstd bundled code\"), person(\"Romain\", \"Francois\", role = c(\"ctb\", \"cph\"), comment = \"Derived example/tutorials for ALTREP structures\"), person(\"Francesc\", \"Alted\", role = c(\"ctb\", \"cph\"), comment = \"Shuffling routines derived from Blosc library\"), person(\"Bryce\", \"Chamberlain\", email = \"superchordate@gmail.com\", role = c(\"ctb\"), comment = \"qsavem and qload functions\"), person(\"Salim\", \"Brüggemann\", email = \"salim-b@pm.me\", role = c(\"ctb\"), comment = \"Contributing to documentation (ORCID:0000-0002-5329-5987)\"))", + "Maintainer": "Travers Ching ", + "Description": "Provides functions for quickly writing and reading any R object to and from disk.", + "License": "GPL-3", + "LazyData": "true", + "Biarch": "true", + "Depends": [ + "R (>= 3.0.2)" + ], + "Imports": [ + "Rcpp", + "RApiSerialize (>= 0.1.4)", + "stringfish (>= 0.15.1)" + ], + "LinkingTo": [ + "Rcpp", + "RApiSerialize", + "stringfish", + "BH" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat", + "dplyr", + "data.table" + ], + "VignetteBuilder": "knitr", + "Copyright": "This package includes code from the 'zstd' library owned by Facebook, Inc. and created by Yann Collet; the 'lz4' library created and owned by Yann Collet; xxHash library created and owned by Yann Collet; and code derived from the 'Blosc' library created and owned by Francesc Alted.", + "URL": "https://github.com/qsbase/qs", + "BugReports": "https://github.com/qsbase/qs/issues", + "NeedsCompilation": "yes", + "Author": "Travers Ching [aut, cre, cph], Yann Collet [ctb, cph] (Yann Collet is the author of the bundled zstd, lz4 and xxHash code), Facebook, Inc. [cph] (Facebook is the copyright holder of the bundled zstd code), Reichardt Tino [ctb, cph] (Contributor/copyright holder of zstd bundled code), Skibinski Przemyslaw [ctb, cph] (Contributor/copyright holder of zstd bundled code), Mori Yuta [ctb, cph] (Contributor/copyright holder of zstd bundled code), Romain Francois [ctb, cph] (Derived example/tutorials for ALTREP structures), Francesc Alted [ctb, cph] (Shuffling routines derived from Blosc library), Bryce Chamberlain [ctb] (qsavem and qload functions), Salim Brüggemann [ctb] (Contributing to documentation (ORCID:0000-0002-5329-5987))", + "Repository": "CRAN" + }, + "ragg": { + "Package": "ragg", + "Version": "1.5.0", + "Source": "Repository", + "Type": "Package", + "Title": "Graphic Devices Based on AGG", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Maxim\", \"Shemanarev\", role = c(\"aut\", \"cph\"), comment = \"Author of AGG\"), person(\"Tony\", \"Juricic\", , \"tonygeek@yahoo.com\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Milan\", \"Marusinec\", , \"milan@marusinec.sk\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Spencer\", \"Garrett\", role = \"ctb\", comment = \"Contributor to AGG\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Maintainer": "Thomas Lin Pedersen ", + "Description": "Anti-Grain Geometry (AGG) is a high-quality and high-performance 2D drawing library. The 'ragg' package provides a set of graphic devices based on AGG to use as alternative to the raster devices provided through the 'grDevices' package.", + "License": "MIT + file LICENSE", + "URL": "https://ragg.r-lib.org, https://github.com/r-lib/ragg", + "BugReports": "https://github.com/r-lib/ragg/issues", + "Imports": [ + "systemfonts (>= 1.0.3)", + "textshaping (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "graphics", + "grid", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "systemfonts", + "textshaping" + ], + "Config/build/compilation-database": "true", + "Config/Needs/website": "ggplot2, devoid, magick, bench, tidyr, ggridges, hexbin, sessioninfo, pkgdown, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "freetype2, libpng, libtiff, libjpeg, libwebp, libwebpmux", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), Maxim Shemanarev [aut, cph] (Author of AGG), Tony Juricic [ctb, cph] (Contributor to AGG), Milan Marusinec [ctb, cph] (Contributor to AGG), Spencer Garrett [ctb] (Contributor to AGG), Posit Software, PBC [cph, fnd] (ROR: )", + "Repository": "CRAN" + }, + "rapidjsonr": { + "Package": "rapidjsonr", + "Version": "1.2.1", + "Source": "Repository", + "Type": "Package", + "Title": "'Rapidjson' C++ Header Files", + "Date": "2025-11-23", + "Authors@R": "c( person(\"David\", \"Cooley\", ,\"dcooley@symbolix.com.au\", role = c(\"aut\", \"cre\")), person(\"Milo\", \"Yip\", , role = \"ctb\", comment = \"Author of c++ rapidjson library, provided through THL A29 Limited, a Tencent company\"), person(\"Alexander\", \"Chemeris\", role = \"ctb\", comment = \"Author of c++ msinttypes library\") )", + "Description": "Provides JSON parsing capability through the 'Rapidjson' 'C++' header-only library.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "SystemRequirements": "GNU make", + "NeedsCompilation": "no", + "Author": "David Cooley [aut, cre], Milo Yip [ctb] (Author of c++ rapidjson library, provided through THL A29 Limited, a Tencent company), Alexander Chemeris [ctb] (Author of c++ msinttypes library)", + "Maintainer": "David Cooley ", + "Repository": "CRAN" + }, + "rappdirs": { + "Package": "rappdirs", + "Version": "0.3.4", + "Source": "Repository", + "Type": "Package", + "Title": "Application Directories: Determine Where to Save Data, Caches, and Logs", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"trl\", \"cre\", \"cph\")), person(\"Sridhar\", \"Ratnakumar\", role = \"aut\"), person(\"Trent\", \"Mick\", role = \"aut\"), person(\"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(\"Eddy\", \"Petrisor\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = c(\"trl\", \"aut\"), comment = c(ORCID = \"0000-0001-6341-4639\")), person(\"Gabor\", \"Csardi\", role = \"ctb\"), person(\"Gregory\", \"Jefferis\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' () to R.", + "License": "MIT + file LICENSE", + "URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs", + "BugReports": "https://github.com/r-lib/rappdirs/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Suggests": [ + "covr", + "roxygen2", + "testthat (>= 3.2.0)", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-05", + "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, Posit, PBC. See file LICENSE for details.", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [trl, cre, cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut] (ORCID: ), Gabor Csardi [ctb], Gregory Jefferis [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "raster": { + "Package": "raster", + "Version": "3.6-32", + "Source": "Repository", + "Type": "Package", + "Title": "Geographic Data Analysis and Modeling", + "Date": "2025-03-27", + "Imports": [ + "Rcpp", + "methods", + "terra (>= 1.8-5)" + ], + "LinkingTo": [ + "Rcpp" + ], + "Depends": [ + "sp (>= 1.4-5)", + "R (>= 3.5.0)" + ], + "Suggests": [ + "ncdf4", + "igraph", + "tcltk", + "parallel", + "rasterVis", + "MASS", + "sf", + "tinytest", + "gstat", + "fields", + "exactextractr" + ], + "Description": "Reading, writing, manipulating, analyzing and modeling of spatial data. This package has been superseded by the \"terra\" package .", + "License": "GPL (>= 3)", + "URL": "https://rspatial.org/raster", + "BugReports": "https://github.com/rspatial/raster/issues/", + "Authors@R": "c( person(\"Robert J.\", \"Hijmans\", role = c(\"cre\", \"aut\"), email = \"r.hijmans@gmail.com\", comment = c(ORCID = \"0000-0001-5872-2872\")), person(\"Jacob\", \"van Etten\", role = \"ctb\"), person(\"Michael\", \"Sumner\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Dan\", \"Baston\", role = \"ctb\"), person(\"Andrew\", \"Bevan\", role = \"ctb\"), person(\"Roger\", \"Bivand\", role = \"ctb\"), person(\"Lorenzo\", \"Busetto\", role = \"ctb\"), person(\"Mort\", \"Canty\", role = \"ctb\"), person(\"Ben\", \"Fasoli\", role = \"ctb\"), person(\"David\", \"Forrest\", role = \"ctb\"), person(\"Aniruddha\", \"Ghosh\", role = \"ctb\"), person(\"Duncan\", \"Golicher\", role = \"ctb\"), person(\"Josh\", \"Gray\", role = \"ctb\"), person(\"Jonathan A.\", \"Greenberg\", role = \"ctb\"), person(\"Paul\", \"Hiemstra\", role = \"ctb\"), person(\"Kassel\", \"Hingee\", role = \"ctb\"), person(\"Alex\", \"Ilich\", role = \"ctb\"), person(\"Institute for Mathematics Applied Geosciences\", role=\"cph\"), person(\"Charles\", \"Karney\", role = \"ctb\"), person(\"Matteo\", \"Mattiuzzi\", role = \"ctb\"), person(\"Steven\", \"Mosher\", role = \"ctb\"), person(\"Babak\", \"Naimi\", role = \"ctb\"),\t person(\"Jakub\", \"Nowosad\", role = \"ctb\"), person(\"Edzer\", \"Pebesma\", role = \"ctb\"), person(\"Oscar\", \"Perpinan Lamigueiro\", role = \"ctb\"), person(\"Etienne B.\", \"Racine\", role = \"ctb\"), person(\"Barry\", \"Rowlingson\", role = \"ctb\"), person(\"Ashton\", \"Shortridge\", role = \"ctb\"), person(\"Bill\", \"Venables\", role = \"ctb\"), person(\"Rafael\", \"Wueest\", role = \"ctb\") )", + "NeedsCompilation": "yes", + "Author": "Robert J. Hijmans [cre, aut] (), Jacob van Etten [ctb], Michael Sumner [ctb], Joe Cheng [ctb], Dan Baston [ctb], Andrew Bevan [ctb], Roger Bivand [ctb], Lorenzo Busetto [ctb], Mort Canty [ctb], Ben Fasoli [ctb], David Forrest [ctb], Aniruddha Ghosh [ctb], Duncan Golicher [ctb], Josh Gray [ctb], Jonathan A. Greenberg [ctb], Paul Hiemstra [ctb], Kassel Hingee [ctb], Alex Ilich [ctb], Institute for Mathematics Applied Geosciences [cph], Charles Karney [ctb], Matteo Mattiuzzi [ctb], Steven Mosher [ctb], Babak Naimi [ctb], Jakub Nowosad [ctb], Edzer Pebesma [ctb], Oscar Perpinan Lamigueiro [ctb], Etienne B. Racine [ctb], Barry Rowlingson [ctb], Ashton Shortridge [ctb], Bill Venables [ctb], Rafael Wueest [ctb]", + "Maintainer": "Robert J. Hijmans ", + "Repository": "CRAN" + }, + "rcmdcheck": { + "Package": "rcmdcheck", + "Version": "1.4.0", + "Source": "Repository", + "Title": "Run 'R CMD check' from 'R' and Capture Results", + "Authors@R": "person(given = \"Gábor\", family = \"Csárdi\", role = c(\"cre\", \"aut\"), email = \"csardi.gabor@gmail.com\")", + "Description": "Run 'R CMD check' from 'R' and capture the results of the individual checks. Supports running checks in the background, timeouts, pretty printing and comparing check results.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.github.io/rcmdcheck/, https://github.com/r-Lib/rcmdcheck#readme", + "BugReports": "https://github.com/r-Lib/rcmdcheck/issues", + "Imports": [ + "callr (>= 3.1.1.9000)", + "cli (>= 3.0.0)", + "curl", + "desc (>= 1.2.0)", + "digest", + "pkgbuild", + "prettyunits", + "R6", + "rprojroot", + "sessioninfo (>= 1.1.1)", + "utils", + "withr", + "xopen" + ], + "Suggests": [ + "covr", + "knitr", + "mockery", + "processx", + "ps", + "rmarkdown", + "svglite", + "testthat", + "webfakes" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [cre, aut]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "rdryad": { + "Package": "rdryad", + "Version": "1.0.0", + "Source": "Repository", + "Type": "Package", + "Title": "Access for Dryad Web Services", + "Description": "Interface to the Dryad \"Solr\" API, their \"OAI-PMH\" service, and fetch datasets. Dryad () is a curated host of data underlying scientific publications.", + "License": "MIT + file LICENSE", + "Authors@R": "c( person(\"Karthik\", \"Ram\", role = \"aut\", comment = c(ORCID = \"0000-0002-0233-1757\")), person(\"Scott\", \"Chamberlain\", role = c(\"aut\", \"cre\"), email = \"myrmecocystus@gmail.com\", comment = c(ORCID = \"0000-0003-1444-9135\")), person(\"Carl\", \"Boettiger\", role = \"aut\", comment = c(ORCID=\"0000-0002-1642-628X\")) )", + "URL": "https://docs.ropensci.org/rdryad, https://github.com/ropensci/rdryad", + "BugReports": "https://github.com/ropensci/rdryad/issues", + "Encoding": "UTF-8", + "Language": "en-US", + "Imports": [ + "crul", + "curl", + "tibble", + "hoardr", + "zip", + "jsonlite", + "mime" + ], + "Suggests": [ + "testthat", + "vcr" + ], + "RoxygenNote": "7.1.0", + "NeedsCompilation": "no", + "Author": "Karthik Ram [aut] (), Scott Chamberlain [aut, cre] (), Carl Boettiger [aut] ()", + "Maintainer": "Scott Chamberlain ", + "Repository": "CRAN" + }, + "readr": { + "Package": "readr", + "Version": "2.2.0", + "Source": "Repository", + "Title": "Read Rectangular Text Data", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = c(\"ctb\", \"cph\"), comment = \"grisu3 implementation\") )", + "Description": "The goal of 'readr' is to provide a fast and friendly way to read rectangular data (like 'csv', 'tsv', and 'fwf'). It is designed to flexibly parse many types of data found in the wild, while still cleanly failing when data unexpectedly changes.", + "License": "MIT + file LICENSE", + "URL": "https://readr.tidyverse.org, https://github.com/tidyverse/readr", + "BugReports": "https://github.com/tidyverse/readr/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli", + "clipr", + "crayon", + "glue", + "hms (>= 0.4.1)", + "lifecycle", + "methods", + "R6", + "rlang", + "tibble", + "utils", + "vroom (>= 1.7.0)", + "withr" + ], + "Suggests": [ + "covr", + "curl", + "datasets", + "knitr", + "rmarkdown", + "spelling", + "stringi", + "testthat (>= 3.2.0)", + "tzdb (>= 0.1.1)", + "waldo", + "xml2" + ], + "LinkingTo": [ + "cpp11", + "tzdb (>= 0.1.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "false", + "Config/usethis/last-upkeep": "2025-11-14", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Romain Francois [ctb], Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], Posit Software, PBC [cph, fnd] (ROR: ), https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [ctb, cph] (grisu3 implementation), Mikkel Jørgensen [ctb, cph] (grisu3 implementation)", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "readxl": { + "Package": "readxl", + "Version": "1.4.5", + "Source": "Repository", + "Title": "Read Excel Files", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\"), comment = \"Copyright holder of all R code and all C/C++ code without explicit copyright attribution\"), person(\"Marcin\", \"Kalicinski\", role = c(\"ctb\", \"cph\"), comment = \"Author of included RapidXML code\"), person(\"Komarov Valery\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Christophe Leitienne\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Bob Colbert\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"David Hoerl\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\"), person(\"Evan Miller\", role = c(\"ctb\", \"cph\"), comment = \"Author of included libxls code\") )", + "Description": "Import excel files into R. Supports '.xls' via the embedded 'libxls' C library and '.xlsx' via the embedded 'RapidXML' C++ library . Works on Windows, Mac and Linux without external dependencies.", + "License": "MIT + file LICENSE", + "URL": "https://readxl.tidyverse.org, https://github.com/tidyverse/readxl", + "BugReports": "https://github.com/tidyverse/readxl/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cellranger", + "tibble (>= 2.0.1)", + "utils" + ], + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "testthat (>= 3.1.6)", + "withr" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.0)", + "progress" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, tidyverse", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Note": "libxls v1.6.3 c199d13", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut] (), Jennifer Bryan [aut, cre] (), Posit, PBC [cph, fnd] (Copyright holder of all R code and all C/C++ code without explicit copyright attribution), Marcin Kalicinski [ctb, cph] (Author of included RapidXML code), Komarov Valery [ctb, cph] (Author of included libxls code), Christophe Leitienne [ctb, cph] (Author of included libxls code), Bob Colbert [ctb, cph] (Author of included libxls code), David Hoerl [ctb, cph] (Author of included libxls code), Evan Miller [ctb, cph] (Author of included libxls code)", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "rematch": { + "Package": "rematch", + "Version": "2.0.0", + "Source": "Repository", + "Title": "Match Regular Expressions with a Nicer 'API'", + "Author": "Gabor Csardi", + "Maintainer": "Gabor Csardi ", + "Description": "A small wrapper on 'regexpr' to extract the matches and captured groups from the match of a regular expression to a character vector.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/gaborcsardi/rematch", + "BugReports": "https://github.com/gaborcsardi/rematch/issues", + "RoxygenNote": "5.0.1.9000", + "Suggests": [ + "covr", + "testthat" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "CRAN" + }, + "rematch2": { + "Package": "rematch2", + "Version": "2.1.2", + "Source": "Repository", + "Title": "Tidy Output from Regular Expression Matching", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", email = \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Matthew\", \"Lincoln\", email = \"matthew.d.lincoln@gmail.com\", role = c(\"ctb\")))", + "Description": "Wrappers on 'regexpr' and 'gregexpr' to return the match results in tidy data frames.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "URL": "https://github.com/r-lib/rematch2#readme", + "BugReports": "https://github.com/r-lib/rematch2/issues", + "RoxygenNote": "7.1.0", + "Imports": [ + "tibble" + ], + "Suggests": [ + "covr", + "testthat" + ], + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Matthew Lincoln [ctb]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "remotes": { + "Package": "remotes", + "Version": "2.5.0", + "Source": "Repository", + "Title": "R Package Installation from Remote Repositories, Including 'GitHub'", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Martin\", \"Morgan\", role = \"aut\"), person(\"Dan\", \"Tenenbaum\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Ascent Digital Services\", role = \"cph\") )", + "Description": "Download and install R packages stored in 'GitHub', 'GitLab', 'Bitbucket', 'Bioconductor', or plain 'subversion' or 'git' repositories. This package provides the 'install_*' functions in 'devtools'. Indeed most of the code was copied over from 'devtools'.", + "License": "MIT + file LICENSE", + "URL": "https://remotes.r-lib.org, https://github.com/r-lib/remotes#readme", + "BugReports": "https://github.com/r-lib/remotes/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ + "methods", + "stats", + "tools", + "utils" + ], + "Suggests": [ + "brew", + "callr", + "codetools", + "covr", + "curl", + "git2r (>= 0.23.0)", + "knitr", + "mockery", + "pingr", + "pkgbuild (>= 1.0.1)", + "rmarkdown", + "rprojroot", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "SystemRequirements": "Subversion for install_svn, git for install_git", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Jim Hester [aut], Hadley Wickham [aut], Winston Chang [aut], Martin Morgan [aut], Dan Tenenbaum [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "renv": { "Package": "renv", + "Version": "1.1.7", + "Source": "Repository", + "Type": "Package", + "Title": "Project Environments", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@rstudio.com\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A dependency management toolkit for R. Using 'renv', you can create and manage project-local R libraries, save the state of these libraries to a 'lockfile', and later restore your library as required. Together, these tools can help make your projects more isolated, portable, and reproducible.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/renv/, https://github.com/rstudio/renv", + "BugReports": "https://github.com/rstudio/renv/issues", + "Imports": [ + "utils" + ], + "Suggests": [ + "BiocManager", + "cli", + "compiler", + "covr", + "cpp11", + "curl", + "devtools", + "generics", + "gitcreds", + "jsonlite", + "jsonvalidate", + "knitr", + "miniUI", + "modules", + "packrat", + "pak", + "R6", + "remotes", + "reticulate", + "rmarkdown", + "rstudioapi", + "shiny", + "testthat", + "uuid", + "waldo", + "yaml", + "webfakes" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "bioconductor,python,install,restore,snapshot,retrieve,remotes", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Posit Software, PBC [cph, fnd]", + "Maintainer": "Kevin Ushey ", + "Repository": "CRAN" + }, + "reprex": { + "Package": "reprex", + "Version": "2.1.1", + "Source": "Repository", + "Title": "Prepare Reproducible Example Code via the Clipboard", + "Authors@R": "c( person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"David\", \"Robinson\", , \"admiral.david@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Convenience wrapper that uses the 'rmarkdown' package to render small snippets of code to target formats that include both code and output. The goal is to encourage the sharing of small, reproducible, and runnable examples on code-oriented websites, such as and , or in email. The user's clipboard is the default source of input code and the default target for rendered output. 'reprex' also extracts clean, runnable R code from various common formats, such as copy/paste from an R session.", + "License": "MIT + file LICENSE", + "URL": "https://reprex.tidyverse.org, https://github.com/tidyverse/reprex", + "BugReports": "https://github.com/tidyverse/reprex/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "callr (>= 3.6.0)", + "cli (>= 3.2.0)", + "clipr (>= 0.4.0)", + "fs", + "glue", + "knitr (>= 1.23)", + "lifecycle", + "rlang (>= 1.0.0)", + "rmarkdown", + "rstudioapi", + "utils", + "withr (>= 2.3.0)" + ], + "Suggests": [ + "covr", + "fortunes", + "miniUI", + "rprojroot", + "sessioninfo", + "shiny", + "spelling", + "styler (>= 1.2.0)", + "testthat (>= 3.2.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "knitr-options, venues, reprex", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2", + "SystemRequirements": "pandoc (>= 2.0) - https://pandoc.org/", + "NeedsCompilation": "no", + "Author": "Jennifer Bryan [aut, cre] (), Jim Hester [aut] (), David Robinson [aut], Hadley Wickham [aut] (), Christophe Dervieux [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "reticulate": { + "Package": "reticulate", + "Version": "1.45.0", + "Source": "Repository", + "Type": "Package", + "Title": "Interface to 'Python'", + "Authors@R": "c( person(\"Tomasz\", \"Kalinowski\", role = c(\"ctb\", \"cre\"), email = \"tomasz@posit.co\"), person(\"Kevin\", \"Ushey\", role = c(\"aut\"), email = \"kevin@posit.co\"), person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@posit.co\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")), person(\"Yuan\", \"Tang\", role = c(\"aut\", \"cph\"), email = \"terrytangyuan@gmail.com\", comment = c(ORCID = \"0000-0001-5243-233X\")), person(\"Dirk\", \"Eddelbuettel\", role = c(\"ctb\", \"cph\"), email = \"edd@debian.org\"), person(\"Bryan\", \"Lewis\", role = c(\"ctb\", \"cph\"), email = \"blewis@illposed.net\"), person(\"Sigrid\", \"Keydana\", role = c(\"ctb\"), email = \"sigrid@posit.co\"), person(\"Ryan\", \"Hafen\", role = c(\"ctb\", \"cph\"), email = \"rhafen@gmail.com\"), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyThread library, http://tinythreadpp.bitsnbites.eu/\") )", + "Description": "Interface to 'Python' modules, classes, and functions. When calling into 'Python', R data types are automatically converted to their equivalent 'Python' types. When values are returned from 'Python' to R they are converted back to R types. Compatible with all versions of 'Python' >= 2.7.", + "License": "Apache License 2.0", + "URL": "https://rstudio.github.io/reticulate/, https://github.com/rstudio/reticulate", + "BugReports": "https://github.com/rstudio/reticulate/issues", + "SystemRequirements": "Python (>= 2.7.0)", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "Matrix", + "Rcpp (>= 1.0.7)", + "RcppTOML", + "graphics", + "here", + "jsonlite", + "methods", + "png", + "rappdirs", + "utils", + "rlang", + "withr" + ], + "Suggests": [ + "callr", + "knitr", + "glue", + "cli", + "rmarkdown", + "pillar", + "testthat" + ], + "LinkingTo": [ + "Rcpp" + ], + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "NeedsCompilation": "yes", + "Author": "Tomasz Kalinowski [ctb, cre], Kevin Ushey [aut], JJ Allaire [aut], RStudio [cph, fnd], Yuan Tang [aut, cph] (ORCID: ), Dirk Eddelbuettel [ctb, cph], Bryan Lewis [ctb, cph], Sigrid Keydana [ctb], Ryan Hafen [ctb, cph], Marcus Geelnard [ctb, cph] (TinyThread library, http://tinythreadpp.bitsnbites.eu/)", + "Maintainer": "Tomasz Kalinowski ", + "Repository": "CRAN" + }, + "rgee": { + "Package": "rgee", + "Version": "1.1.8", + "Source": "Repository", + "Title": "R Bindings for Calling the 'Earth Engine' API", + "Authors@R": "c(person(given = \"Cesar\", family = \"Aybar\", role = c(\"aut\"), email = \"csaybar@gmail.com\", comment = c(ORCID = \"0000-0003-2745-9535\")), person(given = \"Wu\", family = \"Qiusheng\", role = c(\"ctb\"), email = \"giswqs@gmail.com\", comment = c(ORCID = \"0000-0001-5437-4073\")), person(given = \"Lesly\", family = \"Bautista\", role = c(\"ctb\"), email = \"leslyarcelly.213@gmail.com\", comment = c(ORCID = \"0000-0003-3523-8687\")), person(given = \"Roy\", family = \"Yali\", role = c(\"ctb\"), email = \"ryali93@gmail.com\", comment = c(ORCID = \"0000-0003-4542-3755\")), person(given = \"Antony\", family = \"Barja\", role = c(\"ctb\"), email = \"antony.barja8@gmail.com\", comment = c(ORCID = \"0000-0001-5921-2858\")), person(given = \"Kevin\", family = \"Ushey\", role = c(\"ctb\"), email = \"kevin@rstudio.com\"), person(given = \"Jeroen\", family = \"Ooms\", role = c(\"ctb\"), email = \"jeroen@berkeley.edu\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(given = \"Tim\", family = \"Appelhans\", role = c(\"ctb\"), email = \"tim.appelhans@gmail.com\"), person(given = \"JJ\", family = \"Allaire\", role = c(\"ctb\"), email = \"jj@rstudio.com\"), person(given = \"Yuan\", family = \"Tang\", role = c(\"ctb\"), email = \"terrytangyuan@gmail.com\"), person(given = \"Samapriya\", family = \"Roy\", role = c(\"ctb\"), email = \"samapriya.roy@gmail.com\"), person(given = \"MariaElena\", family = \"Adauto\", role = c(\"ctb\"), email = \"2a.mariaelena@gmail.com\", comment = c(ORCID = \"0000-0002-2154-2429\")), person(given = \"Gabriel\", family = \"Carrasco\", role = c(\"ctb\"), email = \"gabriel.carrasco@upch.pe\", comment = c(ORCID = \"0000-0002-6945-0419\")), person(given = \"Henrik\", family = \"Bengtsson\", role = c(\"ctb\"), email = \"henrikb@braju.com\"), person(given = \"Jeffrey\", family = \"Hollister\", role = c(\"rev\"), email = \"hollister.jeff@epa.gov\", comment = \"Hollister reviewed the package for JOSS, see https://github.com/openjournals/joss-reviews/issues/2272/\"), person(given = \"Gennadii\", family = \"Donchyts\", role = c(\"rev\"), comment = \"Gena reviewed the package for JOSS, see https://github.com/openjournals/joss-reviews/issues/2272/\"), person(given=\"Matthieu\", family = \"Stigler\", role = c(\"aut\", \"cre\"), comment=c(ORCID=\"0000-0002-6802-4290\"), email=\"Matthieu.Stigler@gmail.com\"), person(given = \"Marius\", family = \"Appel\", role = c(\"rev\"), email = \"marius.appel@uni-muenster.de\", comment = \"Appel reviewed the package for JOSS, see https://github.com/openjournals/joss-reviews/issues/2272/\"))", + "Description": "Earth Engine client library for R. All of the 'Earth Engine' API classes, modules, and functions are made available. Additional functions implemented include importing (exporting) of Earth Engine spatial objects, extraction of time series, interactive map display, assets management interface, and metadata display. See for further details.", + "License": "Apache License (>= 2.0)", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "methods", + "reticulate (>= 1.27)", + "rstudioapi (>= 0.7)", + "leaflet (>= 2.0.2)", + "magrittr", + "jsonlite", + "processx", + "leafem", + "crayon", + "R6", + "cli" + ], + "Suggests": [ + "magick", + "geojsonio", + "sf", + "stars", + "googledrive (>= 2.0.0)", + "gargle", + "httr", + "digest", + "testthat", + "future", + "terra", + "covr", + "knitr", + "rmarkdown", + "png", + "googleCloudStorageR", + "leaflet.extras2", + "spelling", + "raster" + ], + "URL": "https://github.com/r-spatial/rgee/, https://r-spatial.github.io/rgee/, https://github.com/google/earthengine-api/", + "BugReports": "https://github.com/r-spatial/rgee/issues/", + "VignetteBuilder": "knitr", + "Language": "en-US", + "NeedsCompilation": "no", + "Author": "Cesar Aybar [aut] (ORCID: ), Wu Qiusheng [ctb] (ORCID: ), Lesly Bautista [ctb] (ORCID: ), Roy Yali [ctb] (ORCID: ), Antony Barja [ctb] (ORCID: ), Kevin Ushey [ctb], Jeroen Ooms [ctb] (ORCID: ), Tim Appelhans [ctb], JJ Allaire [ctb], Yuan Tang [ctb], Samapriya Roy [ctb], MariaElena Adauto [ctb] (ORCID: ), Gabriel Carrasco [ctb] (ORCID: ), Henrik Bengtsson [ctb], Jeffrey Hollister [rev] (Hollister reviewed the package for JOSS, see https://github.com/openjournals/joss-reviews/issues/2272/), Gennadii Donchyts [rev] (Gena reviewed the package for JOSS, see https://github.com/openjournals/joss-reviews/issues/2272/), Matthieu Stigler [aut, cre] (ORCID: ), Marius Appel [rev] (Appel reviewed the package for JOSS, see https://github.com/openjournals/joss-reviews/issues/2272/)", + "Maintainer": "Matthieu Stigler ", + "Repository": "CRAN" + }, + "rlang": { + "Package": "rlang", + "Version": "1.1.7", + "Source": "Repository", + "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", + "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", + "Authors@R": "c( person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"), person(given = \"mikefc\", email = \"mikefc@coolbutuseless.com\", role = \"cph\", comment = \"Hash implementation based on Mike's xxhashlite\"), person(given = \"Yann\", family = \"Collet\", role = \"cph\", comment = \"Author of the embedded xxHash library\"), person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "ByteCompile": "true", + "Biarch": "true", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "utils" + ], + "Suggests": [ + "cli (>= 3.1.0)", + "covr", + "crayon", + "desc", + "fs", + "glue", + "knitr", + "magrittr", + "methods", + "pillar", + "pkgload", + "rmarkdown", + "stats", + "testthat (>= 3.2.0)", + "tibble", + "usethis", + "vctrs (>= 0.2.3)", + "withr" + ], + "Enhances": [ + "winch" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", + "BugReports": "https://github.com/r-lib/rlang/issues", + "Config/build/compilation-database": "true", + "Config/testthat/edition": "3", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], mikefc [cph] (Hash implementation based on Mike's xxhashlite), Yann Collet [cph] (Author of the embedded xxHash library), Posit, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" + }, + "rmarkdown": { + "Package": "rmarkdown", + "Version": "2.30", + "Source": "Repository", + "Type": "Package", + "Title": "Dynamic Documents for R", + "Authors@R": "c( person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Javier\", \"Luraschi\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"), person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")), person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Malcolm\", \"Barrett\", role = \"ctb\"), person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"), person(\"Romain\", \"Lesur\", role = \"ctb\"), person(\"Roy\", \"Storey\", role = \"ctb\"), person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"), person(\"Sergio\", \"Oller\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"), person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"), person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"), person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"), person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"), person(, \"W3C\", role = \"cph\", comment = \"slidy library\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"), person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"), person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"), person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"), person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"), person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\") )", + "Description": "Convert R Markdown documents into a variety of formats.", + "License": "GPL-3", + "URL": "https://github.com/rstudio/rmarkdown, https://pkgs.rstudio.com/rmarkdown/", + "BugReports": "https://github.com/rstudio/rmarkdown/issues", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "bslib (>= 0.2.5.1)", + "evaluate (>= 0.13)", + "fontawesome (>= 0.5.0)", + "htmltools (>= 0.5.1)", + "jquerylib", + "jsonlite", + "knitr (>= 1.43)", + "methods", + "tinytex (>= 0.31)", + "tools", + "utils", + "xfun (>= 0.36)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "digest", + "dygraphs", + "fs", + "rsconnect", + "downlit (>= 0.4.0)", + "katex (>= 1.4.0)", + "sass (>= 0.4.0)", + "shiny (>= 1.6.0)", + "testthat (>= 3.0.3)", + "tibble", + "vctrs", + "cleanrmd", + "withr (>= 2.4.2)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "rstudio/quillt, pkgdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "pandoc (>= 1.14) - http://pandoc.org", + "NeedsCompilation": "no", + "Author": "JJ Allaire [aut], Yihui Xie [aut, cre] (ORCID: ), Christophe Dervieux [aut] (ORCID: ), Jonathan McPherson [aut], Javier Luraschi [aut], Kevin Ushey [aut], Aron Atkins [aut], Hadley Wickham [aut], Joe Cheng [aut], Winston Chang [aut], Richard Iannone [aut] (ORCID: ), Andrew Dunning [ctb] (ORCID: ), Atsushi Yasumoto [ctb, cph] (ORCID: , cph: Number sections Lua filter), Barret Schloerke [ctb], Carson Sievert [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Frederik Aust [ctb] (ORCID: ), Jeff Allen [ctb], JooYoung Seo [ctb] (ORCID: ), Malcolm Barrett [ctb], Rob Hyndman [ctb], Romain Lesur [ctb], Roy Storey [ctb], Ruben Arslan [ctb], Sergio Oller [ctb], Posit Software, PBC [cph, fnd], jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Alexander Farkas [ctb, cph] (html5shiv library), Scott Jehl [ctb, cph] (Respond.js library), Ivan Sagalaev [ctb, cph] (highlight.js library), Greg Franko [ctb, cph] (tocify library), John MacFarlane [ctb, cph] (Pandoc templates), Google, Inc. [ctb, cph] (ioslides library), Dave Raggett [ctb] (slidy library), W3C [cph] (slidy library), Dave Gandy [ctb, cph] (Font-Awesome), Ben Sperry [ctb] (Ionicons), Drifty [cph] (Ionicons), Aidan Lister [ctb, cph] (jQuery StickyTabs), Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter), Albert Krewinkel [ctb, cph] (pagebreak Lua filter)", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" + }, + "roxygen2": { + "Package": "roxygen2", + "Version": "7.3.3", + "Source": "Repository", + "Title": "In-Line Documentation for R", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Peter\", \"Danenberg\", , \"pcd@roxygen.org\", role = c(\"aut\", \"cph\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"aut\"), person(\"Manuel\", \"Eugster\", role = c(\"aut\", \"cph\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Generate your Rd documentation, 'NAMESPACE' file, and collation field using specially formatted comments. Writing documentation in-line with code makes it easier to keep your documentation up-to-date as your requirements change. 'roxygen2' is inspired by the 'Doxygen' system for C++.", + "License": "MIT + file LICENSE", + "URL": "https://roxygen2.r-lib.org/, https://github.com/r-lib/roxygen2", + "BugReports": "https://github.com/r-lib/roxygen2/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "brew", + "cli (>= 3.3.0)", + "commonmark", + "desc (>= 1.2.0)", + "knitr", + "methods", + "pkgload (>= 1.0.2)", + "purrr (>= 1.0.0)", + "R6 (>= 2.1.2)", + "rlang (>= 1.0.6)", + "stringi", + "stringr (>= 1.0.0)", + "utils", + "withr", + "xml2" + ], + "Suggests": [ + "covr", + "R.methodsS3", + "R.oo", + "rmarkdown (>= 2.16)", + "testthat (>= 3.1.2)", + "yaml" + ], + "LinkingTo": [ + "cpp11" + ], + "VignetteBuilder": "knitr", + "Config/Needs/development": "testthat", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Encoding": "UTF-8", + "Language": "en-GB", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre, cph] (ORCID: ), Peter Danenberg [aut, cph], Gábor Csárdi [aut], Manuel Eugster [aut, cph], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "rprojroot": { + "Package": "rprojroot", + "Version": "2.1.1", + "Source": "Repository", + "Title": "Finding Files in Project Subdirectories", + "Authors@R": "person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\"))", + "Description": "Robust, reliable and flexible paths to files below a project root. The 'root' of a project is defined as a directory that matches a certain criterion, e.g., it contains a certain regular file.", + "License": "MIT + file LICENSE", + "URL": "https://rprojroot.r-lib.org/, https://github.com/r-lib/rprojroot", + "BugReports": "https://github.com/r-lib/rprojroot/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Suggests": [ + "covr", + "knitr", + "lifecycle", + "rlang", + "rmarkdown", + "testthat (>= 3.2.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (ORCID: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "rstac": { + "Package": "rstac", + "Version": "1.0.1", + "Source": "Repository", + "Title": "Client Library for SpatioTemporal Asset Catalog", + "Authors@R": "c(person(\"Rolf\", \"Simoes\", email = \"rolfsimoes@gmail.com\", role = c(\"aut\")), person(\"Felipe\", \"Carvalho\", email = \"lipecaso@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Brazil Data Cube Team\", email = \"brazildatacube@inpe.br\", role = c(\"aut\")), person(given = \"National Institute for Space Research (INPE)\", role = c(\"cph\")))", + "Description": "Provides functions to access, search and download spacetime earth observation data via SpatioTemporal Asset Catalog (STAC). This package supports the version 1.0.0 (and older) of the STAC specification (). For further details see Simoes et al. (2021) .", + "License": "MIT + file LICENSE", + "URL": "https://brazil-data-cube.github.io/rstac/", + "BugReports": "https://github.com/brazil-data-cube/rstac/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Depends": [ + "R (>= 3.5)" + ], + "Imports": [ + "utils", + "httr", + "jsonlite", + "crayon", + "sf", + "png", + "jpeg", + "grid", + "magrittr" + ], + "Suggests": [ + "lifecycle", + "testthat", + "knitr", + "tmap", + "leaflet", + "stars", + "slider", + "ggplot2", + "purrr", + "dplyr" + ], + "Collate": "'cql2-expr-funs.R' 'cql2-types.R' 'parse-utils.R' 'cql2-core.R' 'cql2-json.R' 'cql2-text.R' 'cql2-adv_comp.R' 'cql2-funs.R' 'cql2-env.R' 'cql2-utils.R' 'assets-utils.R' 'assets-funs.R' 'check-utils.R' 'conformance-query.R' 'collections-funs.R' 'collections-query.R' 'deprec-funs.R' 'doc-funs.R' 'ext_filter.R' 'ext_query.R' 'extensions.R' 'geom-funs.R' 'items-funs.R' 'items-utils.R' 'items-query.R' 'message-utils.R' 'preview-utils.R' 'print.R' 'query-funs.R' 'queryables-query.R' 'request.R' 'signatures.R' 'stac-query.R' 'search-query.R' 'stac-funs.R' 'static-funs.R' 'url-utils.R' 'utils.R' 'rstac.R' 'rstac-funs.R'", + "NeedsCompilation": "no", + "Author": "Rolf Simoes [aut], Felipe Carvalho [aut, cre], Brazil Data Cube Team [aut], National Institute for Space Research (INPE) [cph]", + "Maintainer": "Felipe Carvalho ", + "Repository": "CRAN" + }, + "rstudioapi": { + "Package": "rstudioapi", + "Version": "0.18.0", + "Source": "Repository", + "Title": "Safely Access the RStudio API", + "Description": "Access the RStudio API (if available) and provide informative error messages when it's not.", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\"), person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@posit.co\"), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@posit.co\"), person(\"Gary\", \"Ritchie\", role = c(\"aut\"), email = \"gary@posit.co\"), person(family = \"RStudio\", role = \"cph\") )", + "Maintainer": "Kevin Ushey ", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/rstudioapi/, https://github.com/rstudio/rstudioapi", + "BugReports": "https://github.com/rstudio/rstudioapi/issues", + "RoxygenNote": "7.3.3", + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "clipr", + "covr", + "curl", + "jsonlite", + "withr" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre], JJ Allaire [aut], Hadley Wickham [aut], Gary Ritchie [aut], RStudio [cph]", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "rversions": { + "Package": "rversions", + "Version": "3.0.0", + "Source": "Repository", + "Title": "Query 'R' Versions, Including 'r-release' and 'r-oldrel'", + "Authors@R": "c(person(given = \"Gábor\", family = \"Csárdi\", role = c(\"aut\", \"cre\"), email = \"csardi.gabor@gmail.com\"), person(given = \"Jeroen\", family = \"Ooms\", role = \"ctb\", email = \"jeroen.ooms@stat.ucla.edu\"), person(given = \"R Consortium\", role = \"fnd\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")))", + "Description": "Query the main 'R' 'SVN' repository to find the versions 'r-release' and 'r-oldrel' refer to, and also all previous 'R' versions and their release dates.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-hub/rversions, https://r-hub.github.io/rversions/", + "BugReports": "https://github.com/r-hub/rversions/issues", + "Imports": [ + "curl" + ], + "Suggests": [ + "pillar", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Jeroen Ooms [ctb], R Consortium [fnd], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "rvest": { + "Package": "rvest", + "Version": "1.0.5", + "Source": "Repository", + "Title": "Easily Harvest (Scrape) Web Pages", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Wrappers around the 'xml2' and 'httr' packages to make it easy to download, then manipulate, HTML and XML.", + "License": "MIT + file LICENSE", + "URL": "https://rvest.tidyverse.org/, https://github.com/tidyverse/rvest", + "BugReports": "https://github.com/tidyverse/rvest/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli", + "glue", + "httr (>= 0.5)", + "lifecycle (>= 1.0.3)", + "magrittr", + "rlang (>= 1.1.0)", + "selectr", + "tibble", + "xml2 (>= 1.4.0)" + ], + "Suggests": [ + "chromote", + "covr", + "knitr", + "purrr", + "R6", + "readr", + "repurrrsive", + "rmarkdown", + "spelling", + "stringi (>= 0.3.1)", + "testthat (>= 3.0.2)", + "tidyr", + "webfakes" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "s2": { + "Package": "s2", + "Version": "1.1.9", + "Source": "Repository", + "Title": "Spherical Geometry Operators Using the S2 Geometry Library", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(\"Ege\", \"Rubak\", email=\"rubak@math.aau.dk\", role = c(\"aut\")), person(\"Jeroen\", \"Ooms\", , \"jeroen.ooms@stat.ucla.edu\", role = \"ctb\", comment = \"configure script\"), person(family = \"Google, Inc.\", role = \"cph\", comment = \"Original s2geometry.io source code\") )", + "Description": "Provides R bindings for Google's s2 library for geometric calculations on the sphere. High-performance constructors and exporters provide high compatibility with existing spatial packages, transformers construct new geometries from existing geometries, predicates provide a means to select geometries based on spatial relationships, and accessors extract information about geometries.", + "License": "Apache License (== 2.0)", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.2", + "SystemRequirements": "cmake, OpenSSL >= 1.0.1, Abseil >= 20230802.0", + "LinkingTo": [ + "Rcpp", + "wk" + ], + "Imports": [ + "Rcpp", + "wk (>= 0.6.0)" + ], + "Suggests": [ + "bit64", + "testthat (>= 3.0.0)", + "vctrs" + ], + "URL": "https://r-spatial.github.io/s2/, https://github.com/r-spatial/s2, http://s2geometry.io/", + "BugReports": "https://github.com/r-spatial/s2/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut] (ORCID: ), Edzer Pebesma [aut, cre] (ORCID: ), Ege Rubak [aut], Jeroen Ooms [ctb] (configure script), Google, Inc. [cph] (Original s2geometry.io source code)", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" + }, + "sass": { + "Package": "sass", + "Version": "0.4.10", + "Source": "Repository", + "Type": "Package", + "Title": "Syntactically Awesome Style Sheets ('Sass')", + "Description": "An 'SCSS' compiler, powered by the 'LibSass' library. With this, R developers can use variables, inheritance, and functions to generate dynamic style sheets. The package uses the 'Sass CSS' extension language, which is stable, powerful, and CSS compatible.", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@rstudio.com\", \"aut\"), person(\"Timothy\", \"Mastny\", , \"tim.mastny@gmail.com\", \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Barret\", \"Schloerke\", , \"barret@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Carson\", \"Sievert\", , \"carson@rstudio.com\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Christophe\", \"Dervieux\", , \"cderv@rstudio.com\", c(\"ctb\"), comment = c(ORCID = \"0000-0003-4474-2498\")), person(family = \"RStudio\", role = c(\"cph\", \"fnd\")), person(family = \"Sass Open Source Foundation\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Greter\", \"Marcel\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Mifsud\", \"Michael\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Hampton\", \"Catlin\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Natalie\", \"Weizenbaum\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Chris\", \"Eppstein\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Adams\", \"Joseph\", role = c(\"ctb\", \"cph\"), comment = \"json.cpp\"), person(\"Trifunovic\", \"Nemanja\", role = c(\"ctb\", \"cph\"), comment = \"utf8.h\") )", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/sass/, https://github.com/rstudio/sass", + "BugReports": "https://github.com/rstudio/sass/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "GNU make", + "Imports": [ + "fs (>= 1.2.4)", + "rlang (>= 0.4.10)", + "htmltools (>= 0.5.1)", + "R6", + "rappdirs" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "withr", + "shiny", + "curl" + ], + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Timothy Mastny [aut], Richard Iannone [aut] (), Barret Schloerke [aut] (), Carson Sievert [aut, cre] (), Christophe Dervieux [ctb] (), RStudio [cph, fnd], Sass Open Source Foundation [ctb, cph] (LibSass library), Greter Marcel [ctb, cph] (LibSass library), Mifsud Michael [ctb, cph] (LibSass library), Hampton Catlin [ctb, cph] (LibSass library), Natalie Weizenbaum [ctb, cph] (LibSass library), Chris Eppstein [ctb, cph] (LibSass library), Adams Joseph [ctb, cph] (json.cpp), Trifunovic Nemanja [ctb, cph] (utf8.h)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "scales": { + "Package": "scales", + "Version": "1.4.0", + "Source": "Repository", + "Title": "Scale Functions for Visualization", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Dana\", \"Seidel\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Graphical scales map data to aesthetics, and provide methods for automatically determining breaks and labels for axes and legends.", + "License": "MIT + file LICENSE", + "URL": "https://scales.r-lib.org, https://github.com/r-lib/scales", + "BugReports": "https://github.com/r-lib/scales/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli", + "farver (>= 2.0.3)", + "glue", + "labeling", + "lifecycle", + "R6", + "RColorBrewer", + "rlang (>= 1.1.0)", + "viridisLite" + ], + "Suggests": [ + "bit64", + "covr", + "dichromat", + "ggplot2", + "hms (>= 0.5.0)", + "stringi", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "LazyLoad": "yes", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Thomas Lin Pedersen [cre, aut] (), Dana Seidel [aut], Posit Software, PBC [cph, fnd] (03wc8by49)", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "secretbase": { + "Package": "secretbase", + "Version": "1.2.0", + "Source": "Repository", + "Type": "Package", + "Title": "Cryptographic Hash, Extendable-Output and Binary/Text Encoding Functions", + "Authors@R": "c( person(\"Charlie\", \"Gao\", , \"charlie.gao@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-0750-061X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(\"Hibiki AI Limited\", role = \"cph\") )", + "Description": "Fast and memory-efficient streaming hash functions, binary/text encoding and serialization. Hashes strings and raw vectors directly. Stream hashes files which can be larger than memory, as well as in-memory objects through R's serialization mechanism. Implements the SHA-256, SHA-3 and 'Keccak' cryptographic hash functions, SHAKE256 extendable-output function (XOF), 'SipHash' pseudo-random function, base64 and base58 encoding, 'CBOR' and 'JSON' serialization.", + "License": "MIT + file LICENSE", + "URL": "https://shikokuchuo.net/secretbase/, https://github.com/shikokuchuo/secretbase/", + "BugReports": "https://github.com/shikokuchuo/secretbase/issues", + "Depends": [ + "R (>= 3.5)" + ], + "Config/build/compilation-database": "true", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Charlie Gao [aut, cre] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: ), Hibiki AI Limited [cph]", + "Maintainer": "Charlie Gao ", + "Repository": "CRAN" + }, + "selectr": { + "Package": "selectr", + "Version": "0.5-1", + "Source": "Repository", + "Type": "Package", + "Title": "Translate CSS Selectors to XPath Expressions", + "Authors@R": "c(person(\"Simon\", \"Potter\", role = c(\"aut\", \"trl\", \"cre\"), email = \"simon@sjp.co.nz\"), person(\"Simon\", \"Sapin\", role = \"aut\"), person(\"Ian\", \"Bicking\", role = \"aut\"))", + "License": "BSD_3_clause + file LICENCE", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "methods", + "stringr", + "R6" + ], + "Suggests": [ + "testthat", + "XML", + "xml2" + ], + "URL": "https://sjp.co.nz/projects/selectr/", + "BugReports": "https://github.com/sjp/selectr/issues", + "Description": "Translates a CSS selector into an equivalent XPath expression. This allows us to use CSS selectors when working with the XML package as it can only evaluate XPath expressions. Also provided are convenience functions useful for using CSS selectors on XML nodes. This package is a port of the Python package 'cssselect' ().", + "NeedsCompilation": "no", + "Author": "Simon Potter [aut, trl, cre], Simon Sapin [aut], Ian Bicking [aut]", + "Maintainer": "Simon Potter ", + "Repository": "CRAN" + }, + "sessioninfo": { + "Package": "sessioninfo", + "Version": "1.2.3", + "Source": "Repository", + "Title": "R Session Information", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"cre\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Robert\", \"Flight\", role = \"aut\"), person(\"Kirill\", \"Müller\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"R Core team\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Maintainer": "Gábor Csárdi ", + "Description": "Query and print information about the current R session. It is similar to 'utils::sessionInfo()', but includes more information about packages, and where they were installed from.", + "License": "GPL-2", + "URL": "https://github.com/r-lib/sessioninfo#readme, https://sessioninfo.r-lib.org", + "BugReports": "https://github.com/r-lib/sessioninfo/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "cli (>= 3.1.0)", + "tools", + "utils" + ], + "Suggests": [ + "callr", + "covr", + "gh", + "reticulate", + "rmarkdown", + "testthat (>= 3.2.0)", + "withr" + ], + "Config/Needs/website": "pkgdown, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [cre], Hadley Wickham [aut], Winston Chang [aut], Robert Flight [aut], Kirill Müller [aut], Jim Hester [aut], R Core team [ctb], Posit Software, PBC [cph, fnd]", + "Repository": "CRAN" + }, + "sf": { + "Package": "sf", + "Version": "1.1-0", + "Source": "Repository", + "Title": "Simple Features for R", + "Authors@R": "c(person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Roger\", family = \"Bivand\", role = \"ctb\", comment = c(ORCID = \"0000-0003-2392-6140\")), person(given = \"Etienne\", family = \"Racine\", role = \"ctb\"), person(given = \"Michael\", family = \"Sumner\", role = \"ctb\"), person(given = \"Ian\", family = \"Cook\", role = \"ctb\"), person(given = \"Tim\", family = \"Keitt\", role = \"ctb\"), person(given = \"Robin\", family = \"Lovelace\", role = \"ctb\"), person(given = \"Hadley\", family = \"Wickham\", role = \"ctb\"), person(given = \"Jeroen\", family = \"Ooms\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"ctb\"), person(given = \"Thomas Lin\", family = \"Pedersen\", role = \"ctb\"), person(given = \"Dan\", family = \"Baston\", role = \"ctb\"), person(given = \"Dewey\", family = \"Dunnington\", role = \"ctb\", comment = c(ORCID = \"0000-0002-9415-4582\")) )", + "Description": "Support for simple feature access, a standardized way to encode and analyze spatial vector data. Binds to 'GDAL' for reading and writing data, to 'GEOS' for geometrical operations, and to 'PROJ' for projection conversions and datum transformations. Uses by default the 's2' package for geometry operations on geodetic (long/lat degree) coordinates.", + "License": "GPL-2 | MIT + file LICENSE", + "URL": "https://r-spatial.github.io/sf/, https://github.com/r-spatial/sf", + "BugReports": "https://github.com/r-spatial/sf/issues", + "Depends": [ + "methods", + "R (>= 3.3.0)" + ], + "Imports": [ + "classInt (>= 0.4-1)", + "DBI (>= 0.8)", + "graphics", + "grDevices", + "grid", + "magrittr", + "s2 (>= 1.1.0)", + "stats", + "tools", + "units (>= 0.7-0)", + "utils" + ], + "Suggests": [ + "blob", + "nanoarrow", + "covr", + "dplyr (>= 1.0.0)", + "ggplot2", + "knitr", + "lwgeom (>= 0.2-14)", + "maps", + "mapview", + "Matrix", + "microbenchmark", + "odbc", + "pbapply", + "pillar", + "pool", + "raster", + "rlang", + "rmarkdown", + "RPostgres (>= 1.1.0)", + "RPostgreSQL", + "RSQLite", + "sp (>= 1.2-4)", + "spatstat (>= 2.0-1)", + "spatstat.geom", + "spatstat.random", + "spatstat.linnet", + "spatstat.utils", + "stars (>= 0.6-0)", + "terra", + "testthat (>= 3.0.0)", + "tibble (>= 1.4.1)", + "tidyr (>= 1.2.0)", + "tidyselect (>= 1.0.0)", + "tmap (>= 2.0)", + "vctrs", + "wk (>= 0.9.0)" + ], + "LinkingTo": [ + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Config/testthat/edition": "2", + "Config/needs/coverage": "XML", + "SystemRequirements": "GDAL (>= 2.0.1), GEOS (>= 3.4.0), PROJ (>= 4.8.0), sqlite3", + "Collate": "'RcppExports.R' 'init.R' 'import-standalone-s3-register.R' 'crs.R' 'bbox.R' 'read.R' 'db.R' 'sfc.R' 'sfg.R' 'sf.R' 'bind.R' 'wkb.R' 'wkt.R' 'plot.R' 'geom-measures.R' 'geom-predicates.R' 'geom-transformers.R' 'transform.R' 'proj.R' 'sp.R' 'grid.R' 'arith.R' 'tidyverse.R' 'tidyverse-vctrs.R' 'cast_sfg.R' 'cast_sfc.R' 'graticule.R' 'datasets.R' 'aggregate.R' 'agr.R' 'maps.R' 'join.R' 'sample.R' 'valid.R' 'collection_extract.R' 'jitter.R' 'sgbp.R' 'spatstat.R' 'stars.R' 'crop.R' 'gdal_utils.R' 'nearest.R' 'normalize.R' 'sf-package.R' 'defunct.R' 'z_range.R' 'm_range.R' 'shift_longitude.R' 'make_grid.R' 's2.R' 'terra.R' 'geos-overlayng.R' 'break_antimeridian.R'", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Roger Bivand [ctb] (ORCID: ), Etienne Racine [ctb], Michael Sumner [ctb], Ian Cook [ctb], Tim Keitt [ctb], Robin Lovelace [ctb], Hadley Wickham [ctb], Jeroen Ooms [ctb] (ORCID: ), Kirill Müller [ctb], Thomas Lin Pedersen [ctb], Dan Baston [ctb], Dewey Dunnington [ctb] (ORCID: )", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" + }, + "sfarrow": { + "Package": "sfarrow", + "Version": "0.4.1", + "Source": "Repository", + "Title": "Read/Write Simple Feature Objects ('sf') with 'Apache' 'Arrow'", + "Date": "2021-10-25", + "Authors@R": "person(given = \"Chris\", family = \"Jochem\", role = c(\"aut\", \"cre\"), email = \"w.c.jochem@soton.ac.uk\", comment = c(ORCID = \"0000-0003-2192-5988\"))", + "Description": "Support for reading/writing simple feature ('sf') spatial objects from/to 'Parquet' files. 'Parquet' files are an open-source, column-oriented data storage format from Apache (), now popular across programming languages. This implementation converts simple feature list geometries into well-known binary format for use by 'arrow', and coordinate reference system information is maintained in a standard metadata format.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/wcjochem/sfarrow, https://wcjochem.github.io/sfarrow/", + "BugReports": "https://github.com/wcjochem/sfarrow/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "Imports": [ + "sf", + "arrow", + "jsonlite", + "dplyr" + ], + "Suggests": [ + "knitr", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Chris Jochem [aut, cre] ()", + "Maintainer": "Chris Jochem ", + "Repository": "CRAN" + }, + "sfheaders": { + "Package": "sfheaders", + "Version": "0.4.5", + "Source": "Repository", + "Type": "Package", + "Title": "Converts Between R Objects and Simple Feature Objects", + "Date": "2025-11-24", + "Authors@R": "c( person(\"David\", \"Cooley\", ,\"david.cooley.au@gmail.com\", role = c(\"aut\", \"cre\")), person(given = \"Michael\", family = \"Sumner\", role = \"ctb\") )", + "Description": "Converts between R and Simple Feature 'sf' objects, without depending on the Simple Feature library. Conversion functions are available at both the R level, and through 'Rcpp'.", + "License": "MIT + file LICENSE", + "URL": "https://dcooley.github.io/sfheaders/", + "BugReports": "https://github.com/dcooley/sfheaders/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 3.0.2)" + ], + "LinkingTo": [ + "geometries (>= 0.2.5)", + "Rcpp" + ], + "Imports": [ + "Rcpp (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "knitr", + "testthat" + ], + "NeedsCompilation": "yes", + "Author": "David Cooley [aut, cre], Michael Sumner [ctb]", + "Maintainer": "David Cooley ", + "Repository": "CRAN" + }, + "shiny": { + "Package": "shiny", + "Version": "1.13.0", + "Source": "Repository", + "Type": "Package", + "Title": "Web Application Framework for R", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Garrick\", \"Aden-Buie\", , \"garrick@adenbuie.com\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Alan\", \"Dipert\", role = \"aut\"), person(\"Barbara\", \"Borges\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")), person(, \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(, \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt\"), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Prem Nawaz\", \"Khan\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Victor\", \"Tsaran\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Dennis\", \"Lembree\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Srinivasu\", \"Chakravarthula\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(\"Cathy\", \"O'Connor\", role = \"ctb\", comment = \"Bootstrap accessibility plugin\"), person(, \"PayPal, Inc\", role = \"cph\", comment = \"Bootstrap accessibility plugin\"), person(\"Stefan\", \"Petre\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Andrew\", \"Rowls\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap-datepicker library\"), person(\"Brian\", \"Reavis\", role = c(\"ctb\", \"cph\"), comment = \"selectize.js library\"), person(\"Salmen\", \"Bejaoui\", role = c(\"ctb\", \"cph\"), comment = \"selectize-plugin-a11y library\"), person(\"Denis\", \"Ineshin\", role = c(\"ctb\", \"cph\"), comment = \"ion.rangeSlider library\"), person(\"Sami\", \"Samhuri\", role = c(\"ctb\", \"cph\"), comment = \"Javascript strftime library\"), person(, \"SpryMedia Limited\", role = c(\"ctb\", \"cph\"), comment = \"DataTables library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"R Core Team\", role = c(\"ctb\", \"cph\"), comment = \"tar implementation from R\") )", + "Description": "Makes it incredibly easy to build interactive web applications with R. Automatic \"reactive\" binding between inputs and outputs and extensive prebuilt widgets make it possible to build beautiful, responsive, and powerful applications with minimal effort.", + "License": "MIT + file LICENSE", + "URL": "https://shiny.posit.co/, https://github.com/rstudio/shiny", + "BugReports": "https://github.com/rstudio/shiny/issues", + "Depends": [ + "methods", + "R (>= 3.1.2)" + ], + "Imports": [ + "bslib (>= 0.6.0)", + "cachem (>= 1.1.0)", + "cli", + "commonmark (>= 2.0.0)", + "fastmap (>= 1.1.1)", + "fontawesome (>= 0.4.0)", + "glue (>= 1.3.2)", + "grDevices", + "htmltools (>= 0.5.4)", + "httpuv (>= 1.5.2)", + "jsonlite (>= 0.9.16)", + "later (>= 1.0.0)", + "lifecycle (>= 0.2.0)", + "mime (>= 0.3)", + "otel", + "promises (>= 1.5.0)", + "R6 (>= 2.0)", + "rlang (>= 0.4.10)", + "sourcetools", + "tools", + "utils", + "withr", + "xtable" + ], + "Suggests": [ + "Cairo (>= 1.5-5)", + "coro (>= 1.1.0)", + "datasets", + "DT", + "dygraphs", + "future", + "ggplot2", + "knitr (>= 1.6)", + "magrittr", + "markdown", + "mirai", + "otelsdk (>= 0.2.0)", + "ragg", + "reactlog (>= 1.0.0)", + "rmarkdown", + "sass", + "showtext", + "testthat (>= 3.2.1)", + "watcher", + "yaml" + ], + "Config/Needs/check": "shinytest2", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'globals.R' 'app-state.R' 'app_template.R' 'bind-cache.R' 'bind-event.R' 'bookmark-state-local.R' 'bookmark-state.R' 'bootstrap-deprecated.R' 'bootstrap-layout.R' 'conditions.R' 'map.R' 'utils.R' 'bootstrap.R' 'busy-indicators-spinners.R' 'busy-indicators.R' 'cache-utils.R' 'deprecated.R' 'devmode.R' 'diagnose.R' 'extended-task.R' 'fileupload.R' 'graph.R' 'reactives.R' 'reactive-domains.R' 'history.R' 'hooks.R' 'html-deps.R' 'image-interact-opts.R' 'image-interact.R' 'imageutils.R' 'input-action.R' 'input-checkbox.R' 'input-checkboxgroup.R' 'input-date.R' 'input-daterange.R' 'input-file.R' 'input-numeric.R' 'input-password.R' 'input-radiobuttons.R' 'input-select.R' 'input-slider.R' 'input-submit.R' 'input-text.R' 'input-textarea.R' 'input-utils.R' 'insert-tab.R' 'insert-ui.R' 'jqueryui.R' 'knitr.R' 'middleware-shiny.R' 'middleware.R' 'timer.R' 'shiny.R' 'mock-session.R' 'modal.R' 'modules.R' 'notifications.R' 'otel-attr-srcref.R' 'otel-collect.R' 'otel-enable.R' 'otel-error.R' 'otel-label.R' 'otel-reactive-update.R' 'otel-session.R' 'otel-shiny.R' 'otel-with.R' 'priorityqueue.R' 'progress.R' 'react.R' 'reexports.R' 'render-cached-plot.R' 'render-plot.R' 'render-table.R' 'run-url.R' 'runapp.R' 'serializers.R' 'server-input-handlers.R' 'server-resource-paths.R' 'server.R' 'shiny-options.R' 'shiny-package.R' 'shinyapp.R' 'shinyui.R' 'shinywrappers.R' 'showcase.R' 'snapshot.R' 'staticimports.R' 'tar.R' 'test-export.R' 'test-server.R' 'test.R' 'update-input.R' 'utils-lang.R' 'utils-tags.R' 'version_bs_date_picker.R' 'version_ion_range_slider.R' 'version_jquery.R' 'version_jqueryui.R' 'version_selectize.R' 'version_strftime.R' 'viewer.R'", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut] (ORCID: ), Joe Cheng [aut], JJ Allaire [aut], Carson Sievert [aut, cre] (ORCID: ), Barret Schloerke [aut] (ORCID: ), Garrick Aden-Buie [aut] (ORCID: ), Yihui Xie [aut], Jeff Allen [aut], Jonathan McPherson [aut], Alan Dipert [aut], Barbara Borges [aut], Posit Software, PBC [cph, fnd] (ROR: ), jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/www/shared/jquery-AUTHORS.txt), jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/www/shared/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Prem Nawaz Khan [ctb] (Bootstrap accessibility plugin), Victor Tsaran [ctb] (Bootstrap accessibility plugin), Dennis Lembree [ctb] (Bootstrap accessibility plugin), Srinivasu Chakravarthula [ctb] (Bootstrap accessibility plugin), Cathy O'Connor [ctb] (Bootstrap accessibility plugin), PayPal, Inc [cph] (Bootstrap accessibility plugin), Stefan Petre [ctb, cph] (Bootstrap-datepicker library), Andrew Rowls [ctb, cph] (Bootstrap-datepicker library), Brian Reavis [ctb, cph] (selectize.js library), Salmen Bejaoui [ctb, cph] (selectize-plugin-a11y library), Denis Ineshin [ctb, cph] (ion.rangeSlider library), Sami Samhuri [ctb, cph] (Javascript strftime library), SpryMedia Limited [ctb, cph] (DataTables library), Ivan Sagalaev [ctb, cph] (highlight.js library), R Core Team [ctb, cph] (tar implementation from R)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" + }, + "smoothr": { + "Package": "smoothr", + "Version": "1.2.1", + "Source": "Repository", + "Type": "Package", + "Title": "Smooth and Tidy Spatial Features", + "Authors@R": "person(given = \"Matthew\", family = \"Strimas-Mackey\", role = c(\"aut\", \"cre\"), email = \"mstrimas@gmail.com\", comment = c(ORCID = \"0000-0001-8929-7776\"))", + "Description": "Tools for smoothing and tidying spatial features (i.e. lines and polygons) to make them more aesthetically pleasing. Smooth curves, fill holes, and remove small fragments from lines and polygons.", + "License": "GPL-3", + "URL": "https://strimas.com/smoothr/, https://github.com/mstrimas/smoothr", + "BugReports": "https://github.com/mstrimas/smoothr/issues", + "Depends": [ + "R (>= 3.1.2)" + ], + "Imports": [ + "sf", + "stats", + "units" + ], + "Suggests": [ + "covr", + "knitr", + "lwgeom", + "methods", + "rmarkdown", + "sp", + "testthat", + "terra" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Matthew Strimas-Mackey [aut, cre] (ORCID: )", + "Maintainer": "Matthew Strimas-Mackey ", + "Repository": "CRAN" + }, + "snakecase": { + "Package": "snakecase", + "Version": "0.11.1", + "Source": "Repository", + "Date": "2023-08-27", + "Title": "Convert Strings into any Case", + "Description": "A consistent, flexible and easy to use tool to parse and convert strings into cases like snake or camel among others.", + "Authors@R": "c( person(\"Malte\", \"Grosser\", , \"malte.grosser@gmail.com\", role = c(\"aut\", \"cre\")))", + "Maintainer": "Malte Grosser ", + "Depends": [ + "R (>= 3.2)" + ], + "Imports": [ + "stringr", + "stringi" + ], + "Suggests": [ + "testthat", + "covr", + "tibble", + "purrrlyr", + "knitr", + "rmarkdown", + "magrittr" + ], + "URL": "https://github.com/Tazinho/snakecase", + "BugReports": "https://github.com/Tazinho/snakecase/issues", + "Encoding": "UTF-8", + "License": "GPL-3", + "RoxygenNote": "6.1.1", + "VignetteBuilder": "knitr", + "NeedsCompilation": "no", + "Author": "Malte Grosser [aut, cre]", + "Repository": "CRAN" + }, + "sourcetools": { + "Package": "sourcetools", + "Version": "0.1.7-1", + "Source": "Repository", + "Type": "Package", + "Title": "Tools for Reading, Tokenizing and Parsing R Code", + "Author": "Kevin Ushey", + "Maintainer": "Kevin Ushey ", + "Description": "Tools for the reading and tokenization of R code. The 'sourcetools' package provides both an R and C++ interface for the tokenization of R code, and helpers for interacting with the tokenized representation of R code.", + "License": "MIT + file LICENSE", + "Depends": [ + "R (>= 3.0.2)" + ], + "Suggests": [ + "testthat" + ], + "RoxygenNote": "5.0.1", + "BugReports": "https://github.com/kevinushey/sourcetools/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "sp": { + "Package": "sp", + "Version": "2.2-1", + "Source": "Repository", + "Title": "Classes and Methods for Spatial Data", + "Authors@R": "c(person(\"Edzer\", \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\"), person(\"Roger\", \"Bivand\", role = \"aut\", email = \"Roger.Bivand@nhh.no\"), person(\"Barry\", \"Rowlingson\", role = \"ctb\"), person(\"Virgilio\", \"Gomez-Rubio\", role = \"ctb\"), person(\"Robert\", \"Hijmans\", role = \"ctb\"), person(\"Michael\", \"Sumner\", role = \"ctb\"), person(\"Don\", \"MacQueen\", role = \"ctb\"), person(\"Jim\", \"Lemon\", role = \"ctb\"), person(\"Finn\", \"Lindgren\", role = \"ctb\"), person(\"Josh\", \"O'Brien\", role = \"ctb\"), person(\"Joseph\", \"O'Rourke\", role = \"ctb\"), person(\"Patrick\", \"Hausmann\", role = \"ctb\"), person(\"Sebastian\", \"Meyer\", role = \"ctb\"))", + "Depends": [ + "R (>= 3.5.0)", + "methods" + ], + "Imports": [ + "utils", + "stats", + "graphics", + "grDevices", + "lattice", + "grid" + ], + "Suggests": [ + "RColorBrewer", + "gstat", + "deldir", + "knitr", + "maps", + "mapview", + "rmarkdown", + "sf", + "terra", + "raster" + ], + "Description": "Classes and methods for spatial data; the classes document where the spatial location information resides, for 2D or 3D data. Utility functions are provided, e.g. for plotting data as maps, spatial selection, as well as methods for retrieving coordinates, for subsetting, print, summary, etc. From this version, 'rgdal', 'maptools', and 'rgeos' are no longer used at all, see for details.", + "License": "GPL (>= 2)", + "URL": "https://github.com/edzer/sp/ https://edzer.github.io/sp/", + "BugReports": "https://github.com/edzer/sp/issues", + "Collate": "bpy.colors.R AAA.R Class-CRS.R CRS-methods.R Class-Spatial.R Spatial-methods.R projected.R Class-SpatialPoints.R SpatialPoints-methods.R Class-SpatialPointsDataFrame.R SpatialPointsDataFrame-methods.R Class-SpatialMultiPoints.R SpatialMultiPoints-methods.R Class-SpatialMultiPointsDataFrame.R SpatialMultiPointsDataFrame-methods.R Class-GridTopology.R Class-SpatialGrid.R Class-SpatialGridDataFrame.R Class-SpatialLines.R SpatialLines-methods.R Class-SpatialLinesDataFrame.R SpatialLinesDataFrame-methods.R Class-SpatialPolygons.R Class-SpatialPolygonsDataFrame.R SpatialPolygons-methods.R SpatialPolygonsDataFrame-methods.R GridTopology-methods.R SpatialGrid-methods.R SpatialGridDataFrame-methods.R SpatialPolygons-internals.R point.in.polygon.R SpatialPolygons-displayMethods.R zerodist.R image.R stack.R bubble.R mapasp.R select.spatial.R gridded.R asciigrid.R spplot.R over.R spsample.R recenter.R dms.R gridlines.R spdists.R rbind.R flipSGDF.R chfids.R loadmeuse.R compassRose.R surfaceArea.R spOptions.R subset.R disaggregate.R sp_spat1.R merge.R aggregate.R elide.R sp2Mondrian.R", + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre], Roger Bivand [aut], Barry Rowlingson [ctb], Virgilio Gomez-Rubio [ctb], Robert Hijmans [ctb], Michael Sumner [ctb], Don MacQueen [ctb], Jim Lemon [ctb], Finn Lindgren [ctb], Josh O'Brien [ctb], Joseph O'Rourke [ctb], Patrick Hausmann [ctb], Sebastian Meyer [ctb]", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" + }, + "stars": { + "Package": "stars", + "Version": "0.7-1", + "Source": "Repository", + "Title": "Spatiotemporal Arrays, Raster and Vector Data Cubes", + "Authors@R": "c(person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Michael\", family = \"Sumner\", role = \"ctb\", comment=c(ORCID = \"0000-0002-2471-7511\")), person(given = \"Etienne\", family = \"Racine\", role = \"ctb\"), person(given = \"Adriano\", family = \"Fantini\", role = \"ctb\"), person(given = \"David\", family = \"Blodgett\", role = \"ctb\"), person(given = \"Krzysztof\", family = \"Dyba\", role = \"ctb\", comment=c(ORCID = \"0000-0002-8614-3816\")))", + "Description": "Reading, manipulating, writing and plotting spatiotemporal arrays (raster and vector data cubes) in 'R', using 'GDAL' bindings provided by 'sf', and 'NetCDF' bindings by 'ncmeta' and 'RNetCDF'.", + "License": "Apache License", + "URL": "https://r-spatial.github.io/stars/, https://github.com/r-spatial/stars/", + "BugReports": "https://github.com/r-spatial/stars/issues/", + "Additional_repositories": "https://cran.uni-muenster.de/pebesma/", + "LazyData": "true", + "Depends": [ + "R (>= 4.1.0)", + "abind", + "sf (>= 1.0-19)" + ], + "Imports": [ + "methods", + "parallel", + "classInt (>= 0.4-1)", + "rlang", + "units" + ], + "Suggests": [ + "Cairo", + "CFtime (>= 1.7.1)", + "OpenStreetMap", + "RNetCDF (>= 1.8-2)", + "clue", + "covr", + "cubble (>= 0.3.0)", + "cubelyr", + "digest", + "dplyr (>= 0.7-0)", + "exactextractr", + "FNN", + "future.apply", + "ggforce", + "ggplot2", + "ggthemes", + "gstat", + "httr", + "jsonlite", + "knitr", + "lwgeom", + "maps", + "mapdata", + "ncdfCF", + "ncdfgeom", + "ncmeta (>= 0.0.3)", + "pbapply", + "plm", + "randomForest", + "raster", + "rmarkdown", + "sp", + "spacetime", + "spatstat (>= 2.0-1)", + "spatstat.geom", + "starsdata", + "terra (>= 1.4-22)", + "testthat", + "tibble", + "tidyr", + "tsibble", + "viridis", + "xts", + "zoo" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "Collate": "'aggregate.R' 'cf.R' 'cubble.R' 'datasets.R' 'dimensions.R' 'extract.R' 'factors.R' 'geom.R' 'gt.R' 'init.R' 'intervals.R' 'mdim.R' 'mosaic.R' 'ncdf.R' 'ncproxy.R' 'OpenStreetMap.R' 'ops.R' 'plot.R' 'prcomp.R' 'proxy.R' 'rasterize.R' 'raster.R' 'read.R' 'rotate.R' 'sample.R' 'sf.R' 'spacetime.R' 'spatstat.R' 'sp.R' 'stars.R' 'subset.R' 'tidyverse.R' 'tile.R' 'transform.R' 'values.R' 'warp.R' 'write.R' 'xts.R'", + "NeedsCompilation": "no", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Michael Sumner [ctb] (ORCID: ), Etienne Racine [ctb], Adriano Fantini [ctb], David Blodgett [ctb], Krzysztof Dyba [ctb] (ORCID: )", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" + }, + "stringfish": { + "Package": "stringfish", + "Version": "0.18.0", + "Source": "Repository", + "Title": "Alt String Implementation", + "Date": "2026-01-17", + "Authors@R": "c( person(\"Travers\", \"Ching\", email = \"traversc@gmail.com\", role = c(\"aut\", \"cre\", \"cph\")), person(\"Phillip\", \"Hazel\", role = c(\"ctb\"), comment = \"Bundled PCRE2 code\"), person(\"Zoltan\", \"Herczeg\", role = c(\"ctb\", \"cph\"), comment = \"Bundled PCRE2 code\"), person(\"University of Cambridge\", role = c(\"cph\"), comment = \"Bundled PCRE2 code\"), person(\"Tilera Corporation\", role = c(\"cph\"), comment = \"Stack-less Just-In-Time compiler bundled with PCRE2\"), person(\"Yann\", \"Collet\", role = c(\"ctb\", \"cph\"), comment = \"Yann Collet is the author of the bundled xxHash code\"))", + "Maintainer": "Travers Ching ", + "Description": "Provides an extendable, performant and multithreaded 'alt-string' implementation backed by 'C++' vectors and strings.", + "License": "GPL-3", + "Biarch": "true", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 3.6.0)" + ], + "SystemRequirements": "GNU make", + "LinkingTo": [ + "Rcpp (>= 0.12.18.3)", + "RcppParallel (>= 5.1.4)" + ], + "Imports": [ + "Rcpp", + "RcppParallel" + ], + "Suggests": [ + "qs2", + "knitr", + "rmarkdown", + "usethis", + "dplyr", + "stringr", + "rlang" + ], + "VignetteBuilder": "knitr", + "RoxygenNote": "7.3.3", + "Copyright": "Copyright for the bundled 'PCRE2' library is held by University of Cambridge, Zoltan Herczeg and Tilera Coporation (Stack-less Just-In-Time compiler); Copyright for the bundled 'xxHash' code is held by Yann Collet.", + "URL": "https://github.com/traversc/stringfish", + "BugReports": "https://github.com/traversc/stringfish/issues", + "NeedsCompilation": "yes", + "Author": "Travers Ching [aut, cre, cph], Phillip Hazel [ctb] (Bundled PCRE2 code), Zoltan Herczeg [ctb, cph] (Bundled PCRE2 code), University of Cambridge [cph] (Bundled PCRE2 code), Tilera Corporation [cph] (Stack-less Just-In-Time compiler bundled with PCRE2), Yann Collet [ctb, cph] (Yann Collet is the author of the bundled xxHash code)", + "Repository": "CRAN" + }, + "stringi": { + "Package": "stringi", + "Version": "1.8.7", + "Source": "Repository", + "Date": "2025-03-27", + "Title": "Fast and Portable Character String Processing Facilities", + "Description": "A collection of character string/text/natural language processing tools for pattern searching (e.g., with 'Java'-like regular expressions or the 'Unicode' collation algorithm), random string generation, case mapping, string transliteration, concatenation, sorting, padding, wrapping, Unicode normalisation, date-time formatting and parsing, and many more. They are fast, consistent, convenient, and - thanks to 'ICU' (International Components for Unicode) - portable across all locales and platforms. Documentation about 'stringi' is provided via its website at and the paper by Gagolewski (2022, ).", + "URL": "https://stringi.gagolewski.com/, https://github.com/gagolews/stringi, https://icu.unicode.org/", + "BugReports": "https://github.com/gagolews/stringi/issues", + "SystemRequirements": "ICU4C (>= 61, optional)", + "Type": "Package", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "tools", + "utils", + "stats" + ], + "Biarch": "TRUE", + "License": "file LICENSE", + "Authors@R": "c(person(given = \"Marek\", family = \"Gagolewski\", role = c(\"aut\", \"cre\", \"cph\"), email = \"marek@gagolewski.com\", comment = c(ORCID = \"0000-0003-0637-6028\")), person(given = \"Bartek\", family = \"Tartanus\", role = \"ctb\"), person(\"Unicode, Inc. and others\", role=\"ctb\", comment = \"ICU4C source code, Unicode Character Database\") )", + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Marek Gagolewski [aut, cre, cph] (), Bartek Tartanus [ctb], Unicode, Inc. and others [ctb] (ICU4C source code, Unicode Character Database)", + "Maintainer": "Marek Gagolewski ", + "License_is_FOSS": "yes", + "Repository": "CRAN" + }, + "stringr": { + "Package": "stringr", + "Version": "1.6.0", + "Source": "Repository", + "Title": "Simple, Consistent Wrappers for Common String Operations", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\", \"cph\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A consistent, simple and easy to use set of wrappers around the fantastic 'stringi' package. All function and argument names (and positions) are consistent, all functions deal with \"NA\"'s and zero length vectors in the same way, and the output from one function is easy to feed into the input of another.", + "License": "MIT + file LICENSE", + "URL": "https://stringr.tidyverse.org, https://github.com/tidyverse/stringr", + "BugReports": "https://github.com/tidyverse/stringr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli", + "glue (>= 1.6.1)", + "lifecycle (>= 1.0.3)", + "magrittr", + "rlang (>= 1.0.0)", + "stringi (>= 1.5.3)", + "vctrs (>= 0.4.0)" + ], + "Suggests": [ + "covr", + "dplyr", + "gt", + "htmltools", + "htmlwidgets", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/potools/style": "explicit", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre, cph], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "svglite": { + "Package": "svglite", + "Version": "2.2.2", + "Source": "Repository", + "Title": "An 'SVG' Graphics Device", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"T Jake\", \"Luciani\", , \"jake@apache.org\", role = \"aut\"), person(\"Matthieu\", \"Decorde\", , \"matthieu.decorde@ens-lyon.fr\", role = \"aut\"), person(\"Vaudor\", \"Lise\", , \"lise.vaudor@ens-lyon.fr\", role = \"aut\"), person(\"Tony\", \"Plate\", role = \"ctb\", comment = \"Early line dashing code\"), person(\"David\", \"Gohel\", role = \"ctb\", comment = \"Line dashing code and early raster code\"), person(\"Yixuan\", \"Qiu\", role = \"ctb\", comment = \"Improved styles; polypath implementation\"), person(\"Håkon\", \"Malmedal\", role = \"ctb\", comment = \"Opacity code\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A graphics device for R that produces 'Scalable Vector Graphics'. 'svglite' is a fork of the older 'RSvgDevice' package.", + "License": "GPL (>= 2)", + "URL": "https://svglite.r-lib.org, https://github.com/r-lib/svglite", + "BugReports": "https://github.com/r-lib/svglite/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "base64enc", + "cli", + "lifecycle", + "rlang (>= 1.1.0)", + "systemfonts (>= 1.3.0)", + "textshaping (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "fontquiver (>= 0.2.0)", + "htmltools", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)", + "xml2 (>= 1.0.0)" + ], + "LinkingTo": [ + "cpp11", + "systemfonts", + "textshaping" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-25", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "libpng", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Lionel Henry [aut], Thomas Lin Pedersen [cre, aut] (ORCID: ), T Jake Luciani [aut], Matthieu Decorde [aut], Vaudor Lise [aut], Tony Plate [ctb] (Early line dashing code), David Gohel [ctb] (Line dashing code and early raster code), Yixuan Qiu [ctb] (Improved styles; polypath implementation), Håkon Malmedal [ctb] (Opacity code), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "sys": { + "Package": "sys", + "Version": "3.4.3", + "Source": "Repository", + "Type": "Package", + "Title": "Powerful and Reliable Tools for Running System Commands in R", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"ctb\"))", + "Description": "Drop-in replacements for the base system2() function with fine control and consistent behavior across platforms. Supports clean interruption, timeout, background tasks, and streaming STDIN / STDOUT / STDERR over binary or text connections. Arguments on Windows automatically get encoded and quoted to work on different locales.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/sys", + "BugReports": "https://github.com/jeroen/sys/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "Suggests": [ + "unix (>= 1.4)", + "spelling", + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Gábor Csárdi [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" + }, + "systemfonts": { + "Package": "systemfonts", + "Version": "1.3.1", + "Source": "Repository", + "Type": "Package", + "Title": "System Native Font Finding", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Jeroen\", \"Ooms\", , \"jeroen@berkeley.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Devon\", \"Govett\", role = \"aut\", comment = \"Author of font-manager\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides system native access to the font catalogue. As font handling varies between systems it is difficult to correctly locate installed fonts across different operating systems. The 'systemfonts' package provides bindings to the native libraries on Windows, macOS and Linux for finding font files that can then be used further by e.g. graphic devices. The main use is intended to be from compiled code but 'systemfonts' also provides access from R.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/systemfonts, https://systemfonts.r-lib.org", + "BugReports": "https://github.com/r-lib/systemfonts/issues", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "base64enc", + "grid", + "jsonlite", + "lifecycle", + "tools", + "utils" + ], + "Suggests": [ + "covr", + "farver", + "ggplot2", + "graphics", + "knitr", + "ragg", + "rmarkdown", + "svglite", + "testthat (>= 2.1.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.1)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "fontconfig, freetype2", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [aut, cre] (ORCID: ), Jeroen Ooms [aut] (ORCID: ), Devon Govett [aut] (Author of font-manager), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "tarchetypes": { + "Package": "tarchetypes", "Version": "0.14.0", "Source": "Repository", + "Title": "Archetypes for Targets", + "Description": "Function-oriented Make-like declarative pipelines for Statistics and data science are supported in the 'targets' R package. As an extension to 'targets', the 'tarchetypes' package provides convenient user-side functions to make 'targets' easier to use. By establishing reusable archetypes for common kinds of targets and pipelines, these functions help express complicated reproducible pipelines concisely and compactly. The methods in this package were influenced by the 'targets' R package. by Will Landau (2018) .", + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/tarchetypes/, https://github.com/ropensci/tarchetypes", + "BugReports": "https://github.com/ropensci/tarchetypes/issues", + "Authors@R": "c( person( given = c(\"William\", \"Michael\"), family = \"Landau\", role = c(\"aut\", \"cre\"), email = \"will.landau.oss@gmail.com\", comment = c(ORCID = \"0000-0003-1878-3253\") ), person( given = \"Rudolf\", family = \"Siegel\", role = \"ctb\", comment = c(ORCID = \"0000-0002-6021-804X\") ), person( given = \"Samantha\", family = \"Oliver\", role = \"rev\", comment = c(ORCID = \"0000-0001-5668-1165\") ), person( given = \"Tristan\", family = \"Mahr\", role = \"rev\", comment = c(ORCID = \"0000-0002-8890-5116\") ), person( family = \"Eli Lilly and Company\", role = c(\"cph\", \"fnd\") ))", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "dplyr (>= 1.0.0)", + "fs (>= 1.4.2)", + "parallel", + "rlang (>= 0.4.7)", + "secretbase (>= 0.4.0)", + "targets (>= 1.6.0)", + "tibble (>= 3.0.1)", + "tidyselect (>= 1.1.0)", + "utils", + "vctrs (>= 0.3.4)", + "withr (>= 2.1.2)" + ], + "Suggests": [ + "curl (>= 4.3)", + "knitr (>= 1.28)", + "nanoparquet", + "parsermd", + "quarto (>= 1.4)", + "rmarkdown (>= 2.1)", + "testthat (>= 3.0.0)", + "xml2 (>= 1.3.2)" + ], + "Encoding": "UTF-8", + "Language": "en-US", + "Config/testthat/edition": "3", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "William Michael Landau [aut, cre] (ORCID: ), Rudolf Siegel [ctb] (ORCID: ), Samantha Oliver [rev] (ORCID: ), Tristan Mahr [rev] (ORCID: ), Eli Lilly and Company [cph, fnd]", + "Maintainer": "William Michael Landau ", + "Repository": "CRAN" + }, + "targets": { + "Package": "targets", + "Version": "1.12.0", + "Source": "Repository", + "Title": "Dynamic Function-Oriented 'Make'-Like Declarative Pipelines", + "Description": "Pipeline tools coordinate the pieces of computationally demanding analysis projects. The 'targets' package is a 'Make'-like pipeline tool for statistics and data science in R. The package skips costly runtime for tasks that are already up to date, orchestrates the necessary computation with implicit parallel computing, and abstracts files as R objects. If all the current output matches the current upstream code and data, then the whole pipeline is up to date, and the results are more trustworthy than otherwise. The methodology in this package borrows from GNU 'Make' (2015, ISBN:978-9881443519) and 'drake' (2018, ).", + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/targets/, https://github.com/ropensci/targets", + "BugReports": "https://github.com/ropensci/targets/issues", + "Authors@R": "c( person( given = c(\"William\", \"Michael\"), family = \"Landau\", role = c(\"aut\", \"cre\"), email = \"will.landau.oss@gmail.com\", comment = c(ORCID = \"0000-0003-1878-3253\") ), person( given = c(\"Matthew\", \"T.\"), family = \"Warkentin\", role = \"ctb\" ), person( given = \"Mark\", family = \"Edmondson\", email = \"r@sunholo.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8434-3881\") ), person( given = \"Samantha\", family = \"Oliver\", role = \"rev\", comment = c(ORCID = \"0000-0001-5668-1165\") ), person( given = \"Tristan\", family = \"Mahr\", role = \"rev\", comment = c(ORCID = \"0000-0002-8890-5116\") ), person( family = \"Eli Lilly and Company\", role = c(\"cph\", \"fnd\") ))", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "base64url (>= 1.4)", + "callr (>= 3.7.0)", + "cli (>= 2.0.2)", + "codetools (>= 0.2.16)", + "data.table (>= 1.16.0)", + "igraph (>= 2.0.0)", + "knitr (>= 1.34)", + "prettyunits (>= 1.1.0)", + "ps (>= 1.8.0)", + "R6 (>= 2.4.1)", + "rlang (>= 1.0.0)", + "secretbase (>= 0.5.0)", + "stats", + "tibble (>= 3.0.1)", + "tidyselect (>= 1.1.0)", + "tools", + "utils", + "vctrs (>= 0.2.4)", + "yaml (>= 2.2.1)" + ], + "Suggests": [ + "autometric (>= 0.1.0)", + "bslib", + "clustermq (>= 0.9.2)", + "crew (>= 0.9.0)", + "curl (>= 4.3)", + "DT (>= 0.14)", + "dplyr (>= 1.0.0)", + "fst (>= 0.9.2)", + "future (>= 1.19.1)", + "future.batchtools (>= 0.9.0)", + "future.callr (>= 0.6.0)", + "gargle (>= 1.2.0)", + "googleCloudStorageR (>= 0.7.0)", + "gt (>= 0.2.2)", + "keras (>= 2.2.5.0)", + "markdown (>= 1.1)", + "nanonext (>= 0.12.0)", + "rmarkdown (>= 2.4)", + "parallelly (>= 1.35.0)", + "paws.common (>= 0.6.4)", + "paws.storage (>= 0.4.0)", + "pkgload (>= 1.1.0)", + "processx (>= 3.4.3)", + "qs2", + "reprex (>= 2.0.0)", + "rstudioapi (>= 0.11)", + "R.utils (>= 2.6.0)", + "shiny (>= 1.5.0)", + "shinybusy (>= 0.2.2)", + "shinyWidgets (>= 0.5.4)", + "tarchetypes", + "testthat (>= 3.0.0)", + "torch (>= 0.1.0)", + "usethis (>= 1.6.3)", + "visNetwork (>= 2.1.2)" + ], + "Encoding": "UTF-8", + "Language": "en-US", + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "William Michael Landau [aut, cre] (ORCID: ), Matthew T. Warkentin [ctb], Mark Edmondson [ctb] (ORCID: ), Samantha Oliver [rev] (ORCID: ), Tristan Mahr [rev] (ORCID: ), Eli Lilly and Company [cph, fnd]", + "Maintainer": "William Michael Landau ", + "Repository": "CRAN" + }, + "terra": { + "Package": "terra", + "Version": "1.8-93", + "Source": "Repository", + "Type": "Package", + "Title": "Spatial Data Analysis", + "Date": "2026-01-11", + "Depends": [ + "R (>= 3.5.0)", + "methods" + ], + "Suggests": [ + "parallel", + "tinytest", + "ncdf4", + "sf (>= 0.9-8)", + "deldir", + "XML", + "leaflet (>= 2.2.1)", + "htmlwidgets" + ], + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ + "Rcpp (>= 1.0-10)" + ], + "SystemRequirements": "C++17, GDAL (>= 2.2.3), GEOS (>= 3.4.0), PROJ (>= 4.9.3), TBB, sqlite3", + "Encoding": "UTF-8", + "Language": "en-US", + "Maintainer": "Robert J. Hijmans ", + "Description": "Methods for spatial data analysis with vector (points, lines, polygons) and raster (grid) data. Methods for vector data include geometric operations such as intersect and buffer. Raster methods include local, focal, global, zonal and geometric operations. The predict and interpolate methods facilitate the use of regression type (interpolation, machine learning) models for spatial prediction, including with satellite remote sensing data. Processing of very large files is supported. See the manual and tutorials on to get started.", + "License": "GPL (>= 3)", + "URL": "https://rspatial.org/, https://rspatial.github.io/terra/", + "BugReports": "https://github.com/rspatial/terra/issues", + "LazyLoad": "yes", + "Authors@R": "c( person(\"Robert J.\", \"Hijmans\", role=c(\"cre\", \"aut\"), email=\"r.hijmans@gmail.com\", comment=c(ORCID=\"0000-0001-5872-2872\")),\t\t\t person(\"Márcia\", \"Barbosa\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8972-7713\")), person(\"Roger\", \"Bivand\", role=\"ctb\", comment=c(ORCID=\"0000-0003-2392-6140\")), person(\"Andrew\", \"Brown\", role=\"ctb\", comment=c(ORCID=\"0000-0002-4565-533X\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment=c(ORCID=\"0000-0003-0787-087X\")), person(\"Emanuele\", \"Cordano\", role=\"ctb\",comment=c(ORCID=\"0000-0002-3508-5898\")), person(\"Krzysztof\", \"Dyba\", role=\"ctb\", comment=c(ORCID=\"0000-0002-8614-3816\")), person(\"Edzer\", \"Pebesma\", role=\"ctb\", comment=c(ORCID=\"0000-0001-8049-7069\")), person(\"Barry\", \"Rowlingson\", role=\"ctb\", comment=c(ORCID=\"0000-0002-8586-6625\")), person(\"Michael D.\", \"Sumner\", role=\"ctb\", comment=c(ORCID=\"0000-0002-2471-7511\")))", + "NeedsCompilation": "yes", + "Author": "Robert J. Hijmans [cre, aut] (ORCID: ), Márcia Barbosa [ctb] (ORCID: ), Roger Bivand [ctb] (ORCID: ), Andrew Brown [ctb] (ORCID: ), Michael Chirico [ctb] (ORCID: ), Emanuele Cordano [ctb] (ORCID: ), Krzysztof Dyba [ctb] (ORCID: ), Edzer Pebesma [ctb] (ORCID: ), Barry Rowlingson [ctb] (ORCID: ), Michael D. Sumner [ctb] (ORCID: )", + "Repository": "CRAN" + }, + "testthat": { + "Package": "testthat", + "Version": "3.3.2", + "Source": "Repository", + "Title": "Unit Testing for R", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Core team\", role = \"ctb\", comment = \"Implementation of utils::recover()\") )", + "Description": "Software testing is important, but, in part because it is frustrating and boring, many of us avoid it. 'testthat' is a testing framework for R that is easy to learn and use, and integrates with your existing 'workflow'.", + "License": "MIT + file LICENSE", + "URL": "https://testthat.r-lib.org, https://github.com/r-lib/testthat", + "BugReports": "https://github.com/r-lib/testthat/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "brio (>= 1.1.5)", + "callr (>= 3.7.6)", + "cli (>= 3.6.5)", + "desc (>= 1.4.3)", + "evaluate (>= 1.0.4)", + "jsonlite (>= 2.0.0)", + "lifecycle (>= 1.0.4)", + "magrittr (>= 2.0.3)", + "methods", + "pkgload (>= 1.4.0)", + "praise (>= 1.0.0)", + "processx (>= 3.8.6)", + "ps (>= 1.9.1)", + "R6 (>= 2.6.1)", + "rlang (>= 1.1.6)", + "utils", + "waldo (>= 0.6.2)", + "withr (>= 3.0.2)" + ], + "Suggests": [ + "covr", + "curl (>= 0.9.5)", + "diffviewer (>= 0.1.0)", + "digest (>= 0.6.33)", + "gh", + "knitr", + "otel", + "otelsdk", + "rmarkdown", + "rstudioapi", + "S7", + "shiny", + "usethis", + "vctrs (>= 0.1.0)", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "watcher, parallel*", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], R Core team [ctb] (Implementation of utils::recover())", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "textshaping": { + "Package": "textshaping", + "Version": "1.0.4", + "Source": "Repository", + "Title": "Bindings to the 'HarfBuzz' and 'Fribidi' Libraries for Text Shaping", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides access to the text shaping functionality in the 'HarfBuzz' library and the bidirectional algorithm in the 'Fribidi' library. 'textshaping' is a low-level utility package mainly for graphic devices that expands upon the font tool-set provided by the 'systemfonts' package.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/textshaping", + "BugReports": "https://github.com/r-lib/textshaping/issues", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "lifecycle", + "stats", + "stringi", + "systemfonts (>= 1.3.0)", + "utils" + ], + "Suggests": [ + "covr", + "grDevices", + "grid", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.1)", + "systemfonts (>= 1.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-04-23", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "freetype2, harfbuzz, fribidi", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Thomas Lin Pedersen ", + "Repository": "CRAN" + }, + "tibble": { + "Package": "tibble", + "Version": "3.3.1", + "Source": "Repository", + "Title": "Simple Data Frames", + "Authors@R": "c( person(\"Kirill\", \"Müller\", , \"kirill@cynkra.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-1416-3412\")), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Romain\", \"Francois\", , \"romain@r-enthusiasts.com\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", , \"jenny@rstudio.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Provides a 'tbl_df' class (the 'tibble') with stricter checking and better formatting than the traditional data frame.", + "License": "MIT + file LICENSE", + "URL": "https://tibble.tidyverse.org/, https://github.com/tidyverse/tibble", + "BugReports": "https://github.com/tidyverse/tibble/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "cli", + "lifecycle (>= 1.0.0)", + "magrittr", + "methods", + "pillar (>= 1.8.1)", + "pkgconfig", + "rlang (>= 1.0.2)", + "utils", + "vctrs (>= 0.5.0)" + ], + "Suggests": [ + "bench", + "bit64", + "blob", + "brio", + "callr", + "DiagrammeR", + "dplyr", + "evaluate", + "formattable", + "ggplot2", + "here", + "hms", + "htmltools", + "knitr", + "lubridate", + "nycflights13", + "pkgload", + "purrr", + "rmarkdown", + "stringi", + "testthat (>= 3.0.2)", + "tidyr", + "withr" + ], + "VignetteBuilder": "knitr", + "Config/autostyle/rmd": "false", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "vignette-formats, as_tibble, add, invariants", + "Config/usethis/last-upkeep": "2025-06-07", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3.9000", + "NeedsCompilation": "yes", + "Author": "Kirill Müller [aut, cre] (ORCID: ), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "tidyr": { + "Package": "tidyr", + "Version": "1.3.2", + "Source": "Repository", + "Title": "Tidy Messy Data", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = \"aut\"), person(\"Maximilian\", \"Girlich\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to help to create tidy data, where each column is a variable, each row is an observation, and each cell contains a single value. 'tidyr' contains tools for changing the shape (pivoting) and hierarchy (nesting and 'unnesting') of a dataset, turning deeply nested lists into rectangular data frames ('rectangling'), and extracting values out of string columns. It also includes tools for working with missing values (both implicit and explicit).", + "License": "MIT + file LICENSE", + "URL": "https://tidyr.tidyverse.org, https://github.com/tidyverse/tidyr", + "BugReports": "https://github.com/tidyverse/tidyr/issues", + "Depends": [ + "R (>= 4.1.0)" + ], + "Imports": [ + "cli (>= 3.4.1)", + "dplyr (>= 1.1.0)", + "glue", + "lifecycle (>= 1.0.3)", + "magrittr", + "purrr (>= 1.0.1)", + "rlang (>= 1.1.1)", + "stringr (>= 1.5.0)", + "tibble (>= 2.1.1)", + "tidyselect (>= 1.2.1)", + "utils", + "vctrs (>= 0.5.2)" + ], + "Suggests": [ + "covr", + "data.table", + "knitr", + "readr", + "repurrrsive (>= 1.1.0)", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.4.0)" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Davis Vaughan [aut], Maximilian Girlich [aut], Kevin Ushey [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "tidyselect": { + "Package": "tidyselect", + "Version": "1.2.1", + "Source": "Repository", + "Title": "Select from a Set of Strings", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A backend for the selecting functions of the 'tidyverse'. It makes it easy to implement select-like functions in your own packages in a way that is consistent with other 'tidyverse' interfaces for selection.", + "License": "MIT + file LICENSE", + "URL": "https://tidyselect.r-lib.org, https://github.com/r-lib/tidyselect", + "BugReports": "https://github.com/r-lib/tidyselect/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "cli (>= 3.3.0)", + "glue (>= 1.3.0)", + "lifecycle (>= 1.0.3)", + "rlang (>= 1.0.4)", + "vctrs (>= 0.5.2)", + "withr" + ], + "Suggests": [ + "covr", + "crayon", + "dplyr", + "knitr", + "magrittr", + "rmarkdown", + "stringr", + "testthat (>= 3.1.1)", + "tibble (>= 2.1.3)" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.0.9000", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" + }, + "tidyverse": { + "Package": "tidyverse", + "Version": "2.0.0", + "Source": "Repository", + "Title": "Easily Install and Load the 'Tidyverse'", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "The 'tidyverse' is a set of packages that work in harmony because they share common data representations and 'API' design. This package is designed to make it easy to install and load multiple 'tidyverse' packages in a single step. Learn more about the 'tidyverse' at .", + "License": "MIT + file LICENSE", + "URL": "https://tidyverse.tidyverse.org, https://github.com/tidyverse/tidyverse", + "BugReports": "https://github.com/tidyverse/tidyverse/issues", + "Depends": [ + "R (>= 3.3)" + ], + "Imports": [ + "broom (>= 1.0.3)", + "conflicted (>= 1.2.0)", + "cli (>= 3.6.0)", + "dbplyr (>= 2.3.0)", + "dplyr (>= 1.1.0)", + "dtplyr (>= 1.2.2)", + "forcats (>= 1.0.0)", + "ggplot2 (>= 3.4.1)", + "googledrive (>= 2.0.0)", + "googlesheets4 (>= 1.0.1)", + "haven (>= 2.5.1)", + "hms (>= 1.1.2)", + "httr (>= 1.4.4)", + "jsonlite (>= 1.8.4)", + "lubridate (>= 1.9.2)", + "magrittr (>= 2.0.3)", + "modelr (>= 0.1.10)", + "pillar (>= 1.8.1)", + "purrr (>= 1.0.1)", + "ragg (>= 1.2.5)", + "readr (>= 2.1.4)", + "readxl (>= 1.4.2)", + "reprex (>= 2.0.2)", + "rlang (>= 1.0.6)", + "rstudioapi (>= 0.14)", + "rvest (>= 1.0.3)", + "stringr (>= 1.5.0)", + "tibble (>= 3.1.8)", + "tidyr (>= 1.3.0)", + "xml2 (>= 1.3.3)" + ], + "Suggests": [ + "covr (>= 3.6.1)", + "feather (>= 0.3.5)", + "glue (>= 1.6.2)", + "mockr (>= 0.2.0)", + "knitr (>= 1.41)", + "rmarkdown (>= 2.20)", + "testthat (>= 3.1.6)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "timechange": { + "Package": "timechange", + "Version": "0.4.0", + "Source": "Repository", + "Title": "Efficient Manipulation of Date-Times", + "Authors@R": "c(person(\"Vitalie\", \"Spinu\", email = \"spinuvit@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Google Inc.\", role = c(\"ctb\", \"cph\")))", + "Description": "Efficient routines for manipulation of date-time objects while accounting for time-zones and daylight saving times. The package includes utilities for updating of date-time components (year, month, day etc.), modification of time-zones, rounding of date-times, period addition and subtraction etc. Parts of the 'CCTZ' source code, released under the Apache 2.0 License, are included in this package. See for more details.", + "Depends": [ + "R (>= 3.3)" + ], + "License": "GPL (>= 3)", + "Encoding": "UTF-8", + "LinkingTo": [ + "cpp11 (>= 0.2.7)" + ], + "Suggests": [ + "testthat (>= 0.7.1.99)", + "knitr" + ], + "SystemRequirements": "A system with zoneinfo data (e.g. /usr/share/zoneinfo). On Windows the zoneinfo included with R is used.", + "BugReports": "https://github.com/vspinu/timechange/issues", + "URL": "https://github.com/vspinu/timechange/", + "RoxygenNote": "7.2.1", + "NeedsCompilation": "yes", + "Author": "Vitalie Spinu [aut, cre], Google Inc. [ctb, cph]", + "Maintainer": "Vitalie Spinu ", + "Repository": "CRAN" + }, + "tinytex": { + "Package": "tinytex", + "Version": "0.58", + "Source": "Repository", + "Type": "Package", + "Title": "Helper Functions to Install and Maintain TeX Live, and Compile LaTeX Documents", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Devon\", \"Ryan\", role = \"ctb\", email = \"dpryan79@gmail.com\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Ethan\", \"Heinzen\", role = \"ctb\"), person(\"Fernando\", \"Cagua\", role = \"ctb\"), person() )", + "Description": "Helper functions to install and maintain the 'LaTeX' distribution named 'TinyTeX' (), a lightweight, cross-platform, portable, and easy-to-maintain version of 'TeX Live'. This package also contains helper functions to compile 'LaTeX' documents, and install missing 'LaTeX' packages automatically.", + "Imports": [ + "xfun (>= 0.48)" + ], + "Suggests": [ + "testit", + "rstudioapi" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/tinytex", + "BugReports": "https://github.com/rstudio/tinytex/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: ), Posit Software, PBC [cph, fnd], Christophe Dervieux [ctb] (ORCID: ), Devon Ryan [ctb] (ORCID: ), Ethan Heinzen [ctb], Fernando Cagua [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" + }, + "triebeard": { + "Package": "triebeard", + "Version": "0.4.1", + "Source": "Repository", + "Type": "Package", + "Title": "'Radix' Trees in 'Rcpp'", + "Author": "Os Keyes [aut, cre], Drew Schmidt [aut], Yuuki Takano [cph]", + "Maintainer": "Os Keyes ", + "Description": "'Radix trees', or 'tries', are key-value data structures optimised for efficient lookups, similar in purpose to hash tables. 'triebeard' provides an implementation of 'radix trees' for use in R programming and in developing packages with 'Rcpp'.", + "License": "MIT + file LICENSE", + "LinkingTo": [ + "Rcpp" + ], + "Encoding": "UTF-8", + "Imports": [ + "Rcpp" + ], + "RoxygenNote": "7.1.2", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "URL": "https://github.com/Ironholds/triebeard/", + "BugReports": "https://github.com/Ironholds/triebeard/issues", + "Date": "2023-03-04", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "tzdb": { + "Package": "tzdb", + "Version": "0.5.0", + "Source": "Repository", + "Title": "Time Zone Database Information", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"Howard\", \"Hinnant\", role = \"cph\", comment = \"Author of the included date library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides an up-to-date copy of the Internet Assigned Numbers Authority (IANA) Time Zone Database. It is updated periodically to reflect changes made by political bodies to time zone boundaries, UTC offsets, and daylight saving time rules. Additionally, this package provides a C++ interface for working with the 'date' library. 'date' provides comprehensive support for working with dates and date-times, which this package exposes to make it easier for other R packages to utilize. Headers are provided for calendar specific calculations, along with a limited interface for time zone manipulations.", + "License": "MIT + file LICENSE", + "URL": "https://tzdb.r-lib.org, https://github.com/r-lib/tzdb", + "BugReports": "https://github.com/r-lib/tzdb/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.5.2)" + ], + "Biarch": "yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Davis Vaughan [aut, cre], Howard Hinnant [cph] (Author of the included date library), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "CRAN" + }, + "units": { + "Package": "units", + "Version": "1.0-0", + "Source": "Repository", + "Title": "Measurement Units for R Vectors", + "Authors@R": "c(person(\"Edzer\", \"Pebesma\", role = c(\"aut\", \"cre\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(\"Thomas\", \"Mailund\", role = \"aut\", email = \"mailund@birc.au.dk\"), person(\"Tomasz\", \"Kalinowski\", role = \"aut\"), person(\"James\", \"Hiebert\", role = \"ctb\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", email = \"iucar@fedoraproject.org\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Thomas Lin\", \"Pedersen\", role = \"ctb\") )", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "Rcpp" + ], + "LinkingTo": [ + "Rcpp (>= 0.12.10)" + ], + "Suggests": [ + "NISTunits", + "measurements", + "xml2", + "magrittr", + "pillar (>= 1.3.0)", + "dplyr (>= 1.0.0)", + "vctrs (>= 0.3.1)", + "ggplot2 (> 3.2.1)", + "testthat (>= 3.0.0)", + "vdiffr", + "knitr", + "rvest", + "rmarkdown" + ], + "VignetteBuilder": "knitr", + "Description": "Support for measurement units in R vectors, matrices and arrays: automatic propagation, conversion, derivation and simplification of units; raising errors in case of unit incompatibility. Compatible with the POSIXct, Date and difftime classes. Uses the UNIDATA udunits library and unit database for unit compatibility checking and conversion. Documentation about 'units' is provided in the paper by Pebesma, Mailund & Hiebert (2016, ), included in this package as a vignette; see 'citation(\"units\")' for details.", + "SystemRequirements": "udunits-2", + "License": "GPL-2", + "URL": "https://r-quantities.github.io/units/, https://github.com/r-quantities/units", + "BugReports": "https://github.com/r-quantities/units/issues", + "RoxygenNote": "7.3.3", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Edzer Pebesma [aut, cre] (ORCID: ), Thomas Mailund [aut], Tomasz Kalinowski [aut], James Hiebert [ctb], Iñaki Ucar [aut] (ORCID: ), Thomas Lin Pedersen [ctb]", + "Maintainer": "Edzer Pebesma ", + "Repository": "CRAN" + }, + "urlchecker": { + "Package": "urlchecker", + "Version": "1.0.1", + "Source": "Repository", + "Title": "Run CRAN URL Checks from Older R Versions", + "Authors@R": "c( person(\"R Core team\", role = \"aut\", comment = \"The code in urltools.R adapted from the tools package\"), person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provide the URL checking tools available in R 4.1+ as a package for earlier versions of R. Also uses concurrent requests so can be much faster than the serial versions.", + "License": "GPL-3", + "URL": "https://github.com/r-lib/urlchecker", + "BugReports": "https://github.com/r-lib/urlchecker/issues", + "Depends": [ + "R (>= 3.3)" + ], + "Imports": [ + "cli", + "curl", + "tools", + "xml2" + ], + "Suggests": [ + "covr" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "no", + "Author": "R Core team [aut] (The code in urltools.R adapted from the tools package), Jim Hester [aut] (), Gábor Csárdi [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "urltools": { + "Package": "urltools", + "Version": "1.7.3.1", + "Source": "Repository", + "Type": "Package", + "Title": "Vectorised Tools for URL Handling and Parsing", + "Date": "2019-04-14", + "Authors@R": "c(person(given = \"Os\", family = \"Keyes\", role = c(\"aut\", \"cre\"), email = \"ironholds@gmail.com\"), person(given = \"Jay\", family = \"Jacobs\", role = \"aut\"), person(given = \"Drew\", family = \"Schmidt\", role = \"aut\"), person(given = \"Mark\", family = \"Greenaway\", role = \"ctb\"), person(given = \"Bob\", family = \"Rudis\", role = \"ctb\"), person(given = \"Alex\", family = \"Pinto\", role = \"ctb\"), person(given = \"Maryam\", family = \"Khezrzadeh\", role = \"ctb\"), person(given = \"Peter\", family = \"Meilstrup\", role = \"ctb\"), person(given = c(\"Adam\", \"M.\"), family = \"Costello\", role = \"cph\"), person(given = \"Jeff\", family = \"Bezanson\", role = \"cph\"), person(given = \"Peter\", family = \"Meilstrup\", role = \"ctb\"), person(given = \"Xueyuan\", family = \"Jiang\", role = \"ctb\"))", + "Description": "A toolkit for all URL-handling needs, including encoding and decoding, parsing, parameter extraction and modification. All functions are designed to be both fast and entirely vectorised. It is intended to be useful for people dealing with web-related datasets, such as server-side logs, although may be useful for other situations involving large sets of URLs.", + "License": "MIT + file LICENSE", + "LazyData": "TRUE", + "LinkingTo": [ + "Rcpp" + ], + "Imports": [ + "Rcpp", + "methods", + "triebeard" + ], + "Suggests": [ + "testthat", + "knitr" + ], + "URL": "https://github.com/Ironholds/urltools/", + "BugReports": "https://github.com/Ironholds/urltools/issues", + "VignetteBuilder": "knitr", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 2.10)" + ], + "NeedsCompilation": "yes", + "Repository": "CRAN", + "Author": "Os Keyes [aut, cre], Jay Jacobs [aut], Drew Schmidt [aut], Mark Greenaway [ctb], Bob Rudis [ctb], Alex Pinto [ctb], Maryam Khezrzadeh [ctb], Peter Meilstrup [ctb], Adam M. Costello [cph], Jeff Bezanson [cph], Peter Meilstrup [ctb], Xueyuan Jiang [ctb]", + "Maintainer": "Os Keyes " + }, + "usethis": { + "Package": "usethis", + "Version": "3.2.1", + "Source": "Repository", + "Title": "Automate Package and Project Setup", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Malcolm\", \"Barrett\", , \"malcolmbarrett@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Andy\", \"Teucher\", , \"andy.teucher@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7840-692X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Automate package and project setup tasks that are otherwise performed manually. This includes setting up unit testing, test coverage, continuous integration, Git, 'GitHub', licenses, 'Rcpp', 'RStudio' projects, and more.", + "License": "MIT + file LICENSE", + "URL": "https://usethis.r-lib.org, https://github.com/r-lib/usethis", + "BugReports": "https://github.com/r-lib/usethis/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "cli (>= 3.0.1)", + "clipr (>= 0.3.0)", + "crayon", + "curl (>= 2.7)", + "desc (>= 1.4.2)", + "fs (>= 1.3.0)", + "gert (>= 1.4.1)", + "gh (>= 1.2.1)", + "glue (>= 1.3.0)", + "jsonlite", + "lifecycle (>= 1.0.0)", + "purrr", + "rappdirs", + "rlang (>= 1.1.0)", + "rprojroot (>= 2.1.1)", + "rstudioapi", + "stats", + "tools", + "utils", + "whisker", + "withr (>= 2.3.0)", + "yaml" + ], + "Suggests": [ + "covr", + "knitr", + "magick", + "pkgload (>= 1.3.2.1)", + "quarto (>= 1.5.1)", + "rmarkdown", + "roxygen2 (>= 7.1.2)", + "spelling (>= 1.2)", + "testthat (>= 3.1.8)" + ], + "Config/Needs/website": "r-lib/asciicast, tidyverse/tidytemplate, xml2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "github-actions, release", + "Config/usethis/last-upkeep": "2025-04-22", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Malcolm Barrett [aut] (ORCID: ), Andy Teucher [aut] (ORCID: ), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "utf8": { + "Package": "utf8", + "Version": "1.2.6", + "Source": "Repository", + "Title": "Unicode Text Processing", + "Authors@R": "c(person(given = c(\"Patrick\", \"O.\"), family = \"Perry\", role = c(\"aut\", \"cph\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"cre\", email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database\"))", + "Description": "Process and print 'UTF-8' encoded international text (Unicode). Input, validate, normalize, encode, format, and display.", + "License": "Apache License (== 2.0) | file LICENSE", + "URL": "https://krlmlr.github.io/utf8/, https://github.com/krlmlr/utf8", + "BugReports": "https://github.com/krlmlr/utf8/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "cli", + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" + ], + "VignetteBuilder": "knitr, rmarkdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "Patrick O. Perry [aut, cph], Kirill Müller [cre] (ORCID: ), Unicode, Inc. [cph, dtc] (Unicode Character Database)", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" + }, + "uuid": { + "Package": "uuid", + "Version": "1.2-2", + "Source": "Repository", + "Title": "Tools for Generating and Handling of UUIDs", + "Author": "Simon Urbanek [aut, cre, cph] (https://urbanek.org, ORCID: ), Theodore Ts'o [aut, cph] (libuuid)", + "Maintainer": "Simon Urbanek ", + "Authors@R": "c(person(\"Simon\", \"Urbanek\", role=c(\"aut\",\"cre\",\"cph\"), email=\"Simon.Urbanek@r-project.org\", comment=c(\"https://urbanek.org\", ORCID=\"0000-0003-2297-1732\")), person(\"Theodore\",\"Ts'o\", email=\"tytso@thunk.org\", role=c(\"aut\",\"cph\"), comment=\"libuuid\"))", + "Depends": [ + "R (>= 2.9.0)" + ], + "Description": "Tools for generating and handling of UUIDs (Universally Unique Identifiers).", + "License": "MIT + file LICENSE", + "URL": "https://www.rforge.net/uuid", + "BugReports": "https://github.com/s-u/uuid/issues", + "NeedsCompilation": "yes", + "Repository": "CRAN" + }, + "vctrs": { + "Package": "vctrs", + "Version": "0.7.1", + "Source": "Repository", + "Title": "Vector Helpers", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"data.table team\", role = \"cph\", comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Defines new notions of prototype and size that are used to provide tools for consistent and well-founded type-coercion and size-recycling, and are in turn connected to ideas of type- and size-stability useful for analysing function interfaces.", + "License": "MIT + file LICENSE", + "URL": "https://vctrs.r-lib.org/, https://github.com/r-lib/vctrs", + "BugReports": "https://github.com/r-lib/vctrs/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", + "glue", + "lifecycle (>= 1.0.3)", + "rlang (>= 1.1.7)" + ], + "Suggests": [ + "bit64", + "covr", + "crayon", + "dplyr (>= 0.8.5)", + "generics", + "knitr", + "pillar (>= 1.4.4)", + "pkgdown (>= 2.0.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble (>= 3.1.3)", + "waldo (>= 0.2.0)", + "withr", + "xml2", + "zeallot" + ], + "VignetteBuilder": "knitr", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Encoding": "UTF-8", + "Language": "en-GB", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Lionel Henry [aut], Davis Vaughan [aut, cre], data.table team [cph] (Radix sort based on data.table's forder() and their contribution to R's order()), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "viridis": { + "Package": "viridis", + "Version": "0.6.5", + "Source": "Repository", + "Type": "Package", + "Title": "Colorblind-Friendly Color Maps for R", + "Date": "2024-01-28", + "Authors@R": "c( person(\"Simon\", \"Garnier\", email = \"garnier@njit.edu\", role = c(\"aut\", \"cre\")), person(\"Noam\", \"Ross\", email = \"noam.ross@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Bob\", \"Rudis\", email = \"bob@rud.is\", role = c(\"ctb\", \"cph\")), person(\"Marco\", \"Sciaini\", email = \"sciaini.marco@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Antônio Pedro\", \"Camargo\", role = c(\"ctb\", \"cph\")), person(\"Cédric\", \"Scherer\", email = \"scherer@izw-berlin.de\", role = c(\"ctb\", \"cph\")) )", + "Maintainer": "Simon Garnier ", + "Description": "Color maps designed to improve graph readability for readers with common forms of color blindness and/or color vision deficiency. The color maps are also perceptually-uniform, both in regular form and also when converted to black-and-white for printing. This package also contains 'ggplot2' bindings for discrete and continuous color and fill scales. A lean version of the package called 'viridisLite' that does not include the 'ggplot2' bindings can be found at .", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 2.10)", + "viridisLite (>= 0.4.0)" + ], + "Imports": [ + "ggplot2 (>= 1.0.1)", + "gridExtra" + ], + "Suggests": [ + "hexbin (>= 1.27.0)", + "scales", + "MASS", + "knitr", + "dichromat", + "colorspace", + "httr", + "mapproj", + "vdiffr", + "svglite (>= 1.2.0)", + "testthat", + "covr", + "rmarkdown", + "maps", + "terra" + ], + "LazyData": "true", + "VignetteBuilder": "knitr", + "URL": "https://sjmgarnier.github.io/viridis/, https://github.com/sjmgarnier/viridis/", + "BugReports": "https://github.com/sjmgarnier/viridis/issues", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "no", + "Author": "Simon Garnier [aut, cre], Noam Ross [ctb, cph], Bob Rudis [ctb, cph], Marco Sciaini [ctb, cph], Antônio Pedro Camargo [ctb, cph], Cédric Scherer [ctb, cph]", + "Repository": "CRAN" + }, + "viridisLite": { + "Package": "viridisLite", + "Version": "0.4.3", + "Source": "Repository", + "Type": "Package", + "Title": "Colorblind-Friendly Color Maps (Lite Version)", + "Date": "2026-02-03", + "Authors@R": "c( person(\"Simon\", \"Garnier\", email = \"garnier@njit.edu\", role = c(\"aut\", \"cre\")), person(\"Noam\", \"Ross\", email = \"noam.ross@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Bob\", \"Rudis\", email = \"bob@rud.is\", role = c(\"ctb\", \"cph\")), person(\"Marco\", \"Sciaini\", email = \"sciaini.marco@gmail.com\", role = c(\"ctb\", \"cph\")), person(\"Antônio Pedro\", \"Camargo\", role = c(\"ctb\", \"cph\")), person(\"Cédric\", \"Scherer\", email = \"scherer@izw-berlin.de\", role = c(\"ctb\", \"cph\")) )", + "Maintainer": "Simon Garnier ", + "Description": "Color maps designed to improve graph readability for readers with common forms of color blindness and/or color vision deficiency. The color maps are also perceptually-uniform, both in regular form and also when converted to black-and-white for printing. This is the 'lite' version of the 'viridis' package that also contains 'ggplot2' bindings for discrete and continuous color and fill scales and can be found at .", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "hexbin (>= 1.27.0)", + "ggplot2 (>= 1.0.1)", + "testthat", + "covr" + ], + "URL": "https://sjmgarnier.github.io/viridisLite/, https://github.com/sjmgarnier/viridisLite/", + "BugReports": "https://github.com/sjmgarnier/viridisLite/issues/", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Simon Garnier [aut, cre], Noam Ross [ctb, cph], Bob Rudis [ctb, cph], Marco Sciaini [ctb, cph], Antônio Pedro Camargo [ctb, cph], Cédric Scherer [ctb, cph]", + "Repository": "CRAN" + }, + "visNetwork": { + "Package": "visNetwork", + "Version": "2.1.4", + "Source": "Repository", + "Title": "Network Visualization using 'vis.js' Library", + "Authors@R": "c( person(family = \"Almende B.V. and Contributors\", role = c(\"aut\", \"cph\"), comment = \"vis.js library in htmlwidgets/lib, https://visjs.org/, https://github.com/visjs/vis-network\"), person(\"Benoit\", \"Thieurmel\", role = c(\"aut\", \"cre\"), comment = \"R interface\", email = \"bthieurmel@gmail.com\") )", + "Maintainer": "Benoit Thieurmel ", + "Description": "Provides an R interface to the 'vis.js' JavaScript charting library. It allows an interactive visualization of networks.", + "BugReports": "https://github.com/datastorm-open/visNetwork/issues", + "URL": "https://datastorm-open.github.io/visNetwork/", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "htmlwidgets", + "htmltools", + "jsonlite", + "magrittr", + "utils", + "methods", + "grDevices", + "stats" + ], + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Suggests": [ + "knitr", + "rmarkdown", + "webshot", + "igraph", + "rpart", + "shiny", + "shinyWidgets", + "colourpicker", + "sparkline", + "ggraph", + "tidygraph", + "flashClust" + ], + "VignetteBuilder": "knitr, rmarkdown", + "RoxygenNote": "7.3.3", + "NeedsCompilation": "no", + "Author": "Almende B.V. and Contributors [aut, cph] (vis.js library in htmlwidgets/lib, https://visjs.org/, https://github.com/visjs/vis-network), Benoit Thieurmel [aut, cre] (R interface)", + "Repository": "CRAN" + }, + "vroom": { + "Package": "vroom", + "Version": "1.7.0", + "Source": "Repository", + "Title": "Read and Write Rectangular Text Data Quickly", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Shelby\", \"Bearrows\", role = \"ctb\"), person(\"https://github.com/mandreyel/\", role = \"cph\", comment = \"mio library\"), person(\"Jukka\", \"Jylänki\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Mikkel\", \"Jørgensen\", role = \"cph\", comment = \"grisu3 implementation\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "The goal of 'vroom' is to read and write data (like 'csv', 'tsv' and 'fwf') quickly. When reading it uses a quick initial indexing step, then reads the values lazily , so only the data you actually use needs to be read. The writer formats the data in parallel and writes to disk asynchronously from formatting.", + "License": "MIT + file LICENSE", + "URL": "https://vroom.tidyverse.org, https://github.com/tidyverse/vroom", + "BugReports": "https://github.com/tidyverse/vroom/issues", + "Depends": [ + "R (>= 4.1)" + ], + "Imports": [ + "bit64", + "cli (>= 3.2.0)", + "crayon", + "glue", + "hms", + "lifecycle (>= 1.0.3)", + "methods", + "rlang (>= 1.1.0)", + "stats", + "tibble (>= 2.0.0)", + "tidyselect", + "tzdb (>= 0.1.1)", + "vctrs (>= 0.2.0)", + "withr" + ], + "Suggests": [ + "archive", + "bench (>= 1.1.0)", + "covr", + "curl", + "dplyr", + "forcats", + "fs", + "ggplot2", + "knitr", + "patchwork", + "prettyunits", + "purrr", + "rmarkdown", + "rstudioapi", + "scales", + "spelling", + "testthat (>= 2.1.0)", + "tidyr", + "utils", + "waldo", + "xml2" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.0)", + "progress (>= 1.2.3)", + "tzdb (>= 0.1.1)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "nycflights13, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "false", + "Config/usethis/last-upkeep": "2025-11-25", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.3", + "Config/build/compilation-database": "true", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (ORCID: ), Hadley Wickham [aut] (ORCID: ), Jennifer Bryan [aut, cre] (ORCID: ), Shelby Bearrows [ctb], https://github.com/mandreyel/ [cph] (mio library), Jukka Jylänki [cph] (grisu3 implementation), Mikkel Jørgensen [cph] (grisu3 implementation), Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Jennifer Bryan ", + "Repository": "CRAN" + }, + "waldo": { + "Package": "waldo", + "Version": "0.6.2", + "Source": "Repository", + "Title": "Find Differences Between R Objects", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Compare complex R objects and reveal the key differences. Designed particularly for use in testing packages where being able to quickly isolate key differences makes understanding test failures much easier.", + "License": "MIT + file LICENSE", + "URL": "https://waldo.r-lib.org, https://github.com/r-lib/waldo", + "BugReports": "https://github.com/r-lib/waldo/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "cli", + "diffobj (>= 0.3.4)", + "glue", + "methods", + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "bit64", + "R6", + "S7", + "testthat (>= 3.0.0)", + "withr", + "xml2" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "webshot": { + "Package": "webshot", + "Version": "0.5.5", + "Source": "Repository", + "Title": "Take Screenshots of Web Pages", + "Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@rstudio.com\", role = c(\"aut\", \"cre\")), person(\"Yihui\", \"Xie\", role = \"ctb\"), person(\"Francois\", \"Guillem\", role = \"ctb\"), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Nicolas\", \"Perriault\", role = \"ctb\", comment = \"The CasperJS library\") )", + "Description": "Takes screenshots of web pages, including Shiny applications and R Markdown documents.", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "magrittr", + "jsonlite", + "callr" + ], + "Suggests": [ + "httpuv", + "knitr", + "rmarkdown", + "shiny", + "testthat (>= 3.0.0)" + ], + "License": "GPL-2", + "SystemRequirements": "PhantomJS for taking screenshots, ImageMagick or GraphicsMagick and OptiPNG for manipulating images.", + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "URL": "https://wch.github.io/webshot/, https://github.com/wch/webshot/", + "BugReports": "https://github.com/wch/webshot/issues", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut, cre], Yihui Xie [ctb], Francois Guillem [ctb], Barret Schloerke [ctb], Nicolas Perriault [ctb] (The CasperJS library)", + "Maintainer": "Winston Chang ", + "Repository": "CRAN" + }, + "whisker": { + "Package": "whisker", + "Version": "0.4.1", + "Source": "Repository", + "Maintainer": "Edwin de Jonge ", + "License": "GPL-3", + "Title": "{{mustache}} for R, Logicless Templating", + "Type": "Package", + "LazyLoad": "yes", + "Author": "Edwin de Jonge", + "Description": "Implements 'Mustache' logicless templating.", + "URL": "https://github.com/edwindj/whisker", + "Suggests": [ + "markdown" + ], + "RoxygenNote": "6.1.1", + "NeedsCompilation": "no", + "Repository": "CRAN" + }, + "withr": { + "Package": "withr", + "Version": "3.0.2", + "Source": "Repository", + "Title": "Run Code 'With' Temporarily Modified Global State", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", , \"krlmlr+r@mailbox.org\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevinushey@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A set of functions to run code 'with' safely and temporarily modified global state. Many of these functions were originally a part of the 'devtools' package, this provides a simple package with limited dependencies to provide access to these functions.", + "License": "MIT + file LICENSE", + "URL": "https://withr.r-lib.org, https://github.com/r-lib/withr#readme", + "BugReports": "https://github.com/r-lib/withr/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "graphics", + "grDevices" + ], + "Suggests": [ + "callr", + "DBI", + "knitr", + "methods", + "rlang", + "rmarkdown (>= 2.12)", + "RSQLite", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Collate": "'aaa.R' 'collate.R' 'connection.R' 'db.R' 'defer-exit.R' 'standalone-defer.R' 'defer.R' 'devices.R' 'local_.R' 'with_.R' 'dir.R' 'env.R' 'file.R' 'language.R' 'libpaths.R' 'locale.R' 'makevars.R' 'namespace.R' 'options.R' 'par.R' 'path.R' 'rng.R' 'seed.R' 'wrap.R' 'sink.R' 'tempfile.R' 'timezone.R' 'torture.R' 'utils.R' 'with.R'", + "NeedsCompilation": "no", + "Author": "Jim Hester [aut], Lionel Henry [aut, cre], Kirill Müller [aut], Kevin Ushey [aut], Hadley Wickham [aut], Winston Chang [aut], Jennifer Bryan [ctb], Richard Cotton [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" + }, + "wk": { + "Package": "wk", + "Version": "0.9.5", + "Source": "Repository", + "Title": "Lightweight Well-Known Geometry Parsing", + "Authors@R": "c( person(given = \"Dewey\", family = \"Dunnington\", role = c(\"aut\", \"cre\"), email = \"dewey@fishandwhistle.net\", comment = c(ORCID = \"0000-0002-9415-4582\")), person(given = \"Edzer\", family = \"Pebesma\", role = c(\"aut\"), email = \"edzer.pebesma@uni-muenster.de\", comment = c(ORCID = \"0000-0001-8049-7069\")), person(given = \"Anthony\", family = \"North\", email = \"anthony.jl.north@gmail.com\", role = c(\"ctb\")) )", + "Maintainer": "Dewey Dunnington ", + "Description": "Provides a minimal R and C++ API for parsing well-known binary and well-known text representation of geometries to and from R-native formats. Well-known binary is compact and fast to parse; well-known text is human-readable and is useful for writing tests. These formats are useful in R only if the information they contain can be accessed in R, for which high-performance functions are provided here.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Suggests": [ + "testthat (>= 3.0.0)", + "vctrs (>= 0.3.0)", + "sf", + "tibble", + "readr" + ], + "URL": "https://paleolimbot.github.io/wk/, https://github.com/paleolimbot/wk", + "BugReports": "https://github.com/paleolimbot/wk/issues", + "Config/testthat/edition": "3", + "Depends": [ + "R (>= 2.10)" + ], + "LazyData": "true", + "NeedsCompilation": "yes", + "Author": "Dewey Dunnington [aut, cre] (ORCID: ), Edzer Pebesma [aut] (ORCID: ), Anthony North [ctb]", + "Repository": "CRAN" + }, + "xfun": { + "Package": "xfun", + "Version": "0.56", + "Source": "Repository", + "Type": "Package", + "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\", URL = \"https://yihui.org\")), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Daijiang\", \"Li\", role = \"ctb\"), person(\"Xianying\", \"Tan\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person() )", + "Description": "Miscellaneous functions commonly used in other packages maintained by 'Yihui Xie'.", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ + "grDevices", + "stats", + "tools" + ], + "Suggests": [ + "testit", + "parallel", + "codetools", + "methods", + "rstudioapi", + "tinytex (>= 0.30)", + "mime", + "litedown (>= 0.6)", + "commonmark", + "knitr (>= 1.50)", + "remotes", + "pak", + "curl", + "xml2", + "jsonlite", + "magick", + "yaml", + "data.table", + "qs2" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/yihui/xfun", + "BugReports": "https://github.com/yihui/xfun/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "litedown", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre, cph] (ORCID: , URL: https://yihui.org), Wush Wu [ctb], Daijiang Li [ctb], Xianying Tan [ctb], Salim Brüggemann [ctb] (ORCID: ), Christophe Dervieux [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "xml2": { + "Package": "xml2", + "Version": "1.5.2", + "Source": "Repository", + "Title": "Parse XML", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", email = \"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Foundation\", role = \"ctb\", comment = \"Copy of R-project homepage cached as example\") )", + "Description": "Bindings to 'libxml2' for working with XML data using a simple, consistent interface based on 'XPath' expressions. Also supports XML schema validation; for 'XSLT' transformations see the 'xslt' package.", + "License": "MIT + file LICENSE", + "URL": "https://xml2.r-lib.org, https://r-lib.r-universe.dev/xml2", + "BugReports": "https://github.com/r-lib/xml2/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "cli", + "methods", + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "curl", + "httr", + "knitr", + "mockery", + "rmarkdown", + "testthat (>= 3.2.0)", + "xslt" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "SystemRequirements": "libxml2: libxml2-dev (deb), libxml2-devel (rpm)", + "Collate": "'S4.R' 'as_list.R' 'xml_parse.R' 'as_xml_document.R' 'classes.R' 'format.R' 'import-standalone-obj-type.R' 'import-standalone-purrr.R' 'import-standalone-types-check.R' 'init.R' 'nodeset_apply.R' 'paths.R' 'utils.R' 'xml2-package.R' 'xml_attr.R' 'xml_children.R' 'xml_document.R' 'xml_find.R' 'xml_missing.R' 'xml_modify.R' 'xml_name.R' 'xml_namespaces.R' 'xml_node.R' 'xml_nodeset.R' 'xml_path.R' 'xml_schema.R' 'xml_serialize.R' 'xml_structure.R' 'xml_text.R' 'xml_type.R' 'xml_url.R' 'xml_write.R' 'zzz.R'", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Jeroen Ooms [aut, cre], Posit Software, PBC [cph, fnd], R Foundation [ctb] (Copy of R-project homepage cached as example)", + "Maintainer": "Jeroen Ooms ", + "Repository": "https://packagemanager.posit.co/cran/latest" + }, + "xopen": { + "Package": "xopen", + "Version": "1.0.1", + "Source": "Repository", + "Title": "Open System Files, 'URLs', Anything", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Fathi\", \"Boudra\", role = \"aut\"), person(\"Rex\", \"Dieter\", role = \"aut\"), person(\"Kevin\", \"Krammer\", role = \"aut\"), person(\"Jeremy\", \"White\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Cross platform solution to open files, directories or 'URLs' with their associated programs.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/xopen#readme, https://r-lib.github.io/xopen/", + "BugReports": "https://github.com/r-lib/xopen/issues", + "Depends": [ + "R (>= 3.1)" + ], + "Imports": [ + "processx" + ], + "Suggests": [ + "ps", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Fathi Boudra [aut], Rex Dieter [aut], Kevin Krammer [aut], Jeremy White [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" + }, + "xtable": { + "Package": "xtable", + "Version": "1.8-8", + "Source": "Repository", + "Date": "2026-02-20", + "Title": "Export Tables to LaTeX or HTML", + "Authors@R": "c(person(\"David B.\", \"Dahl\", role=\"aut\"), person(\"David\", \"Scott\", role=c(\"aut\",\"cre\"), email=\"d.scott@auckland.ac.nz\"), person(\"Charles\", \"Roosen\", role=\"aut\"), person(\"Arni\", \"Magnusson\", role=\"aut\"), person(\"Jonathan\", \"Swinton\", role=\"aut\"), person(\"Ajay\", \"Shah\", role=\"ctb\"), person(\"Arne\", \"Henningsen\", role=\"ctb\"), person(\"Benno\", \"Puetz\", role=\"ctb\"), person(\"Bernhard\", \"Pfaff\", role=\"ctb\"), person(\"Claudio\", \"Agostinelli\", role=\"ctb\"), person(\"Claudius\", \"Loehnert\", role=\"ctb\"), person(\"David\", \"Mitchell\", role=\"ctb\"), person(\"David\", \"Whiting\", role=\"ctb\"), person(\"Fernando da\", \"Rosa\", role=\"ctb\"), person(\"Guido\", \"Gay\", role=\"ctb\"), person(\"Guido\", \"Schulz\", role=\"ctb\"), person(\"Ian\", \"Fellows\", role=\"ctb\"), person(\"Jeff\", \"Laake\", role=\"ctb\"), person(\"John\", \"Walker\", role=\"ctb\"), person(\"Jun\", \"Yan\", role=\"ctb\"), person(\"Liviu\", \"Andronic\", role=\"ctb\"), person(\"Markus\", \"Loecher\", role=\"ctb\"), person(\"Martin\", \"Gubri\", role=\"ctb\"), person(\"Matthieu\", \"Stigler\", role=\"ctb\"), person(\"Robert\", \"Castelo\", role=\"ctb\"), person(\"Seth\", \"Falcon\", role=\"ctb\"), person(\"Stefan\", \"Edwards\", role=\"ctb\"), person(\"Sven\", \"Garbade\", role=\"ctb\"), person(\"Uwe\", \"Ligges\", role=\"ctb\"))", + "Maintainer": "David Scott ", + "Imports": [ + "stats", + "utils", + "methods" + ], + "Suggests": [ + "knitr", + "zoo", + "survival", + "glue", + "tinytex" + ], + "VignetteBuilder": "knitr", + "Description": "Coerce data to LaTeX and HTML tables.", + "URL": "http://xtable.r-forge.r-project.org/", + "Depends": [ + "R (>= 2.10.0)" + ], + "License": "GPL (>= 2)", "Repository": "CRAN", - "Hash": "30e5eba91b67f7f4d75d31de14bbfbdc" + "NeedsCompilation": "no", + "Author": "David B. Dahl [aut], David Scott [aut, cre], Charles Roosen [aut], Arni Magnusson [aut], Jonathan Swinton [aut], Ajay Shah [ctb], Arne Henningsen [ctb], Benno Puetz [ctb], Bernhard Pfaff [ctb], Claudio Agostinelli [ctb], Claudius Loehnert [ctb], David Mitchell [ctb], David Whiting [ctb], Fernando da Rosa [ctb], Guido Gay [ctb], Guido Schulz [ctb], Ian Fellows [ctb], Jeff Laake [ctb], John Walker [ctb], Jun Yan [ctb], Liviu Andronic [ctb], Markus Loecher [ctb], Martin Gubri [ctb], Matthieu Stigler [ctb], Robert Castelo [ctb], Seth Falcon [ctb], Stefan Edwards [ctb], Sven Garbade [ctb], Uwe Ligges [ctb]" + }, + "yaml": { + "Package": "yaml", + "Version": "2.3.12", + "Source": "Repository", + "Type": "Package", + "Title": "Methods to Convert R Data to YAML and Back", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"cre\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Shawn\", \"Garbett\", , \"shawn.garbett@vumc.org\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4079-5621\")), person(\"Jeremy\", \"Stephens\", role = c(\"aut\", \"ctb\")), person(\"Kirill\", \"Simonov\", role = \"aut\"), person(\"Yihui\", \"Xie\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Zhuoer\", \"Dong\", role = \"ctb\"), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"reikoch\", role = \"ctb\"), person(\"Will\", \"Beasley\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5613-5006\")), person(\"Brendan\", \"O'Connor\", role = \"ctb\"), person(\"Michael\", \"Quinn\", role = \"ctb\"), person(\"Charlie\", \"Gao\", role = \"ctb\"), person(c(\"Gregory\", \"R.\"), \"Warnes\", role = \"ctb\"), person(c(\"Zhian\", \"N.\"), \"Kamvar\", role = \"ctb\") )", + "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", + "License": "BSD_3_clause + file LICENSE", + "URL": "https://yaml.r-lib.org, https://github.com/r-lib/yaml/", + "BugReports": "https://github.com/r-lib/yaml/issues", + "Suggests": [ + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.3", + "VignetteBuilder": "knitr", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [cre] (ORCID: ), Shawn Garbett [ctb] (ORCID: ), Jeremy Stephens [aut, ctb], Kirill Simonov [aut], Yihui Xie [ctb] (ORCID: ), Zhuoer Dong [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb] (ORCID: ), Brendan O'Connor [ctb], Michael Quinn [ctb], Charlie Gao [ctb], Gregory R. Warnes [ctb], Zhian N. Kamvar [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" + }, + "yyjsonr": { + "Package": "yyjsonr", + "Version": "0.1.21", + "Source": "Repository", + "Type": "Package", + "Title": "Fast 'JSON', 'NDJSON' and 'GeoJSON' Parser and Generator", + "Authors@R": "c( person(\"Mike\", \"Cheng\", role = c(\"aut\", \"cre\", 'cph'), email = \"mikefc@coolbutuseless.com\"), person(\"Yao\", \"Yuan\", role = c(\"aut\", \"cph\"), email = \"ibireme@gmail.com\", comment=\"Author of bundled yyjson\"), person(\"Murat\", \"Tasan\", role = c(\"ctb\"), comment=\"'json_verbatim' handling\") )", + "Maintainer": "Mike Cheng ", + "Description": "A fast 'JSON' parser, generator and validator which converts 'JSON', 'NDJSON' (Newline Delimited 'JSON') and 'GeoJSON' (Geographic 'JSON') data to/from R objects. The standard R data types are supported (e.g. logical, numeric, integer) with configurable handling of NULL and NA values. Data frames, atomic vectors and lists are all supported as data containers translated to/from 'JSON'. 'GeoJSON' data is read in as 'simple features' objects. This implementation wraps the 'yyjson' 'C' library which is available from .", + "License": "MIT + file LICENSE", + "URL": "https://github.com/coolbutuseless/yyjsonr, https://coolbutuseless.github.io/package/yyjsonr/", + "BugReports": "https://github.com/coolbutuseless/yyjsonr/issues", + "Encoding": "UTF-8", + "Language": "en-AU", + "RoxygenNote": "7.3.2", + "Suggests": [ + "bit64", + "knitr", + "rmarkdown", + "jsonlite", + "testthat (>= 3.0.0)" + ], + "Config/testthat/edition": "3", + "VignetteBuilder": "knitr", + "Copyright": "The included 'yyjson' code is Copyright (c) 2020 YaoYuan. See 'COPYRIGHTS' for LICENSE for included code.", + "Depends": [ + "R (>= 4.1.0)" + ], + "NeedsCompilation": "yes", + "Author": "Mike Cheng [aut, cre, cph], Yao Yuan [aut, cph] (Author of bundled yyjson), Murat Tasan [ctb] ('json_verbatim' handling)", + "Repository": "CRAN" + }, + "zip": { + "Package": "zip", + "Version": "2.3.3", + "Source": "Repository", + "Title": "Cross-Platform 'zip' Compression", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Kuba\", \"Podgórski\", role = \"ctb\"), person(\"Rich\", \"Geldreich\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "Cross-Platform 'zip' Compression Library. A replacement for the 'zip' function, that does not require any additional external tools on any platform.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/zip, https://r-lib.github.io/zip/", + "BugReports": "https://github.com/r-lib/zip/issues", + "Suggests": [ + "covr", + "pillar", + "processx", + "R6", + "testthat", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/usethis/last-upkeep": "2025-05-07", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Kuba Podgórski [ctb], Rich Geldreich [ctb], Posit Software, PBC [cph, fnd] (ROR: )", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" } } } diff --git a/renv/.gitignore b/renv/.gitignore index 21296311..0ec0cbba 100644 --- a/renv/.gitignore +++ b/renv/.gitignore @@ -1,5 +1,7 @@ library/ local/ +cellar/ lock/ python/ +sandbox/ staging/ diff --git a/renv/activate.R b/renv/activate.R index 304fd900..ef25ef83 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -2,32 +2,90 @@ local({ # the requested version of renv - version <- "0.14.0" + version <- "1.1.7" + attr(version, "md5") <- "dd5d60f155dadff4c88c2fc6680504b4" + attr(version, "sha") <- NULL # the project directory - project <- getwd() + project <- Sys.getenv("RENV_PROJECT") + if (!nzchar(project)) + project <- getwd() - # allow environment variable to control activation - activate <- Sys.getenv("RENV_ACTIVATE_PROJECT") - if (!nzchar(activate)) { + # use start-up diagnostics if enabled + diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE") + if (diagnostics) { + start <- Sys.time() + profile <- tempfile("renv-startup-", fileext = ".Rprof") + utils::Rprof(profile) + on.exit({ + utils::Rprof(NULL) + elapsed <- signif(difftime(Sys.time(), start, units = "auto"), digits = 2L) + writeLines(sprintf("- renv took %s to run the autoloader.", format(elapsed))) + writeLines(sprintf("- Profile: %s", profile)) + print(utils::summaryRprof(profile)) + }, add = TRUE) + } + + # figure out whether the autoloader is enabled + enabled <- local({ + + # first, check config option + override <- getOption("renv.config.autoloader.enabled") + if (!is.null(override)) + return(override) - # don't auto-activate when R CMD INSTALL is running - if (nzchar(Sys.getenv("R_INSTALL_PKG"))) + # if we're being run in a context where R_LIBS is already set, + # don't load -- presumably we're being run as a sub-process and + # the parent process has already set up library paths for us + rcmd <- Sys.getenv("R_CMD", unset = NA) + rlibs <- Sys.getenv("R_LIBS", unset = NA) + if (!is.na(rlibs) && !is.na(rcmd)) return(FALSE) - } + # next, check environment variables + # prefer using the configuration one in the future + envvars <- c( + "RENV_CONFIG_AUTOLOADER_ENABLED", + "RENV_AUTOLOADER_ENABLED", + "RENV_ACTIVATE_PROJECT" + ) + + for (envvar in envvars) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) + return(tolower(envval) %in% c("true", "t", "1")) + } + + # enable by default + TRUE + + }) + + # bail if we're not enabled + if (!enabled) { + + # if we're not enabled, we might still need to manually load + # the user profile here + profile <- Sys.getenv("R_PROFILE_USER", unset = "~/.Rprofile") + if (file.exists(profile)) { + cfg <- Sys.getenv("RENV_CONFIG_USER_PROFILE", unset = "TRUE") + if (tolower(cfg) %in% c("true", "t", "1")) + sys.source(profile, envir = globalenv()) + } - # bail if activation was explicitly disabled - if (tolower(activate) %in% c("false", "f", "0")) return(FALSE) + } + # avoid recursion - if (nzchar(Sys.getenv("RENV_R_INITIALIZING"))) + if (identical(getOption("renv.autoloader.running"), TRUE)) { + warning("ignoring recursive attempt to run renv autoloader") return(invisible(TRUE)) + } # signal that we're loading renv during R startup - Sys.setenv("RENV_R_INITIALIZING" = "true") - on.exit(Sys.unsetenv("RENV_R_INITIALIZING"), add = TRUE) + options(renv.autoloader.running = TRUE) + on.exit(options(renv.autoloader.running = NULL), add = TRUE) # signal that we've consented to use renv options(renv.consent = TRUE) @@ -36,33 +94,174 @@ local({ # mask 'utils' packages, will come first on the search path library(utils, lib.loc = .Library) - # check to see if renv has already been loaded - if ("renv" %in% loadedNamespaces()) { - - # if renv has already been loaded, and it's the requested version of renv, - # nothing to do - spec <- .getNamespaceInfo(.getNamespace("renv"), "spec") - if (identical(spec[["version"]], version)) - return(invisible(TRUE)) - - # otherwise, unload and attempt to load the correct version of renv + # unload renv if it's already been loaded + if ("renv" %in% loadedNamespaces()) unloadNamespace("renv") - } - # load bootstrap tools + ansify <- function(text) { + if (renv_ansify_enabled()) + renv_ansify_enhanced(text) + else + renv_ansify_default(text) + } + + renv_ansify_enabled <- function() { + + override <- Sys.getenv("RENV_ANSIFY_ENABLED", unset = NA) + if (!is.na(override)) + return(as.logical(override)) + + pane <- Sys.getenv("RSTUDIO_CHILD_PROCESS_PANE", unset = NA) + if (identical(pane, "build")) + return(FALSE) + + testthat <- Sys.getenv("TESTTHAT", unset = "false") + if (tolower(testthat) %in% "true") + return(FALSE) + + iderun <- Sys.getenv("R_CLI_HAS_HYPERLINK_IDE_RUN", unset = "false") + if (tolower(iderun) %in% "false") + return(FALSE) + + TRUE + + } + + renv_ansify_default <- function(text) { + text + } + + renv_ansify_enhanced <- function(text) { + + # R help links + pattern <- "`\\?(renv::(?:[^`])+)`" + replacement <- "`\033]8;;x-r-help:\\1\a?\\1\033]8;;\a`" + text <- gsub(pattern, replacement, text, perl = TRUE) + + # runnable code + pattern <- "`(renv::(?:[^`])+)`" + replacement <- "`\033]8;;x-r-run:\\1\a\\1\033]8;;\a`" + text <- gsub(pattern, replacement, text, perl = TRUE) + + # return ansified text + text + + } + + renv_ansify_init <- function() { + + envir <- renv_envir_self() + if (renv_ansify_enabled()) + assign("ansify", renv_ansify_enhanced, envir = envir) + else + assign("ansify", renv_ansify_default, envir = envir) + + } + + `%||%` <- function(x, y) { + if (is.null(x)) y else x + } + + catf <- function(fmt, ..., appendLF = TRUE) { + + quiet <- getOption("renv.bootstrap.quiet", default = FALSE) + if (quiet) + return(invisible()) + + # also check for config environment variables that should suppress messages + # https://github.com/rstudio/renv/issues/2214 + enabled <- Sys.getenv("RENV_CONFIG_STARTUP_QUIET", unset = NA) + if (!is.na(enabled) && tolower(enabled) %in% c("true", "1")) + return(invisible()) + + enabled <- Sys.getenv("RENV_CONFIG_SYNCHRONIZED_CHECK", unset = NA) + if (!is.na(enabled) && tolower(enabled) %in% c("false", "0")) + return(invisible()) + + msg <- sprintf(fmt, ...) + cat(msg, file = stdout(), sep = if (appendLF) "\n" else "") + + invisible(msg) + + } + + header <- function(label, + ..., + prefix = "#", + suffix = "-", + n = min(getOption("width"), 78)) + { + label <- sprintf(label, ...) + n <- max(n - nchar(label) - nchar(prefix) - 2L, 8L) + if (n <= 0) + return(paste(prefix, label)) + + tail <- paste(rep.int(suffix, n), collapse = "") + paste0(prefix, " ", label, " ", tail) + + } + + heredoc <- function(text, leave = 0) { + + # remove leading, trailing whitespace + trimmed <- gsub("^\\s*\\n|\\n\\s*$", "", text) + + # split into lines + lines <- strsplit(trimmed, "\n", fixed = TRUE)[[1L]] + + # compute common indent + indent <- regexpr("[^[:space:]]", lines) + common <- min(setdiff(indent, -1L)) - leave + text <- paste(substring(lines, common), collapse = "\n") + + # substitute in ANSI links for executable renv code + ansify(text) + + } + bootstrap <- function(version, library) { + friendly <- renv_bootstrap_version_friendly(version) + section <- header(sprintf("Bootstrapping renv %s", friendly)) + catf(section) + + # try to install renv from cache + md5 <- attr(version, "md5", exact = TRUE) + if (length(md5)) { + pkgpath <- renv_bootstrap_find(version) + if (length(pkgpath) && file.exists(pkgpath)) { + file.copy(pkgpath, library, recursive = TRUE) + return(invisible()) + } + } + # attempt to download renv - tarball <- tryCatch(renv_bootstrap_download(version), error = identity) - if (inherits(tarball, "error")) - stop("failed to download renv ", version) + catf("- Downloading renv ... ", appendLF = FALSE) + withCallingHandlers( + tarball <- renv_bootstrap_download(version), + error = function(err) { + catf("FAILED") + stop("failed to download:\n", conditionMessage(err)) + } + ) + catf("OK") + on.exit(unlink(tarball), add = TRUE) # now attempt to install - status <- tryCatch(renv_bootstrap_install(version, tarball, library), error = identity) - if (inherits(status, "error")) - stop("failed to install renv ", version) + catf("- Installing renv ... ", appendLF = FALSE) + withCallingHandlers( + status <- renv_bootstrap_install(version, tarball, library), + error = function(err) { + catf("FAILED") + stop("failed to install:\n", conditionMessage(err)) + } + ) + catf("OK") + # add empty line to break up bootstrapping from normal output + catf("") + return(invisible()) } renv_bootstrap_tests_running <- function() { @@ -71,23 +270,40 @@ local({ renv_bootstrap_repos <- function() { + # get CRAN repository + cran <- getOption("renv.repos.cran", "https://cloud.r-project.org") + # check for repos override repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) - if (!is.na(repos)) - return(repos) + if (!is.na(repos)) { - # if we're testing, re-use the test repositories - if (renv_bootstrap_tests_running()) - return(getOption("renv.tests.repos")) + # split on ';' if present + parts <- strsplit(repos, ";", fixed = TRUE)[[1L]] + + # split into named repositories if present + idx <- regexpr("=", parts, fixed = TRUE) + keys <- substring(parts, 1L, idx - 1L) + vals <- substring(parts, idx + 1L) + names(vals) <- keys + + # if we have a single unnamed repository, call it CRAN + if (length(vals) == 1L && identical(keys, "")) + names(vals) <- "CRAN" + + return(vals) + + } + + # check for lockfile repositories + repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) + if (!inherits(repos, "error") && length(repos)) + return(repos) # retrieve current repos repos <- getOption("repos") # ensure @CRAN@ entries are resolved - repos[repos == "@CRAN@"] <- getOption( - "renv.repos.cran", - "https://cloud.r-project.org" - ) + repos[repos == "@CRAN@"] <- cran # add in renv.bootstrap.repos if set default <- c(FALLBACK = "https://cloud.r-project.org") @@ -100,31 +316,60 @@ local({ } + renv_bootstrap_repos_lockfile <- function() { + + lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") + if (!file.exists(lockpath)) + return(NULL) + + lockfile <- tryCatch(renv_json_read(lockpath), error = identity) + if (inherits(lockfile, "error")) { + warning(lockfile) + return(NULL) + } + + repos <- lockfile$R$Repositories + if (length(repos) == 0) + return(NULL) + + keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) + vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) + names(vals) <- keys + + return(vals) + + } + renv_bootstrap_download <- function(version) { - # if the renv version number has 4 components, assume it must - # be retrieved via github - nv <- numeric_version(version) - components <- unclass(nv)[[1]] + sha <- attr(version, "sha", exact = TRUE) + + methods <- if (!is.null(sha)) { - methods <- if (length(components) == 4L) { - list( - renv_bootstrap_download_github + # attempting to bootstrap a development version of renv + c( + function() renv_bootstrap_download_tarball(sha), + function() renv_bootstrap_download_github(sha) ) + } else { - list( - renv_bootstrap_download_cran_latest, - renv_bootstrap_download_cran_archive + + # attempting to bootstrap a release version of renv + c( + function() renv_bootstrap_download_tarball(version), + function() renv_bootstrap_download_cran_latest(version), + function() renv_bootstrap_download_cran_archive(version) ) + } for (method in methods) { - path <- tryCatch(method(version), error = identity) + path <- tryCatch(method(), error = identity) if (is.character(path) && file.exists(path)) return(path) } - stop("failed to download renv ", version) + stop("All download methods failed") } @@ -140,43 +385,78 @@ local({ if (fixup) mode <- "w+b" - utils::download.file( + args <- list( url = url, destfile = destfile, mode = mode, quiet = TRUE ) + if ("headers" %in% names(formals(utils::download.file))) { + headers <- renv_bootstrap_download_custom_headers(url) + if (length(headers) && is.character(headers)) + args$headers <- headers + } + + do.call(utils::download.file, args) + } - renv_bootstrap_download_cran_latest <- function(version) { + renv_bootstrap_download_custom_headers <- function(url) { - spec <- renv_bootstrap_download_cran_latest_find(version) + headers <- getOption("renv.download.headers") + if (is.null(headers)) + return(character()) + + if (!is.function(headers)) + stopf("'renv.download.headers' is not a function") + + headers <- headers(url) + if (length(headers) == 0L) + return(character()) + + if (is.list(headers)) + headers <- unlist(headers, recursive = FALSE, use.names = TRUE) + + ok <- + is.character(headers) && + is.character(names(headers)) && + all(nzchar(names(headers))) + + if (!ok) + stop("invocation of 'renv.download.headers' did not return a named character vector") + + headers + + } - message("* Downloading renv ", version, " ... ", appendLF = FALSE) + renv_bootstrap_download_cran_latest <- function(version) { + spec <- renv_bootstrap_download_cran_latest_find(version) type <- spec$type repos <- spec$repos - info <- tryCatch( - utils::download.packages( - pkgs = "renv", - destdir = tempdir(), - repos = repos, - type = type, - quiet = TRUE - ), + baseurl <- utils::contrib.url(repos = repos, type = type) + ext <- if (identical(type, "source")) + ".tar.gz" + else if (Sys.info()[["sysname"]] == "Windows") + ".zip" + else + ".tgz" + name <- sprintf("renv_%s%s", version, ext) + url <- paste(baseurl, name, sep = "/") + + destfile <- file.path(tempdir(), name) + status <- tryCatch( + renv_bootstrap_download_impl(url, destfile), condition = identity ) - if (inherits(info, "condition")) { - message("FAILED") + if (inherits(status, "condition")) return(FALSE) - } # report success and return - message("OK (downloaded ", type, ")") - info[1, 2] + destfile } @@ -195,10 +475,21 @@ local({ for (type in types) { for (repos in renv_bootstrap_repos()) { + # build arguments for utils::available.packages() call + args <- list(type = type, repos = repos) + + # add custom headers if available -- note that + # utils::available.packages() will pass this to download.file() + if ("headers" %in% names(formals(utils::download.file))) { + headers <- renv_bootstrap_download_custom_headers(repos) + if (length(headers) && is.character(headers)) + args$headers <- headers + } + # retrieve package database db <- tryCatch( as.data.frame( - utils::available.packages(type = type, repos = repos), + do.call(utils::available.packages, args), stringsAsFactors = FALSE ), error = identity @@ -232,8 +523,6 @@ local({ urls <- file.path(repos, "src/contrib/Archive/renv", name) destfile <- file.path(tempdir(), name) - message("* Downloading renv ", version, " ... ", appendLF = FALSE) - for (url in urls) { status <- tryCatch( @@ -241,18 +530,100 @@ local({ condition = identity ) - if (identical(status, 0L)) { - message("OK") + if (identical(status, 0L)) return(destfile) - } } - message("FAILED") return(FALSE) } + renv_bootstrap_find <- function(version) { + + path <- renv_bootstrap_find_cache(version) + if (length(path) && file.exists(path)) { + catf("- Using renv %s from global package cache", version) + return(path) + } + + } + + renv_bootstrap_find_cache <- function(version) { + + md5 <- attr(version, "md5", exact = TRUE) + if (is.null(md5)) + return() + + # infer path to renv cache + cache <- Sys.getenv("RENV_PATHS_CACHE", unset = "") + if (!nzchar(cache)) { + root <- Sys.getenv("RENV_PATHS_ROOT", unset = NA) + if (!is.na(root)) + cache <- file.path(root, "cache") + } + + if (!nzchar(cache)) { + tools <- asNamespace("tools") + if (is.function(tools$R_user_dir)) { + root <- tools$R_user_dir("renv", "cache") + cache <- file.path(root, "cache") + } + } + + # start completing path to cache + file.path( + cache, + renv_bootstrap_cache_version(), + renv_bootstrap_platform_prefix(), + "renv", + version, + md5, + "renv" + ) + + } + + renv_bootstrap_download_tarball <- function(version) { + + # if the user has provided the path to a tarball via + # an environment variable, then use it + tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) + if (is.na(tarball)) + return() + + # allow directories + if (dir.exists(tarball)) { + name <- sprintf("renv_%s.tar.gz", version) + tarball <- file.path(tarball, name) + } + + # bail if it doesn't exist + if (!file.exists(tarball)) { + + # let the user know we weren't able to honour their request + fmt <- "- RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." + msg <- sprintf(fmt, tarball) + warning(msg) + + # bail + return() + + } + + catf("- Using local tarball '%s'.", tarball) + tarball + + } + + renv_bootstrap_github_token <- function() { + for (envvar in c("GITHUB_TOKEN", "GITHUB_PAT", "GH_TOKEN")) { + envval <- Sys.getenv(envvar, unset = NA) + if (!is.na(envval)) + return(envval) + } + } + renv_bootstrap_download_github <- function(version) { enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") @@ -260,23 +631,24 @@ local({ return(FALSE) # prepare download options - pat <- Sys.getenv("GITHUB_PAT") - if (nzchar(Sys.which("curl")) && nzchar(pat)) { + token <- renv_bootstrap_github_token() + if (is.null(token)) + token <- "" + + if (nzchar(Sys.which("curl")) && nzchar(token)) { fmt <- "--location --fail --header \"Authorization: token %s\"" - extra <- sprintf(fmt, pat) + extra <- sprintf(fmt, token) saved <- options("download.file.method", "download.file.extra") options(download.file.method = "curl", download.file.extra = extra) on.exit(do.call(base::options, saved), add = TRUE) - } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { + } else if (nzchar(Sys.which("wget")) && nzchar(token)) { fmt <- "--header=\"Authorization: token %s\"" - extra <- sprintf(fmt, pat) + extra <- sprintf(fmt, token) saved <- options("download.file.method", "download.file.extra") options(download.file.method = "wget", download.file.extra = extra) on.exit(do.call(base::options, saved), add = TRUE) } - message("* Downloading renv ", version, " from GitHub ... ", appendLF = FALSE) - url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) name <- sprintf("renv_%s.tar.gz", version) destfile <- file.path(tempdir(), name) @@ -286,48 +658,129 @@ local({ condition = identity ) - if (!identical(status, 0L)) { - message("FAILED") + if (!identical(status, 0L)) return(FALSE) - } - message("OK") + renv_bootstrap_download_augment(destfile) + return(destfile) } + # Add Sha to DESCRIPTION. This is stop gap until #890, after which we + # can use renv::install() to fully capture metadata. + renv_bootstrap_download_augment <- function(destfile) { + sha <- renv_bootstrap_git_extract_sha1_tar(destfile) + if (is.null(sha)) { + return() + } + + # Untar + tempdir <- tempfile("renv-github-") + on.exit(unlink(tempdir, recursive = TRUE), add = TRUE) + untar(destfile, exdir = tempdir) + pkgdir <- dir(tempdir, full.names = TRUE)[[1]] + + # Modify description + desc_path <- file.path(pkgdir, "DESCRIPTION") + desc_lines <- readLines(desc_path) + remotes_fields <- c( + "RemoteType: github", + "RemoteHost: api.github.com", + "RemoteRepo: renv", + "RemoteUsername: rstudio", + "RemotePkgRef: rstudio/renv", + paste("RemoteRef: ", sha), + paste("RemoteSha: ", sha) + ) + writeLines(c(desc_lines[desc_lines != ""], remotes_fields), con = desc_path) + + # Re-tar + local({ + old <- setwd(tempdir) + on.exit(setwd(old), add = TRUE) + + tar(destfile, compression = "gzip") + }) + invisible() + } + + # Extract the commit hash from a git archive. Git archives include the SHA1 + # hash as the comment field of the tarball pax extended header + # (see https://www.kernel.org/pub/software/scm/git/docs/git-archive.html) + # For GitHub archives this should be the first header after the default one + # (512 byte) header. + renv_bootstrap_git_extract_sha1_tar <- function(bundle) { + + # open the bundle for reading + # We use gzcon for everything because (from ?gzcon) + # > Reading from a connection which does not supply a 'gzip' magic + # > header is equivalent to reading from the original connection + conn <- gzcon(file(bundle, open = "rb", raw = TRUE)) + on.exit(close(conn)) + + # The default pax header is 512 bytes long and the first pax extended header + # with the comment should be 51 bytes long + # `52 comment=` (11 chars) + 40 byte SHA1 hash + len <- 0x200 + 0x33 + res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len]) + + if (grepl("^52 comment=", res)) { + sub("52 comment=", "", res) + } else { + NULL + } + } + renv_bootstrap_install <- function(version, tarball, library) { # attempt to install it into project library - message("* Installing renv ", version, " ... ", appendLF = FALSE) dir.create(library, showWarnings = FALSE, recursive = TRUE) + output <- renv_bootstrap_install_impl(library, tarball) + + # check for successful install + status <- attr(output, "status") + if (is.null(status) || identical(status, 0L)) + return(status) + + # an error occurred; report it + header <- "installation of renv failed" + lines <- paste(rep.int("=", nchar(header)), collapse = "") + text <- paste(c(header, lines, output), collapse = "\n") + stop(text) + + } + + renv_bootstrap_install_impl <- function(library, tarball) { # invoke using system2 so we can capture and report output bin <- R.home("bin") exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" - r <- file.path(bin, exe) - args <- c("--vanilla", "CMD", "INSTALL", "-l", shQuote(library), shQuote(tarball)) - output <- system2(r, args, stdout = TRUE, stderr = TRUE) - message("Done!") + R <- file.path(bin, exe) - # check for successful install - status <- attr(output, "status") - if (is.numeric(status) && !identical(status, 0L)) { - header <- "Error installing renv:" - lines <- paste(rep.int("=", nchar(header)), collapse = "") - text <- c(header, lines, output) - writeLines(text, con = stderr()) - } + args <- c( + "--vanilla", "CMD", "INSTALL", "--no-multiarch", + "-l", shQuote(path.expand(library)), + shQuote(path.expand(tarball)) + ) - status + system2(R, args, stdout = TRUE, stderr = TRUE) } - renv_bootstrap_platform_prefix <- function() { + renv_bootstrap_platform_prefix_default <- function() { - # construct version prefix - version <- paste(R.version$major, R.version$minor, sep = ".") - prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") + # read version component + version <- Sys.getenv("RENV_PATHS_VERSION", unset = "R-%v") + + # expand placeholders + placeholders <- list( + list("%v", format(getRversion()[1, 1:2])), + list("%V", format(getRversion()[1, 1:3])) + ) + + for (placeholder in placeholders) + version <- gsub(placeholder[[1L]], placeholder[[2L]], version, fixed = TRUE) # include SVN revision for development versions of R # (to avoid sharing platform-specific artefacts with released versions of R) @@ -336,10 +789,19 @@ local({ identical(R.version[["nickname"]], "Unsuffered Consequences") if (devel) - prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") + version <- paste(version, R.version[["svn rev"]], sep = "-r") + + version + + } + + renv_bootstrap_platform_prefix <- function() { + + # construct version prefix + version <- renv_bootstrap_platform_prefix_default() # build list of path components - components <- c(prefix, R.version$platform) + components <- c(version, R.version$platform) # include prefix if provided by user prefix <- renv_bootstrap_platform_prefix_impl() @@ -360,6 +822,9 @@ local({ # if the user has requested an automatic prefix, generate it auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) + if (is.na(auto) && getRversion() >= "4.4.0") + auto <- "TRUE" + if (auto %in% c("TRUE", "True", "true", "1")) return(renv_bootstrap_platform_prefix_auto()) @@ -499,49 +964,97 @@ local({ renv_bootstrap_library_root <- function(project) { + prefix <- renv_bootstrap_profile_prefix() + path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) if (!is.na(path)) - return(path) + return(paste(c(path, prefix), collapse = "/")) - path <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) - if (!is.na(path)) { + path <- renv_bootstrap_library_root_impl(project) + if (!is.null(path)) { name <- renv_bootstrap_library_root_name(project) - return(file.path(path, name)) + return(paste(c(path, prefix, name), collapse = "/")) } - prefix <- renv_bootstrap_profile_prefix() - paste(c(project, prefix, "renv/library"), collapse = "/") + renv_bootstrap_paths_renv("library", project = project) } - renv_bootstrap_validate_version <- function(version) { + renv_bootstrap_library_root_impl <- function(project) { + + root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) + if (!is.na(root)) + return(root) - loadedversion <- utils::packageDescription("renv", fields = "Version") - if (version == loadedversion) + type <- renv_bootstrap_project_type(project) + if (identical(type, "package")) { + userdir <- renv_bootstrap_user_dir() + return(file.path(userdir, "library")) + } + + } + + renv_bootstrap_validate_version <- function(version, description = NULL) { + + # resolve description file + # + # avoid passing lib.loc to `packageDescription()` below, since R will + # use the loaded version of the package by default anyhow. note that + # this function should only be called after 'renv' is loaded + # https://github.com/rstudio/renv/issues/1625 + description <- description %||% packageDescription("renv") + + # check whether requested version 'version' matches loaded version of renv + sha <- attr(version, "sha", exact = TRUE) + valid <- if (!is.null(sha)) + renv_bootstrap_validate_version_dev(sha, description) + else + renv_bootstrap_validate_version_release(version, description) + + if (valid) return(TRUE) - # assume four-component versions are from GitHub; three-component - # versions are from CRAN - components <- strsplit(loadedversion, "[.-]")[[1]] - remote <- if (length(components) == 4L) - paste("rstudio/renv", loadedversion, sep = "@") + # the loaded version of renv doesn't match the requested version; + # give the user instructions on how to proceed + dev <- identical(description[["RemoteType"]], "github") + remote <- if (dev) + paste("rstudio/renv", description[["RemoteSha"]], sep = "@") else - paste("renv", loadedversion, sep = "@") + paste("renv", description[["Version"]], sep = "@") - fmt <- paste( - "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.", - "Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.", - "Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.", - sep = "\n" + # display both loaded version + sha if available + friendly <- renv_bootstrap_version_friendly( + version = description[["Version"]], + sha = if (dev) description[["RemoteSha"]] ) - msg <- sprintf(fmt, loadedversion, version, remote) - warning(msg, call. = FALSE) + fmt <- heredoc(" + renv %1$s was loaded from project library, but this project is configured to use renv %2$s. + - Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile. + - Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library. + ") + catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) FALSE } + renv_bootstrap_validate_version_dev <- function(version, description) { + + expected <- description[["RemoteSha"]] + if (!is.character(expected)) + return(FALSE) + + pattern <- sprintf("^\\Q%s\\E", version) + grepl(pattern, expected, perl = TRUE) + + } + + renv_bootstrap_validate_version_release <- function(version, description) { + expected <- description[["Version"]] + is.character(expected) && identical(c(expected), c(version)) + } + renv_bootstrap_hash_text <- function(text) { hashfile <- tempfile("renv-hash-") @@ -561,6 +1074,12 @@ local({ # warn if the version of renv loaded does not match renv_bootstrap_validate_version(version) + # execute renv load hooks, if any + hooks <- getHook("renv::autoload") + for (hook in hooks) + if (is.function(hook)) + tryCatch(hook(), error = warnify) + # load the project renv::load(project) @@ -576,7 +1095,7 @@ local({ return(profile) # check for a profile file (nothing to do if it doesn't exist) - path <- file.path(project, "renv/local/profile") + path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project) if (!file.exists(path)) return(NULL) @@ -587,7 +1106,7 @@ local({ # set RENV_PROFILE profile <- contents[[1L]] - if (nzchar(profile)) + if (!profile %in% c("", "default")) Sys.setenv(RENV_PROFILE = profile) profile @@ -597,7 +1116,7 @@ local({ renv_bootstrap_profile_prefix <- function() { profile <- renv_bootstrap_profile_get() if (!is.null(profile)) - return(file.path("renv/profiles", profile)) + return(file.path("profiles", profile, "renv")) } renv_bootstrap_profile_get <- function() { @@ -621,6 +1140,264 @@ local({ profile } + + renv_bootstrap_path_absolute <- function(path) { + + substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( + substr(path, 1L, 1L) %in% c(letters, LETTERS) && + substr(path, 2L, 3L) %in% c(":/", ":\\") + ) + + } + + renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { + renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") + root <- if (renv_bootstrap_path_absolute(renv)) NULL else project + prefix <- if (profile) renv_bootstrap_profile_prefix() + components <- c(root, renv, prefix, ...) + paste(components, collapse = "/") + } + + renv_bootstrap_project_type <- function(path) { + + descpath <- file.path(path, "DESCRIPTION") + if (!file.exists(descpath)) + return("unknown") + + desc <- tryCatch( + read.dcf(descpath, all = TRUE), + error = identity + ) + + if (inherits(desc, "error")) + return("unknown") + + type <- desc$Type + if (!is.null(type)) + return(tolower(type)) + + package <- desc$Package + if (!is.null(package)) + return("package") + + "unknown" + + } + + renv_bootstrap_user_dir <- function() { + dir <- renv_bootstrap_user_dir_impl() + path.expand(chartr("\\", "/", dir)) + } + + renv_bootstrap_user_dir_impl <- function() { + + # use local override if set + override <- getOption("renv.userdir.override") + if (!is.null(override)) + return(override) + + # use R_user_dir if available + tools <- asNamespace("tools") + if (is.function(tools$R_user_dir)) + return(tools$R_user_dir("renv", "cache")) + + # try using our own backfill for older versions of R + envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") + for (envvar in envvars) { + root <- Sys.getenv(envvar, unset = NA) + if (!is.na(root)) + return(file.path(root, "R/renv")) + } + + # use platform-specific default fallbacks + if (Sys.info()[["sysname"]] == "Windows") + file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") + else if (Sys.info()[["sysname"]] == "Darwin") + "~/Library/Caches/org.R-project.R/R/renv" + else + "~/.cache/R/renv" + + } + + renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) { + sha <- sha %||% attr(version, "sha", exact = TRUE) + parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L))) + paste(parts, collapse = "") + } + + renv_bootstrap_exec <- function(project, libpath, version) { + if (!renv_bootstrap_load(project, libpath, version)) + renv_bootstrap_run(project, libpath, version) + } + + renv_bootstrap_run <- function(project, libpath, version) { + + # perform bootstrap + bootstrap(version, libpath) + + # exit early if we're just testing bootstrap + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) + return(TRUE) + + # try again to load + if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + return(renv::load(project = project)) + } + + # failed to download or load renv; warn the user + msg <- c( + "Failed to find an renv installation: the project will not be loaded.", + "Use `renv::activate()` to re-initialize the project." + ) + + warning(paste(msg, collapse = "\n"), call. = FALSE) + + } + + renv_bootstrap_cache_version <- function() { + # NOTE: users should normally not override the cache version; + # this is provided just to make testing easier + Sys.getenv("RENV_CACHE_VERSION", unset = "v5") + } + + renv_bootstrap_cache_version_previous <- function() { + version <- renv_bootstrap_cache_version() + number <- as.integer(substring(version, 2L)) + paste("v", number - 1L, sep = "") + } + + renv_json_read <- function(file = NULL, text = NULL) { + + jlerr <- NULL + + # if jsonlite is loaded, use that instead + if ("jsonlite" %in% loadedNamespaces()) { + + json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) + if (!inherits(json, "error")) + return(json) + + jlerr <- json + + } + + # otherwise, fall back to the default JSON reader + json <- tryCatch(renv_json_read_default(file, text), error = identity) + if (!inherits(json, "error")) + return(json) + + # report an error + if (!is.null(jlerr)) + stop(jlerr) + else + stop(json) + + } + + renv_json_read_jsonlite <- function(file = NULL, text = NULL) { + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + jsonlite::fromJSON(txt = text, simplifyVector = FALSE) + } + + renv_json_read_patterns <- function() { + + list( + + # objects + list("{", "\t\n\tobject(\t\n\t", TRUE), + list("}", "\t\n\t)\t\n\t", TRUE), + + # arrays + list("[", "\t\n\tarray(\t\n\t", TRUE), + list("]", "\n\t\n)\n\t\n", TRUE), + + # maps + list(":", "\t\n\t=\t\n\t", TRUE), + + # newlines + list("\\u000a", "\n", FALSE) + + ) + + } + + renv_json_read_envir <- function() { + + envir <- new.env(parent = emptyenv()) + + envir[["+"]] <- `+` + envir[["-"]] <- `-` + + envir[["object"]] <- function(...) { + result <- list(...) + names(result) <- as.character(names(result)) + result + } + + envir[["array"]] <- list + + envir[["true"]] <- TRUE + envir[["false"]] <- FALSE + envir[["null"]] <- NULL + + envir + + } + + renv_json_read_remap <- function(object, patterns) { + + # repair names if necessary + if (!is.null(names(object))) { + + nms <- names(object) + for (pattern in patterns) + nms <- gsub(pattern[[2L]], pattern[[1L]], nms, fixed = TRUE) + names(object) <- nms + + } + + # repair strings if necessary + if (is.character(object)) { + for (pattern in patterns) + object <- gsub(pattern[[2L]], pattern[[1L]], object, fixed = TRUE) + } + + # recurse for other objects + if (is.recursive(object)) + for (i in seq_along(object)) + object[i] <- list(renv_json_read_remap(object[[i]], patterns)) + + # return remapped object + object + + } + + renv_json_read_default <- function(file = NULL, text = NULL) { + + # read json text + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + + # convert into something the R parser will understand + patterns <- renv_json_read_patterns() + transformed <- text + for (pattern in patterns) + transformed <- gsub(pattern[[1L]], pattern[[2L]], transformed, fixed = TRUE) + + # parse it + rfile <- tempfile("renv-json-", fileext = ".R") + on.exit(unlink(rfile), add = TRUE) + writeLines(transformed, con = rfile) + json <- parse(rfile, keep.source = FALSE, srcfile = NULL)[[1L]] + + # evaluate in safe environment + result <- eval(json, envir = renv_json_read_envir()) + + # fix up strings if necessary -- do so only with reversible patterns + patterns <- Filter(function(pattern) pattern[[3L]], patterns) + renv_json_read_remap(result, patterns) + + } + # load the renv profile, if any renv_bootstrap_profile_load(project) @@ -634,35 +1411,9 @@ local({ # construct full libpath libpath <- file.path(root, prefix) - # attempt to load - if (renv_bootstrap_load(project, libpath, version)) - return(TRUE) - - # load failed; inform user we're about to bootstrap - prefix <- paste("# Bootstrapping renv", version) - postfix <- paste(rep.int("-", 77L - nchar(prefix)), collapse = "") - header <- paste(prefix, postfix) - message(header) - - # perform bootstrap - bootstrap(version, libpath) - - # exit early if we're just testing bootstrap - if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) - return(TRUE) - - # try again to load - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - message("* Successfully installed and loaded renv ", version, ".") - return(renv::load()) - } - - # failed to download or load renv; warn the user - msg <- c( - "Failed to find an renv installation: the project will not be loaded.", - "Use `renv::activate()` to re-initialize the project." - ) + # run bootstrap code + renv_bootstrap_exec(project, libpath, version) - warning(paste(msg, collapse = "\n"), call. = FALSE) + invisible() })