From d0c0eff3515c5392626f62d0ff75b5a157945229 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 10 Jul 2024 01:40:56 +0000 Subject: [PATCH] differences for PR #18 --- basic-targets.md | 38 +- branch.md | 142 +-- cache.md | 18 +- config.yaml | 87 -- files.md | 88 +- files/plans/plan_slurm.R | 49 + files/plans/plan_slurm_gpu.R | 52 + files/plans/plan_slurm_memory.R | 39 + hpc.md | 41 + lifecycle.md | 74 +- md5sum.txt | 41 +- organization.md | 47 +- packages.md | 34 +- parallel.md | 10 +- quarto.md | 4 +- renv.lock | 1842 ------------------------------- 16 files changed, 444 insertions(+), 2162 deletions(-) delete mode 100644 config.yaml create mode 100644 files/plans/plan_slurm.R create mode 100644 files/plans/plan_slurm_gpu.R create mode 100644 files/plans/plan_slurm_memory.R create mode 100644 hpc.md delete mode 100644 renv.lock diff --git a/basic-targets.md b/basic-targets.md index ddc2fd6b..2cb3d78d 100644 --- a/basic-targets.md +++ b/basic-targets.md @@ -85,7 +85,7 @@ We will now start to write a `_targets.R` file. Fortunately, `targets` comes wit In the R console, first load the `targets` package with `library(targets)`, then run the command `tar_script()`. -```r +``` r library(targets) tar_script() ``` @@ -120,7 +120,7 @@ In real life you are probably have externally stored raw data, so **let's use th The `path_to_file()` function in `palmerpenguins` provides the path to the raw data CSV file (it is inside the `palmerpenguins` R package source code that you downloaded to your computer when you installed the package). -```r +``` r library(palmerpenguins) # Get path to CSV file @@ -129,8 +129,8 @@ penguins_csv_file <- path_to_file("penguins_raw.csv") penguins_csv_file ``` -```{.output} -[1] "/home/runner/.local/share/renv/cache/v5/R-4.3/x86_64-pc-linux-gnu/palmerpenguins/0.1.1/6c6861efbc13c1d543749e9c7be4a592/palmerpenguins/extdata/penguins_raw.csv" +``` output +[1] "/home/runner/.local/share/renv/cache/v5/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu/palmerpenguins/0.1.1/6c6861efbc13c1d543749e9c7be4a592/palmerpenguins/extdata/penguins_raw.csv" ``` We will use the `tidyverse` set of packages for loading and manipulating the data. We don't have time to cover all the details about using `tidyverse` now, but if you want to learn more about it, please see the ["Manipulating, analyzing and exporting data with tidyverse" lesson](https://datacarpentry.org/R-ecology-lesson/03-dplyr.html). @@ -138,7 +138,7 @@ We will use the `tidyverse` set of packages for loading and manipulating the dat Let's load the data with `read_csv()`. -```r +``` r library(tidyverse) # Read CSV file into R @@ -148,7 +148,7 @@ penguins_data_raw ``` -```{.output} +``` output Rows: 344 Columns: 17 ── Column specification ──────────────────────────────────────────────────────── Delimiter: "," @@ -160,7 +160,7 @@ date (1): Date Egg ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. ``` -```{.output} +``` output # A tibble: 344 × 17 studyName `Sample Number` Species Region Island Stage `Individual ID` @@ -191,7 +191,7 @@ Let's clean up the data to make it easier to use for downstream analyses. We will also remove any rows with missing data, because this could cause errors for some functions later. -```r +``` r # Clean up raw data penguins_data <- penguins_data_raw |> # Rename columns for easier typing and @@ -207,7 +207,7 @@ penguins_data <- penguins_data_raw |> penguins_data ``` -```{.output} +``` output # A tibble: 342 × 3 species bill_length_mm bill_depth_mm @@ -240,7 +240,7 @@ The other steps (setting the file path and loading the data) are each just one f Finally, each step in the workflow is defined with the `tar_target()` function. -```r +``` r library(targets) library(tidyverse) library(palmerpenguins) @@ -271,18 +271,18 @@ Now that we have a workflow, we can run it with the `tar_make()` function. Try running it, and you should see something like this: -```r +``` r tar_make() ``` -```{.output} -• start target penguins_csv_file -• built target penguins_csv_file [0.002 seconds] -• start target penguins_data_raw -• built target penguins_data_raw [0.095 seconds] -• start target penguins_data -• built target penguins_data [0.013 seconds] -• end pipeline [0.216 seconds] +``` output +▶ dispatched target penguins_csv_file +● completed target penguins_csv_file [0 seconds] +▶ dispatched target penguins_data_raw +● completed target penguins_data_raw [0.136 seconds] +▶ dispatched target penguins_data +● completed target penguins_data [0.007 seconds] +▶ ended pipeline [0.205 seconds] ``` Congratulations, you've run your first workflow with `targets`! diff --git a/branch.md b/branch.md index 81d5de0f..a9f041f8 100644 --- a/branch.md +++ b/branch.md @@ -47,14 +47,14 @@ We will test this hypothesis with a linear model. For example, this is a model of bill depth dependent on bill length: -```r +``` r lm(bill_depth_mm ~ bill_length_mm, data = penguins_data) ``` We can add this to our pipeline. We will call it the `combined_model` because it combines all the species together without distinction: -```r +``` r source("R/packages.R") source("R/functions.R") @@ -76,25 +76,25 @@ tar_plan( ``` -```{.output} -✔ skip target penguins_data_raw_file -✔ skip target penguins_data_raw -✔ skip target penguins_data -• start target combined_model -• built target combined_model [0.034 seconds] -• end pipeline [0.136 seconds] +``` output +✔ skipped target penguins_data_raw_file +✔ skipped target penguins_data_raw +✔ skipped target penguins_data +▶ dispatched target combined_model +● completed target combined_model [0.052 seconds] +▶ ended pipeline [0.13 seconds] ``` Let's have a look at the model. We will use the `glance()` function from the `broom` package. Unlike base R `summary()`, this function returns output as a tibble (the tidyverse equivalent of a dataframe), which as we will see later is quite useful for downstream analyses. -```r +``` r library(broom) tar_load(combined_model) glance(combined_model) ``` -```{.output} +``` output # A tibble: 1 × 12 r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs @@ -112,7 +112,7 @@ These could include models that add a parameter for species, or add an interacti Now our workflow is getting more complicated. This is what a workflow for such an analysis might look like **without branching** (make sure to add `library(broom)` to `packages.R`): -```r +``` r source("R/packages.R") source("R/functions.R") @@ -146,32 +146,32 @@ tar_plan( ``` -```{.output} -✔ skip target penguins_data_raw_file -✔ skip target penguins_data_raw -✔ skip target penguins_data -✔ skip target combined_model -• start target interaction_model -• built target interaction_model [0.004 seconds] -• start target species_model -• built target species_model [0.011 seconds] -• start target combined_summary -• built target combined_summary [0.008 seconds] -• start target interaction_summary -• built target interaction_summary [0.002 seconds] -• start target species_summary -• built target species_summary [0.003 seconds] -• end pipeline [0.144 seconds] +``` output +✔ skipped target penguins_data_raw_file +✔ skipped target penguins_data_raw +✔ skipped target penguins_data +✔ skipped target combined_model +▶ dispatched target interaction_model +● completed target interaction_model [0.002 seconds] +▶ dispatched target species_model +● completed target species_model [0.001 seconds] +▶ dispatched target combined_summary +● completed target combined_summary [0.006 seconds] +▶ dispatched target interaction_summary +● completed target interaction_summary [0.003 seconds] +▶ dispatched target species_summary +● completed target species_summary [0.035 seconds] +▶ ended pipeline [0.144 seconds] ``` Let's look at the summary of one of the models: -```r +``` r tar_read(species_summary) ``` -```{.output} +``` output # A tibble: 1 × 12 r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs @@ -189,7 +189,7 @@ It would be fairly easy to make a typo and end up with the wrong model being sum Let's see how to write the same plan using **dynamic branching**: -```r +``` r source("R/packages.R") source("R/functions.R") @@ -225,23 +225,23 @@ What is going on here? First, let's look at the messages provided by `tar_make()`. -```{.output} -✔ skip target penguins_data_raw_file -✔ skip target penguins_data_raw -✔ skip target penguins_data -• start target models -• built target models [0.006 seconds] -• start branch model_summaries_5ad4cec5 -• built branch model_summaries_5ad4cec5 [0.008 seconds] -• start branch model_summaries_c73912d5 -• built branch model_summaries_c73912d5 [0.002 seconds] -• start branch model_summaries_91696941 -• built branch model_summaries_91696941 [0.003 seconds] -• built pattern model_summaries -• end pipeline [0.149 seconds] +``` output +✔ skipped target penguins_data_raw_file +✔ skipped target penguins_data_raw +✔ skipped target penguins_data +▶ dispatched target models +● completed target models [0.004 seconds] +▶ dispatched branch model_summaries_812e3af782bee03f +● completed branch model_summaries_812e3af782bee03f [0.005 seconds] +▶ dispatched branch model_summaries_2b8108839427c135 +● completed branch model_summaries_2b8108839427c135 [0.002 seconds] +▶ dispatched branch model_summaries_533cd9a636c3e05b +● completed branch model_summaries_533cd9a636c3e05b [0.002 seconds] +● completed pattern model_summaries +▶ ended pipeline [0.14 seconds] ``` -There is a series of smaller targets (branches) that are each named like model_summaries_5ad4cec5, then one overall `model_summaries` target. +There is a series of smaller targets (branches) that are each named like model_summaries_812e3af782bee03f, then one overall `model_summaries` target. That is the result of specifying targets using branching: each of the smaller targets are the "branches" that comprise the overall target. Since `targets` has no way of knowing ahead of time how many branches there will be or what they represent, it names each one using this series of numbers and letters (the "hash"). `targets` builds each branch one at a time, then combines them into the overall target. @@ -249,7 +249,7 @@ Since `targets` has no way of knowing ahead of time how many branches there will Next, let's look in more detail about how the workflow is set up, starting with how we defined the models: -```r +``` r # Build models models = list( combined_model = lm( @@ -268,7 +268,7 @@ So we need to prepare the input for looping as a list. Next, take a look at the command to build the target `model_summaries`. -```r +``` r # Get model summaries tar_target( model_summaries, @@ -287,12 +287,12 @@ Finally, there is an argument we haven't seen before, `pattern`, which indicates Now that we understand how the branching workflow is constructed, let's inspect the output: -```r +``` r tar_read(model_summaries) ``` -```{.output} +``` output # A tibble: 3 × 12 r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs @@ -319,7 +319,7 @@ You will need to write custom functions frequently when using `targets`, so it's Here is the function. Save this in `R/functions.R`: -```r +``` r glance_with_mod_name <- function(model_in_list) { model_name <- names(model_in_list) model <- model_in_list[[1]] @@ -331,7 +331,7 @@ glance_with_mod_name <- function(model_in_list) { Our new pipeline looks almost the same as before, but this time we use the custom function instead of `glance()`. -```r +``` r source("R/functions.R") source("R/packages.R") @@ -363,29 +363,29 @@ tar_plan( ``` -```{.output} -✔ skip target penguins_data_raw_file -✔ skip target penguins_data_raw -✔ skip target penguins_data -✔ skip target models -• start branch model_summaries_5ad4cec5 -• built branch model_summaries_5ad4cec5 [0.03 seconds] -• start branch model_summaries_c73912d5 -• built branch model_summaries_c73912d5 [0.006 seconds] -• start branch model_summaries_91696941 -• built branch model_summaries_91696941 [0.004 seconds] -• built pattern model_summaries -• end pipeline [0.154 seconds] +``` output +✔ skipped target penguins_data_raw_file +✔ skipped target penguins_data_raw +✔ skipped target penguins_data +✔ skipped target models +▶ dispatched branch model_summaries_812e3af782bee03f +● completed branch model_summaries_812e3af782bee03f [0.011 seconds] +▶ dispatched branch model_summaries_2b8108839427c135 +● completed branch model_summaries_2b8108839427c135 [0.006 seconds] +▶ dispatched branch model_summaries_533cd9a636c3e05b +● completed branch model_summaries_533cd9a636c3e05b [0.039 seconds] +● completed pattern model_summaries +▶ ended pipeline [0.145 seconds] ``` And this time, when we load the `model_summaries`, we can tell which model corresponds to which row (you may need to scroll to the right to see it). -```r +``` r tar_read(model_summaries) ``` -```{.output} +``` output # A tibble: 3 × 13 r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs model_name @@ -398,12 +398,12 @@ Next we will add one more target, a prediction of bill depth based on each model Such a prediction can be obtained with the `augment()` function of the `broom` package. -```r +``` r tar_load(models) augment(models[[1]]) ``` -```{.output} +``` output # A tibble: 342 × 8 bill_depth_mm bill_length_mm .fitted .resid .hat .sigma .cooksd .std.resid @@ -431,7 +431,7 @@ Can you add the model predictions using `augment()`? You will need to define a c Define the new function as `augment_with_mod_name()`. It is the same as `glance_with_mod_name()`, but use `augment()` instead of `glance()`: -```r +``` r augment_with_mod_name <- function(model_in_list) { model_name <- names(model_in_list) model <- model_in_list[[1]] @@ -443,7 +443,7 @@ augment_with_mod_name <- function(model_in_list) { Add the step to the workflow: -```r +``` r source("R/functions.R") source("R/packages.R") diff --git a/cache.md b/cache.md index 82dc5914..7251e7c8 100644 --- a/cache.md +++ b/cache.md @@ -32,11 +32,11 @@ So we just finished running our first workflow. Now you probably want to look at its output. But, if we just call the name of the object (for example, `penguins_data`), we get an error. -```r +``` r penguins_data ``` -```{.error} +``` error Error in eval(expr, envir, enclos): object 'penguins_data' not found ``` @@ -63,12 +63,12 @@ Let's use this to load `penguins_data` and get an overview of the data with `sum -```r +``` r tar_load(penguins_data) summary(penguins_data) ``` -```{.output} +``` output species bill_length_mm bill_depth_mm Length:342 Min. :32.10 Min. :13.10 Class :character 1st Qu.:39.23 1st Qu.:15.60 @@ -88,12 +88,12 @@ It doesn't actually return a value. Let's try it with `penguins_csv_file`. -```r +``` r tar_read(penguins_csv_file) ``` -```{.output} -[1] "/home/runner/.local/share/renv/cache/v5/R-4.3/x86_64-pc-linux-gnu/palmerpenguins/0.1.1/6c6861efbc13c1d543749e9c7be4a592/palmerpenguins/extdata/penguins_raw.csv" +``` output +[1] "/home/runner/.local/share/renv/cache/v5/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu/palmerpenguins/0.1.1/6c6861efbc13c1d543749e9c7be4a592/palmerpenguins/extdata/penguins_raw.csv" ``` We immediately see the contents of `penguins_csv_file`. @@ -101,11 +101,11 @@ But it has not been loaded into the environment. If you try to run `penguins_csv_file` now, you will get an error: -```r +``` r penguins_csv_file ``` -```{.error} +``` error Error in eval(expr, envir, enclos): object 'penguins_csv_file' not found ``` diff --git a/config.yaml b/config.yaml deleted file mode 100644 index d7951c6c..00000000 --- a/config.yaml +++ /dev/null @@ -1,87 +0,0 @@ -#------------------------------------------------------------ -# Values for this lesson. -#------------------------------------------------------------ - -# Which carpentry is this (swc, dc, lc, or cp)? -# swc: Software Carpentry -# dc: Data Carpentry -# lc: Library Carpentry -# cp: Carpentries (to use for instructor training for instance) -# incubator: The Carpentries Incubator -carpentry: 'incubator' - -# Overall title for pages. -title: 'Introduction to targets' - -# Date the lesson was created (YYYY-MM-DD, this is empty by default) -created: ~ - -# Comma-separated list of keywords for the lesson -keywords: 'reproducibility, data, targets, R' - -# Life cycle stage of the lesson -# possible values: pre-alpha, alpha, beta, stable -life_cycle: 'pre-alpha' - -# License of the lesson -license: 'CC-BY 4.0' - -# Link to the source repository for this lesson -source: 'https://github.com/joelnitta/targets-workshop' - -# Default branch of your lesson -branch: 'main' - -# Who to contact if there are any issues -contact: 'joelnitta@gmail.com' - -# Navigation ------------------------------------------------ -# -# Use the following menu items to specify the order of -# individual pages in each dropdown section. Leave blank to -# include all pages in the folder. -# -# Example ------------- -# -# episodes: -# - introduction.md -# - first-steps.md -# -# learners: -# - setup.md -# -# instructors: -# - instructor-notes.md -# -# profiles: -# - one-learner.md -# - another-learner.md - -# Order of episodes in your lesson -episodes: -- introduction.Rmd -- basic-targets.Rmd -- cache.Rmd -- lifecycle.Rmd -- organization.Rmd -- packages.Rmd -- files.Rmd -- branch.Rmd -- parallel.Rmd -- quarto.Rmd - -# Information for Learners -learners: - -# Information for Instructors -instructors: - -# Learner Profiles -profiles: - -# Customisation --------------------------------------------- -# -# This space below is where custom yaml items (e.g. pinning -# sandpaper and varnish versions) should live - - diff --git a/files.md b/files.md index cbf2583a..0be5a806 100644 --- a/files.md +++ b/files.md @@ -44,7 +44,7 @@ We are about to create a new `_targets.R` file, but you probably don't want to l ::::::::::::::::::::::::::::::::::::: -```r +``` r library(targets) library(tarchetypes) @@ -54,10 +54,10 @@ tar_plan( ``` -```{.output} -• start target some_data -• built target some_data [0.002 seconds] -• end pipeline [0.088 seconds] +``` output +▶ dispatched target some_data +● completed target some_data [0 seconds] +▶ ended pipeline [0.046 seconds] ``` If we inspect the contents of `some_data` with `tar_read(some_data)`, it will contain the string `"Hello World"` as expected. @@ -65,7 +65,7 @@ If we inspect the contents of `some_data` with `tar_read(some_data)`, it will co Now say we edit "hello.txt", perhaps add some text: "Hello World. How are you?". Edit this in the RStudio text editor and save it. Now run the pipeline again. -```r +``` r library(targets) library(tarchetypes) @@ -75,9 +75,9 @@ tar_plan( ``` -```{.output} -✔ skip target some_data -✔ skip pipeline [0.066 seconds] +``` output +✔ skipped target some_data +✔ skipped pipeline [0.048 seconds] ``` The target `some_data` was skipped, even though the contents of the file changed. @@ -85,7 +85,7 @@ The target `some_data` was skipped, even though the contents of the file changed That is because right now, targets is only tracking the **name** of the file, not its contents. We need to use a special function for that, `tar_file()` from the `tarchetypes` package. `tar_file()` will calculate the "hash" of a file---a unique digital signature that is determined by the file's contents. If the contents change, the hash will change, and this will be detected by `targets`. -```r +``` r library(targets) library(tarchetypes) @@ -96,12 +96,12 @@ tar_plan( ``` -```{.output} -• start target data_file -• built target data_file [0.001 seconds] -• start target some_data -• built target some_data [0 seconds] -• end pipeline [0.098 seconds] +``` output +▶ dispatched target data_file +● completed target data_file [0.001 seconds] +▶ dispatched target some_data +● completed target some_data [0 seconds] +▶ ended pipeline [0.064 seconds] ``` This time we see that `targets` does successfully re-build `some_data` as expected. @@ -113,7 +113,7 @@ However, also notice that this means we need to write two targets instead of one It turns out that this is a common pattern in `targets` workflows, so `tarchetypes` provides a shortcut to express this more concisely, `tar_file_read()`. -```r +``` r library(targets) library(tarchetypes) @@ -129,12 +129,12 @@ tar_plan( Let's inspect this pipeline with `tar_manifest()`: -```r +``` r tar_manifest() ``` -```{.output} +``` output # A tibble: 2 × 2 name command @@ -167,7 +167,7 @@ How can you use `tar_file_read()` to load the CSV file while tracking its conten :::::::::::::::::::::::::::::::::: {.solution} -```r +``` r source("R/packages.R") source("R/functions.R") @@ -182,14 +182,14 @@ tar_plan( ``` -```{.output} -• start target penguins_data_raw_file -• built target penguins_data_raw_file [0.002 seconds] -• start target penguins_data_raw -• built target penguins_data_raw [0.101 seconds] -• start target penguins_data -• built target penguins_data [0.024 seconds] -• end pipeline [0.224 seconds] +``` output +▶ dispatched target penguins_data_raw_file +● completed target penguins_data_raw_file [0 seconds] +▶ dispatched target penguins_data_raw +● completed target penguins_data_raw [0.194 seconds] +▶ dispatched target penguins_data +● completed target penguins_data [0.011 seconds] +▶ ended pipeline [0.278 seconds] ``` :::::::::::::::::::::::::::::::::: @@ -203,20 +203,20 @@ Writing to files is similar to loading in files: we will use the `tar_file()` fu Let's do this for `writeLines()`, the R function that writes character data to a file. Normally, its output would be `NULL` (nothing), as we can see here: -```r +``` r x <- writeLines("some text", "test.txt") x ``` -```{.output} +``` output NULL ``` Here is our modified function that writes character data to a file and returns the name of the file (the `...` means "pass the rest of these arguments to `writeLines()`"): -```r +``` r write_lines_file <- function(text, file, ...) { writeLines(text = text, con = file, ...) file @@ -226,20 +226,20 @@ write_lines_file <- function(text, file, ...) { Let's try it out: -```r +``` r x <- write_lines_file("some text", "test.txt") x ``` -```{.output} +``` output [1] "test.txt" ``` We can now use this in a pipeline. For example let's change the text to upper case then write it out again: -```r +``` r library(targets) library(tarchetypes) @@ -260,16 +260,16 @@ tar_plan( ``` -```{.output} -• start target hello_file -• built target hello_file [0.002 seconds] -• start target hello -• built target hello [0 seconds] -• start target hello_caps -• built target hello_caps [0 seconds] -• start target hello_caps_out -• built target hello_caps_out [0 seconds] -• end pipeline [0.105 seconds] +``` output +▶ dispatched target hello_file +● completed target hello_file [0.001 seconds] +▶ dispatched target hello +● completed target hello [0 seconds] +▶ dispatched target hello_caps +● completed target hello_caps [0 seconds] +▶ dispatched target hello_caps_out +● completed target hello_caps_out [0 seconds] +▶ ended pipeline [0.062 seconds] ``` Take a look at `hello_caps.txt` in the `results` folder and verify it is as you expect. diff --git a/files/plans/plan_slurm.R b/files/plans/plan_slurm.R new file mode 100644 index 00000000..4d1c710c --- /dev/null +++ b/files/plans/plan_slurm.R @@ -0,0 +1,49 @@ +library(crew.cluster) +library(targets) +library(tarchetypes) +library(palmerpenguins) +library(broom) +suppressPackageStartupMessages(library(tidyverse)) + +source("R/packages.R") +source("R/functions.R") + +tar_option_set( + controller = crew_controller_slurm( + workers = 3, + script_lines = "module load R", + slurm_memory_gigabytes_per_cpu = 1 + ) +) + +tar_plan( + # Load raw data + tar_file_read( + penguins_data_raw, + path_to_file("penguins_raw.csv"), + read_csv(!!.x, show_col_types = FALSE) + ), + # Clean data + penguins_data = clean_penguin_data(penguins_data_raw), + # Build models + models = list( + combined_model = lm( + bill_depth_mm ~ bill_length_mm, data = penguins_data), + species_model = lm( + bill_depth_mm ~ bill_length_mm + species, data = penguins_data), + interaction_model = lm( + bill_depth_mm ~ bill_length_mm * species, data = penguins_data) + ), + # Get model summaries + tar_target( + model_summaries, + glance_with_mod_name_slow(models), + pattern = map(models) + ), + # Get model predictions + tar_target( + model_predictions, + augment_with_mod_name_slow(models), + pattern = map(models) + ) +) diff --git a/files/plans/plan_slurm_gpu.R b/files/plans/plan_slurm_gpu.R new file mode 100644 index 00000000..badbab1d --- /dev/null +++ b/files/plans/plan_slurm_gpu.R @@ -0,0 +1,52 @@ +graphics_devices <- function(){ + system2("lshw", c("-class", "display"), stdout=TRUE, stderr=FALSE) +} + +library(crew) +library(targets) +library(tarchetypes) +library(crew.cluster) + +source("R/packages.R") +source("R/functions.R") + +tar_option_set( + controller = crew_controller_group( + crew_controller_slurm( + name = "cpu_worker", + workers = 1, + script_lines = "module load R", + slurm_memory_gigabytes_per_cpu = 1, + slurm_cpus_per_task = 1 + ), + + crew_controller_slurm( + name = "gpu_worker", + workers = 1, + script_lines = c( + "#SBATCH --partition=gpuq", + "#SBATCH --gres=gpu:1", + "module load R" + ), + slurm_memory_gigabytes_per_cpu = 1, + slurm_cpus_per_task = 1 + ) + ) +) + +tar_plan( + tar_target( + cpu_hardware, + graphics_devices(), + resources = tar_resources( + crew = tar_resources_crew(controller = "cpu_worker") + ) + ), + tar_target( + gpu_hardware, + graphics_devices(), + resources = tar_resources( + crew = tar_resources_crew(controller = "gpu_worker") + ) + ) +) diff --git a/files/plans/plan_slurm_memory.R b/files/plans/plan_slurm_memory.R new file mode 100644 index 00000000..5056aadf --- /dev/null +++ b/files/plans/plan_slurm_memory.R @@ -0,0 +1,39 @@ +library(crew) +library(targets) +library(tarchetypes) +library(crew.cluster) + +source("R/packages.R") +source("R/functions.R") + +small_memory <- crew_controller_slurm( + name = "small_memory", + script_lines = "module load R", + slurm_memory_gigabytes_per_cpu = 10 +) +big_memory <- crew_controller_slurm( + name = "big_memory", + script_lines = "module load R", + slurm_memory_gigabytes_per_cpu = 20 +) + +tar_option_set( + controller = crew_controller_group(small_memory, big_memory) +) + +list( + tar_target( + name = big_memory_task, + command = Sys.getenv("SLURM_MEM_PER_CPU"), + resources = tar_resources( + crew = tar_resources_crew(controller = "big_memory") + ) + ), + tar_target( + name = small_memory_task, + command = Sys.getenv("SLURM_MEM_PER_CPU"), + resources = tar_resources( + crew = tar_resources_crew(controller = "small_memory") + ) + ) +) diff --git a/hpc.md b/hpc.md new file mode 100644 index 00000000..e5b134ce --- /dev/null +++ b/hpc.md @@ -0,0 +1,41 @@ +--- +title: 'Deploying Targets on HPC' +teaching: 10 +exercises: 2 +--- + + +sbatch was not detected. Likely Slurm is not installed. Exiting. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lifecycle.md b/lifecycle.md index 0a9de414..6e883848 100644 --- a/lifecycle.md +++ b/lifecycle.md @@ -34,15 +34,15 @@ One of the features of `targets` is that it maximizes efficiency by only running This is easiest to understand by trying it yourself. Let's try running the workflow again: -```r +``` r tar_make() ``` -```{.output} -✔ skip target penguins_csv_file -✔ skip target penguins_data_raw -✔ skip target penguins_data -✔ skip pipeline [0.081 seconds] +``` output +✔ skipped target penguins_csv_file +✔ skipped target penguins_data_raw +✔ skipped target penguins_data +✔ skipped pipeline [0.071 seconds] ``` Remember how the first time we ran the pipeline, `targets` printed out a list of each target as it was being built? @@ -61,7 +61,7 @@ Right now they include the common name and the scientific name, but we really on Edit `_targets.R` so that the `clean_penguin_data()` function looks like this: -```r +``` r clean_penguin_data <- function(penguins_data_raw) { penguins_data_raw |> select( @@ -78,16 +78,16 @@ clean_penguin_data <- function(penguins_data_raw) { Then run it again. -```r +``` r tar_make() ``` -```{.output} -✔ skip target penguins_csv_file -✔ skip target penguins_data_raw -• start target penguins_data -• built target penguins_data [0.026 seconds] -• end pipeline [0.128 seconds] +``` output +✔ skipped target penguins_csv_file +✔ skipped target penguins_data_raw +▶ dispatched target penguins_data +● completed target penguins_data [0.011 seconds] +▶ ended pipeline [0.093 seconds] ``` What happened? @@ -141,7 +141,7 @@ It is good to be able to visualize the state of the workflow. This can be done with `tar_visnetwork()` -```r +``` r tar_visnetwork() ``` @@ -207,11 +207,11 @@ There are some other useful functions that can do that. If everything is up to date, it will return a zero-length character vector (`character(0)`). -```r +``` r tar_outdated() ``` -```{.output} +``` output character(0) ``` @@ -219,17 +219,17 @@ character(0) You may find it helpful to further manipulate the dataframe to obtain useful summaries of the workflow, for example using `dplyr` (such data manipulation is beyond the scope of this lesson but the instructor may demonstrate its use). -```r +``` r tar_progress() ``` -```{.output} +``` output # A tibble: 3 × 2 - name progress - -1 penguins_csv_file skipped -2 penguins_data_raw skipped -3 penguins_data built + name progress + +1 penguins_csv_file skipped +2 penguins_data_raw skipped +3 penguins_data completed ``` ## Granular control of targets @@ -244,31 +244,31 @@ Furthermore, if you want to manually "reset" a target and make it appear out-of- Let's give this a try. Remember that our pipeline is currently up to date, so `tar_make()` will skip everything: -```r +``` r tar_make() ``` -```{.output} -✔ skip target penguins_csv_file -✔ skip target penguins_data_raw -✔ skip target penguins_data -✔ skip pipeline [0.077 seconds] +``` output +✔ skipped target penguins_csv_file +✔ skipped target penguins_data_raw +✔ skipped target penguins_data +✔ skipped pipeline [0.075 seconds] ``` Let's invalidate `penguins_data` and run it again: -```r +``` r tar_invalidate(penguins_data) tar_make() ``` -```{.output} -✔ skip target penguins_csv_file -✔ skip target penguins_data_raw -• start target penguins_data -• built target penguins_data [0.038 seconds] -• end pipeline [0.127 seconds] +``` output +✔ skipped target penguins_csv_file +✔ skipped target penguins_data_raw +▶ dispatched target penguins_data +● completed target penguins_data [0.012 seconds] +▶ ended pipeline [0.091 seconds] ``` If you want to reset **everything** and start fresh, you can use `tar_invalidate(everything())` (`tar_invalidate()` [accepts `tidyselect` expressions](https://docs.ropensci.org/targets/reference/tar_invalidate.html) to specify target names). diff --git a/md5sum.txt b/md5sum.txt index 6e7968a4..91e6f257 100644 --- a/md5sum.txt +++ b/md5sum.txt @@ -1,21 +1,22 @@ "file" "checksum" "built" "date" -"CODE_OF_CONDUCT.md" "c93c83c630db2fe2462240bf72552548" "site/built/CODE_OF_CONDUCT.md" "2024-03-12" -"LICENSE.md" "b24ebbb41b14ca25cf6b8216dda83e5f" "site/built/LICENSE.md" "2024-03-12" -"config.yaml" "97cf738871f0133f70da7d938c14bfb2" "site/built/config.yaml" "2024-03-12" -"index.md" "06bbfd5ab0e2353032361b3321342d13" "site/built/index.md" "2024-03-12" -"links.md" "8184cf4149eafbf03ce8da8ff0778c14" "site/built/links.md" "2024-03-12" -"episodes/introduction.Rmd" "feaacfccab344eb1fa6e702aded97924" "site/built/introduction.md" "2024-03-12" -"episodes/basic-targets.Rmd" "90190eae899db41c64b69320e3f72365" "site/built/basic-targets.md" "2024-03-12" -"episodes/cache.Rmd" "b487d6d792469641faec63c838541aac" "site/built/cache.md" "2024-03-12" -"episodes/lifecycle.Rmd" "7974a62cc37ac1138647d043fe1e4a26" "site/built/lifecycle.md" "2024-03-12" -"episodes/organization.Rmd" "74df25779b74013eeb6a8ca7b8934efe" "site/built/organization.md" "2024-03-12" -"episodes/packages.Rmd" "2c0eb6138ea6685a0ee279c89b381bc4" "site/built/packages.md" "2024-03-12" -"episodes/files.Rmd" "b7f4ef83379a58d5c30d8e011e3b2c0d" "site/built/files.md" "2024-03-12" -"episodes/branch.Rmd" "6f1187d6df3310eb042aaae3a44328dc" "site/built/branch.md" "2024-03-12" -"episodes/parallel.Rmd" "f9b7709ceae26b281ea5919835f5260b" "site/built/parallel.md" "2024-03-12" -"episodes/quarto.Rmd" "b854a0a44fd0ec7e503c9e99d21f8fce" "site/built/quarto.md" "2024-03-12" -"instructors/instructor-notes.md" "df3784ee5c0436a9e171071f7965d3fc" "site/built/instructor-notes.md" "2024-03-12" -"learners/reference.md" "3f06251c1f932e767ae8f22db25eb5a2" "site/built/reference.md" "2024-03-12" -"learners/setup.md" "b4bdd601ab985cf048829f49710df7fc" "site/built/setup.md" "2024-03-12" -"profiles/learner-profiles.md" "44d8b9d8aca7963e6577e8c67d23eac0" "site/built/learner-profiles.md" "2024-03-12" -"renv/profiles/lesson-requirements/renv.lock" "709c5f088d07ec0ae755f23905be9799" "site/built/renv.lock" "2024-03-12" +"CODE_OF_CONDUCT.md" "c93c83c630db2fe2462240bf72552548" "site/built/CODE_OF_CONDUCT.md" "2024-07-10" +"LICENSE.md" "b24ebbb41b14ca25cf6b8216dda83e5f" "site/built/LICENSE.md" "2024-07-10" +"config.yaml" "5b0ca11806a6d604dd96faa2f669590e" "site/built/config.yaml" "2024-07-10" +"index.md" "06bbfd5ab0e2353032361b3321342d13" "site/built/index.md" "2024-07-10" +"links.md" "8184cf4149eafbf03ce8da8ff0778c14" "site/built/links.md" "2024-07-10" +"episodes/introduction.Rmd" "feaacfccab344eb1fa6e702aded97924" "site/built/introduction.md" "2024-07-10" +"episodes/basic-targets.Rmd" "90190eae899db41c64b69320e3f72365" "site/built/basic-targets.md" "2024-07-10" +"episodes/cache.Rmd" "b487d6d792469641faec63c838541aac" "site/built/cache.md" "2024-07-10" +"episodes/lifecycle.Rmd" "7974a62cc37ac1138647d043fe1e4a26" "site/built/lifecycle.md" "2024-07-10" +"episodes/organization.Rmd" "74df25779b74013eeb6a8ca7b8934efe" "site/built/organization.md" "2024-07-10" +"episodes/packages.Rmd" "2c0eb6138ea6685a0ee279c89b381bc4" "site/built/packages.md" "2024-07-10" +"episodes/files.Rmd" "b7f4ef83379a58d5c30d8e011e3b2c0d" "site/built/files.md" "2024-07-10" +"episodes/branch.Rmd" "6f1187d6df3310eb042aaae3a44328dc" "site/built/branch.md" "2024-07-10" +"episodes/parallel.Rmd" "f9b7709ceae26b281ea5919835f5260b" "site/built/parallel.md" "2024-07-10" +"episodes/quarto.Rmd" "b854a0a44fd0ec7e503c9e99d21f8fce" "site/built/quarto.md" "2024-07-10" +"episodes/hpc.Rmd" "567d70e3ed162e5b01e96b4306527a56" "site/built/hpc.md" "2024-07-10" +"instructors/instructor-notes.md" "df3784ee5c0436a9e171071f7965d3fc" "site/built/instructor-notes.md" "2024-07-10" +"learners/reference.md" "3f06251c1f932e767ae8f22db25eb5a2" "site/built/reference.md" "2024-07-10" +"learners/setup.md" "b4bdd601ab985cf048829f49710df7fc" "site/built/setup.md" "2024-07-10" +"profiles/learner-profiles.md" "44d8b9d8aca7963e6577e8c67d23eac0" "site/built/learner-profiles.md" "2024-07-10" +"renv/profiles/lesson-requirements/renv.lock" "fbab3d0f112acd3bc7f4527ebf985996" "site/built/renv.lock" "2024-07-10" diff --git a/organization.md b/organization.md index e74671f9..e9b55f61 100644 --- a/organization.md +++ b/organization.md @@ -49,7 +49,7 @@ Let's edit the penguins workflow to use the `tar_plan()` syntax: -```r +``` r library(targets) library(tarchetypes) library(palmerpenguins) @@ -96,7 +96,7 @@ Similarly, let's put the `library()` calls in their own script in `R/` called `p We will also need to modify our `_targets.R` script to call these scripts with `source`: -```r +``` r source("R/packages.R") source("R/functions.R") @@ -128,7 +128,7 @@ Another major difference is that **each target must have a unique name**. You may be used to writing code that looks like this: -```r +``` r # Store a person's height in cm, then convert to inches height <- 160 height <- height / 2.54 @@ -137,7 +137,7 @@ height <- height / 2.54 You would get an error if you tried to run the equivalent targets pipeline: -```r +``` r tar_plan( height = 160, height = height / 2.54 @@ -145,13 +145,42 @@ tar_plan( ``` -```{.error} +``` error Error: ! Error running targets::tar_make() - Error messages: targets::tar_meta(fields = error, complete_only = TRUE) - Debugging guide: https://books.ropensci.org/targets/debugging.html - How to ask for help: https://books.ropensci.org/targets/help.html - Last error: duplicated target names: height +Error messages: targets::tar_meta(fields = error, complete_only = TRUE) +Debugging guide: https://books.ropensci.org/targets/debugging.html +How to ask for help: https://books.ropensci.org/targets/help.html +Last error message: + duplicated target names: height +Last error traceback: + base::tryCatch(base::withCallingHandlers({ NULL base::saveRDS(base::do.c... + tryCatchList(expr, classes, parentenv, handlers) + tryCatchOne(tryCatchList(expr, names[-nh], parentenv, handlers[-nh]), na... + doTryCatch(return(expr), name, parentenv, handler) + tryCatchList(expr, names[-nh], parentenv, handlers[-nh]) + tryCatchOne(expr, names, parentenv, handlers[[1L]]) + doTryCatch(return(expr), name, parentenv, handler) + base::withCallingHandlers({ NULL base::saveRDS(base::do.call(base::do.ca... + base::saveRDS(base::do.call(base::do.call, base::c(base::readRDS("/tmp/R... + base::do.call(base::do.call, base::c(base::readRDS("/tmp/RtmpwFOmnm/call... + (function (what, args, quote = FALSE, envir = parent.frame()) { if (!is.... + (function (targets_function, targets_arguments, options, envir = NULL, s... + tryCatch(out <- withCallingHandlers(targets::tar_callr_inner_try(targets... + tryCatchList(expr, classes, parentenv, handlers) + tryCatchOne(expr, names, parentenv, handlers[[1L]]) + doTryCatch(return(expr), name, parentenv, handler) + withCallingHandlers(targets::tar_callr_inner_try(targets_function = targ... + targets::tar_callr_inner_try(targets_function = targets_function, target... + pipeline_from_list(targets) + pipeline_from_list.default(targets) + pipeline_init(out) + pipeline_targets_init(targets, clone_targets) + tar_assert_unique_targets(names) + tar_throw_validate(message) + tar_error(message = paste0(...), class = c("tar_condition_validate", "ta... + rlang::abort(message = message, class = class, call = tar_empty_envir) + signal_abort(cnd, .file) ``` **A major part of working with `targets` pipelines is writing custom functions that are the right size.** diff --git a/packages.md b/packages.md index 935dd02d..06e86bc4 100644 --- a/packages.md +++ b/packages.md @@ -57,7 +57,7 @@ We are about to create a new `_targets.R` file, but you probably don't want to l This is what using the `tar_option_set()` method looks like: -```r +``` r library(targets) library(tarchetypes) @@ -69,10 +69,10 @@ tar_plan( ``` -```{.output} -• start target adelie_data -• built target adelie_data [0.031 seconds] -• end pipeline [0.109 seconds] +``` output +▶ dispatched target adelie_data +● completed target adelie_data [0.017 seconds] +▶ ended pipeline [0.064 seconds] ``` This method gets around the slow-downs that may sometimes be experienced with Method 1. @@ -84,7 +84,7 @@ The main function for defining targets, `tar_target()` includes a `packages` arg Here is how we could use this method, modified from the same example as above. -```r +``` r library(targets) library(tarchetypes) @@ -98,10 +98,10 @@ tar_plan( ``` -```{.output} -• start target adelie_data -• built target adelie_data [0.033 seconds] -• end pipeline [0.112 seconds] +``` output +▶ dispatched target adelie_data +● completed target adelie_data [0.018 seconds] +▶ ended pipeline [0.066 seconds] ``` This can be more memory efficient in some cases than loading all packages, since not every target is always made during a typical run of the workflow. @@ -115,7 +115,7 @@ This means you can **avoid loading packages altogether**. Here is how to write the plan using this method: -```r +``` r library(targets) library(tarchetypes) @@ -125,10 +125,10 @@ tar_plan( ``` -```{.output} -• start target adelie_data -• built target adelie_data [0.023 seconds] -• end pipeline [0.101 seconds] +``` output +▶ dispatched target adelie_data +● completed target adelie_data [0.009 seconds] +▶ ended pipeline [0.058 seconds] ``` The benefits of this approach are that the origins of all functions is explicit, so you could browse your code (for example, by looking at its source in GitHub), and immediately know where all the functions come from. @@ -169,7 +169,7 @@ For example, you may want to do this if you are using your own custom package th The way to do so is by using `tar_option_set()`, specifying the **same** package name in both `packages` and `imports`. Here is a modified version of the earlier code that demonstrates this for `dplyr` and `palmerpenguins`. -```r +``` r library(targets) library(tarchetypes) @@ -210,7 +210,7 @@ This will open `.Rprofile` in your editor, where you can edit it and save it. For example, your `.Rprofile` could include this: -```r +``` r library(conflicted) conflicts_prefer(dplyr::filter) ``` diff --git a/parallel.md b/parallel.md index 2b14e20a..c90eca86 100644 --- a/parallel.md +++ b/parallel.md @@ -51,7 +51,7 @@ For this demo, we will use the new [`crew` backend](https://wlandau.github.io/cr You will need to install several packages to use the `crew` backend: -```r +``` r install.packages("nanonext", repos = "https://shikokuchuo.r-universe.dev") install.packages("mirai", repos = "https://shikokuchuo.r-universe.dev") install.packages("crew", type = "source") @@ -76,7 +76,7 @@ Make these changes to the penguins analysis. It should now look like this: -```r +``` r source("R/functions.R") source("R/packages.R") @@ -127,7 +127,7 @@ This will simulate a long-running computation and enable us to see the differenc Add these functions to `functions.R` (you can copy-paste the original ones, then modify them): -```r +``` r glance_with_mod_name_slow <- function(model_in_list) { Sys.sleep(4) model_name <- names(model_in_list) @@ -147,7 +147,7 @@ augment_with_mod_name_slow <- function(model_in_list) { Then, change the plan to use the "slow" version of the functions: -```r +``` r source("R/functions.R") source("R/packages.R") @@ -193,7 +193,7 @@ tar_plan( Finally, run the pipeline with `tar_make()` as normal. -```{.output} +``` output ✔ skip target penguins_data_raw_file ✔ skip target penguins_data_raw ✔ skip target penguins_data diff --git a/quarto.md b/quarto.md index cc682e7e..19e78f74 100644 --- a/quarto.md +++ b/quarto.md @@ -80,7 +80,7 @@ Copy the [raw code from here](https://raw.githubusercontent.com/joelnitta/pengui Then, add one more target to the pipeline using the `tar_quarto()` function like this: -```r +``` r source("R/functions.R") source("R/packages.R") @@ -140,7 +140,7 @@ How does this work? The answer lies **inside** the `penguin_report.qmd` file. Let's look at the start of the file: -````markdown +```` markdown --- title: "Simpson's Paradox in Palmer Penguins" format: diff --git a/renv.lock b/renv.lock deleted file mode 100644 index a71e04bd..00000000 --- a/renv.lock +++ /dev/null @@ -1,1842 +0,0 @@ -{ - "R": { - "Version": "4.3.3", - "Repositories": [ - { - "Name": "carpentries", - "URL": "https://carpentries.r-universe.dev" - }, - { - "Name": "carpentries_archive", - "URL": "https://carpentries.github.io/drat" - }, - { - "Name": "CRAN", - "URL": "https://cran.rstudio.com" - } - ] - }, - "Packages": { - "DBI": { - "Package": "DBI", - "Version": "1.1.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "b2866e62bab9378c3cc9476a1954226b" - }, - "MASS": { - "Package": "MASS", - "Version": "7.3-59", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics", - "methods", - "stats", - "utils" - ], - "Hash": "26570ae748e78cb2b0f56019dd2ba354" - }, - "Matrix": { - "Package": "Matrix", - "Version": "1.5-4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "graphics", - "grid", - "lattice", - "methods", - "stats", - "utils" - ], - "Hash": "e779c7d9f35cc364438578f334cffee2" - }, - "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.10", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "methods", - "utils" - ], - "Hash": "e749cae40fa9ef469b6050959517453c" - }, - "askpass": { - "Package": "askpass", - "Version": "1.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "sys" - ], - "Hash": "e8a22846fff485f0be3770c2da758713" - }, - "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" - }, - "base64url": { - "Package": "base64url", - "Version": "1.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "backports" - ], - "Hash": "0c54cf3a08cc0e550fbd64ad33166143" - }, - "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.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "backports", - "dplyr", - "ellipsis", - "generics", - "glue", - "lifecycle", - "purrr", - "rlang", - "stringr", - "tibble", - "tidyr" - ], - "Hash": "f62b2504021369a2449c54bbda362d30" - }, - "bslib": { - "Package": "bslib", - "Version": "0.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "base64enc", - "cachem", - "grDevices", - "htmltools", - "jquerylib", - "jsonlite", - "memoise", - "mime", - "rlang", - "sass" - ], - "Hash": "a7fbf03946ad741129dc81098722fca1" - }, - "cachem": { - "Package": "cachem", - "Version": "1.0.8", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "fastmap", - "rlang" - ], - "Hash": "c35768291560ce302c0a6589f92e837d" - }, - "callr": { - "Package": "callr", - "Version": "3.7.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "processx", - "utils" - ], - "Hash": "9b2191ede20fa29828139b9900922e51" - }, - "cellranger": { - "Package": "cellranger", - "Version": "1.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "rematch", - "tibble" - ], - "Hash": "f61dbaec772ccd2e17705c1e872e9e7c" - }, - "cli": { - "Package": "cli", - "Version": "3.6.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "89e6d8219950eac806ae0c489052048a" - }, - "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" - }, - "colorspace": { - "Package": "colorspace", - "Version": "2.1-0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics", - "methods", - "stats" - ], - "Hash": "f20c47fd52fae58b4e377c37bb8c335b" - }, - "conflicted": { - "Package": "conflicted", - "Version": "1.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "memoise", - "rlang" - ], - "Hash": "bb097fccb22d156624fd07cd2894ddb6" - }, - "cpp11": { - "Package": "cpp11", - "Version": "0.4.3", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "ed588261931ee3be2c700d22e94a29ab" - }, - "crayon": { - "Package": "crayon", - "Version": "1.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "grDevices", - "methods", - "utils" - ], - "Hash": "e8a1e41acf02548751f45c718d55aa6a" - }, - "crew": { - "Package": "crew", - "Version": "0.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "getip", - "mirai", - "nanonext", - "processx", - "ps", - "rlang", - "stats", - "tibble", - "tidyselect", - "utils" - ], - "Hash": "50a166a0063e9e74231f4473ec8dcab3" - }, - "curl": { - "Package": "curl", - "Version": "5.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "e4f97056611e8e6b8b852d13b7400cf1" - }, - "data.table": { - "Package": "data.table", - "Version": "1.14.8", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "b4c06e554f33344e044ccd7fdca750a9" - }, - "dbplyr": { - "Package": "dbplyr", - "Version": "2.3.2", - "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": "d24305b92db333726aed162a2c23a147" - }, - "digest": { - "Package": "digest", - "Version": "0.6.31", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "8b708f296afd9ae69f450f9640be8990" - }, - "dplyr": { - "Package": "dplyr", - "Version": "1.1.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", - "generics", - "glue", - "lifecycle", - "magrittr", - "methods", - "pillar", - "rlang", - "tibble", - "tidyselect", - "utils", - "vctrs" - ], - "Hash": "dea6970ff715ca541c387de363ff405e" - }, - "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.20", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "4b68aa51edd89a0e044a66e75ae3cc6c" - }, - "fansi": { - "Package": "fansi", - "Version": "1.0.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "utils" - ], - "Hash": "1d9e7ad3c8312a192dea7d3db0274fde" - }, - "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.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "htmltools", - "rlang" - ], - "Hash": "1e22b8cabbad1eae951a75e9f8b52378" - }, - "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.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "94af08e0aa9675a16fadbb3aaaa90d2a" - }, - "furrr": { - "Package": "furrr", - "Version": "0.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "future", - "globals", - "lifecycle", - "purrr", - "rlang", - "vctrs" - ], - "Hash": "da7a4c32196cb2262a41dd5a25d486ff" - }, - "future": { - "Package": "future", - "Version": "1.32.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "digest", - "globals", - "listenv", - "parallel", - "parallelly", - "utils" - ], - "Hash": "c68517cf2f78be4ea86e140b8598a4ca" - }, - "future.callr": { - "Package": "future.callr", - "Version": "0.8.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "callr", - "future" - ], - "Hash": "e76426c4a99a1798a9376c6fe9070a68" - }, - "gargle": { - "Package": "gargle", - "Version": "1.4.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "fs", - "glue", - "httr", - "jsonlite", - "lifecycle", - "openssl", - "rappdirs", - "rlang", - "stats", - "utils", - "withr" - ], - "Hash": "8c72a723822dc317613da5ff8e8da6ee" - }, - "generics": { - "Package": "generics", - "Version": "0.1.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "15e9634c0fcd294799e9b2e929ed1b86" - }, - "getip": { - "Package": "getip", - "Version": "0.1-3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "ceb49d19444b9b3acfce8ee34e23e2f5" - }, - "ggplot2": { - "Package": "ggplot2", - "Version": "3.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "MASS", - "R", - "cli", - "glue", - "grDevices", - "grid", - "gtable", - "isoband", - "lifecycle", - "mgcv", - "rlang", - "scales", - "stats", - "tibble", - "vctrs", - "withr" - ], - "Hash": "3a147ee02e85a8941aad9909f1b43b7b" - }, - "globals": { - "Package": "globals", - "Version": "0.16.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "codetools" - ], - "Hash": "baa9585ab4ce47a9f4618e671778cc6f" - }, - "glue": { - "Package": "glue", - "Version": "1.6.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e" - }, - "googledrive": { - "Package": "googledrive", - "Version": "2.1.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "gargle", - "glue", - "httr", - "jsonlite", - "lifecycle", - "magrittr", - "pillar", - "purrr", - "rlang", - "tibble", - "utils", - "uuid", - "vctrs", - "withr" - ], - "Hash": "e88ba642951bc8d1898ba0d12581850b" - }, - "googlesheets4": { - "Package": "googlesheets4", - "Version": "1.1.0", - "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": "fd7b97bd862a14297b0bb7ed28a3dada" - }, - "gtable": { - "Package": "gtable", - "Version": "0.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "grid", - "lifecycle", - "rlang" - ], - "Hash": "b44addadb528a0d227794121c00572a0" - }, - "haven": { - "Package": "haven", - "Version": "2.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "cpp11", - "forcats", - "hms", - "lifecycle", - "methods", - "readr", - "rlang", - "tibble", - "tidyselect", - "vctrs" - ], - "Hash": "8b331e659e67d757db0fcc28e689c501" - }, - "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.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "base64enc", - "digest", - "ellipsis", - "fastmap", - "grDevices", - "rlang", - "utils" - ], - "Hash": "ba0240784ad50a62165058a27459304a" - }, - "htmlwidgets": { - "Package": "htmlwidgets", - "Version": "1.6.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "grDevices", - "htmltools", - "jsonlite", - "knitr", - "rmarkdown", - "yaml" - ], - "Hash": "a865aa85bcb2697f47505bfd70422471" - }, - "httr": { - "Package": "httr", - "Version": "1.4.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "curl", - "jsonlite", - "mime", - "openssl" - ], - "Hash": "7e5e3cbd2a7bc07880c94e22348fb661" - }, - "ids": { - "Package": "ids", - "Version": "1.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "openssl", - "uuid" - ], - "Hash": "99df65cfef20e525ed38c3d2577f7190" - }, - "igraph": { - "Package": "igraph", - "Version": "1.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", - "cpp11", - "grDevices", - "graphics", - "magrittr", - "methods", - "pkgconfig", - "rlang", - "stats", - "utils" - ], - "Hash": "3e476b375c746d899fd53a7281d78191" - }, - "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.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "methods" - ], - "Hash": "a4269a09a9b865579b2635c77e572374" - }, - "knitr": { - "Package": "knitr", - "Version": "1.42", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "evaluate", - "highr", - "methods", - "tools", - "xfun", - "yaml" - ], - "Hash": "8329a9bcc82943c8069104d4be3ee22d" - }, - "labeling": { - "Package": "labeling", - "Version": "0.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "graphics", - "stats" - ], - "Hash": "3d5108641f47470611a32d0bdf357a72" - }, - "later": { - "Package": "later", - "Version": "1.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Rcpp", - "rlang" - ], - "Hash": "40401c9cf2bc2259dfe83311c9384710" - }, - "lattice": { - "Package": "lattice", - "Version": "0.21-8", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics", - "grid", - "stats", - "utils" - ], - "Hash": "0b8a6d63c8770f02a8b5635f3c431e6b" - }, - "lifecycle": { - "Package": "lifecycle", - "Version": "1.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "rlang" - ], - "Hash": "001cecbeac1cff9301bdc3775ee46a86" - }, - "listenv": { - "Package": "listenv", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "4fbd3679ec8ee169ba28d4b1ea7d0e8f" - }, - "lubridate": { - "Package": "lubridate", - "Version": "1.9.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "generics", - "methods", - "timechange" - ], - "Hash": "e25f18436e3efd42c7c590a1c4c15390" - }, - "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.8-42", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Matrix", - "R", - "graphics", - "methods", - "nlme", - "splines", - "stats", - "utils" - ], - "Hash": "3460beba7ccc8946249ba35327ba902a" - }, - "mime": { - "Package": "mime", - "Version": "0.12", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "tools" - ], - "Hash": "18e9c28c1d3ca1560ce30658b22ce104" - }, - "mirai": { - "Package": "mirai", - "Version": "0.8.7", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "nanonext" - ], - "Hash": "56134b1459538963b210ab61fd0a9d16" - }, - "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" - }, - "nanonext": { - "Package": "nanonext", - "Version": "0.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "6ace059b9be5e80d84a537f9180d441e" - }, - "nlme": { - "Package": "nlme", - "Version": "3.1-162", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "graphics", - "lattice", - "stats", - "utils" - ], - "Hash": "0984ce8da8da9ead8643c5cbbb60f83e" - }, - "openssl": { - "Package": "openssl", - "Version": "2.0.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "askpass" - ], - "Hash": "0f7cd2962e3044bb940cca4f4b5cecbe" - }, - "packrat": { - "Package": "packrat", - "Version": "0.9.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "tools", - "utils" - ], - "Hash": "481428983c19a7c443f7ea1beff0a2de" - }, - "palmerpenguins": { - "Package": "palmerpenguins", - "Version": "0.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "6c6861efbc13c1d543749e9c7be4a592" - }, - "parallelly": { - "Package": "parallelly", - "Version": "1.35.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "parallel", - "tools", - "utils" - ], - "Hash": "1cf5a54cfc5dcb0b84037acfd93cbca7" - }, - "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" - }, - "prettyunits": { - "Package": "prettyunits", - "Version": "1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "95ef9167b75dde9d2ccc3c7528393e7e" - }, - "processx": { - "Package": "processx", - "Version": "3.8.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "ps", - "utils" - ], - "Hash": "d75b4059d781336efba24021915902b4" - }, - "progress": { - "Package": "progress", - "Version": "1.2.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R6", - "crayon", - "hms", - "prettyunits" - ], - "Hash": "14dc9f7a3c91ebb14ec5bb9208a07061" - }, - "ps": { - "Package": "ps", - "Version": "1.7.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "709d852d33178db54b17c722e5b1e594" - }, - "purrr": { - "Package": "purrr", - "Version": "1.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "lifecycle", - "magrittr", - "rlang", - "vctrs" - ], - "Hash": "d71c815267c640f17ddbf7f16144b4bb" - }, - "quarto": { - "Package": "quarto", - "Version": "1.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "jsonlite", - "later", - "processx", - "rmarkdown", - "rsconnect", - "rstudioapi", - "utils", - "yaml" - ], - "Hash": "298a252816cabed120391c955aced484" - }, - "ragg": { - "Package": "ragg", - "Version": "1.2.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "systemfonts", - "textshaping" - ], - "Hash": "690bc058ea2b1b8a407d3cfe3dce3ef9" - }, - "rappdirs": { - "Package": "rappdirs", - "Version": "0.3.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "5e3c5dc0b071b21fa128676560dbe94d" - }, - "readr": { - "Package": "readr", - "Version": "2.1.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", - "clipr", - "cpp11", - "crayon", - "hms", - "lifecycle", - "methods", - "rlang", - "tibble", - "tzdb", - "utils", - "vroom" - ], - "Hash": "b5047343b3825f37ad9d3b5d89aa1078" - }, - "readxl": { - "Package": "readxl", - "Version": "1.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cellranger", - "cpp11", - "progress", - "tibble", - "utils" - ], - "Hash": "2e6020b1399d95f947ed867045e9ca17" - }, - "rematch": { - "Package": "rematch", - "Version": "1.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "c66b930d20bb6d858cd18e1cebcfae5c" - }, - "rematch2": { - "Package": "rematch2", - "Version": "2.1.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "tibble" - ], - "Hash": "76c9e04c712a05848ae7a23d2f170a40" - }, - "renv": { - "Package": "renv", - "Version": "0.17.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "utils" - ], - "Hash": "4543b8cd233ae25c6aba8548be9e747e" - }, - "reprex": { - "Package": "reprex", - "Version": "2.0.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "callr", - "cli", - "clipr", - "fs", - "glue", - "knitr", - "lifecycle", - "rlang", - "rmarkdown", - "rstudioapi", - "utils", - "withr" - ], - "Hash": "d66fe009d4c20b7ab1927eb405db9ee2" - }, - "rlang": { - "Package": "rlang", - "Version": "1.1.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "utils" - ], - "Hash": "a85c767b55f0bf9b7ad16c6d7baee5bb" - }, - "rmarkdown": { - "Package": "rmarkdown", - "Version": "2.21", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bslib", - "evaluate", - "fontawesome", - "htmltools", - "jquerylib", - "jsonlite", - "knitr", - "methods", - "stringr", - "tinytex", - "tools", - "utils", - "xfun", - "yaml" - ], - "Hash": "493df4ae51e2e984952ea4d5c75786a3" - }, - "rsconnect": { - "Package": "rsconnect", - "Version": "0.8.29", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "curl", - "digest", - "jsonlite", - "openssl", - "packrat", - "rstudioapi", - "tools", - "yaml" - ], - "Hash": "fe178fc15af80952f546aafedf655b36" - }, - "rstudioapi": { - "Package": "rstudioapi", - "Version": "0.14", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "690bd2acc42a9166ce34845884459320" - }, - "rvest": { - "Package": "rvest", - "Version": "1.0.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "httr", - "lifecycle", - "magrittr", - "rlang", - "selectr", - "tibble", - "withr", - "xml2" - ], - "Hash": "a4a5ac819a467808c60e36e92ddf195e" - }, - "sass": { - "Package": "sass", - "Version": "0.4.5", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R6", - "fs", - "htmltools", - "rappdirs", - "rlang" - ], - "Hash": "2bb4371a4c80115518261866eab6ab11" - }, - "scales": { - "Package": "scales", - "Version": "1.2.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "RColorBrewer", - "farver", - "labeling", - "lifecycle", - "munsell", - "rlang", - "viridisLite" - ], - "Hash": "906cb23d2f1c5680b8ce439b44c6fa63" - }, - "selectr": { - "Package": "selectr", - "Version": "0.4-2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "methods", - "stringr" - ], - "Hash": "3838071b66e0c566d55cc26bd6e27bf4" - }, - "stringi": { - "Package": "stringi", - "Version": "1.7.12", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "stats", - "tools", - "utils" - ], - "Hash": "ca8bd84263c77310739d2cf64d84d7c9" - }, - "stringr": { - "Package": "stringr", - "Version": "1.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "magrittr", - "rlang", - "stringi", - "vctrs" - ], - "Hash": "671a4d384ae9d32fc47a14e98bfa3dc8" - }, - "sys": { - "Package": "sys", - "Version": "3.4.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "34c16f1ef796057bfa06d3f4ff818a5d" - }, - "systemfonts": { - "Package": "systemfonts", - "Version": "1.0.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" - ], - "Hash": "90b28393209827327de889f49935140a" - }, - "tarchetypes": { - "Package": "tarchetypes", - "Version": "0.7.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "digest", - "dplyr", - "fs", - "furrr", - "future", - "future.callr", - "rlang", - "targets", - "tibble", - "tidyselect", - "utils", - "vctrs", - "withr" - ], - "Hash": "571f204a0ad0352cb96dc53b602e56e4" - }, - "targets": { - "Package": "targets", - "Version": "1.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "base64url", - "callr", - "cli", - "codetools", - "data.table", - "digest", - "igraph", - "knitr", - "rlang", - "stats", - "tibble", - "tidyselect", - "tools", - "utils", - "vctrs", - "withr", - "yaml" - ], - "Hash": "3f299989005cd3ccd101eb97623fd533" - }, - "textshaping": { - "Package": "textshaping", - "Version": "0.3.6", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11", - "systemfonts" - ], - "Hash": "1ab6223d3670fac7143202cb6a2d43d5" - }, - "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.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "cpp11", - "dplyr", - "glue", - "lifecycle", - "magrittr", - "purrr", - "rlang", - "stringr", - "tibble", - "tidyselect", - "utils", - "vctrs" - ], - "Hash": "e47debdc7ce599b070c8e78e8ac0cfcf" - }, - "tidyselect": { - "Package": "tidyselect", - "Version": "1.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "rlang", - "vctrs", - "withr" - ], - "Hash": "79540e5fcd9e0435af547d885f184fd5" - }, - "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.2.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" - ], - "Hash": "8548b44f79a35ba1791308b61e6012d7" - }, - "tinytex": { - "Package": "tinytex", - "Version": "0.45", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "xfun" - ], - "Hash": "e4e357f28c2edff493936b6cb30c3d65" - }, - "tzdb": { - "Package": "tzdb", - "Version": "0.3.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cpp11" - ], - "Hash": "b2e1cbce7c903eaf23ec05c58e59fb5e" - }, - "utf8": { - "Package": "utf8", - "Version": "1.2.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "1fe17157424bb09c48a8b3b550c753bc" - }, - "uuid": { - "Package": "uuid", - "Version": "1.1-0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "f1cb46c157d080b729159d407be83496" - }, - "vctrs": { - "Package": "vctrs", - "Version": "0.6.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "glue", - "lifecycle", - "rlang" - ], - "Hash": "a745bda7aff4734c17294bb41d4e4607" - }, - "viridisLite": { - "Package": "viridisLite", - "Version": "0.4.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "c826c7c4241b6fc89ff55aaea3fa7491" - }, - "visNetwork": { - "Package": "visNetwork", - "Version": "2.1.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "htmltools", - "htmlwidgets", - "jsonlite", - "magrittr", - "methods", - "stats", - "utils" - ], - "Hash": "3e48b097e8d9a91ecced2ed4817a678d" - }, - "vroom": { - "Package": "vroom", - "Version": "1.6.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bit64", - "cli", - "cpp11", - "crayon", - "glue", - "hms", - "lifecycle", - "methods", - "progress", - "rlang", - "stats", - "tibble", - "tidyselect", - "tzdb", - "vctrs", - "withr" - ], - "Hash": "8318e64ffb3a70e652494017ec455561" - }, - "withr": { - "Package": "withr", - "Version": "2.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics", - "stats" - ], - "Hash": "c0e49a9760983e81e55cdd9be92e7182" - }, - "xfun": { - "Package": "xfun", - "Version": "0.39", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "stats", - "tools" - ], - "Hash": "8f56e9acb54fb525e66464d57ab58bcb" - }, - "xml2": { - "Package": "xml2", - "Version": "1.3.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "methods" - ], - "Hash": "7dc765ac9b909487326a7d471fdd3821" - }, - "yaml": { - "Package": "yaml", - "Version": "2.3.7", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "0d0056cc5383fbc240ccd0cb584bf436" - } - } -}