---
title: "How-to guides"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{How-to guides}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
```
Task-focused guides for common projr workflows.
---
## 1. Initialise a project
```{r eval=FALSE}
library(projr)
# Interactive prompts (recommended for first-time users)
projr_init_prompt()
# Sensible defaults, no prompts
projr_init()
# Full setup: Git, GitHub, license, citation, renv, etc.
projr_init_all()
```
This creates `_projr.yml`, `DESCRIPTION`, `README.md`, and directories
(`_raw_data`, `_output`, `_tmp`, `docs`). Git, GitHub, license, and
citation setup are optional and prompted or skipped depending on the
function used.
```{r eval=FALSE}
# Set license and citation separately
projr_init_license(license = "MIT")
projr_init_cite(title = "My Research Project", authors = "Jane Doe")
```
If GitHub credential prompts fail, run `projr_instr_auth_github()` for
setup instructions. Initialisation won't overwrite existing config files.
---
## 2. Run a development build
Use `projr_build_dev()` when iterating on code and documents before
creating a versioned release.
```{r eval=FALSE}
projr_build_dev()
# Build specific documents only
projr_build_dev("analysis.Rmd")
projr_build_dev(c("methods.Rmd", "results.Rmd"))
```
Dev builds route outputs to the cache at `_tmp/projr/v/`
instead of `_output`. Always use `projr_path_get()` so paths resolve
correctly in both dev and final builds:
```{r eval=FALSE}
# In your R Markdown or scripts:
fig_path <- projr_path_get("output", "figures", "plot.png")
png(filename = fig_path)
# ... plotting code ...
dev.off()
# Dev build: _tmp/projr/v0.1.0/output/figures/plot.png
# Final build: _output/figures/plot.png
```
Hardcoded paths like `"_output/plot.png"` bypass the cache and write
directly to `_output` during dev builds.
---
## 3. Run a final (versioned) build
```{r eval=FALSE}
# Patch bump (0.1.0 -> 0.1.1) — projr_build() is equivalent
projr_build_patch()
# Minor bump (0.1.0 -> 0.2.0)
projr_build_minor()
# Major bump (0.1.0 -> 1.0.0)
projr_build_major()
```
A final build clears output directories, renders documents, bumps the
version, writes the manifest, uploads to configured destinations, and
commits to Git (if configured).
Control output clearing with the `PROJR_CLEAR_OUTPUT` env var
(`"pre"`, `"post"`, or `"never"`):
```{r eval=FALSE}
Sys.setenv(PROJR_CLEAR_OUTPUT = "pre")
projr_build()
```
Git behaviour is configured in `_projr.yml`:
```yaml
build:
git:
commit: true
push: true
```
---
## 4. Archive artefacts
projr supports three destination types: GitHub Releases, OSF, and local
directories. Configure them in `_projr.yml`:
```yaml
build:
github:
raw-data:
content: [raw-data]
description: "Raw data files"
cue: "always"
output:
content: [output]
description: "Analysis outputs"
local:
path: "~/Dropbox/my-project-archive"
raw-data:
content: [raw-data]
path: "data"
output:
content: [output]
path: "outputs"
```
Or add destinations programmatically:
```{r eval=FALSE}
projr_yml_dest_add_github(
label = "raw-data",
content = "raw-data",
description = "Raw data files"
)
projr_yml_dest_add_local(
label = "raw-data",
content = "raw-data",
path = "~/archive/data"
)
```
Key parameters:
- `content`: directory to archive (raw-data, output, docs, cache)
- `cue`: when to upload — "always", "new" (only if changed), "never"
- `strategy`: "archive" (versioned) or "latest" (overwrite)
GitHub has a 2 GB limit per release asset. Use local or OSF for larger
datasets.
---
## 5. Restore artefacts
```{r eval=FALSE}
# Clone a repo and restore archived content
projr_restore_repo("owner/repo")
projr_restore_repo("owner/repo", path = "~/projects/my-project")
# Restore from the current working directory (already cloned)
projr_restore_repo_wd()
```
Restore specific directories:
```{r eval=FALSE}
projr_content_update(label = "raw-data")
projr_content_update(label = c("raw-data", "output"))
projr_content_update(label = "raw-data", version = "v0.1.0")
```
projr checks configured sources in order: GitHub Releases, OSF, then
local archives. Ensure credentials are set up before restoring from
remote sources.
---
## 6. Define directories and labels
Default labels:
- `raw-data` → `_raw_data`
- `cache` → `_tmp`
- `output` → `_output`
- `docs` → `docs`
Add custom labels in `_projr.yml`:
```yaml
directories:
raw-data:
path: _raw_data
raw-data-public:
path: _raw_data_public
raw-data-private:
path: _raw_data_private
cache:
path: _tmp
output:
path: _output
output-figures:
path: _output/figures
docs:
path: docs
```
Labels must start with `raw`, `cache`, `output`, or `docs`. Each label
maps to a single, unique path. Directories are created automatically on
build.
```{r eval=FALSE}
projr_path_get("raw-data-public")
projr_path_get("output-figures", "plot.png")
```
---
## 7. Use profiles
Profiles let you maintain different configurations for different
contexts (development vs production, different machines, etc.).
```{r eval=FALSE}
# Create a profile (creates _projr-dev.yml)
projr_profile_create("dev")
```
Edit `_projr-dev.yml` to override specific settings. Unspecified keys
fall back to `_projr.yml`.
```yaml
build:
github:
enabled: false
directories:
output:
path: _output_dev
```
Activate a profile:
```{r eval=FALSE}
Sys.setenv(PROJR_PROFILE = "dev")
projr_build()
# Check active profile
projr_profile_get()
# Delete a profile
projr_profile_delete("dev")
```
Remember to unset `PROJR_PROFILE` when switching back to the default
configuration.
---
## 8. View and manage build logs
Build history is logged to `cache/projr/log/{dev,output}/history/builds.md`.
Each build also creates a detailed Quarto log file organised by date.
```{r eval=FALSE}
# View build logs
projr_log_view()
# List detailed log files
list.files("cache/projr/log/dev/output",
recursive = TRUE, pattern = "\\.qmd$"
)
```
Control logging:
```{r eval=FALSE}
# Disable detailed log files (history still maintained)
Sys.setenv(PROJR_LOG_DETAILED = "FALSE")
# Re-enable
Sys.setenv(PROJR_LOG_DETAILED = "TRUE")
```
Clear old logs:
```{r eval=FALSE}
projr_log_clear()
projr_log_clear(build_type = "dev")
projr_log_clear(before_date = "2025-01-01")
```
Logs are never cleared automatically — manage them manually.
---
## 9. Query the manifest
The manifest (`manifest.csv`) tracks file hashes across versions. It is
updated only by final builds, not dev builds.
Compare two versions:
```{r eval=FALSE}
projr_manifest_changes("0.0.1", "0.0.2")
projr_manifest_changes("0.0.1", "0.0.2", label = "output")
```
Track files across a range of versions:
```{r eval=FALSE}
projr_manifest_range("0.0.1")
projr_manifest_range("0.0.1", "0.0.5", label = "raw-data")
```
Check when directories last changed:
```{r eval=FALSE}
projr_manifest_last_change()
projr_manifest_last_change("0.0.3")
```
Practical example — detect raw data changes since a release:
```{r eval=FALSE}
raw_changes <- projr_manifest_changes(
"0.1.0", projr_version_get(), label = "raw-data"
)
if (nrow(raw_changes) > 0) {
message("Raw data has changed - outputs may need regeneration")
}
```
Version strings accept both `"0.0.1"` and `"v0.0.1"`. All query
functions return a 0-row data.frame when there are no results.
---
## 10. Configure environment variables
Create environment files at the project root:
```{r eval=FALSE}
file.create("_environment") # Global defaults
file.create("_environment-dev") # Profile-specific overrides
file.create("_environment.local") # Machine-specific, git-ignored
```
Add variables in `KEY=value` format:
```bash
# _environment
PROJR_OUTPUT_LEVEL=std
PROJR_LOG_DETAILED=TRUE
# _environment.local (for secrets — git-ignored)
GITHUB_PAT=your_token_here
```
Load them:
```{r eval=FALSE}
projr_env_set()
```
Key variables:
| Variable | Values | Purpose |
|---|---|---|
| `PROJR_OUTPUT_LEVEL` | none, std, debug | Console verbosity |
| `PROJR_LOG_DETAILED` | TRUE, FALSE | Create detailed log files |
| `PROJR_CLEAR_OUTPUT` | pre, post, never | When to clear output dirs |
| `PROJR_PROFILE` | profile name | Active configuration profile |
See `?projr_env_set` and the [Environment Variables article](environment.html)
for full details.