Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Design of everyday functions

7ba164f40a50bc23dbb2aa825fb7bc16?s=47 Hadley Wickham
September 18, 2018

Design of everyday functions

7ba164f40a50bc23dbb2aa825fb7bc16?s=128

Hadley Wickham

September 18, 2018
Tweet

Transcript

  1. The DESIGN 
 of EVERYDAY 
 FUNCTIONS Hadley Wickham
 @hadleywickham


    RStudio September 2018
  2. Practitioner Programmer

  3. Interactive Easily detect & resolve problems Packaged In production You

    hear your code Things break and people at you Practitioner Programmer
  4. Notebook IDE https://yihui.name/en/2018/09/notebook-war/ The First Notebook War Data analyst Engineer

  5. Me You Practitioner Programmer

  6. Code is a conversation Ambiguity can be tolerated early and

    often Practitioner Programmer Implicit Explicit
  7. Practitioner Programmer Implicit Explicit

  8. What makes a good door? https://99percentinvisible.org/article/norman-doors

  9. None
  10. “When you have trouble with things—whether it’s figuring out whether

    to push or pull a door or the arbitrary vagaries of the modern computer and electronics industries—it’s not your fault. Don't blame yourself: blame the designer...” — Donald A. Norman
  11. https://twitter.com/irismwang/status/994349937944158208

  12. https://twitter.com/BrockTibert/status/1009543843690278920

  13. https://twitter.com/mattfrost/status/768078660200898560

  14. https://twitter.com/gshotwell/status/675344503566417921

  15. https://twitter.com/PetrelStation/status/1038043993387552768

  16. https://twitter.com/NateApathy/status/1030263775205707776

  17. https://twitter.com/scottmccain5/status/986275394692272129

  18. “Rule of thumb: if you think something is clever and

    sophisticated, beware — it is probably self-indulgence.” — Donald A. Norman
  19. WAT makes a bad function? https://www.destroyallsoftware.com/talks/wat

  20. c(factor("a"), factor("b")) What happens when you combine two factors?

  21. c(factor("a"), factor("b")) #> [1] 1 1 What happens when you

    combine two factors? WAT!
  22. today <- as.Date("2018-09-18") lunch <- as.POSIXct("2018-09-18 12:00", tz = "Europe/Belgrade")

    c(today, lunch) What happens when you combine a date and a date-time?
  23. today <- as.Date("2018-09-18") lunch <- as.POSIXct("2018-09-18 12:00", tz = "Europe/Belgrade")

    c(today, lunch) #> [1] "2018-09-18" #> [2] "4210927-01-24" What happens when you combine a date and a date time? WAT!
  24. today <- as.Date("2018-09-18") lunch <- as.POSIXct("2018-09-18 12:00", tz = "Europe/Belgrade")

    c(lunch, today) What happens when you combine a date and a date-time?
  25. today <- as.Date("2018-09-18") lunch <- as.POSIXct("2018-09-18 12:00", tz = "Europe/Belgrade")

    c(lunch, today) #> [1] "2018-09-18 12:00:00 CDT" #> [2] "1969-12-31 22:56:32 CST" What happens if you touch a date-time the wrong way? WAT!
  26. lunch <- as.POSIXct("2018-09-18 12:00", tz = "Europe/Belgrade") lunch #> [1]

    "2018-09-18 12:00:00 CEST" c(lunch) c(NULL, lunch) What happens if you look at a date-time the wrong way?
  27. lunch <- as.POSIXct("2018-09-18 12:00", tz = "Europe/Belgrade") lunch #> [1]

    "2018-09-18 12:00:00 CEST" c(lunch) #> [1] "2018-09-18 05:00:00 CDT" c(NULL, lunch) #> [1] 1537264800 What happens if you look at a date-time the wrong way? WAT! WAT!!
  28. What makes a good function? one aspect of ^

  29. c(<factor>, <factor>) -> <integer> c(<datetime<tz>>) -> <datetime> c(NULL, <datetime<tz>>) ->

    <double> Types can give us a high-level overview of a function I’ll put types in angle brackets to make clear that this is not real R code
  30. To do that we need to review some foundations Atomic

    Numeric Logical Integer Double Character
  31. c(<logical>, <logical>) -> <logical> c(<logical>, <integer>) -> <integer> c(<logical>, <double>)

    -> <double> c(<logical>, <character>) -> <character> c(<integer>, <logical>) -> <logical> c(<integer>, <integer>) -> <integer> c(<integer>, <double>) -> <double> c(<integer>, <character>) -> <character> c(<double>, <logical>) -> <double> c(<double>, <integer>) -> <integer> c(<double>, <double>) -> <double> c(<double>, <character>) -> <character> For atomic vectors, the rules are simple
  32. For atomic vectors, the rules are simple Logical Integer Double

    Character Logical logical integer double character Integer integer integer double character Double double double double character Character character character character character
  33. For atomic vectors, the rules are simple Logical Integer Double

    Character Even if you’re never explicitly learned this, I think you internalise it quickly.
  34. Unfortunately c() breaks down when we get to S3 vectors

    Atomic Numeric Logical Integer Double Character factor POSIXct Date S3 vectors
  35. Figuring out the rules is the goal of the vctrs

    package http://vctrs.r-lib.org
  36. mutate(<data.frame>) -> <data.frame> filter(<data.frame>) -> <data.frame> select(<data.frame>) -> <data.frame> arrange(<data.frame>)

    -> <data.frame> summarise(<data.frame>) -> <data.frame> group_by(<data.frame>) -> <grouped_df> The types of the primary dplyr functions are simple
  37. if_else(<logical>, <integer>, <integer>) -> <integer> if_else(<logical>, <double>, <double>) -> <double>

    if_else(<logical>, <integer>, <logical>) -> ??? if_else(<logical>, <integer>, <double>) -> ??? if_else(<logical>, <factor>, <character>) -> ??? if_else(<logical>, <date>, <datetime>) -> ??? But there are a few that are more complex
  38. x <- runif(6) if_else(x > 0.5, x, NA) #> Error:

    `false` must be type double, #> not logical Which leads to this annoyance
  39. x <- runif(6) if_else(x > 0.5, x, NA) #> Error:

    `false` must be type double, #> not logical if_else(x > 5, x, NA_real_) #> [1] NA 0.700 0.557 NA NA NA Which leads to this annoyance You’re currently forced to learn about the “typed” NAs
  40. if_else(<logical>, <integer>, <logical>) -> vec_c(<integer>, <logical>) -> <integer> if_else(<logical>, <factor>,

    <character>) -> vec_c(<factor>, <character>) -> <error> I think I'm starting to see the principles
  41. Fin

  42. Practitioner Programmer Implicit Explicit Interactive Easily detect & resolve problems

    Packaged In production Code is a conversation Ambiguity can be tolerated early and often
  43. https://adv-r.hadley.nz/vectors-chap.html http://vctrs.r-lib.org https://www.destroyallsoftware.com/talks/wat https://99percentinvisible.org/article/norman-doors WAT! http://bit.ly/everyday-functions