IDEs & Relative Paths

An IDE – Integrated Development Environment – is a piece of software intended to enhance the process of writing and testing code. In the context of reproducibility, one of the most valuable aspects of an IDE is it’s project management capabilities which allow you to work with relative file paths instead of an absolute path or a path defined by setwd(), both of which were introduced in day 2. We’ve already introduce R projects with the .Rproj file. When you open your project file, your root directory is your working directory, allowing you to port your project to a different machine without directory structures wreaking havoc on running your code.

With an R project, all files are still referenced in relation to the script or RMarkdown file that you’re writing in, however. So, if your project is organized like this:

|-- project-folder/  
    |-- readme.md  
    |-- data/  
        |-- my-data.csv  
    |-- scripts/  
        |-- my-script.

In order to read in data from your script you need to go up one level, into data/ and then identify your data – read_csv("../data/my-data.csv")

There is an additional package, here to help you improve this workflow, by making it such that you call all files from the root directory as the primary reference point. This, among other things, allows you to move a script without impacting it’s ability to locate the data. Perhaps most importantly, it also allows you to open a script without first opening the .Rproj file and still have it run. That being said, here should be used within an R project; that is, you should have an .Rproj file in the root of your project.

To use here, first install it:

install.packages("here")

Then, load it into each of your .R or .Rmd files

library(here)
## here() starts at C:/Users/nrochlin/OneDrive - University of Victoria/Documents/jumpstart-round2/rdm-jumpstart2

When you call here, it reports the root directory of your R project

here()
## [1] "C:/Users/nrochlin/OneDrive - University of Victoria/Documents/jumpstart-round2/rdm-jumpstart2"

To use here to load data, you call here from within data reading function, and feed it a character string representing the directory or directories to follow from your root all the way to your file:

read_csv(here("data", "my-data.csv"))

You can read more about the here package at https://here.r-lib.org/

