diff --git a/.Rprofile b/.Rprofile
deleted file mode 100644
index 81b960f5c6a8ee40840badd620f8af9743787730..0000000000000000000000000000000000000000
--- a/.Rprofile
+++ /dev/null
@@ -1 +0,0 @@
-source("renv/activate.R")
diff --git a/renv.lock b/renv.lock
deleted file mode 100644
index 6bca5370ae38f174346aba6852fb499ac6b21946..0000000000000000000000000000000000000000
--- a/renv.lock
+++ /dev/null
@@ -1,1844 +0,0 @@
-{
-  "R": {
-    "Version": "4.3.2",
-    "Repositories": [
-      {
-        "Name": "CRAN",
-        "URL": "https://ftp.gwdg.de/pub/misc/cran"
-      }
-    ]
-  },
-  "Bioconductor": {
-    "Version": "3.18"
-  },
-  "Packages": {
-    "BiocGenerics": {
-      "Package": "BiocGenerics",
-      "Version": "0.48.1",
-      "Source": "Bioconductor",
-      "Requirements": [
-        "R",
-        "graphics",
-        "methods",
-        "stats",
-        "utils"
-      ],
-      "Hash": "e34278c65d7dffcc08f737bf0944ca9a"
-    },
-    "BiocManager": {
-      "Package": "BiocManager",
-      "Version": "1.30.23",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "utils"
-      ],
-      "Hash": "47e968dfe563c1b22c2e20a067ec21d5"
-    },
-    "BiocVersion": {
-      "Package": "BiocVersion",
-      "Version": "3.18.1",
-      "Source": "Bioconductor",
-      "Requirements": [
-        "R"
-      ],
-      "Hash": "2ecaed86684f5fae76ed5530f9d29c4a"
-    },
-    "DBI": {
-      "Package": "DBI",
-      "Version": "1.2.2",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "methods"
-      ],
-      "Hash": "164809cd72e1d5160b4cb3aa57f510fe"
-    },
-    "MASS": {
-      "Package": "MASS",
-      "Version": "7.3-60",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "grDevices",
-        "graphics",
-        "methods",
-        "stats",
-        "utils"
-      ],
-      "Hash": "a56a6365b3fa73293ea8d084be0d9bb0"
-    },
-    "Matrix": {
-      "Package": "Matrix",
-      "Version": "1.6-1.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "grDevices",
-        "graphics",
-        "grid",
-        "lattice",
-        "methods",
-        "stats",
-        "utils"
-      ],
-      "Hash": "1a00d4828f33a9d690806e98bd17150c"
-    },
-    "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"
-    },
-    "Rhdf5lib": {
-      "Package": "Rhdf5lib",
-      "Version": "1.24.2",
-      "Source": "Bioconductor",
-      "Repository": "Bioconductor 3.18",
-      "Requirements": [
-        "R"
-      ],
-      "Hash": "3cf103db29d75af0221d71946509a30c"
-    },
-    "S4Vectors": {
-      "Package": "S4Vectors",
-      "Version": "0.40.2",
-      "Source": "Bioconductor",
-      "Requirements": [
-        "BiocGenerics",
-        "R",
-        "methods",
-        "stats",
-        "stats4",
-        "utils"
-      ],
-      "Hash": "1716e201f81ced0f456dd5ec85fe20f8"
-    },
-    "aggregation": {
-      "Package": "aggregation",
-      "Version": "1.0.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Hash": "c28ad93c095befba2d60d6cd34b7dba0"
-    },
-    "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"
-    },
-    "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.7.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "base64enc",
-        "cachem",
-        "fastmap",
-        "grDevices",
-        "htmltools",
-        "jquerylib",
-        "jsonlite",
-        "lifecycle",
-        "memoise",
-        "mime",
-        "rlang",
-        "sass"
-      ],
-      "Hash": "8644cc53f43828f19133548195d7e59e"
-    },
-    "cachem": {
-      "Package": "cachem",
-      "Version": "1.1.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "fastmap",
-        "rlang"
-      ],
-      "Hash": "cd9a672193789068eb5a2aad65a0dedf"
-    },
-    "callr": {
-      "Package": "callr",
-      "Version": "3.7.6",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "R6",
-        "processx",
-        "utils"
-      ],
-      "Hash": "d7e13f49c19103ece9e58ad2d83a7354"
-    },
-    "cellranger": {
-      "Package": "cellranger",
-      "Version": "1.1.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "rematch",
-        "tibble"
-      ],
-      "Hash": "f61dbaec772ccd2e17705c1e872e9e7c"
-    },
-    "cli": {
-      "Package": "cli",
-      "Version": "3.6.3",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "utils"
-      ],
-      "Hash": "b21916dd77a27642b447374a5d30ecf3"
-    },
-    "clipr": {
-      "Package": "clipr",
-      "Version": "0.8.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "utils"
-      ],
-      "Hash": "3f038e5ac7f41d4ac41ce658c85e3042"
-    },
-    "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.3",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "grDevices",
-        "methods",
-        "utils"
-      ],
-      "Hash": "859d96e65ef198fd43e82b9628d593ef"
-    },
-    "curl": {
-      "Package": "curl",
-      "Version": "5.2.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R"
-      ],
-      "Hash": "411ca2c03b1ce5f548345d2fc2685f7a"
-    },
-    "data.table": {
-      "Package": "data.table",
-      "Version": "1.15.4",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "methods"
-      ],
-      "Hash": "8ee9ac56ef633d0c7cab8b2ca87d683e"
-    },
-    "dbplyr": {
-      "Package": "dbplyr",
-      "Version": "2.5.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": "39b2e002522bfd258039ee4e889e0fd1"
-    },
-    "digest": {
-      "Package": "digest",
-      "Version": "0.6.36",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "utils"
-      ],
-      "Hash": "fd6824ad91ede64151e93af67df6376b"
-    },
-    "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.2",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Hash": "680887028577f3fa2a81e410ed0d6e42"
-    },
-    "fastmap": {
-      "Package": "fastmap",
-      "Version": "1.2.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8"
-    },
-    "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.4",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "methods"
-      ],
-      "Hash": "15aeb8c27f5ea5161f9f6a641fafd93a"
-    },
-    "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"
-    },
-    "ggplot2": {
-      "Package": "ggplot2",
-      "Version": "3.5.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "MASS",
-        "R",
-        "cli",
-        "glue",
-        "grDevices",
-        "grid",
-        "gtable",
-        "isoband",
-        "lifecycle",
-        "mgcv",
-        "rlang",
-        "scales",
-        "stats",
-        "tibble",
-        "vctrs",
-        "withr"
-      ],
-      "Hash": "44c6a2f8202d5b7e878ea274b1092426"
-    },
-    "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.5",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "cli",
-        "glue",
-        "grid",
-        "lifecycle",
-        "rlang"
-      ],
-      "Hash": "e18861963cbc65a27736e02b3cd3c4a0"
-    },
-    "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.8.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "base64enc",
-        "digest",
-        "fastmap",
-        "grDevices",
-        "rlang",
-        "utils"
-      ],
-      "Hash": "81d371a9cc60640e74e4ab6ac46dcedc"
-    },
-    "httpuv": {
-      "Package": "httpuv",
-      "Version": "1.6.15",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "R6",
-        "Rcpp",
-        "later",
-        "promises",
-        "utils"
-      ],
-      "Hash": "d55aa087c47a63ead0f6fc10f8fa1ee0"
-    },
-    "httr": {
-      "Package": "httr",
-      "Version": "1.4.7",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "R6",
-        "curl",
-        "jsonlite",
-        "mime",
-        "openssl"
-      ],
-      "Hash": "ac107251d9d9fd72f0ca8049988f1d7f"
-    },
-    "ids": {
-      "Package": "ids",
-      "Version": "1.0.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "openssl",
-        "uuid"
-      ],
-      "Hash": "99df65cfef20e525ed38c3d2577f7190"
-    },
-    "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"
-    },
-    "kableExtra": {
-      "Package": "kableExtra",
-      "Version": "1.4.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "digest",
-        "grDevices",
-        "graphics",
-        "htmltools",
-        "knitr",
-        "magrittr",
-        "rmarkdown",
-        "rstudioapi",
-        "scales",
-        "stats",
-        "stringr",
-        "svglite",
-        "tools",
-        "viridisLite",
-        "xml2"
-      ],
-      "Hash": "532d16304274c23c8563f94b79351c86"
-    },
-    "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"
-    },
-    "later": {
-      "Package": "later",
-      "Version": "1.3.2",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "Rcpp",
-        "rlang"
-      ],
-      "Hash": "a3e051d405326b8b0012377434c62b37"
-    },
-    "lattice": {
-      "Package": "lattice",
-      "Version": "0.22-6",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "grDevices",
-        "graphics",
-        "grid",
-        "stats",
-        "utils"
-      ],
-      "Hash": "cc5ac1ba4c238c7ca9fa6a87ca11a7e2"
-    },
-    "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"
-    },
-    "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"
-    },
-    "matrixStats": {
-      "Package": "matrixStats",
-      "Version": "1.3.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R"
-      ],
-      "Hash": "4b3ea27a19d669c0405b38134d89a9d1"
-    },
-    "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"
-    },
-    "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.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "colorspace",
-        "methods"
-      ],
-      "Hash": "4fd8900853b746af55b81fda99da7695"
-    },
-    "nlme": {
-      "Package": "nlme",
-      "Version": "3.1-164",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "graphics",
-        "lattice",
-        "stats",
-        "utils"
-      ],
-      "Hash": "a623a2239e642806158bc4dc3f51565d"
-    },
-    "openssl": {
-      "Package": "openssl",
-      "Version": "2.2.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "askpass"
-      ],
-      "Hash": "2bcca3848e4734eb3b16103bc9aa4b8e"
-    },
-    "openxlsx": {
-      "Package": "openxlsx",
-      "Version": "4.2.5.2",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "Rcpp",
-        "grDevices",
-        "methods",
-        "stats",
-        "stringi",
-        "utils",
-        "zip"
-      ],
-      "Hash": "c03b4c18d42da881fb8e15a085c2b9d6"
-    },
-    "pheatmap": {
-      "Package": "pheatmap",
-      "Version": "1.0.12",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "RColorBrewer",
-        "grDevices",
-        "graphics",
-        "grid",
-        "gtable",
-        "scales",
-        "stats"
-      ],
-      "Hash": "db1fb0021811b6693741325bbe916e58"
-    },
-    "pillar": {
-      "Package": "pillar",
-      "Version": "1.9.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "cli",
-        "fansi",
-        "glue",
-        "lifecycle",
-        "rlang",
-        "utf8",
-        "utils",
-        "vctrs"
-      ],
-      "Hash": "15da5a8412f317beeee6175fbc76f4bb"
-    },
-    "pkgconfig": {
-      "Package": "pkgconfig",
-      "Version": "2.0.3",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "utils"
-      ],
-      "Hash": "01f28d4278f15c76cddbea05899c5d6f"
-    },
-    "plyr": {
-      "Package": "plyr",
-      "Version": "1.8.9",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "Rcpp"
-      ],
-      "Hash": "6b8177fd19982f0020743fadbfdbd933"
-    },
-    "prettyunits": {
-      "Package": "prettyunits",
-      "Version": "1.2.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R"
-      ],
-      "Hash": "6b01fc98b1e86c4f705ce9dcfd2f57c7"
-    },
-    "processx": {
-      "Package": "processx",
-      "Version": "3.8.4",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "R6",
-        "ps",
-        "utils"
-      ],
-      "Hash": "0c90a7d71988856bad2a2a45dd871bb9"
-    },
-    "progress": {
-      "Package": "progress",
-      "Version": "1.2.3",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "R6",
-        "crayon",
-        "hms",
-        "prettyunits"
-      ],
-      "Hash": "f4625e061cb2865f111b47ff163a5ca6"
-    },
-    "promises": {
-      "Package": "promises",
-      "Version": "1.3.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R6",
-        "Rcpp",
-        "fastmap",
-        "later",
-        "magrittr",
-        "rlang",
-        "stats"
-      ],
-      "Hash": "434cd5388a3979e74be5c219bcd6e77d"
-    },
-    "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.3.2",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "systemfonts",
-        "textshaping"
-      ],
-      "Hash": "e3087db406e079a8a2fd87f413918ed3"
-    },
-    "rappdirs": {
-      "Package": "rappdirs",
-      "Version": "0.3.3",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R"
-      ],
-      "Hash": "5e3c5dc0b071b21fa128676560dbe94d"
-    },
-    "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"
-    },
-    "renv": {
-      "Package": "renv",
-      "Version": "1.0.7",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "utils"
-      ],
-      "Hash": "397b7b2a265bc5a7a06852524dabae20"
-    },
-    "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"
-    },
-    "reshape2": {
-      "Package": "reshape2",
-      "Version": "1.4.4",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "Rcpp",
-        "plyr",
-        "stringr"
-      ],
-      "Hash": "bb5996d0bd962d214a11140d77589917"
-    },
-    "rhdf5": {
-      "Package": "rhdf5",
-      "Version": "2.46.1",
-      "Source": "Bioconductor",
-      "Requirements": [
-        "R",
-        "Rhdf5lib",
-        "S4Vectors",
-        "methods",
-        "rhdf5filters"
-      ],
-      "Hash": "b0a244022c3427cd8213c33804c6b5de"
-    },
-    "rhdf5filters": {
-      "Package": "rhdf5filters",
-      "Version": "1.14.1",
-      "Source": "Bioconductor",
-      "Requirements": [
-        "Rhdf5lib"
-      ],
-      "Hash": "d27a2f6a89def6388fad5b0aae026220"
-    },
-    "rlang": {
-      "Package": "rlang",
-      "Version": "1.1.4",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "utils"
-      ],
-      "Hash": "3eec01f8b1dee337674b2e34ab1f9bc1"
-    },
-    "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"
-    },
-    "rstudioapi": {
-      "Package": "rstudioapi",
-      "Version": "0.16.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Hash": "96710351d642b70e8f02ddeb237c46a7"
-    },
-    "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.9",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R6",
-        "fs",
-        "htmltools",
-        "rappdirs",
-        "rlang"
-      ],
-      "Hash": "d53dbfddf695303ea4ad66f86e99b95d"
-    },
-    "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"
-    },
-    "shiny": {
-      "Package": "shiny",
-      "Version": "1.8.1.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "R6",
-        "bslib",
-        "cachem",
-        "commonmark",
-        "crayon",
-        "fastmap",
-        "fontawesome",
-        "glue",
-        "grDevices",
-        "htmltools",
-        "httpuv",
-        "jsonlite",
-        "later",
-        "lifecycle",
-        "methods",
-        "mime",
-        "promises",
-        "rlang",
-        "sourcetools",
-        "tools",
-        "utils",
-        "withr",
-        "xtable"
-      ],
-      "Hash": "54b26646816af9960a4c64d8ceec75d6"
-    },
-    "sleuth": {
-      "Package": "sleuth",
-      "Version": "0.30.1",
-      "Source": "GitHub",
-      "RemoteType": "github",
-      "RemoteHost": "api.github.com",
-      "RemoteRepo": "sleuth",
-      "RemoteUsername": "pachterlab",
-      "RemoteRef": "HEAD",
-      "RemoteSha": "20e493fb98cb1b65a508e6634db430d5d3848567",
-      "Requirements": [
-        "R",
-        "aggregation",
-        "data.table",
-        "dplyr",
-        "ggplot2",
-        "lazyeval",
-        "matrixStats",
-        "methods",
-        "parallel",
-        "pheatmap",
-        "reshape2",
-        "rhdf5",
-        "shiny",
-        "tidyr"
-      ],
-      "Hash": "adcbaf747c08a6d57c05b7f1790642ef"
-    },
-    "sourcetools": {
-      "Package": "sourcetools",
-      "Version": "0.1.7-1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R"
-      ],
-      "Hash": "5f5a7629f956619d519205ec475fe647"
-    },
-    "stringi": {
-      "Package": "stringi",
-      "Version": "1.8.4",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "stats",
-        "tools",
-        "utils"
-      ],
-      "Hash": "39e1144fd75428983dc3f63aa53dfa91"
-    },
-    "stringr": {
-      "Package": "stringr",
-      "Version": "1.5.1",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "cli",
-        "glue",
-        "lifecycle",
-        "magrittr",
-        "rlang",
-        "stringi",
-        "vctrs"
-      ],
-      "Hash": "960e2ae9e09656611e0b8214ad543207"
-    },
-    "svglite": {
-      "Package": "svglite",
-      "Version": "2.1.3",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "cpp11",
-        "systemfonts"
-      ],
-      "Hash": "124a41fdfa23e8691cb744c762f10516"
-    },
-    "sys": {
-      "Package": "sys",
-      "Version": "3.4.2",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Hash": "3a1be13d68d47a8cd0bfd74739ca1555"
-    },
-    "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.51",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "xfun"
-      ],
-      "Hash": "d44e2fcd2e4e076f0aac540208559d1d"
-    },
-    "tzdb": {
-      "Package": "tzdb",
-      "Version": "0.4.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "cpp11"
-      ],
-      "Hash": "f561504ec2897f4d46f0c7657e488ae1"
-    },
-    "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"
-    },
-    "withr": {
-      "Package": "withr",
-      "Version": "3.0.0",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "grDevices",
-        "graphics"
-      ],
-      "Hash": "d31b6c62c10dcf11ec530ca6b0dd5d35"
-    },
-    "xfun": {
-      "Package": "xfun",
-      "Version": "0.44",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "grDevices",
-        "stats",
-        "tools"
-      ],
-      "Hash": "317a0538d32f4a009658bcedb7923f4b"
-    },
-    "xml2": {
-      "Package": "xml2",
-      "Version": "1.3.6",
-      "Source": "Repository",
-      "Repository": "CRAN",
-      "Requirements": [
-        "R",
-        "cli",
-        "methods",
-        "rlang"
-      ],
-      "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61"
-    },
-    "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/renv/.gitignore b/renv/.gitignore
deleted file mode 100644
index 0ec0cbba2d7755cbd91956afaa585449906a1e16..0000000000000000000000000000000000000000
--- a/renv/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-library/
-local/
-cellar/
-lock/
-python/
-sandbox/
-staging/
diff --git a/renv/activate.R b/renv/activate.R
deleted file mode 100644
index d13f9932a16a92986a514d8cb439662d85db3add..0000000000000000000000000000000000000000
--- a/renv/activate.R
+++ /dev/null
@@ -1,1220 +0,0 @@
-
-local({
-
-  # the requested version of renv
-  version <- "1.0.7"
-  attr(version, "sha") <- NULL
-
-  # the project directory
-  project <- Sys.getenv("RENV_PROJECT")
-  if (!nzchar(project))
-    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)
-  
-  }
-  
-  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
-    paste(substring(lines, common), collapse = "\n")
-  
-  }
-  
-  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 (is.na(auto) && getRversion() >= "4.4.0")
-      auto <- "TRUE"
-  
-    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
-    dev <- identical(description[["RemoteType"]], "github")
-    remote <- if (dev)
-      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     = if (dev) description[["RemoteSha"]]
-    )
-  
-    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"]]
-    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/renv/settings.json b/renv/settings.json
deleted file mode 100644
index ffdbb3200f779343ad1aa1a2fb6c74a02fd9b365..0000000000000000000000000000000000000000
--- a/renv/settings.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "bioconductor.version": null,
-  "external.libraries": [],
-  "ignored.packages": [],
-  "package.dependency.fields": [
-    "Imports",
-    "Depends",
-    "LinkingTo"
-  ],
-  "ppm.enabled": null,
-  "ppm.ignored.urls": [],
-  "r.version": null,
-  "snapshot.type": "implicit",
-  "use.cache": true,
-  "vcs.ignore.cellar": true,
-  "vcs.ignore.library": true,
-  "vcs.ignore.local": true,
-  "vcs.manage.ignores": true
-}
diff --git a/workflows/R-renv-docker/Dockerfile b/workflows/R-renv-docker/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..81d77b937131578874af867dfb955fd61788b815
--- /dev/null
+++ b/workflows/R-renv-docker/Dockerfile
@@ -0,0 +1,10 @@
+## Use pre-built base image coming with R and required system libraries
+
+FROM rstudio/r-base:4.3-jammy
+
+## Install package `renv` to Docker image
+RUN R -e "install.packages('renv', repos = c(CRAN = 'https://cloud.r-project.org'))"
+
+## pull in a manifest file and restore it
+COPY renv.lock ./
+RUN R -e 'renv::restore()'
\ No newline at end of file
diff --git a/workflows/R-renv-docker/README.md b/workflows/R-renv-docker/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..358084d201271231cc81aa9ac7db454955003da6
--- /dev/null
+++ b/workflows/R-renv-docker/README.md
@@ -0,0 +1,5 @@
+
+
+## Build docker image
+
+docker build --pull --rm -f "workflows/_R-docker/Dockerfile" -t rdocker-test:latest "workflows/_R-docker"
diff --git a/workflows/R-renv-docker/renv.rmd b/workflows/R-renv-docker/renv.rmd
new file mode 100644
index 0000000000000000000000000000000000000000..63f67b5f04f23f45f0cff16029dd478c9c8c71fd
--- /dev/null
+++ b/workflows/R-renv-docker/renv.rmd
@@ -0,0 +1,25 @@
+---
+title: "Using renv and docker"
+author: "Dominik Brilhaus"
+date: 2024-08-05
+output: html_document
+---
+
+
+```{r}
+install.packages("renv")
+
+renv::init(bare = TRUE)
+renv::status()
+renv::dependencies()
+
+renv::snapshot()
+
+```
+```{r}
+if (!require("BiocManager", quietly = TRUE))
+    install.packages("BiocManager")
+BiocManager::install(version = "3.19")
+```
+
+