by jennybc

jennybc / here_here

I love the here package. Here's why.

224 Stars 20 Forks Last release: Not found 14 Commits 0 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

Ode to the here package


  1. Install here.

  2. Use it.

    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.

works like
, 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.

Admitting you have a problem

If the first line of your #rstats script is

, I will come into your lab and SET YOUR COMPUTER ON FIRE.

Mash-up of rage tweets by @jennybc and @tpoi.

Do you:

  • Have
    in your scripts? PLEASE STOP DOING THAT.
    • This makes your script very fragile, hard-wired to exactly one time and place. As soon as you rename or move directories, it breaks. Or maybe you get a new computer? Or maybe someone else needs to run your code? We show a very accessible way to go cold turkey and eliminate the
      gotcha from your code.
  • Fanny around with working directory alot? During development and/or at run time? YOU CAN STOP DOING THAT TOO.
    • Classic problem presentation: Awkwardness around building paths and/or setting working directory in projects with subdirectories. Especially if you use R Markdown and knitr, which trips up alot of people with its default behavior of “working directory = directory where this file lives”. We show a very accessible way to specify paths in your project’s
      files, regardless of where they live.

Read my blog post “Project-oriented workflow” for more about why

is so problematic and often associated with other awkward workflow problems. Never fear: there are solutions!

Actual demonstration of

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

#> here() starts at /Users/jenny/rrr/here_here
#> [1] "/Users/jenny/rrr/here_here"

Build a path to something in a subdirectory and use it.

here("one", "two", "awesome.txt")
#> [1] "/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

, still works.
#> [1] "/Users/jenny/rrr/here_here/one"
cat(readLines(here("one", "two", "awesome.txt")))
#> OMG this is so awesome!

The fine print

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:

  • Is a file named
  • Is this an RStudio Project? Literally, can I find a file named something like
  • Is this an R package? Does it have a
  • Is this a remake project? Does it have a file named
  • Is this a projectile project? Does it have a file named
  • Is this a checkout from a version control system? Does it have a directory named
    ? Currently, only Git and Subversion are supported.

If no criteria match, the current working directory will be used as fallback. Use

to create an empty
file that will stop the search if none of the other criteria apply.
will attempt to explain why
decided the root location the way it did. See the function reference for more detail.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.