Finding Files in Project Subdirectories.
rprojroot
This package helps accessing files relative to a project root to stop the working directory insanity. It is a low-level helper package for the here package.
library(rprojroot)
Example
The rprojroot package works best when you have a “project”: all related files contained in a subdirectory that can be categorized using a strict criterion. Let’s create a package for demonstration.
dir <- tempfile() pkg <- usethis::create_package(dir) #> ✓ Creating '/tmp/RtmpBLE08t/file294c3c8acca7/' #> ✓ Setting active project to '/tmp/RtmpBLE08t/file294c3c8acca7' #> ✓ Creating 'R/' #> ✓ Writing 'DESCRIPTION' #> Package: file294c3c8acca7 #> Title: What the Package Does (One Line, Title Case) #> Version: 0.0.0.9000 #> Date: 2020-11-08 #> Authors@R (parsed): #> * Kirill Müller <[email protected]> [aut, cre] (<https://orcid.org/0000-0002-1416-3412>) #> Description: What the package does (one paragraph). #> License: GPL-3 #> URL: https://github.com/krlmlr/rprojroot, #> https://krlmlr.github.io/rprojroot #> BugReports: https://github.com/krlmlr/rprojroot/issues #> Encoding: UTF-8 #> LazyData: true #> Roxygen: list(markdown = TRUE) #> RoxygenNote: 7.1.1.9000 #> ✓ Writing 'NAMESPACE' #> ✓ Setting active project to '<no active project>'
R packages satisfy the is_r_package
criterion. A criterion is an object that contains a find_file()
function. With pkg
as working directory, the function works like file.path()
, rooted at the working directory:
setwd(pkg) is_r_package #> Root criterion: contains a file `DESCRIPTION` with contents matching `^Package: ` is_r_package$find_file() #> [1] "/tmp/RtmpBLE08t/file294c3c8acca7" is_r_package$find_file("tests", "testthat") #> [1] "/tmp/RtmpBLE08t/file294c3c8acca7/tests/testthat"
This works identically when starting from a subdirectory:
setwd(file.path(pkg, "R")) is_r_package$find_file() #> [1] "/tmp/RtmpBLE08t/file294c3c8acca7" is_r_package$find_file("tests", "testthat") #> [1] "/tmp/RtmpBLE08t/file294c3c8acca7/tests/testthat"
There is one exception: if the first component passed to find_file()
is already an absolute path. This allows safely applying this function to paths that may be absolute or relative:
setwd(file.path(pkg, "R")) path <- is_r_package$find_file() is_r_package$find_file(path, "tests", "testthat") #> [1] "/tmp/RtmpBLE08t/file294c3c8acca7/tests/testthat"
As long as you are sure that your working directory is somewhere inside your project, you can retrieve the project root.
Installation and further reading
Install the package from CRAN:
install.package("rprojroot")
See the documentation for more detail.
Code of Conduct
Please note that the rprojroot project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.