diff --git a/.all-contributorsrc b/.all-contributorsrc
new file mode 100644
index 00000000..80a70c27
--- /dev/null
+++ b/.all-contributorsrc
@@ -0,0 +1,55 @@
+{
+ "projectName": "media-impact-monitor-website",
+ "projectOwner": "SocialChangeLab",
+ "repoType": "github",
+ "repoHost": "https://github.com",
+ "files": [
+ "README.md"
+ ],
+ "imageSize": 64,
+ "commit": false,
+ "commitConvention": "angular",
+ "contributors": [
+ {
+ "login": "vogelino",
+ "name": "Lucas Vogel",
+ "avatar_url": "https://avatars.githubusercontent.com/u/2759340?v=4",
+ "profile": "https://github.com/vogelino",
+ "contributions": [
+ "code",
+ "design",
+ "doc",
+ "projectManagement"
+ ]
+ },
+ {
+ "login": "davidpomerenke",
+ "name": "David Pomerenke",
+ "avatar_url": "https://avatars.githubusercontent.com/u/46022183?v=4",
+ "profile": "https://github.com/davidpomerenke",
+ "contributions": [
+ "code",
+ "content",
+ "data",
+ "doc",
+ "projectManagement",
+ "research"
+ ]
+ },
+ {
+ "login": "Lennartklein",
+ "name": "lennartklein",
+ "avatar_url": "https://avatars.githubusercontent.com/u/132817556?v=4",
+ "profile": "https://github.com/Lennartklein",
+ "contributions": [
+ "code",
+ "data",
+ "doc",
+ "projectManagement",
+ "research"
+ ]
+ }
+ ],
+ "contributorsPerLine": 10,
+ "linkToUsage": true
+}
\ No newline at end of file
diff --git a/.devcontainer/R/.Renviron b/.devcontainer/R/.Renviron
new file mode 100644
index 00000000..54c73317
--- /dev/null
+++ b/.devcontainer/R/.Renviron
@@ -0,0 +1,3 @@
+## Global .Renviron
+
+RENV_PATHS_CACHE="/renv/cache"
\ No newline at end of file
diff --git a/.devcontainer/R/.Rprofile b/.devcontainer/R/.Rprofile
new file mode 100644
index 00000000..ba71a6f2
--- /dev/null
+++ b/.devcontainer/R/.Rprofile
@@ -0,0 +1,6 @@
+## Copy to '/home/vscode/.Rprofile' in postCreateCommand.sh
+
+cat("Loading global R presets from '/home/vscode/.Rprofile'....\n")
+
+setwd("/workspaces/media-impact-monitor/backend-R")
+renv::load(project = "/workspaces/media-impact-monitor/backend-R")
diff --git a/.devcontainer/R/addins.json b/.devcontainer/R/addins.json
new file mode 100644
index 00000000..fcdc8aa2
--- /dev/null
+++ b/.devcontainer/R/addins.json
@@ -0,0 +1,3 @@
+{
+ "styler::style_active_file": "Shift+Cmd+F"
+}
\ No newline at end of file
diff --git a/.devcontainer/R/r.snippets b/.devcontainer/R/r.snippets
new file mode 100644
index 00000000..3067f3b2
--- /dev/null
+++ b/.devcontainer/R/r.snippets
@@ -0,0 +1,2 @@
+snippet tidy
+ library(tidyverse)
diff --git a/.devcontainer/R/rstudio-prefs.json b/.devcontainer/R/rstudio-prefs.json
new file mode 100644
index 00000000..4b1b550e
--- /dev/null
+++ b/.devcontainer/R/rstudio-prefs.json
@@ -0,0 +1,10 @@
+{
+ "always_save_history": false,
+ "save_workspace": "never",
+ "load_workspace": false,
+ "initial_working_directory": "/workspaces/media-impact-monitor/backend-R",
+ "restore_last_project": true,
+ "jobs_tab_visibility": "shown",
+ "rainbow_parentheses": true,
+ "auto_append_newline": true
+}
\ No newline at end of file
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index b82bc0bf..104697ca 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -5,31 +5,74 @@
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/base:jammy",
"features": {
- "ghcr.io/devcontainers/features/azure-cli:1": {},
- "ghcr.io/devcontainers/features/node:1": {},
- "ghcr.io/devcontainers/features/python:1": {},
- "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": {},
- "ghcr.io/rocker-org/devcontainer-features/r-apt:0": {},
- "ghcr.io/rocker-org/devcontainer-features/r-packages:1": {},
- "ghcr.io/rocker-org/devcontainer-features/rstudio-server:0": {},
- "ghcr.io/devcontainers-contrib/features/poetry:2": {},
- "ghcr.io/devcontainers-contrib/features/ruff:1": {},
- "ghcr.io/devcontainers-contrib/features/starship:1": {},
- "ghcr.io/dhoeric/features/google-cloud-cli:1": {},
- "ghcr.io/stuartleeks/dev-container-features/azure-cli-persistence:0": {},
- "ghcr.io/joshuanianji/devcontainer-features/gcloud-cli-persistence:1": {},
- "ghcr.io/nikobockerman/devcontainer-features/poetry-persistent-cache:1": {},
- "ghcr.io/rocker-org/devcontainer-features/r-history:0": {},
- "ghcr.io/stuartleeks/dev-container-features/shell-history:0": {},
+ // Web Dev Stack –--------------------------------------------------------
+
+ // https://github.com/devcontainers/features/tree/main/src/node
+ "ghcr.io/devcontainers/features/node:1": {
+ "version": "lts" // Node.js version
+ },
+
+ "ghcr.io/devcontainers/features/azure-cli:1": { },
+ "ghcr.io/stuartleeks/dev-container-features/azure-cli-persistence:0": { },
+ "ghcr.io/dhoeric/features/google-cloud-cli:1": { },
+ "ghcr.io/joshuanianji/devcontainer-features/gcloud-cli-persistence:1": { },
+
+ // Python Stack –--------------------------------------------------------
+
+ "ghcr.io/devcontainers/features/python:1": {
+ "installTools": true,
+ "version": "3.10"
+ },
+ "ghcr.io/devcontainers-contrib/features/poetry:2": { },
+ "ghcr.io/nikobockerman/devcontainer-features/poetry-persistent-cache:1": { },
+ "ghcr.io/devcontainers-contrib/features/ruff:1": { },
+ "ghcr.io/devcontainers-contrib/features/starship:1": { },
+
+ // R Stack –--------------------------------------------------------
+
+ // System dependencies
+ // "ghcr.io/devcontainers-contrib/features/apt-get-packages:1": {
+ // "packages": "libfribidi-dev,libharfbuzz-dev,cmake"
+ // },
+
+ // https://github.com/rocker-org/devcontainer-features/tree/main/src/r-apt
+ // NOTE: always installs the latest R Version (not fixed!)
+ "ghcr.io/rocker-org/devcontainer-features/r-apt:0": {
+ "vscodeRSupport": "full",
+ "installDevTools": true, // for debugging
+ "installREnv": false, // -> install with renv cache feature
+ "installRMarkdown": false, // needed?
+ "installJupyterlab": false,
+ "installRadian": true, // better R console
+ "installVscDebugger": true,
+ "useTesting": true, // for Debian, default: true
+ "installBspm": false
+ },
+ // https://github.com/rocker-org/devcontainer-features/tree/main/src/rstudio-server
+ "ghcr.io/rocker-org/devcontainer-features/rstudio-server:0": {
+ "singleUser": true,
+ "version": "stable"
+ },
+ // https://github.com/rocker-org/devcontainer-features/tree/main/src/quarto-cli
+ "ghcr.io/rocker-org/devcontainer-features/quarto-cli:1": {
+ "installTinyTex": false,
+ "installChromium": false // https://github.com/rocker-org/devcontainer-features/tree/main/src/quarto-cli#install-chromium
+ },
+ // https://github.com/rocker-org/devcontainer-features/tree/main/src/renv-cache
+ "ghcr.io/rocker-org/devcontainer-features/renv-cache:0": { },
+
+ // Misc –-----------------------------------------------------------------------------------
+
+ "ghcr.io/stuartleeks/dev-container-features/shell-history:0": { },
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers-contrib/features/act:1": {},
"ghcr.io/devcontainers/features/terraform:1": {}
},
// Ports & Server ----------------------------------------------------------------------------
- // start RStudio Server process in container
- "postAttachCommand": {
- "rstudio-start": "rserver"
- },
+ // start RStudio Server process in container, not needed automatically
+ // "postAttachCommand": {
+ // "rstudio-start": "rserver"
+ // },
// https://containers.dev/implementors/json_reference/#port-attributes
"forwardPorts": [
8787
@@ -70,8 +113,11 @@
"ms-python.python",
"ms-toolsai.jupyter",
"charliermarsh.ruff",
- "tamasfe.even-better-toml",
+ "tamasfe.even-better-toml"
],
+ // "codespaces": {
+ // "openFiles": [ "README.md" ]
+ // },
"settings": {
"editor.codeActionsOnSave": {
"source.fixAll": "always",
diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh
index 84f524eb..c9e23eb1 100644
--- a/.devcontainer/postCreateCommand.sh
+++ b/.devcontainer/postCreateCommand.sh
@@ -1,5 +1,51 @@
#!/usr/bin/bash
## postCreateCommand.sh
-echo 'eval "$(starship init bash)"' >> ~/.bashrc;
-cd backend-python && poetry install; # install everything once at setup
+## Node Startup
+# https://github.com/devcontainers/features/tree/main/src/node#using-nvm-from-postcreatecommand-or-another-lifecycle-command
+# . ${NVM_DIR}/nvm.sh && nvm install --lts
+
+## R ------------------------------------
+
+## R system dependencies
+sudo apt-get update
+sudo apt-get install -y \
+ cmake
+
+## tidyverse dependencies (from https://packagemanager.posit.co/client/#/repos/cran/packages/overview?search=tidyverse)
+sudo apt-get install -y \
+ libicu-dev \
+ make \
+ libcurl4-openssl-dev \
+ libssl-dev \
+ zlib1g-dev \
+ libfontconfig1-dev \
+ libfreetype6-dev \
+ libfribidi-dev \
+ libharfbuzz-dev \
+ libjpeg-dev \
+ libpng-dev \
+ libtiff-dev \
+ pandoc \
+ libxml2-dev
+
+## setup R env prefs
+# ~ = /home/vscode/ for Codespaces
+cp /workspaces/media-impact-monitor/.devcontainer/R/.Rprofile ~/.Rprofile
+cp /workspaces/media-impact-monitor/.devcontainer/R/.Renviron ~/.Renviron
+
+# https://docs.rstudio.com/ide/server-pro/session-user-settings.html
+cp /workspaces/media-impact-monitor/.devcontainer/R/rstudio-prefs.json ~/.config/rstudio/rstudio-prefs.json
+
+mkdir -p ~/.config/rstudio/keybindings
+cp /workspaces/media-impact-monitor/.devcontainer/R/addins.json ~/.config/rstudio/keybindings/addins.json
+mkdir -p ~/.config/rstudio/snippets
+cp /workspaces/media-impact-monitor/.devcontainer/R/r.snippets ~/.config/rstudio/snippets/r.snippets
+
+## Restore renv library from lockfile
+Rscript -e 'renv::restore(project = "/workspaces/media-impact-monitor/backend-R")'
+
+####
+
+echo 'eval "$(starship init bash)"' >> ~/.bashrc
+cd backend-python && poetry install # install everything once at setup
\ No newline at end of file
diff --git a/.devcontainer/postStartCommand.sh b/.devcontainer/postStartCommand.sh
index 08963572..b3021c39 100644
--- a/.devcontainer/postStartCommand.sh
+++ b/.devcontainer/postStartCommand.sh
@@ -1,5 +1,5 @@
#!/usr/bin/bash
## postStartCommand.sh
-cd backend-python && poetry install; # install changed packages
-bash
+cd backend-python && poetry install # install changed packages
+# bash
diff --git a/.gitignore b/.gitignore
index dd5d907e..9f07f0ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,6 @@
# Icon must end with two \r
Icon
-
# Thumbnails
._*
@@ -35,7 +34,6 @@ Temporary Items
# End of https://www.toptal.com/developers/gitignore/api/macos
-
### Windows ------------------------------------------------------------------------
# Windows thumbnail cache files
@@ -65,7 +63,6 @@ $RECYCLE.BIN/
# End of https://www.toptal.com/developers/gitignore/api/windows
-
### Python ------------------------------------------------------------------------
# Byte-compiled / optimized / DLL files
@@ -241,7 +238,6 @@ pyrightconfig.json
# End of https://www.toptal.com/developers/gitignore/api/python
-
### R ------------------------------------------------------------------------
# History files
@@ -283,7 +279,7 @@ vignettes/*.pdf
*.knit.md
# R Environment Variables
-.Renviron
+# .Renviron
# pkgdown site
docs/
diff --git a/README.md b/README.md
index 419588b2..096f18b9 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,74 @@
-# media-impact-monitor
+[![Logo of the Media Impact Monitor app](https://mediaimpactmonitor.app/assets/logos/mim-alternate-hybrid.svg)](https://mediaimpactmonitor.app/)
-
-[![Project Status: WIP – Initial development is in progress](https://www.repostatus.org/badges/latest/wip.svg)](https://www.repostatus.org/#wip)
-
+
+
+# Media Impact Monitor
+
+
+
+[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-)
+
+
+
+The _Media Impact Monitor_ is be a novel tool for protest groups and NGOs to measure and visualize their impact on public discourse. The tool will show how activist events affect the discourse across various media sources, such as local and national newspapers, social media, parliamentary debates, and more. Protest groups can use it to quantitatively and qualitatively evaluate their actions and adapt them in a targeted manner to draw attention to their issues.
+
+The _Media Impact Monitor_ project is hosted by [Social Change Lab](http://socialchangelab.org/) and funded by [Prototype Fund](https://prototypefund.de/en/) ([BMBF](https://www.bmbf.de/bmbf/de/home/home_node.html)). Development is primarily taking place from March–August 2024.
+
+## Motivation
+
+NGOs and protest groups often want to draw more public attention to important issues in order to initiate social change. To do this, they organise panel discussions, publish articles on social media, send out press releases, organize demonstrations, practice civil disobedience, implement art actions, and so on. To evaluate their work, organizations often use "press hits" as a metric - but this is a poor substitute for the broader impact on agenda setting within public discourse, which the organizations are interested in but cannot easily analyze.
+
+This impact on agenda setting is difficult to capture statistically because of the complex causal relationship between discourse, action events, and external events. A correlational and even a simple regression analysis would therefore lead to statistically biased results.
+
+This is where we will start with the Media Impact Monitor: It aims to use innovative causal inference methods to quantify and visualize how action events affect agenda setting in public discourse.
+
+**Examples:** The "Last Generation" can use it to see, for example, whether their actions distract from actual climate policy discussion or contribute to it constructively; and NGOs such as Greenpeace can evaluate which of their formats are most effective in media terms, and can use their media impact as an argument for donating to them.
+
+## Team
+
+The project team is constituted from:
+
+- **David Pomerenke** (@davidpomerenke) – Data Science – M.A. Artificial Intelligence
+- **Lennard Klein** (@kleinlennart) – Data Science – B.A. Political Science
+- **Lucas Vogel** (@vogelino) – Frontend UI/UX Development – B.A. Interface Design
+
+## Contact
+
+We are seeking activists and NGO employees to help us shape the tool: We are curious about your experience with media evaluation, your ideas and dreams, and your feedback on our prototypes!
+
+Please [send us an email](mailto:david@socialchangelab.org) or [book a short meeting](https://cal.com/davidpomerenke/meeting-mim) with us 🤗
+
+## Contributors
+
+
+
+
+
+
+
+
+
+
+
+## Partners
+
+| Hosted by | Funded by | |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [![Logo of the Social Change Lab](https://mediaimpactmonitor.app/assets/logos/socialchangelab-hybrid.svg)](https://socialchangelab.org/) | [![Logo of the Prototype Fund](https://mediaimpactmonitor.app/assets/logos/prototypefund-hybrid.svg)](https://prototypefund.org/) | [![Logo of the Bundesministerium für Bildung und Forschung](https://mediaimpactmonitor.app/assets/logos/bmbf-hybrid.svg)](https://prototypefund.org/) |
diff --git a/assets/logos/bmbf-hybrid.svg b/assets/logos/bmbf-hybrid.svg
new file mode 100644
index 00000000..287df864
--- /dev/null
+++ b/assets/logos/bmbf-hybrid.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/logos/bmbf-negative.svg b/assets/logos/bmbf-negative.svg
new file mode 100644
index 00000000..86369d9a
--- /dev/null
+++ b/assets/logos/bmbf-negative.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/logos/bmbf-positive.svg b/assets/logos/bmbf-positive.svg
new file mode 100644
index 00000000..c7014083
--- /dev/null
+++ b/assets/logos/bmbf-positive.svg
@@ -0,0 +1,8 @@
+
diff --git a/assets/logos/prototypefund-hybrid.svg b/assets/logos/prototypefund-hybrid.svg
new file mode 100644
index 00000000..95723593
--- /dev/null
+++ b/assets/logos/prototypefund-hybrid.svg
@@ -0,0 +1,17 @@
+
diff --git a/assets/logos/prototypefund-negative.svg b/assets/logos/prototypefund-negative.svg
new file mode 100644
index 00000000..cffb9e5d
--- /dev/null
+++ b/assets/logos/prototypefund-negative.svg
@@ -0,0 +1,17 @@
+
diff --git a/assets/logos/prototypefund-positive.svg b/assets/logos/prototypefund-positive.svg
new file mode 100644
index 00000000..83b9ccd2
--- /dev/null
+++ b/assets/logos/prototypefund-positive.svg
@@ -0,0 +1,17 @@
+
diff --git a/assets/logos/socialchangelab-hybrid.svg b/assets/logos/socialchangelab-hybrid.svg
new file mode 100644
index 00000000..eee8fdd4
--- /dev/null
+++ b/assets/logos/socialchangelab-hybrid.svg
@@ -0,0 +1,25 @@
+
diff --git a/assets/logos/socialchangelab-negative.svg b/assets/logos/socialchangelab-negative.svg
new file mode 100644
index 00000000..e7fa6e32
--- /dev/null
+++ b/assets/logos/socialchangelab-negative.svg
@@ -0,0 +1,25 @@
+
diff --git a/assets/logos/socialchangelab-positive.svg b/assets/logos/socialchangelab-positive.svg
new file mode 100644
index 00000000..82ebff85
--- /dev/null
+++ b/assets/logos/socialchangelab-positive.svg
@@ -0,0 +1,25 @@
+
diff --git a/backend-R/.Renviron b/backend-R/.Renviron
new file mode 100644
index 00000000..eed6a7fc
--- /dev/null
+++ b/backend-R/.Renviron
@@ -0,0 +1 @@
+## Local .Renviron
diff --git a/backend-R/.Rprofile b/backend-R/.Rprofile
new file mode 100644
index 00000000..00971986
--- /dev/null
+++ b/backend-R/.Rprofile
@@ -0,0 +1,15 @@
+# library(renv)
+
+# ?renv::settings
+
+renv::settings$snapshot.type("all")
+options(renv.config.auto.snapshot = TRUE)
+
+# ?renv::config
+
+# renv::config$auto.snapshot()
+
+# custom cache location
+# renv::paths$cache()
+
+source("renv/activate.R")
diff --git a/backend-R/README.md b/backend-R/README.md
new file mode 100644
index 00000000..681b5ba4
--- /dev/null
+++ b/backend-R/README.md
@@ -0,0 +1,22 @@
+
+
+
+## {renv}
+
+- ?renv::settings
+
+```
+> .libPaths()
+[1] "/workspaces/media-impact-monitor/backend-R/renv/library/R-4.3/x86_64-pc-linux-gnu"
+[2] "/usr/local/lib/R/site-library"
+[3] "/usr/lib/R/site-library"
+[4] "/usr/lib/R/library"
+```
+
+# Installed packages in global library: `/usr/lib/R/site-library`
+
+### Within renv project folder
+
+> .libPaths()
+[1] "/workspaces/media-impact-monitor/backend-R/renv/library/R-4.3/x86_64-pc-linux-gnu"
+[2] "/home/vscode/.cache/R/renv/sandbox/R-4.3/x86_64-pc-linux-gnu/9a444a72"
diff --git a/media-impact-monitor.Rproj b/backend-R/backend-R.Rproj
similarity index 100%
rename from media-impact-monitor.Rproj
rename to backend-R/backend-R.Rproj
diff --git a/backend-R/renv.lock b/backend-R/renv.lock
new file mode 100644
index 00000000..2da9e2c1
--- /dev/null
+++ b/backend-R/renv.lock
@@ -0,0 +1,2345 @@
+{
+ "R": {
+ "Version": "4.3.3",
+ "Repositories": [
+ {
+ "Name": "CRAN",
+ "URL": "https://cloud.r-project.org"
+ }
+ ]
+ },
+ "Packages": {
+ "DBI": {
+ "Package": "DBI",
+ "Version": "1.2.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "164809cd72e1d5160b4cb3aa57f510fe"
+ },
+ "MASS": {
+ "Package": "MASS",
+ "Version": "7.3-60.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "graphics",
+ "methods",
+ "stats",
+ "utils"
+ ],
+ "Hash": "b765b28387acc8ec9e9c1530713cb19c"
+ },
+ "Matrix": {
+ "Package": "Matrix",
+ "Version": "1.6-5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "graphics",
+ "grid",
+ "lattice",
+ "methods",
+ "stats",
+ "utils"
+ ],
+ "Hash": "8c7115cd3a0e048bda2a7cd110549f7a"
+ },
+ "R.cache": {
+ "Package": "R.cache",
+ "Version": "0.16.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R.methodsS3",
+ "R.oo",
+ "R.utils",
+ "digest",
+ "utils"
+ ],
+ "Hash": "fe539ca3f8efb7410c3ae2cf5fe6c0f8"
+ },
+ "R.methodsS3": {
+ "Package": "R.methodsS3",
+ "Version": "1.8.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "278c286fd6e9e75d0c2e8f731ea445c8"
+ },
+ "R.oo": {
+ "Package": "R.oo",
+ "Version": "1.26.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R.methodsS3",
+ "methods",
+ "utils"
+ ],
+ "Hash": "4fed809e53ddb5407b3da3d0f572e591"
+ },
+ "R.utils": {
+ "Package": "R.utils",
+ "Version": "2.12.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R.methodsS3",
+ "R.oo",
+ "methods",
+ "tools",
+ "utils"
+ ],
+ "Hash": "3dc2829b790254bfba21e60965787651"
+ },
+ "R6": {
+ "Package": "R6",
+ "Version": "2.5.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "470851b6d5d0ac559e9d01bb352b4021"
+ },
+ "RColorBrewer": {
+ "Package": "RColorBrewer",
+ "Version": "1.1-3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "45f0398006e83a5b10b72a90663d8d8c"
+ },
+ "Rcpp": {
+ "Package": "Rcpp",
+ "Version": "1.0.12",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods",
+ "utils"
+ ],
+ "Hash": "5ea2700d21e038ace58269ecdbeb9ec0"
+ },
+ "askpass": {
+ "Package": "askpass",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "sys"
+ ],
+ "Hash": "cad6cf7f1d5f6e906700b9d3e718c796"
+ },
+ "backports": {
+ "Package": "backports",
+ "Version": "1.4.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "c39fbec8a30d23e721980b8afb31984c"
+ },
+ "base64enc": {
+ "Package": "base64enc",
+ "Version": "0.1-3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "543776ae6848fde2f48ff3816d0628bc"
+ },
+ "bit": {
+ "Package": "bit",
+ "Version": "4.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "d242abec29412ce988848d0294b208fd"
+ },
+ "bit64": {
+ "Package": "bit64",
+ "Version": "4.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bit",
+ "methods",
+ "stats",
+ "utils"
+ ],
+ "Hash": "9fe98599ca456d6552421db0d6772d8f"
+ },
+ "blob": {
+ "Package": "blob",
+ "Version": "1.2.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "40415719b5a479b87949f3aa0aee737c"
+ },
+ "brew": {
+ "Package": "brew",
+ "Version": "1.0-10",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "8f4a384e19dccd8c65356dc096847b76"
+ },
+ "brio": {
+ "Package": "brio",
+ "Version": "1.1.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "68bd2b066e1fe780bbf62fc8bcc36de3"
+ },
+ "broom": {
+ "Package": "broom",
+ "Version": "1.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "backports",
+ "dplyr",
+ "ellipsis",
+ "generics",
+ "glue",
+ "lifecycle",
+ "purrr",
+ "rlang",
+ "stringr",
+ "tibble",
+ "tidyr"
+ ],
+ "Hash": "fd25391c3c4f6ecf0fa95f1e6d15378c"
+ },
+ "bslib": {
+ "Package": "bslib",
+ "Version": "0.6.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "base64enc",
+ "cachem",
+ "grDevices",
+ "htmltools",
+ "jquerylib",
+ "jsonlite",
+ "lifecycle",
+ "memoise",
+ "mime",
+ "rlang",
+ "sass"
+ ],
+ "Hash": "c0d8599494bc7fb408cd206bbdd9cab0"
+ },
+ "cachem": {
+ "Package": "cachem",
+ "Version": "1.0.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "fastmap",
+ "rlang"
+ ],
+ "Hash": "c35768291560ce302c0a6589f92e837d"
+ },
+ "callr": {
+ "Package": "callr",
+ "Version": "3.7.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "processx",
+ "utils"
+ ],
+ "Hash": "9f0e4fae4963ba775a5e5c520838c87b"
+ },
+ "cellranger": {
+ "Package": "cellranger",
+ "Version": "1.1.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "rematch",
+ "tibble"
+ ],
+ "Hash": "f61dbaec772ccd2e17705c1e872e9e7c"
+ },
+ "cli": {
+ "Package": "cli",
+ "Version": "3.6.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "1216ac65ac55ec0058a6f75d7ca0fd52"
+ },
+ "clipr": {
+ "Package": "clipr",
+ "Version": "0.8.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "3f038e5ac7f41d4ac41ce658c85e3042"
+ },
+ "codetools": {
+ "Package": "codetools",
+ "Version": "0.2-19",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "c089a619a7fae175d149d89164f8c7d8"
+ },
+ "collections": {
+ "Package": "collections",
+ "Version": "0.3.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "90a0eda114ab0bef170ddbf5ef0cd93f"
+ },
+ "colorspace": {
+ "Package": "colorspace",
+ "Version": "2.1-0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "graphics",
+ "methods",
+ "stats"
+ ],
+ "Hash": "f20c47fd52fae58b4e377c37bb8c335b"
+ },
+ "commonmark": {
+ "Package": "commonmark",
+ "Version": "1.9.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "5d8225445acb167abf7797de48b2ee3c"
+ },
+ "conflicted": {
+ "Package": "conflicted",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "memoise",
+ "rlang"
+ ],
+ "Hash": "bb097fccb22d156624fd07cd2894ddb6"
+ },
+ "cpp11": {
+ "Package": "cpp11",
+ "Version": "0.4.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "5a295d7d963cc5035284dcdbaf334f4e"
+ },
+ "crayon": {
+ "Package": "crayon",
+ "Version": "1.5.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "grDevices",
+ "methods",
+ "utils"
+ ],
+ "Hash": "e8a1e41acf02548751f45c718d55aa6a"
+ },
+ "credentials": {
+ "Package": "credentials",
+ "Version": "2.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "askpass",
+ "curl",
+ "jsonlite",
+ "openssl",
+ "sys"
+ ],
+ "Hash": "c7844b32098dcbd1c59cbd8dddb4ecc6"
+ },
+ "curl": {
+ "Package": "curl",
+ "Version": "5.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "411ca2c03b1ce5f548345d2fc2685f7a"
+ },
+ "cyclocomp": {
+ "Package": "cyclocomp",
+ "Version": "1.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "callr",
+ "crayon",
+ "desc",
+ "remotes",
+ "withr"
+ ],
+ "Hash": "cdc4a473222b0112d4df0bcfbed12d44"
+ },
+ "data.table": {
+ "Package": "data.table",
+ "Version": "1.15.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "536dfe4ac4093b5d115caed7a1a7223b"
+ },
+ "dbplyr": {
+ "Package": "dbplyr",
+ "Version": "2.4.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "DBI",
+ "R",
+ "R6",
+ "blob",
+ "cli",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "purrr",
+ "rlang",
+ "tibble",
+ "tidyr",
+ "tidyselect",
+ "utils",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "59351f28a81f0742720b85363c4fdd61"
+ },
+ "desc": {
+ "Package": "desc",
+ "Version": "1.4.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "utils"
+ ],
+ "Hash": "99b79fcbd6c4d1ce087f5c5c758b384f"
+ },
+ "devtools": {
+ "Package": "devtools",
+ "Version": "2.4.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "desc",
+ "ellipsis",
+ "fs",
+ "lifecycle",
+ "memoise",
+ "miniUI",
+ "pkgbuild",
+ "pkgdown",
+ "pkgload",
+ "profvis",
+ "rcmdcheck",
+ "remotes",
+ "rlang",
+ "roxygen2",
+ "rversions",
+ "sessioninfo",
+ "stats",
+ "testthat",
+ "tools",
+ "urlchecker",
+ "usethis",
+ "utils",
+ "withr"
+ ],
+ "Hash": "ea5bc8b4a6a01e4f12d98b58329930bb"
+ },
+ "diffobj": {
+ "Package": "diffobj",
+ "Version": "0.3.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "crayon",
+ "methods",
+ "stats",
+ "tools",
+ "utils"
+ ],
+ "Hash": "bcaa8b95f8d7d01a5dedfd959ce88ab8"
+ },
+ "digest": {
+ "Package": "digest",
+ "Version": "0.6.35",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "698ece7ba5a4fa4559e3d537e7ec3d31"
+ },
+ "downlit": {
+ "Package": "downlit",
+ "Version": "0.4.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "brio",
+ "desc",
+ "digest",
+ "evaluate",
+ "fansi",
+ "memoise",
+ "rlang",
+ "vctrs",
+ "withr",
+ "yaml"
+ ],
+ "Hash": "14fa1f248b60ed67e1f5418391a17b14"
+ },
+ "dplyr": {
+ "Package": "dplyr",
+ "Version": "1.1.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "generics",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "rlang",
+ "tibble",
+ "tidyselect",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "fedd9d00c2944ff00a0e2696ccf048ec"
+ },
+ "dtplyr": {
+ "Package": "dtplyr",
+ "Version": "1.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "data.table",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "tibble",
+ "tidyselect",
+ "vctrs"
+ ],
+ "Hash": "54ed3ea01b11e81a86544faaecfef8e2"
+ },
+ "ellipsis": {
+ "Package": "ellipsis",
+ "Version": "0.3.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "rlang"
+ ],
+ "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077"
+ },
+ "evaluate": {
+ "Package": "evaluate",
+ "Version": "0.23",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "daf4a1246be12c1fa8c7705a0935c1a0"
+ },
+ "fansi": {
+ "Package": "fansi",
+ "Version": "1.0.6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "utils"
+ ],
+ "Hash": "962174cf2aeb5b9eea581522286a911f"
+ },
+ "farver": {
+ "Package": "farver",
+ "Version": "2.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "8106d78941f34855c440ddb946b8f7a5"
+ },
+ "fastmap": {
+ "Package": "fastmap",
+ "Version": "1.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "f7736a18de97dea803bde0a2daaafb27"
+ },
+ "fontawesome": {
+ "Package": "fontawesome",
+ "Version": "0.5.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "htmltools",
+ "rlang"
+ ],
+ "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d"
+ },
+ "forcats": {
+ "Package": "forcats",
+ "Version": "1.0.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "tibble"
+ ],
+ "Hash": "1a0a9a3d5083d0d573c4214576f1e690"
+ },
+ "fs": {
+ "Package": "fs",
+ "Version": "1.6.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "47b5f30c720c23999b913a1a635cf0bb"
+ },
+ "gargle": {
+ "Package": "gargle",
+ "Version": "1.5.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "fs",
+ "glue",
+ "httr",
+ "jsonlite",
+ "lifecycle",
+ "openssl",
+ "rappdirs",
+ "rlang",
+ "stats",
+ "utils",
+ "withr"
+ ],
+ "Hash": "fc0b272e5847c58cd5da9b20eedbd026"
+ },
+ "generics": {
+ "Package": "generics",
+ "Version": "0.1.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "15e9634c0fcd294799e9b2e929ed1b86"
+ },
+ "gert": {
+ "Package": "gert",
+ "Version": "2.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "askpass",
+ "credentials",
+ "openssl",
+ "rstudioapi",
+ "sys",
+ "zip"
+ ],
+ "Hash": "f70d3fe2d9e7654213a946963d1591eb"
+ },
+ "ggplot2": {
+ "Package": "ggplot2",
+ "Version": "3.5.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "MASS",
+ "R",
+ "cli",
+ "glue",
+ "grDevices",
+ "grid",
+ "gtable",
+ "isoband",
+ "lifecycle",
+ "mgcv",
+ "rlang",
+ "scales",
+ "stats",
+ "tibble",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "52ef83f93f74833007f193b2d4c159a2"
+ },
+ "gh": {
+ "Package": "gh",
+ "Version": "1.4.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "gitcreds",
+ "httr2",
+ "ini",
+ "jsonlite",
+ "rlang"
+ ],
+ "Hash": "03533b1c875028233598f848fda44c4c"
+ },
+ "gitcreds": {
+ "Package": "gitcreds",
+ "Version": "0.1.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "ab08ac61f3e1be454ae21911eb8bc2fe"
+ },
+ "glue": {
+ "Package": "glue",
+ "Version": "1.7.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "e0b3a53876554bd45879e596cdb10a52"
+ },
+ "googledrive": {
+ "Package": "googledrive",
+ "Version": "2.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "gargle",
+ "glue",
+ "httr",
+ "jsonlite",
+ "lifecycle",
+ "magrittr",
+ "pillar",
+ "purrr",
+ "rlang",
+ "tibble",
+ "utils",
+ "uuid",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "e99641edef03e2a5e87f0a0b1fcc97f4"
+ },
+ "googlesheets4": {
+ "Package": "googlesheets4",
+ "Version": "1.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cellranger",
+ "cli",
+ "curl",
+ "gargle",
+ "glue",
+ "googledrive",
+ "httr",
+ "ids",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "purrr",
+ "rematch2",
+ "rlang",
+ "tibble",
+ "utils",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "d6db1667059d027da730decdc214b959"
+ },
+ "gtable": {
+ "Package": "gtable",
+ "Version": "0.3.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "grid",
+ "lifecycle",
+ "rlang"
+ ],
+ "Hash": "b29cf3031f49b04ab9c852c912547eef"
+ },
+ "haven": {
+ "Package": "haven",
+ "Version": "2.5.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "cpp11",
+ "forcats",
+ "hms",
+ "lifecycle",
+ "methods",
+ "readr",
+ "rlang",
+ "tibble",
+ "tidyselect",
+ "vctrs"
+ ],
+ "Hash": "9171f898db9d9c4c1b2c745adc2c1ef1"
+ },
+ "highr": {
+ "Package": "highr",
+ "Version": "0.10",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "xfun"
+ ],
+ "Hash": "06230136b2d2b9ba5805e1963fa6e890"
+ },
+ "hms": {
+ "Package": "hms",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "lifecycle",
+ "methods",
+ "pkgconfig",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "b59377caa7ed00fa41808342002138f9"
+ },
+ "htmltools": {
+ "Package": "htmltools",
+ "Version": "0.5.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "base64enc",
+ "digest",
+ "ellipsis",
+ "fastmap",
+ "grDevices",
+ "rlang",
+ "utils"
+ ],
+ "Hash": "2d7b3857980e0e0d0a1fd6f11928ab0f"
+ },
+ "htmlwidgets": {
+ "Package": "htmlwidgets",
+ "Version": "1.6.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "grDevices",
+ "htmltools",
+ "jsonlite",
+ "knitr",
+ "rmarkdown",
+ "yaml"
+ ],
+ "Hash": "04291cc45198225444a397606810ac37"
+ },
+ "httpuv": {
+ "Package": "httpuv",
+ "Version": "1.6.14",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "Rcpp",
+ "later",
+ "promises",
+ "utils"
+ ],
+ "Hash": "16abeb167dbf511f8cc0552efaf05bab"
+ },
+ "httr": {
+ "Package": "httr",
+ "Version": "1.4.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "curl",
+ "jsonlite",
+ "mime",
+ "openssl"
+ ],
+ "Hash": "ac107251d9d9fd72f0ca8049988f1d7f"
+ },
+ "httr2": {
+ "Package": "httr2",
+ "Version": "1.0.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "curl",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "openssl",
+ "rappdirs",
+ "rlang",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "e2b30f1fc039a0bab047dd52bb20ef71"
+ },
+ "ids": {
+ "Package": "ids",
+ "Version": "1.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "openssl",
+ "uuid"
+ ],
+ "Hash": "99df65cfef20e525ed38c3d2577f7190"
+ },
+ "ini": {
+ "Package": "ini",
+ "Version": "0.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "6154ec2223172bce8162d4153cda21f7"
+ },
+ "isoband": {
+ "Package": "isoband",
+ "Version": "0.2.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "grid",
+ "utils"
+ ],
+ "Hash": "0080607b4a1a7b28979aecef976d8bc2"
+ },
+ "jquerylib": {
+ "Package": "jquerylib",
+ "Version": "0.1.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "htmltools"
+ ],
+ "Hash": "5aab57a3bd297eee1c1d862735972182"
+ },
+ "jsonlite": {
+ "Package": "jsonlite",
+ "Version": "1.8.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods"
+ ],
+ "Hash": "e1b9c55281c5adc4dd113652d9e26768"
+ },
+ "knitr": {
+ "Package": "knitr",
+ "Version": "1.45",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "evaluate",
+ "highr",
+ "methods",
+ "tools",
+ "xfun",
+ "yaml"
+ ],
+ "Hash": "1ec462871063897135c1bcbe0fc8f07d"
+ },
+ "labeling": {
+ "Package": "labeling",
+ "Version": "0.4.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "graphics",
+ "stats"
+ ],
+ "Hash": "b64ec208ac5bc1852b285f665d6368b3"
+ },
+ "languageserver": {
+ "Package": "languageserver",
+ "Version": "0.3.16",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "callr",
+ "collections",
+ "fs",
+ "jsonlite",
+ "lintr",
+ "parallel",
+ "roxygen2",
+ "stringi",
+ "styler",
+ "tools",
+ "utils",
+ "xml2",
+ "xmlparsedata"
+ ],
+ "Hash": "f8901f44aedb6d7e7d03b5533986bd97"
+ },
+ "later": {
+ "Package": "later",
+ "Version": "1.3.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "Rcpp",
+ "rlang"
+ ],
+ "Hash": "a3e051d405326b8b0012377434c62b37"
+ },
+ "lattice": {
+ "Package": "lattice",
+ "Version": "0.22-5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "graphics",
+ "grid",
+ "stats",
+ "utils"
+ ],
+ "Hash": "7c5e89f04e72d6611c77451f6331a091"
+ },
+ "lazyeval": {
+ "Package": "lazyeval",
+ "Version": "0.2.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "d908914ae53b04d4c0c0fd72ecc35370"
+ },
+ "lifecycle": {
+ "Package": "lifecycle",
+ "Version": "1.0.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "rlang"
+ ],
+ "Hash": "b8552d117e1b808b09a832f589b79035"
+ },
+ "lintr": {
+ "Package": "lintr",
+ "Version": "3.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "backports",
+ "codetools",
+ "cyclocomp",
+ "digest",
+ "glue",
+ "knitr",
+ "rex",
+ "stats",
+ "utils",
+ "xml2",
+ "xmlparsedata"
+ ],
+ "Hash": "93e9379f4be8c0bf1862dfc7f720193e"
+ },
+ "lubridate": {
+ "Package": "lubridate",
+ "Version": "1.9.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "generics",
+ "methods",
+ "timechange"
+ ],
+ "Hash": "680ad542fbcf801442c83a6ac5a2126c"
+ },
+ "magrittr": {
+ "Package": "magrittr",
+ "Version": "2.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "7ce2733a9826b3aeb1775d56fd305472"
+ },
+ "memoise": {
+ "Package": "memoise",
+ "Version": "2.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "cachem",
+ "rlang"
+ ],
+ "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c"
+ },
+ "mgcv": {
+ "Package": "mgcv",
+ "Version": "1.9-1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "Matrix",
+ "R",
+ "graphics",
+ "methods",
+ "nlme",
+ "splines",
+ "stats",
+ "utils"
+ ],
+ "Hash": "110ee9d83b496279960e162ac97764ce"
+ },
+ "mime": {
+ "Package": "mime",
+ "Version": "0.12",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "tools"
+ ],
+ "Hash": "18e9c28c1d3ca1560ce30658b22ce104"
+ },
+ "miniUI": {
+ "Package": "miniUI",
+ "Version": "0.1.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "htmltools",
+ "shiny",
+ "utils"
+ ],
+ "Hash": "fec5f52652d60615fdb3957b3d74324a"
+ },
+ "modelr": {
+ "Package": "modelr",
+ "Version": "0.1.11",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "broom",
+ "magrittr",
+ "purrr",
+ "rlang",
+ "tibble",
+ "tidyr",
+ "tidyselect",
+ "vctrs"
+ ],
+ "Hash": "4f50122dc256b1b6996a4703fecea821"
+ },
+ "munsell": {
+ "Package": "munsell",
+ "Version": "0.5.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "colorspace",
+ "methods"
+ ],
+ "Hash": "6dfe8bf774944bd5595785e3229d8771"
+ },
+ "nlme": {
+ "Package": "nlme",
+ "Version": "3.1-164",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "graphics",
+ "lattice",
+ "stats",
+ "utils"
+ ],
+ "Hash": "a623a2239e642806158bc4dc3f51565d"
+ },
+ "openssl": {
+ "Package": "openssl",
+ "Version": "2.1.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "askpass"
+ ],
+ "Hash": "2a0dc8c6adfb6f032e4d4af82d258ab5"
+ },
+ "pillar": {
+ "Package": "pillar",
+ "Version": "1.9.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "cli",
+ "fansi",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "utf8",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "15da5a8412f317beeee6175fbc76f4bb"
+ },
+ "pkgbuild": {
+ "Package": "pkgbuild",
+ "Version": "1.4.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "callr",
+ "cli",
+ "desc",
+ "processx"
+ ],
+ "Hash": "c0143443203205e6a2760ce553dafc24"
+ },
+ "pkgconfig": {
+ "Package": "pkgconfig",
+ "Version": "2.0.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "01f28d4278f15c76cddbea05899c5d6f"
+ },
+ "pkgdown": {
+ "Package": "pkgdown",
+ "Version": "2.0.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bslib",
+ "callr",
+ "cli",
+ "desc",
+ "digest",
+ "downlit",
+ "fs",
+ "httr",
+ "jsonlite",
+ "magrittr",
+ "memoise",
+ "purrr",
+ "ragg",
+ "rlang",
+ "rmarkdown",
+ "tibble",
+ "whisker",
+ "withr",
+ "xml2",
+ "yaml"
+ ],
+ "Hash": "16fa15449c930bf3a7761d3c68f8abf9"
+ },
+ "pkgload": {
+ "Package": "pkgload",
+ "Version": "1.3.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "crayon",
+ "desc",
+ "fs",
+ "glue",
+ "methods",
+ "pkgbuild",
+ "rlang",
+ "rprojroot",
+ "utils",
+ "withr"
+ ],
+ "Hash": "876c618df5ae610be84356d5d7a5d124"
+ },
+ "praise": {
+ "Package": "praise",
+ "Version": "1.0.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "a555924add98c99d2f411e37e7d25e9f"
+ },
+ "prettyunits": {
+ "Package": "prettyunits",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7"
+ },
+ "processx": {
+ "Package": "processx",
+ "Version": "3.8.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "ps",
+ "utils"
+ ],
+ "Hash": "82d48b1aec56084d9438dbf98087a7e9"
+ },
+ "profvis": {
+ "Package": "profvis",
+ "Version": "0.3.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "htmlwidgets",
+ "purrr",
+ "rlang",
+ "stringr",
+ "vctrs"
+ ],
+ "Hash": "aa5a3864397ce6ae03458f98618395a1"
+ },
+ "progress": {
+ "Package": "progress",
+ "Version": "1.2.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "crayon",
+ "hms",
+ "prettyunits"
+ ],
+ "Hash": "f4625e061cb2865f111b47ff163a5ca6"
+ },
+ "promises": {
+ "Package": "promises",
+ "Version": "1.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "Rcpp",
+ "fastmap",
+ "later",
+ "magrittr",
+ "rlang",
+ "stats"
+ ],
+ "Hash": "0d8a15c9d000970ada1ab21405387dee"
+ },
+ "ps": {
+ "Package": "ps",
+ "Version": "1.7.6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "dd2b9319ee0656c8acf45c7f40c59de7"
+ },
+ "purrr": {
+ "Package": "purrr",
+ "Version": "1.0.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc"
+ },
+ "ragg": {
+ "Package": "ragg",
+ "Version": "1.2.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "systemfonts",
+ "textshaping"
+ ],
+ "Hash": "90a1b8b7e518d7f90480d56453b4d062"
+ },
+ "rappdirs": {
+ "Package": "rappdirs",
+ "Version": "0.3.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "5e3c5dc0b071b21fa128676560dbe94d"
+ },
+ "rcmdcheck": {
+ "Package": "rcmdcheck",
+ "Version": "1.4.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "callr",
+ "cli",
+ "curl",
+ "desc",
+ "digest",
+ "pkgbuild",
+ "prettyunits",
+ "rprojroot",
+ "sessioninfo",
+ "utils",
+ "withr",
+ "xopen"
+ ],
+ "Hash": "8f25ebe2ec38b1f2aef3b0d2ef76f6c4"
+ },
+ "readr": {
+ "Package": "readr",
+ "Version": "2.1.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "cli",
+ "clipr",
+ "cpp11",
+ "crayon",
+ "hms",
+ "lifecycle",
+ "methods",
+ "rlang",
+ "tibble",
+ "tzdb",
+ "utils",
+ "vroom"
+ ],
+ "Hash": "9de96463d2117f6ac49980577939dfb3"
+ },
+ "readxl": {
+ "Package": "readxl",
+ "Version": "1.4.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cellranger",
+ "cpp11",
+ "progress",
+ "tibble",
+ "utils"
+ ],
+ "Hash": "8cf9c239b96df1bbb133b74aef77ad0a"
+ },
+ "rematch": {
+ "Package": "rematch",
+ "Version": "2.0.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "cbff1b666c6fa6d21202f07e2318d4f1"
+ },
+ "rematch2": {
+ "Package": "rematch2",
+ "Version": "2.1.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "tibble"
+ ],
+ "Hash": "76c9e04c712a05848ae7a23d2f170a40"
+ },
+ "remotes": {
+ "Package": "remotes",
+ "Version": "2.4.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods",
+ "stats",
+ "tools",
+ "utils"
+ ],
+ "Hash": "63d15047eb239f95160112bcadc4fcb9"
+ },
+ "renv": {
+ "Package": "renv",
+ "Version": "1.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "utils"
+ ],
+ "Hash": "32c3f93e8360f667ca5863272ec8ba6a"
+ },
+ "reprex": {
+ "Package": "reprex",
+ "Version": "2.1.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "callr",
+ "cli",
+ "clipr",
+ "fs",
+ "glue",
+ "knitr",
+ "lifecycle",
+ "rlang",
+ "rmarkdown",
+ "rstudioapi",
+ "utils",
+ "withr"
+ ],
+ "Hash": "1425f91b4d5d9a8f25352c44a3d914ed"
+ },
+ "rex": {
+ "Package": "rex",
+ "Version": "1.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "lazyeval"
+ ],
+ "Hash": "ae34cd56890607370665bee5bd17812f"
+ },
+ "rlang": {
+ "Package": "rlang",
+ "Version": "1.1.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "utils"
+ ],
+ "Hash": "42548638fae05fd9a9b5f3f437fbbbe2"
+ },
+ "rmarkdown": {
+ "Package": "rmarkdown",
+ "Version": "2.26",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bslib",
+ "evaluate",
+ "fontawesome",
+ "htmltools",
+ "jquerylib",
+ "jsonlite",
+ "knitr",
+ "methods",
+ "tinytex",
+ "tools",
+ "utils",
+ "xfun",
+ "yaml"
+ ],
+ "Hash": "9b148e7f95d33aac01f31282d49e4f44"
+ },
+ "roxygen2": {
+ "Package": "roxygen2",
+ "Version": "7.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "brew",
+ "cli",
+ "commonmark",
+ "cpp11",
+ "desc",
+ "knitr",
+ "methods",
+ "pkgload",
+ "purrr",
+ "rlang",
+ "stringi",
+ "stringr",
+ "utils",
+ "withr",
+ "xml2"
+ ],
+ "Hash": "c25fe7b2d8cba73d1b63c947bf7afdb9"
+ },
+ "rprojroot": {
+ "Package": "rprojroot",
+ "Version": "2.0.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "4c8415e0ec1e29f3f4f6fc108bef0144"
+ },
+ "rstudio.prefs": {
+ "Package": "rstudio.prefs",
+ "Version": "0.1.9.9000",
+ "Source": "GitHub",
+ "RemoteType": "github",
+ "RemoteHost": "api.github.com",
+ "RemoteRepo": "rstudio.prefs",
+ "RemoteUsername": "ddsjoberg",
+ "RemoteRef": "HEAD",
+ "RemoteSha": "9ef2b57de07caaf415933a2173ada9b857323b0c",
+ "Requirements": [
+ "R",
+ "cli",
+ "dplyr",
+ "fs",
+ "jsonlite",
+ "purrr",
+ "rappdirs",
+ "rlang",
+ "rstudioapi",
+ "rvest",
+ "tibble"
+ ],
+ "Hash": "d08d957e76e72262efc6a9b310933858"
+ },
+ "rstudioapi": {
+ "Package": "rstudioapi",
+ "Version": "0.15.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "5564500e25cffad9e22244ced1379887"
+ },
+ "rversions": {
+ "Package": "rversions",
+ "Version": "2.1.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "curl",
+ "utils",
+ "xml2"
+ ],
+ "Hash": "a9881dfed103e83f9de151dc17002cd1"
+ },
+ "rvest": {
+ "Package": "rvest",
+ "Version": "1.0.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "httr",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "selectr",
+ "tibble",
+ "xml2"
+ ],
+ "Hash": "0bcf0c6f274e90ea314b812a6d19a519"
+ },
+ "sass": {
+ "Package": "sass",
+ "Version": "0.4.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R6",
+ "fs",
+ "htmltools",
+ "rappdirs",
+ "rlang"
+ ],
+ "Hash": "168f9353c76d4c4b0a0bbf72e2c2d035"
+ },
+ "scales": {
+ "Package": "scales",
+ "Version": "1.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "RColorBrewer",
+ "cli",
+ "farver",
+ "glue",
+ "labeling",
+ "lifecycle",
+ "munsell",
+ "rlang",
+ "viridisLite"
+ ],
+ "Hash": "c19df082ba346b0ffa6f833e92de34d1"
+ },
+ "selectr": {
+ "Package": "selectr",
+ "Version": "0.4-2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "methods",
+ "stringr"
+ ],
+ "Hash": "3838071b66e0c566d55cc26bd6e27bf4"
+ },
+ "sessioninfo": {
+ "Package": "sessioninfo",
+ "Version": "1.2.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "tools",
+ "utils"
+ ],
+ "Hash": "3f9796a8d0a0e8c6eb49a4b029359d1f"
+ },
+ "shiny": {
+ "Package": "shiny",
+ "Version": "1.8.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "bslib",
+ "cachem",
+ "commonmark",
+ "crayon",
+ "ellipsis",
+ "fastmap",
+ "fontawesome",
+ "glue",
+ "grDevices",
+ "htmltools",
+ "httpuv",
+ "jsonlite",
+ "later",
+ "lifecycle",
+ "methods",
+ "mime",
+ "promises",
+ "rlang",
+ "sourcetools",
+ "tools",
+ "utils",
+ "withr",
+ "xtable"
+ ],
+ "Hash": "3a1f41807d648a908e3c7f0334bf85e6"
+ },
+ "sourcetools": {
+ "Package": "sourcetools",
+ "Version": "0.1.7-1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "5f5a7629f956619d519205ec475fe647"
+ },
+ "stringi": {
+ "Package": "stringi",
+ "Version": "1.8.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "stats",
+ "tools",
+ "utils"
+ ],
+ "Hash": "058aebddea264f4c99401515182e656a"
+ },
+ "stringr": {
+ "Package": "stringr",
+ "Version": "1.5.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "rlang",
+ "stringi",
+ "vctrs"
+ ],
+ "Hash": "960e2ae9e09656611e0b8214ad543207"
+ },
+ "styler": {
+ "Package": "styler",
+ "Version": "1.10.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R.cache",
+ "cli",
+ "magrittr",
+ "purrr",
+ "rlang",
+ "rprojroot",
+ "tools",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "d61238fd44fc63c8adf4565efe8eb682"
+ },
+ "sys": {
+ "Package": "sys",
+ "Version": "3.4.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "3a1be13d68d47a8cd0bfd74739ca1555"
+ },
+ "systemfonts": {
+ "Package": "systemfonts",
+ "Version": "1.0.6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "6d538cff441f0f1f36db2209ac7495ac"
+ },
+ "testthat": {
+ "Package": "testthat",
+ "Version": "3.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "brio",
+ "callr",
+ "cli",
+ "desc",
+ "digest",
+ "evaluate",
+ "jsonlite",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pkgload",
+ "praise",
+ "processx",
+ "ps",
+ "rlang",
+ "utils",
+ "waldo",
+ "withr"
+ ],
+ "Hash": "4767a686ebe986e6cb01d075b3f09729"
+ },
+ "textshaping": {
+ "Package": "textshaping",
+ "Version": "0.3.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11",
+ "systemfonts"
+ ],
+ "Hash": "997aac9ad649e0ef3b97f96cddd5622b"
+ },
+ "tibble": {
+ "Package": "tibble",
+ "Version": "3.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "fansi",
+ "lifecycle",
+ "magrittr",
+ "methods",
+ "pillar",
+ "pkgconfig",
+ "rlang",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "a84e2cc86d07289b3b6f5069df7a004c"
+ },
+ "tidyr": {
+ "Package": "tidyr",
+ "Version": "1.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "cpp11",
+ "dplyr",
+ "glue",
+ "lifecycle",
+ "magrittr",
+ "purrr",
+ "rlang",
+ "stringr",
+ "tibble",
+ "tidyselect",
+ "utils",
+ "vctrs"
+ ],
+ "Hash": "915fb7ce036c22a6a33b5a8adb712eb1"
+ },
+ "tidyselect": {
+ "Package": "tidyselect",
+ "Version": "1.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "rlang",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "829f27b9c4919c16b593794a6344d6c0"
+ },
+ "tidyverse": {
+ "Package": "tidyverse",
+ "Version": "2.0.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "broom",
+ "cli",
+ "conflicted",
+ "dbplyr",
+ "dplyr",
+ "dtplyr",
+ "forcats",
+ "ggplot2",
+ "googledrive",
+ "googlesheets4",
+ "haven",
+ "hms",
+ "httr",
+ "jsonlite",
+ "lubridate",
+ "magrittr",
+ "modelr",
+ "pillar",
+ "purrr",
+ "ragg",
+ "readr",
+ "readxl",
+ "reprex",
+ "rlang",
+ "rstudioapi",
+ "rvest",
+ "stringr",
+ "tibble",
+ "tidyr",
+ "xml2"
+ ],
+ "Hash": "c328568cd14ea89a83bd4ca7f54ae07e"
+ },
+ "timechange": {
+ "Package": "timechange",
+ "Version": "0.3.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "c5f3c201b931cd6474d17d8700ccb1c8"
+ },
+ "tinytex": {
+ "Package": "tinytex",
+ "Version": "0.49",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "xfun"
+ ],
+ "Hash": "5ac22900ae0f386e54f1c307eca7d843"
+ },
+ "tzdb": {
+ "Package": "tzdb",
+ "Version": "0.4.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11"
+ ],
+ "Hash": "f561504ec2897f4d46f0c7657e488ae1"
+ },
+ "urlchecker": {
+ "Package": "urlchecker",
+ "Version": "1.0.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "curl",
+ "tools",
+ "xml2"
+ ],
+ "Hash": "409328b8e1253c8d729a7836fe7f7a16"
+ },
+ "usethis": {
+ "Package": "usethis",
+ "Version": "2.2.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "clipr",
+ "crayon",
+ "curl",
+ "desc",
+ "fs",
+ "gert",
+ "gh",
+ "glue",
+ "jsonlite",
+ "lifecycle",
+ "purrr",
+ "rappdirs",
+ "rlang",
+ "rprojroot",
+ "rstudioapi",
+ "stats",
+ "utils",
+ "whisker",
+ "withr",
+ "yaml"
+ ],
+ "Hash": "d524fd42c517035027f866064417d7e6"
+ },
+ "utf8": {
+ "Package": "utf8",
+ "Version": "1.2.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "62b65c52671e6665f803ff02954446e9"
+ },
+ "uuid": {
+ "Package": "uuid",
+ "Version": "1.2-0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "303c19bfd970bece872f93a824e323d9"
+ },
+ "vctrs": {
+ "Package": "vctrs",
+ "Version": "0.6.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "glue",
+ "lifecycle",
+ "rlang"
+ ],
+ "Hash": "c03fa420630029418f7e6da3667aac4a"
+ },
+ "viridisLite": {
+ "Package": "viridisLite",
+ "Version": "0.4.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "c826c7c4241b6fc89ff55aaea3fa7491"
+ },
+ "vroom": {
+ "Package": "vroom",
+ "Version": "1.6.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "bit64",
+ "cli",
+ "cpp11",
+ "crayon",
+ "glue",
+ "hms",
+ "lifecycle",
+ "methods",
+ "progress",
+ "rlang",
+ "stats",
+ "tibble",
+ "tidyselect",
+ "tzdb",
+ "vctrs",
+ "withr"
+ ],
+ "Hash": "390f9315bc0025be03012054103d227c"
+ },
+ "waldo": {
+ "Package": "waldo",
+ "Version": "0.5.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "diffobj",
+ "fansi",
+ "glue",
+ "methods",
+ "rematch2",
+ "rlang",
+ "tibble"
+ ],
+ "Hash": "c7d3fd6d29ab077cbac8f0e2751449e6"
+ },
+ "whisker": {
+ "Package": "whisker",
+ "Version": "0.4.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "c6abfa47a46d281a7d5159d0a8891e88"
+ },
+ "withr": {
+ "Package": "withr",
+ "Version": "3.0.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "grDevices",
+ "graphics"
+ ],
+ "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35"
+ },
+ "xfun": {
+ "Package": "xfun",
+ "Version": "0.42",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "grDevices",
+ "stats",
+ "tools"
+ ],
+ "Hash": "fd1349170df31f7a10bd98b0189e85af"
+ },
+ "xml2": {
+ "Package": "xml2",
+ "Version": "1.3.6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "methods",
+ "rlang"
+ ],
+ "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61"
+ },
+ "xmlparsedata": {
+ "Package": "xmlparsedata",
+ "Version": "1.0.5",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "45e4bf3c46476896e821fc0a408fb4fc"
+ },
+ "xopen": {
+ "Package": "xopen",
+ "Version": "1.0.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "processx"
+ ],
+ "Hash": "6c85f015dee9cc7710ddd20f86881f58"
+ },
+ "xtable": {
+ "Package": "xtable",
+ "Version": "1.8-4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "stats",
+ "utils"
+ ],
+ "Hash": "b8acdf8af494d9ec19ccb2481a9b11c2"
+ },
+ "yaml": {
+ "Package": "yaml",
+ "Version": "2.3.8",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "29240487a071f535f5e5d5a323b7afbd"
+ },
+ "zip": {
+ "Package": "zip",
+ "Version": "2.3.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "fcc4bd8e6da2d2011eb64a5e5cc685ab"
+ }
+ }
+}
diff --git a/backend-R/renv/.gitignore b/backend-R/renv/.gitignore
new file mode 100644
index 00000000..0ec0cbba
--- /dev/null
+++ b/backend-R/renv/.gitignore
@@ -0,0 +1,7 @@
+library/
+local/
+cellar/
+lock/
+python/
+sandbox/
+staging/
diff --git a/backend-R/renv/activate.R b/backend-R/renv/activate.R
new file mode 100644
index 00000000..9b2e7f18
--- /dev/null
+++ b/backend-R/renv/activate.R
@@ -0,0 +1,1201 @@
+
+local({
+
+ # the requested version of renv
+ version <- "1.0.5"
+ attr(version, "sha") <- NULL
+
+ # the project directory
+ project <- getwd()
+
+ # use start-up diagnostics if enabled
+ diagnostics <- Sys.getenv("RENV_STARTUP_DIAGNOSTICS", unset = "FALSE")
+ if (diagnostics) {
+ start <- Sys.time()
+ profile <- tempfile("renv-startup-", fileext = ".Rprof")
+ utils::Rprof(profile)
+ on.exit({
+ utils::Rprof(NULL)
+ elapsed <- signif(difftime(Sys.time(), start, units = "auto"), digits = 2L)
+ writeLines(sprintf("- renv took %s to run the autoloader.", format(elapsed)))
+ writeLines(sprintf("- Profile: %s", profile))
+ print(utils::summaryRprof(profile))
+ }, add = TRUE)
+ }
+
+ # figure out whether the autoloader is enabled
+ enabled <- local({
+
+ # first, check config option
+ override <- getOption("renv.config.autoloader.enabled")
+ if (!is.null(override))
+ return(override)
+
+ # if we're being run in a context where R_LIBS is already set,
+ # don't load -- presumably we're being run as a sub-process and
+ # the parent process has already set up library paths for us
+ rcmd <- Sys.getenv("R_CMD", unset = NA)
+ rlibs <- Sys.getenv("R_LIBS", unset = NA)
+ if (!is.na(rlibs) && !is.na(rcmd))
+ return(FALSE)
+
+ # next, check environment variables
+ # TODO: prefer using the configuration one in the future
+ envvars <- c(
+ "RENV_CONFIG_AUTOLOADER_ENABLED",
+ "RENV_AUTOLOADER_ENABLED",
+ "RENV_ACTIVATE_PROJECT"
+ )
+
+ for (envvar in envvars) {
+ envval <- Sys.getenv(envvar, unset = NA)
+ if (!is.na(envval))
+ return(tolower(envval) %in% c("true", "t", "1"))
+ }
+
+ # enable by default
+ TRUE
+
+ })
+
+ # bail if we're not enabled
+ if (!enabled) {
+
+ # if we're not enabled, we might still need to manually load
+ # the user profile here
+ profile <- Sys.getenv("R_PROFILE_USER", unset = "~/.Rprofile")
+ if (file.exists(profile)) {
+ cfg <- Sys.getenv("RENV_CONFIG_USER_PROFILE", unset = "TRUE")
+ if (tolower(cfg) %in% c("true", "t", "1"))
+ sys.source(profile, envir = globalenv())
+ }
+
+ return(FALSE)
+
+ }
+
+ # avoid recursion
+ if (identical(getOption("renv.autoloader.running"), TRUE)) {
+ warning("ignoring recursive attempt to run renv autoloader")
+ return(invisible(TRUE))
+ }
+
+ # signal that we're loading renv during R startup
+ options(renv.autoloader.running = TRUE)
+ on.exit(options(renv.autoloader.running = NULL), add = TRUE)
+
+ # signal that we've consented to use renv
+ options(renv.consent = TRUE)
+
+ # load the 'utils' package eagerly -- this ensures that renv shims, which
+ # mask 'utils' packages, will come first on the search path
+ library(utils, lib.loc = .Library)
+
+ # unload renv if it's already been loaded
+ if ("renv" %in% loadedNamespaces())
+ unloadNamespace("renv")
+
+ # load bootstrap tools
+ `%||%` <- function(x, y) {
+ if (is.null(x)) y else x
+ }
+
+ catf <- function(fmt, ..., appendLF = TRUE) {
+
+ quiet <- getOption("renv.bootstrap.quiet", default = FALSE)
+ if (quiet)
+ return(invisible())
+
+ msg <- sprintf(fmt, ...)
+ cat(msg, file = stdout(), sep = if (appendLF) "\n" else "")
+
+ invisible(msg)
+
+ }
+
+ header <- function(label,
+ ...,
+ prefix = "#",
+ suffix = "-",
+ n = min(getOption("width"), 78))
+ {
+ label <- sprintf(label, ...)
+ n <- max(n - nchar(label) - nchar(prefix) - 2L, 8L)
+ if (n <= 0)
+ return(paste(prefix, label))
+
+ tail <- paste(rep.int(suffix, n), collapse = "")
+ paste0(prefix, " ", label, " ", tail)
+
+ }
+
+ startswith <- function(string, prefix) {
+ substring(string, 1, nchar(prefix)) == prefix
+ }
+
+ bootstrap <- function(version, library) {
+
+ friendly <- renv_bootstrap_version_friendly(version)
+ section <- header(sprintf("Bootstrapping renv %s", friendly))
+ catf(section)
+
+ # attempt to download renv
+ catf("- Downloading renv ... ", appendLF = FALSE)
+ withCallingHandlers(
+ tarball <- renv_bootstrap_download(version),
+ error = function(err) {
+ catf("FAILED")
+ stop("failed to download:\n", conditionMessage(err))
+ }
+ )
+ catf("OK")
+ on.exit(unlink(tarball), add = TRUE)
+
+ # now attempt to install
+ catf("- Installing renv ... ", appendLF = FALSE)
+ withCallingHandlers(
+ status <- renv_bootstrap_install(version, tarball, library),
+ error = function(err) {
+ catf("FAILED")
+ stop("failed to install:\n", conditionMessage(err))
+ }
+ )
+ catf("OK")
+
+ # add empty line to break up bootstrapping from normal output
+ catf("")
+
+ return(invisible())
+ }
+
+ renv_bootstrap_tests_running <- function() {
+ getOption("renv.tests.running", default = FALSE)
+ }
+
+ renv_bootstrap_repos <- function() {
+
+ # get CRAN repository
+ cran <- getOption("renv.repos.cran", "https://cloud.r-project.org")
+
+ # check for repos override
+ repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA)
+ if (!is.na(repos)) {
+
+ # check for RSPM; if set, use a fallback repository for renv
+ rspm <- Sys.getenv("RSPM", unset = NA)
+ if (identical(rspm, repos))
+ repos <- c(RSPM = rspm, CRAN = cran)
+
+ return(repos)
+
+ }
+
+ # check for lockfile repositories
+ repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity)
+ if (!inherits(repos, "error") && length(repos))
+ return(repos)
+
+ # retrieve current repos
+ repos <- getOption("repos")
+
+ # ensure @CRAN@ entries are resolved
+ repos[repos == "@CRAN@"] <- cran
+
+ # add in renv.bootstrap.repos if set
+ default <- c(FALLBACK = "https://cloud.r-project.org")
+ extra <- getOption("renv.bootstrap.repos", default = default)
+ repos <- c(repos, extra)
+
+ # remove duplicates that might've snuck in
+ dupes <- duplicated(repos) | duplicated(names(repos))
+ repos[!dupes]
+
+ }
+
+ renv_bootstrap_repos_lockfile <- function() {
+
+ lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock")
+ if (!file.exists(lockpath))
+ return(NULL)
+
+ lockfile <- tryCatch(renv_json_read(lockpath), error = identity)
+ if (inherits(lockfile, "error")) {
+ warning(lockfile)
+ return(NULL)
+ }
+
+ repos <- lockfile$R$Repositories
+ if (length(repos) == 0)
+ return(NULL)
+
+ keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1))
+ vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1))
+ names(vals) <- keys
+
+ return(vals)
+
+ }
+
+ renv_bootstrap_download <- function(version) {
+
+ sha <- attr(version, "sha", exact = TRUE)
+
+ methods <- if (!is.null(sha)) {
+
+ # attempting to bootstrap a development version of renv
+ c(
+ function() renv_bootstrap_download_tarball(sha),
+ function() renv_bootstrap_download_github(sha)
+ )
+
+ } else {
+
+ # attempting to bootstrap a release version of renv
+ c(
+ function() renv_bootstrap_download_tarball(version),
+ function() renv_bootstrap_download_cran_latest(version),
+ function() renv_bootstrap_download_cran_archive(version)
+ )
+
+ }
+
+ for (method in methods) {
+ path <- tryCatch(method(), error = identity)
+ if (is.character(path) && file.exists(path))
+ return(path)
+ }
+
+ stop("All download methods failed")
+
+ }
+
+ renv_bootstrap_download_impl <- function(url, destfile) {
+
+ mode <- "wb"
+
+ # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715
+ fixup <-
+ Sys.info()[["sysname"]] == "Windows" &&
+ substring(url, 1L, 5L) == "file:"
+
+ if (fixup)
+ mode <- "w+b"
+
+ args <- list(
+ url = url,
+ destfile = destfile,
+ mode = mode,
+ quiet = TRUE
+ )
+
+ if ("headers" %in% names(formals(utils::download.file)))
+ args$headers <- renv_bootstrap_download_custom_headers(url)
+
+ do.call(utils::download.file, args)
+
+ }
+
+ renv_bootstrap_download_custom_headers <- function(url) {
+
+ headers <- getOption("renv.download.headers")
+ if (is.null(headers))
+ return(character())
+
+ if (!is.function(headers))
+ stopf("'renv.download.headers' is not a function")
+
+ headers <- headers(url)
+ if (length(headers) == 0L)
+ return(character())
+
+ if (is.list(headers))
+ headers <- unlist(headers, recursive = FALSE, use.names = TRUE)
+
+ ok <-
+ is.character(headers) &&
+ is.character(names(headers)) &&
+ all(nzchar(names(headers)))
+
+ if (!ok)
+ stop("invocation of 'renv.download.headers' did not return a named character vector")
+
+ headers
+
+ }
+
+ renv_bootstrap_download_cran_latest <- function(version) {
+
+ spec <- renv_bootstrap_download_cran_latest_find(version)
+ type <- spec$type
+ repos <- spec$repos
+
+ baseurl <- utils::contrib.url(repos = repos, type = type)
+ ext <- if (identical(type, "source"))
+ ".tar.gz"
+ else if (Sys.info()[["sysname"]] == "Windows")
+ ".zip"
+ else
+ ".tgz"
+ name <- sprintf("renv_%s%s", version, ext)
+ url <- paste(baseurl, name, sep = "/")
+
+ destfile <- file.path(tempdir(), name)
+ status <- tryCatch(
+ renv_bootstrap_download_impl(url, destfile),
+ condition = identity
+ )
+
+ if (inherits(status, "condition"))
+ return(FALSE)
+
+ # report success and return
+ destfile
+
+ }
+
+ renv_bootstrap_download_cran_latest_find <- function(version) {
+
+ # check whether binaries are supported on this system
+ binary <-
+ getOption("renv.bootstrap.binary", default = TRUE) &&
+ !identical(.Platform$pkgType, "source") &&
+ !identical(getOption("pkgType"), "source") &&
+ Sys.info()[["sysname"]] %in% c("Darwin", "Windows")
+
+ types <- c(if (binary) "binary", "source")
+
+ # iterate over types + repositories
+ for (type in types) {
+ for (repos in renv_bootstrap_repos()) {
+
+ # retrieve package database
+ db <- tryCatch(
+ as.data.frame(
+ utils::available.packages(type = type, repos = repos),
+ stringsAsFactors = FALSE
+ ),
+ error = identity
+ )
+
+ if (inherits(db, "error"))
+ next
+
+ # check for compatible entry
+ entry <- db[db$Package %in% "renv" & db$Version %in% version, ]
+ if (nrow(entry) == 0)
+ next
+
+ # found it; return spec to caller
+ spec <- list(entry = entry, type = type, repos = repos)
+ return(spec)
+
+ }
+ }
+
+ # if we got here, we failed to find renv
+ fmt <- "renv %s is not available from your declared package repositories"
+ stop(sprintf(fmt, version))
+
+ }
+
+ renv_bootstrap_download_cran_archive <- function(version) {
+
+ name <- sprintf("renv_%s.tar.gz", version)
+ repos <- renv_bootstrap_repos()
+ urls <- file.path(repos, "src/contrib/Archive/renv", name)
+ destfile <- file.path(tempdir(), name)
+
+ for (url in urls) {
+
+ status <- tryCatch(
+ renv_bootstrap_download_impl(url, destfile),
+ condition = identity
+ )
+
+ if (identical(status, 0L))
+ return(destfile)
+
+ }
+
+ return(FALSE)
+
+ }
+
+ renv_bootstrap_download_tarball <- function(version) {
+
+ # if the user has provided the path to a tarball via
+ # an environment variable, then use it
+ tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA)
+ if (is.na(tarball))
+ return()
+
+ # allow directories
+ if (dir.exists(tarball)) {
+ name <- sprintf("renv_%s.tar.gz", version)
+ tarball <- file.path(tarball, name)
+ }
+
+ # bail if it doesn't exist
+ if (!file.exists(tarball)) {
+
+ # let the user know we weren't able to honour their request
+ fmt <- "- RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist."
+ msg <- sprintf(fmt, tarball)
+ warning(msg)
+
+ # bail
+ return()
+
+ }
+
+ catf("- Using local tarball '%s'.", tarball)
+ tarball
+
+ }
+
+ renv_bootstrap_download_github <- function(version) {
+
+ enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE")
+ if (!identical(enabled, "TRUE"))
+ return(FALSE)
+
+ # prepare download options
+ pat <- Sys.getenv("GITHUB_PAT")
+ if (nzchar(Sys.which("curl")) && nzchar(pat)) {
+ fmt <- "--location --fail --header \"Authorization: token %s\""
+ extra <- sprintf(fmt, pat)
+ 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)) {
+ fmt <- "--header=\"Authorization: token %s\""
+ extra <- sprintf(fmt, pat)
+ saved <- options("download.file.method", "download.file.extra")
+ options(download.file.method = "wget", download.file.extra = extra)
+ on.exit(do.call(base::options, saved), add = TRUE)
+ }
+
+ url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version)
+ name <- sprintf("renv_%s.tar.gz", version)
+ destfile <- file.path(tempdir(), name)
+
+ status <- tryCatch(
+ renv_bootstrap_download_impl(url, destfile),
+ condition = identity
+ )
+
+ if (!identical(status, 0L))
+ return(FALSE)
+
+ renv_bootstrap_download_augment(destfile)
+
+ return(destfile)
+
+ }
+
+ # Add Sha to DESCRIPTION. This is stop gap until #890, after which we
+ # can use renv::install() to fully capture metadata.
+ renv_bootstrap_download_augment <- function(destfile) {
+ sha <- renv_bootstrap_git_extract_sha1_tar(destfile)
+ if (is.null(sha)) {
+ return()
+ }
+
+ # Untar
+ tempdir <- tempfile("renv-github-")
+ on.exit(unlink(tempdir, recursive = TRUE), add = TRUE)
+ untar(destfile, exdir = tempdir)
+ pkgdir <- dir(tempdir, full.names = TRUE)[[1]]
+
+ # Modify description
+ desc_path <- file.path(pkgdir, "DESCRIPTION")
+ desc_lines <- readLines(desc_path)
+ remotes_fields <- c(
+ "RemoteType: github",
+ "RemoteHost: api.github.com",
+ "RemoteRepo: renv",
+ "RemoteUsername: rstudio",
+ "RemotePkgRef: rstudio/renv",
+ paste("RemoteRef: ", sha),
+ paste("RemoteSha: ", sha)
+ )
+ writeLines(c(desc_lines[desc_lines != ""], remotes_fields), con = desc_path)
+
+ # Re-tar
+ local({
+ old <- setwd(tempdir)
+ on.exit(setwd(old), add = TRUE)
+
+ tar(destfile, compression = "gzip")
+ })
+ invisible()
+ }
+
+ # Extract the commit hash from a git archive. Git archives include the SHA1
+ # hash as the comment field of the tarball pax extended header
+ # (see https://www.kernel.org/pub/software/scm/git/docs/git-archive.html)
+ # For GitHub archives this should be the first header after the default one
+ # (512 byte) header.
+ renv_bootstrap_git_extract_sha1_tar <- function(bundle) {
+
+ # open the bundle for reading
+ # We use gzcon for everything because (from ?gzcon)
+ # > Reading from a connection which does not supply a 'gzip' magic
+ # > header is equivalent to reading from the original connection
+ conn <- gzcon(file(bundle, open = "rb", raw = TRUE))
+ on.exit(close(conn))
+
+ # The default pax header is 512 bytes long and the first pax extended header
+ # with the comment should be 51 bytes long
+ # `52 comment=` (11 chars) + 40 byte SHA1 hash
+ len <- 0x200 + 0x33
+ res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len])
+
+ if (grepl("^52 comment=", res)) {
+ sub("52 comment=", "", res)
+ } else {
+ NULL
+ }
+ }
+
+ renv_bootstrap_install <- function(version, tarball, library) {
+
+ # attempt to install it into project library
+ dir.create(library, showWarnings = FALSE, recursive = TRUE)
+ output <- renv_bootstrap_install_impl(library, tarball)
+
+ # check for successful install
+ status <- attr(output, "status")
+ if (is.null(status) || identical(status, 0L))
+ return(status)
+
+ # an error occurred; report it
+ header <- "installation of renv failed"
+ lines <- paste(rep.int("=", nchar(header)), collapse = "")
+ text <- paste(c(header, lines, output), collapse = "\n")
+ stop(text)
+
+ }
+
+ renv_bootstrap_install_impl <- function(library, tarball) {
+
+ # invoke using system2 so we can capture and report output
+ bin <- R.home("bin")
+ exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R"
+ R <- file.path(bin, exe)
+
+ args <- c(
+ "--vanilla", "CMD", "INSTALL", "--no-multiarch",
+ "-l", shQuote(path.expand(library)),
+ shQuote(path.expand(tarball))
+ )
+
+ system2(R, args, stdout = TRUE, stderr = TRUE)
+
+ }
+
+ renv_bootstrap_platform_prefix <- function() {
+
+ # construct version prefix
+ version <- paste(R.version$major, R.version$minor, sep = ".")
+ prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-")
+
+ # include SVN revision for development versions of R
+ # (to avoid sharing platform-specific artefacts with released versions of R)
+ devel <-
+ identical(R.version[["status"]], "Under development (unstable)") ||
+ identical(R.version[["nickname"]], "Unsuffered Consequences")
+
+ if (devel)
+ prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r")
+
+ # build list of path components
+ components <- c(prefix, R.version$platform)
+
+ # include prefix if provided by user
+ prefix <- renv_bootstrap_platform_prefix_impl()
+ if (!is.na(prefix) && nzchar(prefix))
+ components <- c(prefix, components)
+
+ # build prefix
+ paste(components, collapse = "/")
+
+ }
+
+ renv_bootstrap_platform_prefix_impl <- function() {
+
+ # if an explicit prefix has been supplied, use it
+ prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA)
+ if (!is.na(prefix))
+ return(prefix)
+
+ # if the user has requested an automatic prefix, generate it
+ auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA)
+ if (auto %in% c("TRUE", "True", "true", "1"))
+ return(renv_bootstrap_platform_prefix_auto())
+
+ # empty string on failure
+ ""
+
+ }
+
+ renv_bootstrap_platform_prefix_auto <- function() {
+
+ prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity)
+ if (inherits(prefix, "error") || prefix %in% "unknown") {
+
+ msg <- paste(
+ "failed to infer current operating system",
+ "please file a bug report at https://github.com/rstudio/renv/issues",
+ sep = "; "
+ )
+
+ warning(msg)
+
+ }
+
+ prefix
+
+ }
+
+ renv_bootstrap_platform_os <- function() {
+
+ sysinfo <- Sys.info()
+ sysname <- sysinfo[["sysname"]]
+
+ # handle Windows + macOS up front
+ if (sysname == "Windows")
+ return("windows")
+ else if (sysname == "Darwin")
+ return("macos")
+
+ # check for os-release files
+ for (file in c("/etc/os-release", "/usr/lib/os-release"))
+ if (file.exists(file))
+ return(renv_bootstrap_platform_os_via_os_release(file, sysinfo))
+
+ # check for redhat-release files
+ if (file.exists("/etc/redhat-release"))
+ return(renv_bootstrap_platform_os_via_redhat_release())
+
+ "unknown"
+
+ }
+
+ renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) {
+
+ # read /etc/os-release
+ release <- utils::read.table(
+ file = file,
+ sep = "=",
+ quote = c("\"", "'"),
+ col.names = c("Key", "Value"),
+ comment.char = "#",
+ stringsAsFactors = FALSE
+ )
+
+ vars <- as.list(release$Value)
+ names(vars) <- release$Key
+
+ # get os name
+ os <- tolower(sysinfo[["sysname"]])
+
+ # read id
+ id <- "unknown"
+ for (field in c("ID", "ID_LIKE")) {
+ if (field %in% names(vars) && nzchar(vars[[field]])) {
+ id <- vars[[field]]
+ break
+ }
+ }
+
+ # read version
+ version <- "unknown"
+ for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) {
+ if (field %in% names(vars) && nzchar(vars[[field]])) {
+ version <- vars[[field]]
+ break
+ }
+ }
+
+ # join together
+ paste(c(os, id, version), collapse = "-")
+
+ }
+
+ renv_bootstrap_platform_os_via_redhat_release <- function() {
+
+ # read /etc/redhat-release
+ contents <- readLines("/etc/redhat-release", warn = FALSE)
+
+ # infer id
+ id <- if (grepl("centos", contents, ignore.case = TRUE))
+ "centos"
+ else if (grepl("redhat", contents, ignore.case = TRUE))
+ "redhat"
+ else
+ "unknown"
+
+ # try to find a version component (very hacky)
+ version <- "unknown"
+
+ parts <- strsplit(contents, "[[:space:]]")[[1L]]
+ for (part in parts) {
+
+ nv <- tryCatch(numeric_version(part), error = identity)
+ if (inherits(nv, "error"))
+ next
+
+ version <- nv[1, 1]
+ break
+
+ }
+
+ paste(c("linux", id, version), collapse = "-")
+
+ }
+
+ renv_bootstrap_library_root_name <- function(project) {
+
+ # use project name as-is if requested
+ asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE")
+ if (asis)
+ return(basename(project))
+
+ # otherwise, disambiguate based on project's path
+ id <- substring(renv_bootstrap_hash_text(project), 1L, 8L)
+ paste(basename(project), id, sep = "-")
+
+ }
+
+ renv_bootstrap_library_root <- function(project) {
+
+ prefix <- renv_bootstrap_profile_prefix()
+
+ path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA)
+ if (!is.na(path))
+ return(paste(c(path, prefix), collapse = "/"))
+
+ path <- renv_bootstrap_library_root_impl(project)
+ if (!is.null(path)) {
+ name <- renv_bootstrap_library_root_name(project)
+ return(paste(c(path, prefix, name), collapse = "/"))
+ }
+
+ renv_bootstrap_paths_renv("library", project = project)
+
+ }
+
+ renv_bootstrap_library_root_impl <- function(project) {
+
+ root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA)
+ if (!is.na(root))
+ return(root)
+
+ type <- renv_bootstrap_project_type(project)
+ if (identical(type, "package")) {
+ userdir <- renv_bootstrap_user_dir()
+ return(file.path(userdir, "library"))
+ }
+
+ }
+
+ renv_bootstrap_validate_version <- function(version, description = NULL) {
+
+ # resolve description file
+ #
+ # avoid passing lib.loc to `packageDescription()` below, since R will
+ # use the loaded version of the package by default anyhow. note that
+ # this function should only be called after 'renv' is loaded
+ # https://github.com/rstudio/renv/issues/1625
+ description <- description %||% packageDescription("renv")
+
+ # check whether requested version 'version' matches loaded version of renv
+ sha <- attr(version, "sha", exact = TRUE)
+ valid <- if (!is.null(sha))
+ renv_bootstrap_validate_version_dev(sha, description)
+ else
+ renv_bootstrap_validate_version_release(version, description)
+
+ if (valid)
+ return(TRUE)
+
+ # the loaded version of renv doesn't match the requested version;
+ # give the user instructions on how to proceed
+ remote <- if (!is.null(description[["RemoteSha"]])) {
+ paste("rstudio/renv", description[["RemoteSha"]], sep = "@")
+ } else {
+ paste("renv", description[["Version"]], sep = "@")
+ }
+
+ # display both loaded version + sha if available
+ friendly <- renv_bootstrap_version_friendly(
+ version = description[["Version"]],
+ sha = description[["RemoteSha"]]
+ )
+
+ 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"
+ )
+ catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote)
+
+ FALSE
+
+ }
+
+ renv_bootstrap_validate_version_dev <- function(version, description) {
+ expected <- description[["RemoteSha"]]
+ is.character(expected) && startswith(expected, version)
+ }
+
+ renv_bootstrap_validate_version_release <- function(version, description) {
+ expected <- description[["Version"]]
+ is.character(expected) && identical(expected, version)
+ }
+
+ renv_bootstrap_hash_text <- function(text) {
+
+ hashfile <- tempfile("renv-hash-")
+ on.exit(unlink(hashfile), add = TRUE)
+
+ writeLines(text, con = hashfile)
+ tools::md5sum(hashfile)
+
+ }
+
+ renv_bootstrap_load <- function(project, libpath, version) {
+
+ # try to load renv from the project library
+ if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE))
+ return(FALSE)
+
+ # warn if the version of renv loaded does not match
+ renv_bootstrap_validate_version(version)
+
+ # execute renv load hooks, if any
+ hooks <- getHook("renv::autoload")
+ for (hook in hooks)
+ if (is.function(hook))
+ tryCatch(hook(), error = warnify)
+
+ # load the project
+ renv::load(project)
+
+ TRUE
+
+ }
+
+ renv_bootstrap_profile_load <- function(project) {
+
+ # if RENV_PROFILE is already set, just use that
+ profile <- Sys.getenv("RENV_PROFILE", unset = NA)
+ if (!is.na(profile) && nzchar(profile))
+ return(profile)
+
+ # check for a profile file (nothing to do if it doesn't exist)
+ path <- renv_bootstrap_paths_renv("profile", profile = FALSE, project = project)
+ if (!file.exists(path))
+ return(NULL)
+
+ # read the profile, and set it if it exists
+ contents <- readLines(path, warn = FALSE)
+ if (length(contents) == 0L)
+ return(NULL)
+
+ # set RENV_PROFILE
+ profile <- contents[[1L]]
+ if (!profile %in% c("", "default"))
+ Sys.setenv(RENV_PROFILE = profile)
+
+ profile
+
+ }
+
+ renv_bootstrap_profile_prefix <- function() {
+ profile <- renv_bootstrap_profile_get()
+ if (!is.null(profile))
+ return(file.path("profiles", profile, "renv"))
+ }
+
+ renv_bootstrap_profile_get <- function() {
+ profile <- Sys.getenv("RENV_PROFILE", unset = "")
+ renv_bootstrap_profile_normalize(profile)
+ }
+
+ renv_bootstrap_profile_set <- function(profile) {
+ profile <- renv_bootstrap_profile_normalize(profile)
+ if (is.null(profile))
+ Sys.unsetenv("RENV_PROFILE")
+ else
+ Sys.setenv(RENV_PROFILE = profile)
+ }
+
+ renv_bootstrap_profile_normalize <- function(profile) {
+
+ if (is.null(profile) || profile %in% c("", "default"))
+ return(NULL)
+
+ profile
+
+ }
+
+ renv_bootstrap_path_absolute <- function(path) {
+
+ substr(path, 1L, 1L) %in% c("~", "/", "\\") || (
+ substr(path, 1L, 1L) %in% c(letters, LETTERS) &&
+ substr(path, 2L, 3L) %in% c(":/", ":\\")
+ )
+
+ }
+
+ renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) {
+ renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv")
+ root <- if (renv_bootstrap_path_absolute(renv)) NULL else project
+ prefix <- if (profile) renv_bootstrap_profile_prefix()
+ components <- c(root, renv, prefix, ...)
+ paste(components, collapse = "/")
+ }
+
+ renv_bootstrap_project_type <- function(path) {
+
+ descpath <- file.path(path, "DESCRIPTION")
+ if (!file.exists(descpath))
+ return("unknown")
+
+ desc <- tryCatch(
+ read.dcf(descpath, all = TRUE),
+ error = identity
+ )
+
+ if (inherits(desc, "error"))
+ return("unknown")
+
+ type <- desc$Type
+ if (!is.null(type))
+ return(tolower(type))
+
+ package <- desc$Package
+ if (!is.null(package))
+ return("package")
+
+ "unknown"
+
+ }
+
+ renv_bootstrap_user_dir <- function() {
+ dir <- renv_bootstrap_user_dir_impl()
+ path.expand(chartr("\\", "/", dir))
+ }
+
+ renv_bootstrap_user_dir_impl <- function() {
+
+ # use local override if set
+ override <- getOption("renv.userdir.override")
+ if (!is.null(override))
+ return(override)
+
+ # use R_user_dir if available
+ tools <- asNamespace("tools")
+ if (is.function(tools$R_user_dir))
+ return(tools$R_user_dir("renv", "cache"))
+
+ # try using our own backfill for older versions of R
+ envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME")
+ for (envvar in envvars) {
+ root <- Sys.getenv(envvar, unset = NA)
+ if (!is.na(root))
+ return(file.path(root, "R/renv"))
+ }
+
+ # use platform-specific default fallbacks
+ if (Sys.info()[["sysname"]] == "Windows")
+ file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv")
+ else if (Sys.info()[["sysname"]] == "Darwin")
+ "~/Library/Caches/org.R-project.R/R/renv"
+ else
+ "~/.cache/R/renv"
+
+ }
+
+ renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) {
+ sha <- sha %||% attr(version, "sha", exact = TRUE)
+ parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L)))
+ paste(parts, collapse = "")
+ }
+
+ renv_bootstrap_exec <- function(project, libpath, version) {
+ if (!renv_bootstrap_load(project, libpath, version))
+ renv_bootstrap_run(version, libpath)
+ }
+
+ renv_bootstrap_run <- function(version, libpath) {
+
+ # 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 = getwd()))
+ }
+
+ # failed to download or load renv; warn the user
+ msg <- c(
+ "Failed to find an renv installation: the project will not be loaded.",
+ "Use `renv::activate()` to re-initialize the project."
+ )
+
+ warning(paste(msg, collapse = "\n"), call. = FALSE)
+
+ }
+
+ renv_json_read <- function(file = NULL, text = NULL) {
+
+ jlerr <- NULL
+
+ # if jsonlite is loaded, use that instead
+ if ("jsonlite" %in% loadedNamespaces()) {
+
+ json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity)
+ if (!inherits(json, "error"))
+ return(json)
+
+ jlerr <- json
+
+ }
+
+ # otherwise, fall back to the default JSON reader
+ json <- tryCatch(renv_json_read_default(file, text), error = identity)
+ if (!inherits(json, "error"))
+ return(json)
+
+ # report an error
+ if (!is.null(jlerr))
+ stop(jlerr)
+ else
+ stop(json)
+
+ }
+
+ renv_json_read_jsonlite <- function(file = NULL, text = NULL) {
+ text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n")
+ jsonlite::fromJSON(txt = text, simplifyVector = FALSE)
+ }
+
+ renv_json_read_default <- function(file = NULL, text = NULL) {
+
+ # find strings in the JSON
+ text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n")
+ pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]'
+ locs <- gregexpr(pattern, text, perl = TRUE)[[1]]
+
+ # if any are found, replace them with placeholders
+ replaced <- text
+ strings <- character()
+ replacements <- character()
+
+ if (!identical(c(locs), -1L)) {
+
+ # get the string values
+ starts <- locs
+ ends <- locs + attr(locs, "match.length") - 1L
+ strings <- substring(text, starts, ends)
+
+ # only keep those requiring escaping
+ strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE)
+
+ # compute replacements
+ replacements <- sprintf('"\032%i\032"', seq_along(strings))
+
+ # replace the strings
+ mapply(function(string, replacement) {
+ replaced <<- sub(string, replacement, replaced, fixed = TRUE)
+ }, strings, replacements)
+
+ }
+
+ # transform the JSON into something the R parser understands
+ transformed <- replaced
+ transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE)
+ transformed <- gsub("[[{]", "list(", transformed, perl = TRUE)
+ transformed <- gsub("[]}]", ")", transformed, perl = TRUE)
+ transformed <- gsub(":", "=", transformed, fixed = TRUE)
+ text <- paste(transformed, collapse = "\n")
+
+ # parse it
+ json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]]
+
+ # construct map between source strings, replaced strings
+ map <- as.character(parse(text = strings))
+ names(map) <- as.character(parse(text = replacements))
+
+ # convert to list
+ map <- as.list(map)
+
+ # remap strings in object
+ remapped <- renv_json_read_remap(json, map)
+
+ # evaluate
+ eval(remapped, envir = baseenv())
+
+ }
+
+ renv_json_read_remap <- function(json, map) {
+
+ # fix names
+ if (!is.null(names(json))) {
+ lhs <- match(names(json), names(map), nomatch = 0L)
+ rhs <- match(names(map), names(json), nomatch = 0L)
+ names(json)[rhs] <- map[lhs]
+ }
+
+ # fix values
+ if (is.character(json))
+ return(map[[json]] %||% json)
+
+ # handle true, false, null
+ if (is.name(json)) {
+ text <- as.character(json)
+ if (text == "true")
+ return(TRUE)
+ else if (text == "false")
+ return(FALSE)
+ else if (text == "null")
+ return(NULL)
+ }
+
+ # recurse
+ if (is.recursive(json)) {
+ for (i in seq_along(json)) {
+ json[i] <- list(renv_json_read_remap(json[[i]], map))
+ }
+ }
+
+ json
+
+ }
+
+ # load the renv profile, if any
+ renv_bootstrap_profile_load(project)
+
+ # construct path to library root
+ root <- renv_bootstrap_library_root(project)
+
+ # construct library prefix for platform
+ prefix <- renv_bootstrap_platform_prefix()
+
+ # construct full libpath
+ libpath <- file.path(root, prefix)
+
+ # run bootstrap code
+ renv_bootstrap_exec(project, libpath, version)
+
+ invisible()
+
+})
diff --git a/backend-R/renv/settings.json b/backend-R/renv/settings.json
new file mode 100644
index 00000000..a1ae2284
--- /dev/null
+++ b/backend-R/renv/settings.json
@@ -0,0 +1,19 @@
+{
+ "bioconductor.version": null,
+ "external.libraries": [],
+ "ignored.packages": [],
+ "package.dependency.fields": [
+ "Imports",
+ "Depends",
+ "LinkingTo"
+ ],
+ "ppm.enabled": null,
+ "ppm.ignored.urls": [],
+ "r.version": null,
+ "snapshot.type": "all",
+ "use.cache": true,
+ "vcs.ignore.cellar": true,
+ "vcs.ignore.library": true,
+ "vcs.ignore.local": true,
+ "vcs.manage.ignores": true
+}