suppressPackageStartupMessages(library("tidyverse"))
package 㤼㸱tidyverse㤼㸲 was built under R version 3.6.3

1. Read the source code for each of the following three functions, puzzle out what they do, and then brainstorm better names.

f1 <- function(string, prefix) {
  substr(string, 1, nchar(prefix)) == prefix
}

f2 <- function(x) {
  if (length(x) <= 1) {
    return(NULL)
  }
  x[-length(x)]
}

f3 <- function(x, y) {
  rep(y, length.out = length(x))
}

The function f1 tests whether each element of the character vector nchar starts with the string prefix. For example,

f1(c("abc", "abcde", "ad"), "ab")
[1]  TRUE  TRUE FALSE

A better name for f1 is has_prefix()

The function f2 drops the last element of the vector x.

f2(1:3)
[1] 1 2
f2(1:2)
[1] 1
f2(1)
NULL

A better name for f2 is drop_last().

The function f3 repeats y once for each element of x.

f3(1:3, 4)
[1] 4 4 4

Good names would include recycle() (R’s name for this behavior) or expand().

2. Take a function that you’ve written recently and spend 5 minutes brainstorming a better name for it and its arguments.

3. Compare and contrast rnorm() and MASS::mvrnorm(). How could you make them more consistent?

rnorm() samples from the univariate normal distribution, while MASS::mvrnorm samples from the multivariate normal distribution. The main arguments in rnorm() are n, mean, sd. The main arguments is MASS::mvrnorm are n, mu, Sigma. To be consistent they should have the same names. However, this is difficult. In general, it is better to be consistent with more widely used functions, e.g. rmvnorm() should follow the conventions of rnorm(). However, while mean is correct in the multivariate case, sd does not make sense in the multivariate case. However, both functions are internally consistent. It would not be good practice to have mu and sd as arguments or mean and Sigma as arguments.

4. Make a case for why norm_r(), norm_d() etc would be better than rnorm(), dnorm(). Make a case for the opposite.

If named norm_r() and norm_d(), the naming convention groups functions by their distribution.

If named rnorm(), and dnorm(), the naming convention groups functions by the action they perform.

  • r* functions always sample from distributions: for example, rnorm(), rbinom(), runif(), and rexp().
  • d* functions calculate the probability density or mass of a distribution: For example, dnorm(), dbinom(), dunif(), and dexp().

R distributions use this latter naming convention.

