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==