The here package enables easy file
referencing by using the top-level directory of a file project to easily
build file paths. This article demonstrates the case where the working
directory is set to a subdirectory of the project root, for instance
when rendering an R Markdown document that lives in a subdirectory. See
vignette("here")
for a more general introduction.
For demonstration, this article uses a data analysis project that
lives in /tmp/RtmpTxQu3u/Rinstc3ccc3a1ac/here/demo-project
on my machine. This is the project root. The path will most
likely be different on your machine, the here package helps deal with
this situation.
The project has the following structure:
#> /tmp/RtmpTxQu3u/Rinstc3ccc3a1ac/here/demo-project
#> ├── analysis
#> │ └── report.Rmd
#> ├── data
#> │ └── penguins.csv
#> ├── demo-project.Rproj
#> └── prepare
#> └── penguins.R
When report.Rmd
is rendered, the working directory is
internally set to <project root>/analysis
by
rmarkdown:
However, penguins.csv
still lives in the
data/
subdirectory. The report requires the
penguins.csv
file to work.
To render report.Rmd
, you would have to ensure the path
to penguins.csv
is relative to the analysis/
directory - i.e., ../data/penguins.csv
. The chunks would
knit properly, but could not be run in the console since the working
directory in the console isn’t analysis/
.
The here package circumvents this issue by always referring to the project root:
here::i_am("analysis/report.Rmd")
#> here() starts at /tmp/RtmpTxQu3u/Rinstc3ccc3a1ac/here/demo-project
All files accessed by report.Rmd
should be referred to
using here()
:
library(here)
here("data", "penguins.csv")
#> Error in here("data", "penguins.csv"): unused argument ("penguins.csv")
here("data/penguins.csv")
#> Error in as.vector(x, "character"): cannot coerce type 'environment' to vector of type 'character'
This ensures that penguins.csv
can be read both when the
report is knit and when the code is run interactively in the
console.