1 Programming with functions

1.1 ⭐️Overview

The basic question I asked while developing tabler was how do you pass a function as an argument to another function.

This chapter still needs a lot of work.

1.2 🌎Useful websites

1.3 📦Load packages

library(dplyr, warn.conflicts = FALSE)

1.4 🔢Simulate data

Here we simulate a small dataset that is intended to be representative of data from a research study.

set.seed(123)
study <- tibble(
  id     = as.character(seq(1001, 1020, 1)),
  sex    = factor(sample(c("Female", "Male"), 20, TRUE)),
  date   = sample(seq.Date(as.Date("2021-09-15"), as.Date("2021-10-26"), "day"), 20, TRUE),
  days   = sample(1L:21L, 20L, TRUE),
  height = rnorm(20, 71, 10)
)

# Add missing values for testing
study$id[3] <- NA
study$sex[4] <- NA
study$date[5] <- NA
study$days[6] <- NA
study$height[7] <- NA

1.5 Examples

This needs to be cleaned up. I’m just in a rush.

# Function passed to a function?
fn_number <- function(x) {
  x
}

fn_number(3)
## [1] 3
fn_sum <- function(n, fn) {
  1 + fn(n)
}

fn_sum(3, fn_number)
## [1] 4
lapply2 <- function(x, f, ...) {
  out <- vector("list", length(x))
  for (i in seq_along(x)) {
    out[[i]] <- f(x[[i]], ...)
  }
  out
}

lapply2(select(study, days, height), mean)
## [[1]]
## [1] NA
## 
## [[2]]
## [1] NA
lapply2(select(study, days, height), mean, na.rm = TRUE)
## [[1]]
## [1] 12.05263
## 
## [[2]]
## [1] 72.33294
# How do I make this work like purrr, dplyr, etc.
lapply2(select(study, days, height), ~ mean(.x, na.rm = TRUE))
## Error in f(x[[i]], ...): could not find function "f"