LS0tDQp0aXRsZTogIkZ1bmN0aW9ucyBhcmUgZm9yIGh1bWFucyBhbmQgY29tcHV0ZXJzIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCi0tLQ0KDQpgYGB7cn0NCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KCJ0aWR5dmVyc2UiKSkNCmBgYA0KDQojIyMgMS4gUmVhZCB0aGUgc291cmNlIGNvZGUgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMsIHB1enpsZSBvdXQgd2hhdCB0aGV5IGRvLCBhbmQgdGhlbiBicmFpbnN0b3JtIGJldHRlciBuYW1lcy4NCg0KYGBge3J9DQpmMSA8LSBmdW5jdGlvbihzdHJpbmcsIHByZWZpeCkgew0KICBzdWJzdHIoc3RyaW5nLCAxLCBuY2hhcihwcmVmaXgpKSA9PSBwcmVmaXgNCn0NCg0KZjIgPC0gZnVuY3Rpb24oeCkgew0KICBpZiAobGVuZ3RoKHgpIDw9IDEpIHsNCiAgICByZXR1cm4oTlVMTCkNCiAgfQ0KICB4Wy1sZW5ndGgoeCldDQp9DQoNCmYzIDwtIGZ1bmN0aW9uKHgsIHkpIHsNCiAgcmVwKHksIGxlbmd0aC5vdXQgPSBsZW5ndGgoeCkpDQp9DQpgYGANCg0KVGhlIGZ1bmN0aW9uIGBmMWAgdGVzdHMgd2hldGhlciBlYWNoIGVsZW1lbnQgb2YgdGhlIGNoYXJhY3RlciB2ZWN0b3IgbmNoYXIgc3RhcnRzIHdpdGggdGhlIHN0cmluZyBgcHJlZml4YC4gRm9yIGV4YW1wbGUsDQoNCmBgYHtyfQ0KZjEoYygiYWJjIiwgImFiY2RlIiwgImFkIiksICJhYiIpDQpgYGANCg0KQSBiZXR0ZXIgbmFtZSBmb3IgYGYxYCBpcyBgaGFzX3ByZWZpeCgpYA0KDQpUaGUgZnVuY3Rpb24gYGYyYCBkcm9wcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSB2ZWN0b3IgYHhgLg0KDQpgYGB7cn0NCmYyKDE6MykNCmYyKDE6MikNCmYyKDEpDQpgYGANCg0KQSBiZXR0ZXIgbmFtZSBmb3IgYGYyYCBpcyBgZHJvcF9sYXN0KClgLg0KDQpUaGUgZnVuY3Rpb24gYGYzYCByZXBlYXRzIGB5YCBvbmNlIGZvciBlYWNoIGVsZW1lbnQgb2YgYHhgLg0KDQpgYGB7cn0NCmYzKDE6MywgNCkNCmBgYA0KDQpHb29kIG5hbWVzIHdvdWxkIGluY2x1ZGUgYHJlY3ljbGUoKWAgKFLigJlzIG5hbWUgZm9yIHRoaXMgYmVoYXZpb3IpIG9yIGBleHBhbmQoKWAuDQoNCiMjIyAyLiBUYWtlIGEgZnVuY3Rpb24gdGhhdCB5b3XigJl2ZSB3cml0dGVuIHJlY2VudGx5IGFuZCBzcGVuZCA1IG1pbnV0ZXMgYnJhaW5zdG9ybWluZyBhIGJldHRlciBuYW1lIGZvciBpdCBhbmQgaXRzIGFyZ3VtZW50cy4NCg0KDQojIyMgMy4gQ29tcGFyZSBhbmQgY29udHJhc3QgYHJub3JtKClgIGFuZCBgTUFTUzo6bXZybm9ybSgpYC4gSG93IGNvdWxkIHlvdSBtYWtlIHRoZW0gbW9yZSBjb25zaXN0ZW50Pw0KDQpgcm5vcm0oKWAgc2FtcGxlcyBmcm9tIHRoZSB1bml2YXJpYXRlIG5vcm1hbCBkaXN0cmlidXRpb24sIHdoaWxlIGBNQVNTOjptdnJub3JtYCBzYW1wbGVzIGZyb20gdGhlIG11bHRpdmFyaWF0ZSBub3JtYWwgZGlzdHJpYnV0aW9uLiBUaGUgbWFpbiBhcmd1bWVudHMgaW4gYHJub3JtKClgIGFyZSBgbmAsIGBtZWFuYCwgYHNkYC4gVGhlIG1haW4gYXJndW1lbnRzIGlzIGBNQVNTOjptdnJub3JtYCBhcmUgYG5gLCBgbXVgLCBgU2lnbWFgLiBUbyBiZSBjb25zaXN0ZW50IHRoZXkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbmFtZXMuIEhvd2V2ZXIsIHRoaXMgaXMgZGlmZmljdWx0LiBJbiBnZW5lcmFsLCBpdCBpcyBiZXR0ZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoIG1vcmUgd2lkZWx5IHVzZWQgZnVuY3Rpb25zLCBlLmcuIGBybXZub3JtKClgIHNob3VsZCBmb2xsb3cgdGhlIGNvbnZlbnRpb25zIG9mIGBybm9ybSgpYC4gSG93ZXZlciwgd2hpbGUgYG1lYW5gIGlzIGNvcnJlY3QgaW4gdGhlIG11bHRpdmFyaWF0ZSBjYXNlLCBgc2RgIGRvZXMgbm90IG1ha2Ugc2Vuc2UgaW4gdGhlIG11bHRpdmFyaWF0ZSBjYXNlLiBIb3dldmVyLCBib3RoIGZ1bmN0aW9ucyBhcmUgaW50ZXJuYWxseSBjb25zaXN0ZW50LiBJdCB3b3VsZCBub3QgYmUgZ29vZCBwcmFjdGljZSB0byBoYXZlIGBtdWAgYW5kIGBzZGAgYXMgYXJndW1lbnRzIG9yIGBtZWFuYCBhbmQgYFNpZ21hYCBhcyBhcmd1bWVudHMuDQoNCiMjIyA0LiBNYWtlIGEgY2FzZSBmb3Igd2h5IGBub3JtX3IoKWAsIGBub3JtX2QoKWAgZXRjIHdvdWxkIGJlIGJldHRlciB0aGFuIGBybm9ybSgpYCwgYGRub3JtKClgLiBNYWtlIGEgY2FzZSBmb3IgdGhlIG9wcG9zaXRlLg0KDQpJZiBuYW1lZCBgbm9ybV9yKClgIGFuZCBgbm9ybV9kKClgLCB0aGUgbmFtaW5nIGNvbnZlbnRpb24gZ3JvdXBzIGZ1bmN0aW9ucyBieSB0aGVpciBkaXN0cmlidXRpb24uDQoNCklmIG5hbWVkIGBybm9ybSgpYCwgYW5kIGBkbm9ybSgpYCwgdGhlIG5hbWluZyBjb252ZW50aW9uIGdyb3VwcyBmdW5jdGlvbnMgYnkgdGhlIGFjdGlvbiB0aGV5IHBlcmZvcm0uDQoNCiAtIGByKmAgZnVuY3Rpb25zIGFsd2F5cyBzYW1wbGUgZnJvbSBkaXN0cmlidXRpb25zOiBmb3IgZXhhbXBsZSwgYHJub3JtKClgLCBgcmJpbm9tKClgLCBgcnVuaWYoKWAsIGFuZCBgcmV4cCgpYC4NCiAtIGBkKmAgZnVuY3Rpb25zIGNhbGN1bGF0ZSB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBvciBtYXNzIG9mIGEgZGlzdHJpYnV0aW9uOiBGb3IgZXhhbXBsZSwgYGRub3JtKClgLCBgZGJpbm9tKClgLCBgZHVuaWYoKWAsIGFuZCBgZGV4cCgpYC4NCg0KUiBkaXN0cmlidXRpb25zIHVzZSB0aGlzIGxhdHRlciBuYW1pbmcgY29udmVudGlvbi4=