I love the here package. Here's why.
library(here) here("data", "file_i_want.csv")
This works, regardless of where the associated source file lives inside your project. These paths will also “just work” during interactive development, without incessant fiddling with the working directory of your IDE’s R process.
file.path(), but where the path root is implicitly set to “the path to the top-level of my current project”. See The Fine Print for the underlying heuristics. If they don’t suit, use the more powerful package rprojroot directly. Both here and rprojroot are written by Kirill Müller and are available on CRAN.
If the first line of your #rstats script issetwd("C:\Users\jenny\path\that\only\I\have"), I will come into your lab and SET YOUR COMPUTER ON FIRE.
setwd()in your scripts? PLEASE STOP DOING THAT.
setwd()gotcha from your code.
.Rmdfiles, regardless of where they live.
Read my blog post “Project-oriented workflow” for more about why
setwd()is so problematic and often associated with other awkward workflow problems. Never fear: there are solutions!
I will let this code run.
What does here think the top-level of current project is? The package displays this on load or, at any time, you can just call
library(here) #> here() starts at /Users/jenny/rrr/here_here here() #>  "/Users/jenny/rrr/here_here"
Build a path to something in a subdirectory and use it.
here("one", "two", "awesome.txt") #>  "/Users/jenny/rrr/here_here/one/two/awesome.txt" cat(readLines(here("one", "two", "awesome.txt"))) #> OMG this is so awesome!
Don’t try this at home, folks! But let me set working directory to a subdirectory and prove to you that the same code as above, for getting the path to
awesome.txt, still works.
setwd(here("one")) getwd() #>  "/Users/jenny/rrr/here_here/one" cat(readLines(here("one", "two", "awesome.txt"))) #> OMG this is so awesome!
here::here()figures out the top-level of your current project using some sane heuristics. It looks at working directory, checks a criterion and, if not satisfied, moves up to parent directory and checks again. Lather, rinse, repeat.
Here are the criteria. The order doesn’t really matter because all of them are checked for each directory before moving up to the parent directory:
.svn? Currently, only Git and Subversion are supported.
If no criteria match, the current working directory will be used as fallback. Use
set_here()to create an empty
.herefile that will stop the search if none of the other criteria apply.
dr_here()will attempt to explain why
heredecided the root location the way it did. See the function reference for more detail.