Rmd Document organization
- front-matter
- clean-up:
rm(list = ls())
source()
and library()
statements
- user-defined functions–e.g. anytime you use
function()
- load all data used
- body of document including well-commented and well-organized code
Whitespace
- begin new line after ~80 characters (set up RStudio to draw reference line)
- begin new line after chain operators (e.g.
%>%
, +
)
- blank lines are useful to separate command sequences just as paragraphs are used to separate sentence sequences:
- before and after a sequence of chained commands
- before and after a group commands unified toward some goal
- comments (use them!)
- Entire commented lines should begin with
#
and one space
- End of line comments
- appended to line of code: precede with two spaces,
#
, and then one space
- additional spacing can be used to align at the
#
in case of several end of line comments in close succession
- Modified “Advanced R” style for spacing (http://adv-r.had.co.nz/Style.html; see examples there)
- Spaces around all infix operators including
=
, +
, -
, <-
, etc., with exception of :
, ::
- Always put a space after a comma, and never before (as in English)
- Place a space before left parentheses, except in a function call
- Do not place spaces around code in parentheses or square brackets (unless there’s a comma, in which case see above).
- curly braces (
{
, }
)
- An opening curly brace (
{
) should never go on its own line and should always be followed by a new line
- A closing curly brace (
}
) should always go on its own line, unless it’s followed by else.
- Always indent the code inside curly braces (and use progressive indenting for nested curly braces).
Object naming
- Always use
<-
assignment operator (never =
for object assignment)
- Use
CamelCase
or Snake_case
; Do not use periods “.” in object names (e.g., not.cool
), because it can mess with R’s internal functions
- Avoid reusing object names
- the same name should NOT refer to fundamentally different objects at different places in the same code script
- do NOT choose names that coincide with popular functions (e.g. if you calculate a mean, name the object
avg
, NOT mean
)
- Preferred capitalization
- try to begin variable, vector, scalar names with lowercase letter
- try to begin data set, list, array, matrix names with CAPITAL letter
- don’t necessarily worry about renaming external objects that don’t follow convention
General suggestions
- minimize nested syntax where possible
- Bad:
Result <- select(filter(Data, condition), var1, var2)
- Better:
Result <- Data %>% filter(condition) %>% select(var1, var2)
- Best:
Result <-
Data %>%
filter(condition) %>%
select(var1, var2)
- begin new line after comma for compound
mutate
and summarise
statements
- always preserve access to the uncorrected/raw source data (i.e. never overwrite your only copy of the source data)
Resources & code examples (including good and bad):
LS0tCnRpdGxlOiAiU1RBVCAzODAgUiBQcm9ncmFtbWluZyBTdHlsZSBHdWlkZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCiMgUm1kIERvY3VtZW50IG9yZ2FuaXphdGlvbgoKLSBmcm9udC1tYXR0ZXIKICAgIDEuIGNsZWFuLXVwOiBgcm0obGlzdCA9IGxzKCkpYAogICAgMi4gYHNvdXJjZSgpYCBhbmQgYGxpYnJhcnkoKWAgc3RhdGVtZW50cwogICAgMy4gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy0tZS5nLiBhbnl0aW1lIHlvdSB1c2UgYGZ1bmN0aW9uKClgCiAgICA0LiBsb2FkIGFsbCBkYXRhIHVzZWQKLSBib2R5IG9mIGRvY3VtZW50IGluY2x1ZGluZyB3ZWxsLWNvbW1lbnRlZCBhbmQgd2VsbC1vcmdhbml6ZWQgY29kZQoKIyBXaGl0ZXNwYWNlCgotIGJlZ2luIG5ldyBsaW5lIGFmdGVyIH44MCBjaGFyYWN0ZXJzIChzZXQgdXAgUlN0dWRpbyB0byBkcmF3IHJlZmVyZW5jZSBsaW5lKQotIGJlZ2luIG5ldyBsaW5lIGFmdGVyIGNoYWluIG9wZXJhdG9ycyAoZS5nLiBgJT4lYCwgYCtgKQotIGJsYW5rIGxpbmVzIGFyZSB1c2VmdWwgdG8gc2VwYXJhdGUgY29tbWFuZCBzZXF1ZW5jZXMganVzdCBhcyBwYXJhZ3JhcGhzIGFyZSB1c2VkIHRvIHNlcGFyYXRlIHNlbnRlbmNlIHNlcXVlbmNlczogCiAgICAtIGJlZm9yZSBhbmQgYWZ0ZXIgYSBzZXF1ZW5jZSBvZiBjaGFpbmVkIGNvbW1hbmRzIAogICAgLSBiZWZvcmUgYW5kIGFmdGVyIGEgZ3JvdXAgY29tbWFuZHMgdW5pZmllZCB0b3dhcmQgc29tZSBnb2FsCi0gY29tbWVudHMgKHVzZSB0aGVtISkKICAgIC0gRW50aXJlIGNvbW1lbnRlZCBsaW5lcyBzaG91bGQgYmVnaW4gd2l0aCBgI2AgYW5kIG9uZSBzcGFjZQogICAgLSBFbmQgb2YgbGluZSBjb21tZW50cyAKICAgICAgICAtIGFwcGVuZGVkIHRvIGxpbmUgb2YgY29kZTogcHJlY2VkZSB3aXRoIHR3byBzcGFjZXMsIGAjYCwgYW5kIHRoZW4gb25lIHNwYWNlCiAgICAgICAgLSBhZGRpdGlvbmFsIHNwYWNpbmcgY2FuIGJlIHVzZWQgdG8gYWxpZ24gYXQgdGhlIGAjYCBpbiBjYXNlIG9mIHNldmVyYWwgZW5kIG9mIGxpbmUgY29tbWVudHMgaW4gY2xvc2Ugc3VjY2Vzc2lvbgotIE1vZGlmaWVkICJBZHZhbmNlZCBSIiBzdHlsZSBmb3Igc3BhY2luZyAoPGh0dHA6Ly9hZHYtci5oYWQuY28ubnovU3R5bGUuaHRtbD47IHNlZSBleGFtcGxlcyB0aGVyZSkKICAgIC0gU3BhY2VzIGFyb3VuZCBhbGwgaW5maXggb3BlcmF0b3JzIGluY2x1ZGluZyBgPWAsIGArYCwgYC1gLCBgPC1gLCBldGMuLCB3aXRoIGV4Y2VwdGlvbiBvZiBgOmAsIGA6OmAKICAgIC0gQWx3YXlzIHB1dCBhIHNwYWNlIGFmdGVyIGEgY29tbWEsIGFuZCBuZXZlciBiZWZvcmUgKGFzIGluIEVuZ2xpc2gpCiAgICAtIFBsYWNlIGEgc3BhY2UgYmVmb3JlIGxlZnQgcGFyZW50aGVzZXMsIGV4Y2VwdCBpbiBhIGZ1bmN0aW9uIGNhbGwKICAgIC0gRG8gbm90IHBsYWNlIHNwYWNlcyBhcm91bmQgY29kZSBpbiBwYXJlbnRoZXNlcyBvciBzcXVhcmUgYnJhY2tldHMgKHVubGVzcyB0aGVyZeKAmXMgYSBjb21tYSwgaW4gd2hpY2ggY2FzZSBzZWUgYWJvdmUpLgotIGN1cmx5IGJyYWNlcyAoYHtgLCBgfWApCiAgICAtIEFuIG9wZW5pbmcgY3VybHkgYnJhY2UgKGB7YCkgc2hvdWxkICpuZXZlciogZ28gb24gaXRzIG93biBsaW5lIGFuZCBzaG91bGQgKmFsd2F5cyogYmUgZm9sbG93ZWQgYnkgYSBuZXcgbGluZQogICAgLSBBIGNsb3NpbmcgY3VybHkgYnJhY2UgKGB9YCkgc2hvdWxkIGFsd2F5cyBnbyBvbiBpdHMgb3duIGxpbmUsIHVubGVzcyBpdOKAmXMgZm9sbG93ZWQgYnkgZWxzZS4KICAgIC0gQWx3YXlzIGluZGVudCB0aGUgY29kZSBpbnNpZGUgY3VybHkgYnJhY2VzIChhbmQgdXNlIHByb2dyZXNzaXZlIGluZGVudGluZyBmb3IgbmVzdGVkIGN1cmx5IGJyYWNlcykuCgojIE9iamVjdCBuYW1pbmcKCi0gQWx3YXlzIHVzZSBgPC1gIGFzc2lnbm1lbnQgb3BlcmF0b3IgKG5ldmVyIGA9YCBmb3Igb2JqZWN0IGFzc2lnbm1lbnQpCi0gVXNlIGBDYW1lbENhc2VgIG9yIGBTbmFrZV9jYXNlYDsgRG8gbm90IHVzZSBwZXJpb2RzICIuIiBpbiBvYmplY3QgbmFtZXMgKGUuZy4sIGBub3QuY29vbGApLCBiZWNhdXNlIGl0IGNhbiBtZXNzIHdpdGggUidzIGludGVybmFsIGZ1bmN0aW9ucwotIEF2b2lkIHJldXNpbmcgb2JqZWN0IG5hbWVzCiAgICAtIHRoZSBzYW1lIG5hbWUgc2hvdWxkIE5PVCByZWZlciB0byBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBvYmplY3RzIGF0IGRpZmZlcmVudCBwbGFjZXMgaW4gdGhlIHNhbWUgY29kZSBzY3JpcHQKICAgIC0gZG8gTk9UIGNob29zZSBuYW1lcyB0aGF0IGNvaW5jaWRlIHdpdGggcG9wdWxhciBmdW5jdGlvbnMgKGUuZy4gaWYgeW91IGNhbGN1bGF0ZSBhIG1lYW4sIG5hbWUgdGhlIG9iamVjdCBgYXZnYCwgTk9UIGBtZWFuYCkKLSBQcmVmZXJyZWQgY2FwaXRhbGl6YXRpb24KICAgIC0gdHJ5IHRvIGJlZ2luIHZhcmlhYmxlLCB2ZWN0b3IsIHNjYWxhciBuYW1lcyB3aXRoIGxvd2VyY2FzZSBsZXR0ZXIKICAgIC0gdHJ5IHRvIGJlZ2luIGRhdGEgc2V0LCBsaXN0LCBhcnJheSwgbWF0cml4IG5hbWVzIHdpdGggQ0FQSVRBTCBsZXR0ZXIKICAgIC0gZG9uJ3QgbmVjZXNzYXJpbHkgd29ycnkgYWJvdXQgcmVuYW1pbmcgZXh0ZXJuYWwgb2JqZWN0cyB0aGF0IGRvbid0IGZvbGxvdyBjb252ZW50aW9uCgojIEdlbmVyYWwgc3VnZ2VzdGlvbnMKCi0gbWluaW1pemUgbmVzdGVkIHN5bnRheCB3aGVyZSBwb3NzaWJsZSAKICAgIC0gQmFkOiBgUmVzdWx0IDwtIHNlbGVjdChmaWx0ZXIoRGF0YSwgY29uZGl0aW9uKSwgdmFyMSwgdmFyMilgIAogICAgLSBCZXR0ZXI6IGBSZXN1bHQgPC0gRGF0YSAlPiUgZmlsdGVyKGNvbmRpdGlvbikgJT4lIHNlbGVjdCh2YXIxLCB2YXIyKWAKICAgIC0gQmVzdDogCmBgYHtyIGVjaG89VFJVRSwgZXZhbD1GQUxTRX0KICAgIFJlc3VsdCA8LSAKICAgICAgRGF0YSAlPiUKICAgICAgZmlsdGVyKGNvbmRpdGlvbikgJT4lIAogICAgICBzZWxlY3QodmFyMSwgdmFyMikKYGBgCgotIGJlZ2luIG5ldyBsaW5lIGFmdGVyIGNvbW1hIGZvciBjb21wb3VuZCBgbXV0YXRlYCBhbmQgYHN1bW1hcmlzZWAgc3RhdGVtZW50cwotICphbHdheXMqIHByZXNlcnZlIGFjY2VzcyB0byB0aGUgdW5jb3JyZWN0ZWQvcmF3IHNvdXJjZSBkYXRhIChpLmUuICoqbmV2ZXIqKiBvdmVyd3JpdGUgeW91ciBvbmx5IGNvcHkgb2YgdGhlIHNvdXJjZSBkYXRhKQoKIyBSZXNvdXJjZXMgJiBjb2RlIGV4YW1wbGVzIChpbmNsdWRpbmcgZ29vZCBhbmQgYmFkKTogCgotIE1EU1IgVGV4dGJvb2sgKHRoZXkgc29tZXRpbWVzIGZsYWcgc3R5bGUgc3VnZ2VzdGlvbnMgYXMgYSAiUHJvIFRpcCIpCi0gR29vZ2xlJ3MgUiBTdHlsZSBHdWlkZSAoPGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL1JndWlkZS54bWw+KSAKLSBIYWRsZXkgV2lja2hhbSdzICJBZHZhbmNlZCBSIiBTdHlsZSBHdWlkZSAoPGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL1JndWlkZS54bWw+KQotIFRoaXMgZG9jdW1lbnQgaXMgdGhlIGF1dGhvcml0eSBmb3Igb3VyIGNsYXNzIHdoZW4gdGhlIHN0eWxlIGd1aWRlcyBkaXNhZ3JlZSAoZS5nLiBvYmplY3QgbmFtaW5nKQoKPC9icj4KCiFbaHR0cHM6Ly94a2NkLmNvbS8xNTEzL10oeGtjZC1jb2RlLXF1YWxpdHkucG5nKQ==