LS0tDQp0aXRsZTogIklERXMgJiBSZWxhdGl2ZSBQYXRocyINCnBhZ2V0aXRsZTogIklERXMgJiBSZWxhdGl2ZSBQYXRocyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cgIyBhbGxvd3MgdG9nZ2xpbmcgb2Ygc2hvd2luZyBhbmQgaGlkaW5nIGNvZGUuIFJlbW92ZSBpZiBub3QgdXNpbmcgY29kZS4NCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlICMgYWxsb3dzIHRoZSB1c2VyIHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgLlJtZCBmaWxlLiBSZW1vdmUgaWYgbm90IHVzaW5nIGNvZGUuDQogICAgaW5jbHVkZXM6DQogICAgICBhZnRlcl9ib2R5OiBmb290ZXIuaHRtbCAjIGluY2x1ZGUgYSBjdXN0b20gZm9vdGVyLg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQotLS0NCiMjIElERXMgJiBSZWxhdGl2ZSBQYXRocw0KDQpBbiBJREUgLS0gSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAtLSBpcyBhIHBpZWNlIG9mIHNvZnR3YXJlIGludGVuZGVkIHRvIGVuaGFuY2UgdGhlIHByb2Nlc3Mgb2Ygd3JpdGluZyBhbmQgdGVzdGluZyBjb2RlLiBJbiB0aGUgY29udGV4dCBvZiByZXByb2R1Y2liaWxpdHksIG9uZSBvZiB0aGUgbW9zdCB2YWx1YWJsZSBhc3BlY3RzIG9mIGFuIElERSBpcyBpdCdzIHByb2plY3QgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgd2hpY2ggYWxsb3cgeW91IHRvIHdvcmsgd2l0aCByZWxhdGl2ZSBmaWxlIHBhdGhzIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aCBvciBhIHBhdGggZGVmaW5lZCBieSBgc2V0d2QoKWAsIGJvdGggb2Ygd2hpY2ggd2VyZSBpbnRyb2R1Y2VkIGluIGRheSAyLiBXZSd2ZSBhbHJlYWR5IGludHJvZHVjZSBSIHByb2plY3RzIHdpdGggdGhlIC5ScHJvaiBmaWxlLiBXaGVuIHlvdSBvcGVuIHlvdXIgcHJvamVjdCBmaWxlLCB5b3VyIHJvb3QgZGlyZWN0b3J5IGlzIHlvdXIgd29ya2luZyBkaXJlY3RvcnksIGFsbG93aW5nIHlvdSB0byBwb3J0IHlvdXIgcHJvamVjdCB0byBhIGRpZmZlcmVudCBtYWNoaW5lIHdpdGhvdXQgZGlyZWN0b3J5IHN0cnVjdHVyZXMgd3JlYWtpbmcgaGF2b2Mgb24gcnVubmluZyB5b3VyIGNvZGUuDQoNCldpdGggYW4gUiBwcm9qZWN0LCBhbGwgZmlsZXMgYXJlIHN0aWxsIHJlZmVyZW5jZWQgaW4gcmVsYXRpb24gdG8gdGhlIHNjcmlwdCBvciBSTWFya2Rvd24gZmlsZSB0aGF0IHlvdSdyZSB3cml0aW5nIGluLCBob3dldmVyLiBTbywgaWYgeW91ciBwcm9qZWN0IGlzIG9yZ2FuaXplZCBsaWtlIHRoaXM6DQoNCjxwcmU+DQp8LS0gcHJvamVjdC1mb2xkZXIvICANCiAgICB8LS0gcmVhZG1lLm1kICANCiAgICB8LS0gZGF0YS8gIA0KICAgICAgICB8LS0gbXktZGF0YS5jc3YgIA0KICAgIHwtLSBzY3JpcHRzLyAgDQogICAgICAgIHwtLSBteS1zY3JpcHQuDQo8L3ByZT4NCg0KSW4gb3JkZXIgdG8gcmVhZCBpbiBkYXRhIGZyb20geW91ciBzY3JpcHQgeW91IG5lZWQgdG8gZ28gdXAgb25lIGxldmVsLCBpbnRvIGBkYXRhL2AgYW5kIHRoZW4gaWRlbnRpZnkgeW91ciBkYXRhIC0tIGByZWFkX2NzdigiLi4vZGF0YS9teS1kYXRhLmNzdiIpYA0KDQpUaGVyZSBpcyBhbiBhZGRpdGlvbmFsIHBhY2thZ2UsIGBoZXJlYCB0byBoZWxwIHlvdSBpbXByb3ZlIHRoaXMgd29ya2Zsb3csIGJ5IG1ha2luZyBpdCBzdWNoIHRoYXQgeW91IGNhbGwgYWxsIGZpbGVzIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5IGFzIHRoZSBwcmltYXJ5IHJlZmVyZW5jZSBwb2ludC4gVGhpcywgYW1vbmcgb3RoZXIgdGhpbmdzLCBhbGxvd3MgeW91IHRvIG1vdmUgYSBzY3JpcHQgd2l0aG91dCBpbXBhY3RpbmcgaXQncyBhYmlsaXR5IHRvIGxvY2F0ZSB0aGUgZGF0YS4gUGVyaGFwcyBtb3N0IGltcG9ydGFudGx5LCBpdCBhbHNvIGFsbG93cyB5b3UgdG8gb3BlbiBhIHNjcmlwdCB3aXRob3V0IGZpcnN0IG9wZW5pbmcgdGhlIC5ScHJvaiBmaWxlIGFuZCBzdGlsbCBoYXZlIGl0IHJ1bi4gVGhhdCBiZWluZyBzYWlkLCBgaGVyZWAgc2hvdWxkIGJlIHVzZWQgd2l0aGluIGFuIFIgcHJvamVjdDsgdGhhdCBpcywgeW91IHNob3VsZCBoYXZlIGFuIC5ScHJvaiBmaWxlIGluIHRoZSByb290IG9mIHlvdXIgcHJvamVjdC4NCg0KVG8gdXNlIGBoZXJlYCwgZmlyc3QgaW5zdGFsbCBpdDoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQppbnN0YWxsLnBhY2thZ2VzKCJoZXJlIikNCmBgYA0KDQpUaGVuLCBsb2FkIGl0IGludG8gZWFjaCBvZiB5b3VyIC5SIG9yIC5SbWQgZmlsZXMNCg0KYGBge3J9DQpsaWJyYXJ5KGhlcmUpDQpgYGANCg0KV2hlbiB5b3UgY2FsbCBoZXJlLCBpdCByZXBvcnRzIHRoZSByb290IGRpcmVjdG9yeSBvZiB5b3VyIFIgcHJvamVjdA0KDQpgYGB7cn0NCmhlcmUoKQ0KYGBgDQoNClRvIHVzZSBgaGVyZWAgdG8gbG9hZCBkYXRhLCB5b3UgY2FsbCBgaGVyZWAgZnJvbSB3aXRoaW4gZGF0YSByZWFkaW5nIGZ1bmN0aW9uLCBhbmQgZmVlZCBpdCBhIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkaXJlY3Rvcnkgb3IgZGlyZWN0b3JpZXMgdG8gZm9sbG93IGZyb20geW91ciByb290IGFsbCB0aGUgd2F5IHRvIHlvdXIgZmlsZToNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQpyZWFkX2NzdihoZXJlKCJkYXRhIiwgIm15LWRhdGEuY3N2IikpDQpgYGANCg0KWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgdGhlIGhlcmUgcGFja2FnZSBhdCBbaHR0cHM6Ly9oZXJlLnItbGliLm9yZy9dKGh0dHBzOi8vaGVyZS5yLWxpYi5vcmcvKQ==