diff --git a/episodes/.DS_Store b/episodes/.DS_Store
index 606085d7..21ebf3a2 100644
Binary files a/episodes/.DS_Store and b/episodes/.DS_Store differ
diff --git a/episodes/4-minimal-reproducible-code.Rmd b/episodes/4-minimal-reproducible-code.Rmd
index 0dd4460a..4dbfe13e 100644
--- a/episodes/4-minimal-reproducible-code.Rmd
+++ b/episodes/4-minimal-reproducible-code.Rmd
@@ -23,7 +23,7 @@ exercises: 35
- Describe the {reprex} package and its uses
:::
-```{r include = FALSE}
+```{r}
library(tidyverse)
library(ratdat)
library(here)
@@ -438,22 +438,21 @@ What are some ways that you could use a minimal dataset to make this reprex bett
This exercise should take about 5 minutes.
::: solution
-- Could provide the `control_spectab` file directly to Jordan, e.g. via email attachment.
-- Advantages: less work, keeps the context, Jordan is a coworker so they probably understand it.
-
-- Disadvantages: file might be large, relies on ability to email file, won't be able to use this method if you post the question online, file contains extra rows/columns that aren't actually necessary to this problem and might therefore be confusing.
+Could provide the `control_spectab` file directly to Jordan, e.g. via email attachment.
+Advantages: less work, keeps the context, Jordan is a coworker so they probably understand it.
+Disadvantages: file might be large, relies on ability to email file, won't be able to use this method if you post the question online, file contains extra rows/columns that aren't actually necessary to this problem and might therefore be confusing.
-- Could create a new dataset from scratch.
-- Advantages
-- Disadvantages
+Could create a new dataset from scratch.
+Advantages:
+Disadvantages:
-- Could take a minimal subset of the `control_spectab` data and use `dput` or similar to include it directly
-- Advantages
-- Disadvantages
+Could take a minimal subset of the `control_spectab` data and use `dput` or similar to include it directly
+Advantages:
+Disadvantages:
-- Could use a built-in dataset from R
-- Advantages
-- Disadvantages
+Could use a built-in dataset from R
+Advantages:
+Disadvantages:
:::
:::::::::::::::::::::::::::::::::::::::::::
diff --git a/episodes/5-asking-your-question.md b/episodes/5-asking-your-question.md
index b6010c0e..78a94175 100644
--- a/episodes/5-asking-your-question.md
+++ b/episodes/5-asking-your-question.md
@@ -5,25 +5,458 @@ exercises: 2
---
:::::::::::::::::::::::::::::::::::::: questions
-
- How can I make sure my minimal reproducible example will actually run correctly for someone else?
- How can I easily share a reproducible example with a mentor or helper, or online?
- How do I ask a good question?
-
::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::: objectives
-
-- Use the reprex package to support making reproducible examples.
+- Use the reprex package to test whether an example is reproducible.
- Use the reprex package to format reprexes for posting online.
- Understand the benefits and drawbacks of different places to get help.
- Have a road map to follow when posting a question to make sure it's a good question.
-
+- Understand what the {reprex} package does and doesn't do.
::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::: keypoints
-
- The {reprex} package makes it easy to format and share your reproducible examples.
- Following a certain set of steps will make your questions clearer and likelier to get answered.
-
::::::::::::::::::::::::::::::::::::::::::::::::
+
+Congratulations on making it this far. Creating a good reproducible example is a lot of work! In this episode, we'll talk about how to finish up your reprex, make sure it's ready to send to your helper or post online, and make absolutely double sure that it actually runs.
+
+There are three principles to remember when you think about sharing your reprex with other people:
+
+1. Reproducibility
+2. Formatting
+3. Context
+
+## 1. Reproducibility
+
+You might be thinking, *Haven't we already talked a lot about reproducibility?* We have! We discussed variables and packages, minimal datasets, and making sure that the problem is meaningfully reproduced by the data that you choose. But there are some reasons that a code snippet that appears reproducible in your own R session might not actually be runnable by someone else.
+
+Some possible reasons:
+
+- You forgot to account for the origins of some functions and/or variables. We went through our code methodically, but what if we missed something? It would be nice to confirm that the code is as self-contained as we thought it was.
+
+- Your code accidentally relies on objects in your R environment that won't exist for other people. For example, imagine you defined a function `my_awesome_custom_function()` in a project-specific `functions.R` script, and your code calls that function.
+
+![A function called `"my_awesome_custom_function"` is lurking in my R environment. I must have defined it a while ago and forgotten! Code that includes this function will not run for someone else unless the function definition is also included in the reprex.](fig/custom_function.png)
+
+```
+my_awesome_custom_function("rain")
+# [1] "rain is awesome!"
+```
+
+I might conclude that this code is reproducible--after all, it works when I run it! But unless I include the function defintion in the reprex itself, nobody who doesn't already have that custom function defined in their R environment will be able to run the code.
+
+A corrected reprex would look like this:
+
+```
+my_awesome_custom_function <- function(x){print(paste0(x, " is awesome!"))}
+my_awesome_custom_function("rain")
+#[1] "rain is awesome!"
+```
+
+Wouldn't it be nice if we had a way to check whether any traps like this are lurking in our draft reprex?
+
+Luckily, there's a package that can help you test out your reprexes in a clean, isolated environment to make sure they're actually reproducible. Introducing `{reprex}`!
+
+The most important function in the `{reprex}` package is called `reprex()`. Here's how to use it.
+
+First, install and load the `{reprex}` package.
+
+```
+#install.packages("reprex")
+library(reprex)
+```
+
+Second, write some code. This is your reproducible example.
+
+```
+(y <- 1:4)
+mean(y)
+```
+
+Third, highlight that code and copy it to your clipboard (e.g. `Cmd + C` on Mac, or `Ctrl + C` on Windows).
+
+Finally, type `reprex()` into your console.
+
+```
+# (with the target code snippet copied to your clipboard already...)
+# In the console:
+reprex()
+```
+
+`{reprex}` will grab the code that you copied to your clipboard and _run that code in an isolated environment_. It will return a nicely formatted reproducible example that includes your code and and any results, plots, warnings, or errors generated.
+
+The generated output will be on your clipboard by default, so all you have to do is paste it into GitHub, StackOverflow, Slack, or another venue.
+
+::: callout
+This workflow is unusual and takes some getting used to! Instead of copying your code *into* the function, you simply copy it to the clipboard (a mysterious, invisible place to most of us) and then let the blank, empty `reprex()` function go over to the clipboard by itself and find it.
+
+And then the completed, rendered reprex replaces the original code on the clipboard and all you need to do is paste, not copy and paste.
+
+Try to practice this workflow a few times with very simple reprexes so you can get a sense for the steps.
+:::
+
+Let's practice this one more time. Here's some very simple code:
+
+```
+library(ggplot2)
+library(dplyr)
+mpg %>%
+ ggplot(aes(x = factor(cyl), y = displ))+
+ geom_boxplot()
+```
+
+Let's highlight the code snippet, copy it to the clipboard, and then run `reprex()` in the console.
+
+```
+# In the console:
+reprex()
+```
+
+The result, which was automatically placed onto my clipboard and which I pasted here, looks like this:
+
+``` r
+library(ggplot2)
+library(dplyr)
+#>
+#> Attaching package: 'dplyr'
+#> The following objects are masked from 'package:stats':
+#>
+#> filter, lag
+#> The following objects are masked from 'package:base':
+#>
+#> intersect, setdiff, setequal, union
+mpg %>%
+ ggplot(aes(x = factor(cyl), y = displ))+
+ geom_boxplot()
+```
+
+![](https://i.imgur.com/bOA0BAS.png)
+
+Created on 2024-12-29 with [reprex v2.1.1](https://reprex.tidyverse.org)
+
+Nice and neat! It even includes the plot produced, so I don't have to take screenshots and figure out how to attach them to an email or something.
+
+The formatting is great, but `{reprex}` really shines when you treat it as a helpful collaborator in your process of building a reproducible example (including all dependencies, providing minimal data, etc.)
+
+Let's see what happens if we forget to include `library(ggplot2)` in our small reprex above.
+
+```
+library(dplyr)
+mpg %>%
+ ggplot(aes(x = factor(cyl), y = displ))+
+ geom_boxplot()
+```
+
+As before, let's copy that code to the clipboard, run `reprex()` in the console, and paste the result here.
+
+```
+# In the console:
+reprex()
+```
+
+``` r
+library(dplyr)
+#>
+#> Attaching package: 'dplyr'
+#> The following objects are masked from 'package:stats':
+#>
+#> filter, lag
+#> The following objects are masked from 'package:base':
+#>
+#> intersect, setdiff, setequal, union
+mpg %>%
+ ggplot(aes(x = factor(cyl), y = displ))+
+ geom_boxplot()
+#> Error in ggplot(., aes(x = factor(cyl), y = displ)): could not find function "ggplot"
+```
+
+Created on 2024-12-29 with [reprex v2.1.1](https://reprex.tidyverse.org)
+
+Now we get an error message indicating that R cannot find the function `ggplot`! That's because we forgot to load the `ggplot2` package in the reprex.
+
+This happened even though we had `ggplot2` already loaded in our own current RStudio session. `{reprex}` deliberately "plays dumb", running the code in a clean, isolated R session that's different from the R session we've been working in. This keeps us honest and makes sure we don't forget any important packages or function definitions.
+
+Let's return to our previous example with the custom function.
+
+```
+my_awesome_custom_function("rain")
+```
+
+```
+# In the console:
+reprex()
+```
+
+``` r
+my_awesome_custom_function("rain")
+#> Error in my_awesome_custom_function("rain"): could not find function "my_awesome_custom_function"
+```
+
+Created on 2024-12-29 with [reprex v2.1.1](https://reprex.tidyverse.org)
+
+By contrast, if we include the function definition:
+
+```
+my_awesome_custom_function <- function(x){print(paste0(x, " is awesome!"))}
+my_awesome_custom_function("rain")
+```
+
+```
+# In the console:
+reprex()
+```
+
+``` r
+my_awesome_custom_function <- function(x){print(paste0(x, " is awesome!"))}
+my_awesome_custom_function("rain")
+#> [1] "rain is awesome!"
+```
+
+Created on 2024-12-29 with [reprex v2.1.1](https://reprex.tidyverse.org)
+
+## Other features of `{reprex}`
+
+### Session Info
+Another nice thing about `{reprex}` is that you can choose to include information about your R session, in case your error has something to do with your R settings rather than the code itself. You can do that using the `session_info` argument to `reprex()`.
+
+For example:
+
+```
+library(ggplot2)
+library(dplyr)
+mpg %>%
+ ggplot(aes(x = factor(cyl), y = displ))+
+ geom_boxplot()
+```
+
+```
+# In the console:
+reprex(session_info = TRUE)
+```
+
+``` r
+library(ggplot2)
+library(dplyr)
+#>
+#> Attaching package: 'dplyr'
+#> The following objects are masked from 'package:stats':
+#>
+#> filter, lag
+#> The following objects are masked from 'package:base':
+#>
+#> intersect, setdiff, setequal, union
+mpg %>%
+ ggplot(aes(x = factor(cyl), y = displ))+
+ geom_boxplot()
+```
+
+![](https://i.imgur.com/kHBf9Zr.png)
+
+Created on 2024-12-29 with [reprex v2.1.1](https://reprex.tidyverse.org)
+
+
+
+Session info
+
+
+``` r
+sessioninfo::session_info()
+#> ─ Session info ───────────────────────────────────────────────────────────────
+#> setting value
+#> version R version 4.4.2 (2024-10-31)
+#> os macOS Monterey 12.7.6
+#> system aarch64, darwin20
+#> ui X11
+#> language (EN)
+#> collate en_US.UTF-8
+#> ctype en_US.UTF-8
+#> tz America/New_York
+#> date 2024-12-29
+#> pandoc 3.2 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/aarch64/ (via rmarkdown)
+#>
+#> ─ Packages ───────────────────────────────────────────────────────────────────
+#> package * version date (UTC) lib source
+#> cli 3.6.3 2024-06-21 [1] CRAN (R 4.4.0)
+#> colorspace 2.1-1 2024-07-26 [1] CRAN (R 4.4.0)
+#> curl 6.0.1 2024-11-20 [1] https://jeroen.r-universe.dev (R 4.4.2)
+#> digest 0.6.37 2024-08-19 [1] CRAN (R 4.4.1)
+#> dplyr * 1.1.4 2023-11-17 [1] CRAN (R 4.4.0)
+#> evaluate 1.0.1 2024-10-10 [1] CRAN (R 4.4.1)
+#> fansi 1.0.6 2023-12-08 [1] CRAN (R 4.4.0)
+#> farver 2.1.2 2024-05-13 [1] CRAN (R 4.4.0)
+#> fastmap 1.2.0 2024-05-15 [1] CRAN (R 4.4.0)
+#> fs 1.6.5 2024-10-30 [1] CRAN (R 4.4.1)
+#> generics 0.1.3 2022-07-05 [1] CRAN (R 4.4.0)
+#> ggplot2 * 3.5.1 2024-04-23 [1] CRAN (R 4.4.0)
+#> glue 1.8.0 2024-09-30 [1] CRAN (R 4.4.1)
+#> gtable 0.3.6 2024-10-25 [1] CRAN (R 4.4.1)
+#> htmltools 0.5.8.1 2024-04-04 [1] CRAN (R 4.4.0)
+#> knitr 1.49 2024-11-08 [1] CRAN (R 4.4.1)
+#> labeling 0.4.3 2023-08-29 [1] CRAN (R 4.4.0)
+#> lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.4.0)
+#> magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.4.0)
+#> munsell 0.5.1 2024-04-01 [1] CRAN (R 4.4.0)
+#> pillar 1.9.0 2023-03-22 [1] CRAN (R 4.4.0)
+#> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.4.0)
+#> R6 2.5.1 2021-08-19 [1] CRAN (R 4.4.0)
+#> reprex 2.1.1 2024-07-06 [1] CRAN (R 4.4.0)
+#> rlang 1.1.4 2024-06-04 [1] CRAN (R 4.4.0)
+#> rmarkdown 2.29 2024-11-04 [1] CRAN (R 4.4.1)
+#> rstudioapi 0.17.1 2024-10-22 [1] CRAN (R 4.4.1)
+#> scales 1.3.0 2023-11-28 [1] CRAN (R 4.4.0)
+#> sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.4.0)
+#> tibble 3.2.1 2023-03-20 [1] CRAN (R 4.4.0)
+#> tidyselect 1.2.1 2024-03-11 [1] CRAN (R 4.4.0)
+#> utf8 1.2.4 2023-10-22 [1] CRAN (R 4.4.0)
+#> vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.4.0)
+#> withr 3.0.2 2024-10-28 [1] CRAN (R 4.4.1)
+#> xfun 0.49 2024-10-31 [1] CRAN (R 4.4.1)
+#> xml2 1.3.6 2023-12-04 [1] CRAN (R 4.4.0)
+#> yaml 2.3.10 2024-07-26 [1] CRAN (R 4.4.0)
+#>
+#> [1] /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library
+#>
+#> ──────────────────────────────────────────────────────────────────────────────
+```
+
+
+
+### Formatting
+
+The output of `reprex()` is markdown, which can easily be copied and pasted into many sites/apps. However, different places have slightly different formatting conventions for markdown. `{reprex}` lets you customize the output of your reprex according to where you're planning to post it.
+
+The default, `venue = "gh"`, gives you "[GitHub-Flavored Markdown](https://github.github.com/gfm/)". Another format you might want is "r", which gives you a runnable R script, with commented output interleaved.
+
+Check out the formatting options in the help file with `?reprex`, and try out a few depending on the destination of your reprex!
+
+::: callout
+## `{reprex}` can't do everything for you!
+
+People often mention `{reprex}` as a useful tool for creating reproducible examples, but it can't do the work of crafting the example for you! The package doesn't locate the problem, pare down the code, create a minimal dataset, or automatically include package dependencies.
+
+A better way to think of `{reprex}` is as a tool to check your work as you go through the process of creating a reproducible example, and to help you polish up the result.
+:::
+
+## Testing it out
+
+Now that we've met our new reprex-making collaborator, let's use it to test out the reproducible example we created in the previous episode.
+
+Here's the code we wrote:
+
+```
+# This script will contain my minimal reproducible example.
+# Created by Mishka on 2024-12-17
+
+# Load packages needed for the analysis
+library(dplyr)
+
+# Provide a minimal dataset
+years <- 1:4
+species <- c("Species A", "Species B", "Species C")
+plots <- c("Control", "Treatment")
+
+total_records_per_year <- c(10, 12, 3, 30) # I chose these arbitrarily
+total_rows <- sum(total_records_per_year) # how many total rows will we have?
+
+# Create the fake data using `rep()` and `sample()`.
+minimal_data <- data.frame(year = rep(years, times = total_records_per_year),
+ plot_type = rep(plots, length.out = total_rows),
+ species_id = sample(species, size = total_rows, replace = TRUE)) # Because I assigned the species randomly, we should expect Species A to occur *roughly* 33% of the time.
+
+# Calculate proportion of Species A caught
+head(minimal_data)
+prop_speciesA <- minimal_data %>%
+ group_by(year, plot_type, species_id) %>%
+ summarize(total_count = n(), .groups = "drop") %>%
+ mutate(prop = total_count/sum(total_count)) %>%
+ dplyr::filter(species_id == "Species A") # keep only Species A
+
+head(prop_speciesA) # Species A only occurs 1-3% of the time in each plot type in each year. Why is this off by an order of magnitude? (This is the same problem I was seeing in my real data--the occurrence proportions were way, way too small.)
+```
+
+Time to find out if our example is actually reproducible! Let's copy it to the clipboard and run `reprex()`. Since we want to give Jordan a runnable R script, we can use `venue = "r"`.
+
+```
+# In the console:
+reprex(venue = "r")
+```
+
+It worked!
+
+```
+# This script will contain my minimal reproducible example.
+# Created by Mishka on 2024-12-17
+
+# Load packages needed for the analysis
+library(dplyr)
+#>
+#> Attaching package: 'dplyr'
+#> The following objects are masked from 'package:stats':
+#>
+#> filter, lag
+#> The following objects are masked from 'package:base':
+#>
+#> intersect, setdiff, setequal, union
+
+# Provide a minimal dataset
+years <- 1:4
+species <- c("Species A", "Species B", "Species C")
+plots <- c("Control", "Treatment")
+
+total_records_per_year <- c(10, 12, 3, 30) # I chose these arbitrarily
+total_rows <- sum(total_records_per_year) # how many total rows will we have?
+
+# Create the fake data using `rep()` and `sample()`.
+minimal_data <- data.frame(year = rep(years, times = total_records_per_year),
+ plot_type = rep(plots, length.out = total_rows),
+ species_id = sample(species, size = total_rows, replace = TRUE)) # Because I assigned the species randomly, we should expect Species A to occur *roughly* 33% of the time.
+
+# Calculate proportion of Species A caught
+head(minimal_data)
+#> year plot_type species_id
+#> 1 1 Control Species A
+#> 2 1 Treatment Species A
+#> 3 1 Control Species A
+#> 4 1 Treatment Species B
+#> 5 1 Control Species C
+#> 6 1 Treatment Species A
+prop_speciesA <- minimal_data %>%
+ group_by(year, plot_type, species_id) %>%
+ summarize(total_count = n(), .groups = "drop") %>%
+ mutate(prop = total_count/sum(total_count)) %>%
+ dplyr::filter(species_id == "Species A") # keep only Species A
+
+head(prop_speciesA) # Species A only occurs 1-3% of the time in each plot type in each year. Why is this off by an order of magnitude? (This is the same problem I was seeing in my real data--the occurrence proportions were way, way too small.)
+#> # A tibble: 6 × 5
+#> year plot_type species_id total_count prop
+#>
+#> 1 1 Control Species A 2 0.0364
+#> 2 1 Treatment Species A 2 0.0364
+#> 3 2 Control Species A 1 0.0182
+#> 4 2 Treatment Species A 1 0.0182
+#> 5 3 Control Species A 2 0.0364
+#> 6 4 Control Species A 4 0.0727
+```
+
+Now we have a beautifully-formatted reprex that includes runnable code and all the context needed to reproduce the problem.
+
+It's time to send another email to Jordan to finally get help with our problem. It's important to include a brief description of the problem, including what we were hoping to achieve and what the problem seems to be.
+
+> Hi Jordan,
+> I took some time to learn how to write reproducible examples. I've simplified my problem down to a "reprex" and formatted it with the `{reprex}` package (attached). I'm using a simplified dataset here, but hopefully it illustrates the problem.
+> Basically, my data has three species, and I'm trying to calculate the proportion of each species that was caught in each plot type in each of several years. In the example, I would expect each species to come up approximately one third of the time, but instead I'm seeing really tiny proportions, like 1-3%. My real data shows a similar pattern.
+> I think something must be wrong with how I'm calculating the proportions, but I can't quite figure it out. Can you shed some light on what might be going on?
+> Thanks so much!
+> Mishka
+> Attachment: reprex-script.R
+
+XXX how should this end? Some possibilities:
+- no solution! The point wasn't to find the solution, it was to create a reprex.
+- Jordan writes back and solves the problem
+- Mishka figures out what was wrong in the process of drafting the email
+- Something else?
diff --git a/episodes/fig/custom_function.png b/episodes/fig/custom_function.png
new file mode 100644
index 00000000..0fc38a5e
Binary files /dev/null and b/episodes/fig/custom_function.png differ
diff --git a/renv/profiles/lesson-requirements/renv.lock b/renv/profiles/lesson-requirements/renv.lock
index a6eb81ad..3e6e5445 100644
--- a/renv/profiles/lesson-requirements/renv.lock
+++ b/renv/profiles/lesson-requirements/renv.lock
@@ -17,6 +17,17 @@
]
},
"Packages": {
+ "DBI": {
+ "Package": "DBI",
+ "Version": "1.2.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "065ae649b05f1ff66bb0c793107508f5"
+ },
"MASS": {
"Package": "MASS",
"Version": "7.3-61",
@@ -93,6 +104,26 @@
],
"Hash": "4ac8e423216b8b70cb9653d1b3f71eb9"
},
+ "askpass": {
+ "Package": "askpass",
+ "Version": "1.2.1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "sys"
+ ],
+ "Hash": "c39f4155b3ceb1a9a2799d700fbd4b6a"
+ },
+ "backports": {
+ "Package": "backports",
+ "Version": "1.5.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "e1e1b9d75c37401117b636b7ae50827a"
+ },
"base64enc": {
"Package": "base64enc",
"Version": "0.1-3",
@@ -127,6 +158,18 @@
],
"Hash": "e84984bf5f12a18628d9a02322128dfd"
},
+ "blob": {
+ "Package": "blob",
+ "Version": "1.2.4",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "methods",
+ "rlang",
+ "vctrs"
+ ],
+ "Hash": "40415719b5a479b87949f3aa0aee737c"
+ },
"boot": {
"Package": "boot",
"Version": "1.3-31",
@@ -139,6 +182,26 @@
],
"Hash": "de2a4646c18661d6a0a08ec67f40b7ed"
},
+ "broom": {
+ "Package": "broom",
+ "Version": "1.0.7",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "backports",
+ "dplyr",
+ "generics",
+ "glue",
+ "lifecycle",
+ "purrr",
+ "rlang",
+ "stringr",
+ "tibble",
+ "tidyr"
+ ],
+ "Hash": "8fcc818f3b9887aebaf206f141437cc9"
+ },
"bslib": {
"Package": "bslib",
"Version": "0.8.0",
@@ -185,6 +248,18 @@
],
"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",
@@ -220,6 +295,19 @@
],
"Hash": "d954cb1c57e8d8b756165d7ba18aa55a"
},
+ "conflicted": {
+ "Package": "conflicted",
+ "Version": "1.2.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "memoise",
+ "rlang"
+ ],
+ "Hash": "bb097fccb22d156624fd07cd2894ddb6"
+ },
"cpp11": {
"Package": "cpp11",
"Version": "0.5.0",
@@ -242,6 +330,57 @@
],
"Hash": "859d96e65ef198fd43e82b9628d593ef"
},
+ "curl": {
+ "Package": "curl",
+ "Version": "6.0.1",
+ "Source": "Repository",
+ "Repository": "https://jeroen.r-universe.dev",
+ "RemoteUrl": "https://github.com/jeroen/curl",
+ "RemoteSha": "c7b5ad150ec4e0701c203df19e3920ca90d1a54c",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "e8ba62486230951fcd2b881c5be23f96"
+ },
+ "data.table": {
+ "Package": "data.table",
+ "Version": "1.16.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "methods"
+ ],
+ "Hash": "2e00b378fc3be69c865120d9f313039a"
+ },
+ "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.37",
@@ -276,6 +415,25 @@
],
"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"
+ },
"evaluate": {
"Package": "evaluate",
"Version": "1.0.1",
@@ -324,6 +482,22 @@
],
"Hash": "bd1297f9b5b1fc1372d19e2c4cd82215"
},
+ "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.5",
@@ -335,6 +509,28 @@
],
"Hash": "7f48af39fa27711ea5fbd183b399920d"
},
+ "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",
@@ -382,6 +578,59 @@
],
"Hash": "5899f1eaa825580172bb56c08266f37c"
},
+ "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.6",
@@ -398,6 +647,27 @@
],
"Hash": "de949855009e2d4d0e52a844e30617ae"
},
+ "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"
+ },
"here": {
"Package": "here",
"Version": "1.0.1",
@@ -449,6 +719,32 @@
],
"Hash": "81d371a9cc60640e74e4ab6ac46dcedc"
},
+ "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",
@@ -632,6 +928,24 @@
],
"Hash": "785ef8e22389d4a7634c6c944f2dc07d"
},
+ "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",
@@ -664,6 +978,16 @@
"Repository": "CRAN",
"Hash": "27550641889a3abf3aec4d91186311ec"
},
+ "openssl": {
+ "Package": "openssl",
+ "Version": "2.2.2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "askpass"
+ ],
+ "Hash": "d413e0fef796c9401a4419485f709ca1"
+ },
"pillar": {
"Package": "pillar",
"Version": "1.9.0",
@@ -739,6 +1063,32 @@
],
"Hash": "b4404b1de13758dea1c0484ad0d48563"
},
+ "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.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "systemfonts",
+ "textshaping"
+ ],
+ "Hash": "0595fe5e47357111f29ad19101c7d271"
+ },
"rappdirs": {
"Package": "rappdirs",
"Version": "0.3.3",
@@ -782,6 +1132,38 @@
],
"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.11",
@@ -865,6 +1247,25 @@
"Repository": "CRAN",
"Hash": "5f90cd73946d706cfe26024294236113"
},
+ "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",
@@ -899,6 +1300,19 @@
],
"Hash": "c19df082ba346b0ffa6f833e92de34d1"
},
+ "selectr": {
+ "Package": "selectr",
+ "Version": "0.4-2",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "R6",
+ "methods",
+ "stringr"
+ ],
+ "Hash": "3838071b66e0c566d55cc26bd6e27bf4"
+ },
"stringi": {
"Package": "stringi",
"Version": "1.8.4",
@@ -929,6 +1343,38 @@
],
"Hash": "960e2ae9e09656611e0b8214ad543207"
},
+ "sys": {
+ "Package": "sys",
+ "Version": "3.4.3",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Hash": "de342ebfebdbf40477d0758d05426646"
+ },
+ "systemfonts": {
+ "Package": "systemfonts",
+ "Version": "1.1.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11",
+ "lifecycle"
+ ],
+ "Hash": "213b6b8ed5afbf934843e6c3b090d418"
+ },
+ "textshaping": {
+ "Package": "textshaping",
+ "Version": "0.4.0",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cpp11",
+ "lifecycle",
+ "systemfonts"
+ ],
+ "Hash": "5142f8bc78ed3d819d26461b641627ce"
+ },
"tibble": {
"Package": "tibble",
"Version": "3.2.1",
@@ -948,6 +1394,29 @@
],
"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",
@@ -964,6 +1433,46 @@
],
"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",
@@ -1006,6 +1515,16 @@
],
"Hash": "62b65c52671e6665f803ff02954446e9"
},
+ "uuid": {
+ "Package": "uuid",
+ "Version": "1.2-1",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R"
+ ],
+ "Hash": "34e965e62a41fcafb1ca60e9b142085b"
+ },
"vctrs": {
"Package": "vctrs",
"Version": "0.6.5",
@@ -1081,6 +1600,19 @@
],
"Hash": "8687398773806cfff9401a2feca96298"
},
+ "xml2": {
+ "Package": "xml2",
+ "Version": "1.3.6",
+ "Source": "Repository",
+ "Repository": "CRAN",
+ "Requirements": [
+ "R",
+ "cli",
+ "methods",
+ "rlang"
+ ],
+ "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61"
+ },
"yaml": {
"Package": "yaml",
"Version": "2.3.10",