Project Organization
Path Conventions
Stable Locations
Project code is easier to move when scripts build paths from named parts instead of hard-coded host locations.
Program
Play the script to choose an output folder and see the relative path update.
path_conventions.R
Replay: real traced execution (multi-file project)
root <- "analysis"
folders <- c("data", "figures", "reports")
folder_index <- 2
folder <- folders[folder_index]
path <- file.path(root, folder, "summary.csv")
cat(path, "\n", sep = "")
root <- "analysis"
folders <- c("data", "figures", "reports")
folder_index <- 1
folder <- folders[folder_index]
path <- file.path(root, folder, "summary.csv")
cat(path, "\n", sep = "")
root <- "analysis"
folders <- c("data", "figures", "reports")
folder_index <- 3
folder <- folders[folder_index]
path <- file.path(root, folder, "summary.csv")
cat(path, "\n", sep = "")
root ← analysis
1root <- "analysis"2folders <- c("data", "figures", "reports")values this stepanalysisrootfolders ← data, figures, reports
1root <- "analysis"2folders <- c("data", "figures", "reports")3folder_index <- 2values this stepdata, figures, reportsfoldersfolder_index ← 2
2folders <- c("data", "figures", "reports")3folder_index <- 24folder <- folders[folder_index]values this step2folder_indexfolder ← figures
3folder_index <- 24folder <- folders[folder_index]5path <- file.path(root, folder, "summary.csv")values this stepfiguresfolderdata, figures, reportsfolders2folder_indexpath ← analysis/figures/summary.csv
4folder <- folders[folder_index]5path <- file.path(root, folder, "summary.csv")6cat(path, "\n", sep = "")values this stepanalysis/figures/summary.csvpathanalysisrootfiguresfoldercat(path, " ", sep = "")
5path <- file.path(root, folder, "summary.csv")6cat(path, "\n", sep = "")outputanalysis/figures/summary.csvvalues this stepanalysis/figures/summary.csvpath
root ← analysis
1root <- "analysis"2folders <- c("data", "figures", "reports")values this stepanalysisrootfolders ← data, figures, reports
1root <- "analysis"2folders <- c("data", "figures", "reports")3folder_index <- 1values this stepdata, figures, reportsfoldersfolder_index ← 1
2folders <- c("data", "figures", "reports")3folder_index <- 14folder <- folders[folder_index]values this step1folder_indexfolder ← data
3folder_index <- 14folder <- folders[folder_index]5path <- file.path(root, folder, "summary.csv")values this stepdatafolderdata, figures, reportsfolders1folder_indexpath ← analysis/data/summary.csv
4folder <- folders[folder_index]5path <- file.path(root, folder, "summary.csv")6cat(path, "\n", sep = "")values this stepanalysis/data/summary.csvpathanalysisrootdatafoldercat(path, " ", sep = "")
5path <- file.path(root, folder, "summary.csv")6cat(path, "\n", sep = "")outputanalysis/data/summary.csvvalues this stepanalysis/data/summary.csvpath
root ← analysis
1root <- "analysis"2folders <- c("data", "figures", "reports")values this stepanalysisrootfolders ← data, figures, reports
1root <- "analysis"2folders <- c("data", "figures", "reports")3folder_index <- 3values this stepdata, figures, reportsfoldersfolder_index ← 3
2folders <- c("data", "figures", "reports")3folder_index <- 34folder <- folders[folder_index]values this step3folder_indexfolder ← reports
3folder_index <- 34folder <- folders[folder_index]5path <- file.path(root, folder, "summary.csv")values this stepreportsfolderdata, figures, reportsfolders3folder_indexpath ← analysis/reports/summary.csv
4folder <- folders[folder_index]5path <- file.path(root, folder, "summary.csv")6cat(path, "\n", sep = "")values this stepanalysis/reports/summary.csvpathanalysisrootreportsfoldercat(path, " ", sep = "")
5path <- file.path(root, folder, "summary.csv")6cat(path, "\n", sep = "")outputanalysis/reports/summary.csvvalues this stepanalysis/reports/summary.csvpath
Follow the Path
rootisanalysis.folder_indexstarts at2.folders[2]selectsfigures.file.path(root, folder, "summary.csv")joins the parts.- The script prints
analysis/figures/summary.csv. | folder_index | folder | output path | | ---: | --- | --- | | 1 | data | analysis/data/summary.csv | | 2 | figures | analysis/figures/summary.csv | | 3 | reports | analysis/reports/summary.csv |
relative path
A project-relative path avoids host-specific prefixes.
file.path
`file.path(root, folder, "summary.csv")` joins path parts portably.
convention
Named folders make output locations explicit.
Exercise: path_conventions.R
Reproduce analysis/figures/summary.csv, then use folder_index 1 and 3 to predict analysis/data/summary.csv and analysis/reports/summary.csv.