The goal of STM is to provide the readers of the Strength Training Manual a list of functions to help them re-create set and rep schemes as well as to create their own in reproducible and open-source environment.

Installation

You can install the released version (once released) of STM from CRAN with:

And the development version from GitHub with:

# install.packages("devtools")
devtools::install_github("mladenjovanovic/STM")

Examples

This is a quick example, more are coming….

Progression tables

Strength Training Manual comes with two progression table implemented in RIR_increment and perc_drop functions, although there are fixed variants (and you can easily make your own).

To visualize these progression tables, we need to write a simple plot function:

require(tidyverse)
require(ggstance)
require(STM)

plot_progression_table <- function(progression_table = RIR_increment) {
  progression_tbl <- generate_progression_table(
    progression_table = progression_table)
  
  progression_tbl <- progression_tbl %>%
    mutate(
      volume = factor(
        volume,
        levels = c("intensive", "normal", "extensive")
      ),
      type = factor(
        type,
        levels = c("grinding", "ballistic")
      ),
      reps = factor(reps),
      step = factor(step),
      perc_1RM = signif(perc_1RM * 100, 2),
      adjustment = signif(adjustment, 2)
    )
  
  gg_perc_1RM <- ggplot(progression_tbl, aes(x = step, y = reps)) +
    theme_linedraw() +
    #geom_tile(fill = "transparent", color = "black") + 
    geom_text(aes(label = perc_1RM)) +
    facet_grid(type~volume) +
    scale_y_discrete(limits = rev(levels(progression_tbl$reps))) +
    theme(
      legend.position = "none",
      axis.title = element_blank(),
      #axis.text = element_blank(),
      axis.ticks = element_blank(),
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank()
    ) +
    xlab(NULL) +
    ylab(NULL) +
    ggtitle("%1RM")
  
  gg_adj <- ggplot(progression_tbl, aes(x = step, y = reps)) +
    theme_linedraw() +
    #geom_tile(fill = "transparent", color = "black") + 
    geom_text(aes(label = adjustment)) +
    facet_grid(type~volume) +
    scale_y_discrete(limits = rev(levels(progression_tbl$reps))) +
    theme(
      legend.position = "none",
      axis.title = element_blank(),
      #axis.text = element_blank(),
      axis.ticks = element_blank(),
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank()
    ) +
    xlab(NULL) +
    ylab(NULL) +
    ggtitle("Adjustment", "RIR Increment or Percent Drop")
  
  list(
    `%1RM` = gg_perc_1RM,
    `Adjustment` = gg_adj
  )
}

Here is the table of the RIR_increment:

plot_progression_table(RIR_increment)$`%1RM`

And table of the perc_drop:

plot_progression_table(perc_drop)$`%1RM`

Set and Rep schemes

Strength Training Manual comes with more than 2,000 set and rep schemes. STM package allows re-creation of those schemes, but also creation of custom ones.

To make these schemes more visual, we need to write a plotting function.

# Plot scheme function
plot_scheme <- function(scheme, label_size = 3) {
  # Reorganize the data
  scheme <- scheme %>%
    group_by(index) %>%
    mutate(
      set = row_number(),
      adjustment = signif(adjustment, 2),
      perc_1RM = signif(perc_1RM * 100, 2),
      index = paste0("Week ", index)
    ) %>%
    rename(
      Reps = reps,
      Adjustment = adjustment,
      `%1RM` = perc_1RM
    ) %>%
    pivot_longer(cols = c("Reps", "Adjustment", "%1RM"), names_to = "param") %>%
    mutate(
      param = factor(param, levels = c("Reps", "Adjustment", "%1RM")),
      hjust = ifelse(value < 0, -0.5, 1.5))

  # Plot
  ggplot(scheme, aes(x = value, y = set, fill = param)) +
    theme_linedraw() +
    geom_barh(stat = "identity") +
    geom_text(aes(label = value, hjust = hjust), size = label_size) +
    facet_grid(index ~ param, scales = "free_x") +
    scale_y_reverse() +
    theme(
      legend.position = "none",
      axis.title = element_blank(),
      axis.text = element_blank(),
      axis.ticks = element_blank(),
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank()
    ) +
    scale_fill_brewer(palette = "Accent") +
    xlab(NULL) +
    ylab(NULL)
}

Here is an example for the Wave Set and Rep Scheme

# Wave set and rep scheme
scheme <- scheme_wave(
  reps = c(10, 8, 6, 10, 8, 6),
  # Adjusting sets to use lower %1RM (RIR Inc method used, so RIR adjusted)
  adjustment = c(4, 2, 0, 6, 4, 2),
  vertical_planning = vertical_linear,
  vertical_planning_control = list(reps_change = c(0, -2, -4)),
  progression_table = RIR_increment,
  progression_table_control = list(volume = "extensive")
)

plot_scheme(scheme)

Example of Set Accumulation Wave Scheme

scheme <- scheme_wave(
  reps = c(10, 8, 6),
  # Needed to remove default scheme_wave adjustment
  adjustment = 0,
  vertical_planning = vertical_set_accumulation,
  vertical_planning_control = list(accumulate_rep = c(1, 2, 3)),
  # Custom progression table
  progression_table = perc_drop_fixed_5,
  progression_table_control = list(volume = "extensive"))

plot_scheme(scheme, label_size = 2.5)