A sortable table keeps row values together while changing their display order.

Program

Play the script to choose a sort mode and watch the row order change.

sort_mode
table_sort.R
Replay: real traced execution (multi-file project)
item <- c("alpha", "beta", "gamma")
count <- c(5, 12, 8)
sort_mode <- 2
mode <- c("name", "count_desc", "count_asc")[sort_mode]
order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))
rows <- paste(item[order_index], count[order_index], sep = "=")
label <- paste(rows, collapse = ",")
cat(label, "\n", sep = "")
item <- c("alpha", "beta", "gamma")
count <- c(5, 12, 8)
sort_mode <- 1
mode <- c("name", "count_desc", "count_asc")[sort_mode]
order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))
rows <- paste(item[order_index], count[order_index], sep = "=")
label <- paste(rows, collapse = ",")
cat(label, "\n", sep = "")
item <- c("alpha", "beta", "gamma")
count <- c(5, 12, 8)
sort_mode <- 3
mode <- c("name", "count_desc", "count_asc")[sort_mode]
order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))
rows <- paste(item[order_index], count[order_index], sep = "=")
label <- paste(rows, collapse = ",")
cat(label, "\n", sep = "")
  1. item ← alpha, beta, gamma

    1item <- c("alpha", "beta", "gamma")2count <- c(5, 12, 8)
    values this stepalpha, beta, gammaitem
  2. count ← 5, 12, 8

    1item <- c("alpha", "beta", "gamma")2count <- c(5, 12, 8)3sort_mode <- 2
    values this step5, 12, 8count
  3. sort_mode ← 2

    2count <- c(5, 12, 8)3sort_mode <- 24mode <- c("name", "count_desc", "count_asc")[sort_mode]
    values this step2sort_mode
  4. mode ← count_desc

    3sort_mode <- 24mode <- c("name", "count_desc", "count_asc")[sort_mode]5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))
    values this stepcount_descmode2sort_mode
  5. order_index ← 2, 3, 1

    4mode <- c("name", "count_desc", "count_asc")[sort_mode]5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))6rows <- paste(item[order_index], count[order_index], sep = "=")
    values this step2, 3, 1order_indexcount_descmode5, 12, 8count
  6. rows ← beta=12, gamma=8, alpha=5

    5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))6rows <- paste(item[order_index], count[order_index], sep = "=")7label <- paste(rows, collapse = ",")
    values this stepbeta=12, gamma=8, alpha=5rows2, 3, 1order_index
  7. label ← beta=12,gamma=8,alpha=5

    6rows <- paste(item[order_index], count[order_index], sep = "=")7label <- paste(rows, collapse = ",")8cat(label, "\n", sep = "")
    values this stepbeta=12,gamma=8,alpha=5label3 sorted rowsrows
  8. cat(label, " ", sep = "")

    7label <- paste(rows, collapse = ",")8cat(label, "\n", sep = "")
    outputbeta=12,gamma=8,alpha=5
    values this stepbeta=12,gamma=8,alpha=5label
  1. item ← alpha, beta, gamma

    1item <- c("alpha", "beta", "gamma")2count <- c(5, 12, 8)
    values this stepalpha, beta, gammaitem
  2. count ← 5, 12, 8

    1item <- c("alpha", "beta", "gamma")2count <- c(5, 12, 8)3sort_mode <- 1
    values this step5, 12, 8count
  3. sort_mode ← 1

    2count <- c(5, 12, 8)3sort_mode <- 14mode <- c("name", "count_desc", "count_asc")[sort_mode]
    values this step1sort_mode
  4. mode ← name

    3sort_mode <- 14mode <- c("name", "count_desc", "count_asc")[sort_mode]5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))
    values this stepnamemode1sort_mode
  5. order_index ← 1, 2, 3

    4mode <- c("name", "count_desc", "count_asc")[sort_mode]5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))6rows <- paste(item[order_index], count[order_index], sep = "=")
    values this step1, 2, 3order_indexnamemodealpha, beta, gammaitem
  6. rows ← alpha=5, beta=12, gamma=8

    5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))6rows <- paste(item[order_index], count[order_index], sep = "=")7label <- paste(rows, collapse = ",")
    values this stepalpha=5, beta=12, gamma=8rows1, 2, 3order_index
  7. label ← alpha=5,beta=12,gamma=8

    6rows <- paste(item[order_index], count[order_index], sep = "=")7label <- paste(rows, collapse = ",")8cat(label, "\n", sep = "")
    values this stepalpha=5,beta=12,gamma=8label3 sorted rowsrows
  8. cat(label, " ", sep = "")

    7label <- paste(rows, collapse = ",")8cat(label, "\n", sep = "")
    outputalpha=5,beta=12,gamma=8
    values this stepalpha=5,beta=12,gamma=8label
  1. item ← alpha, beta, gamma

    1item <- c("alpha", "beta", "gamma")2count <- c(5, 12, 8)
    values this stepalpha, beta, gammaitem
  2. count ← 5, 12, 8

    1item <- c("alpha", "beta", "gamma")2count <- c(5, 12, 8)3sort_mode <- 3
    values this step5, 12, 8count
  3. sort_mode ← 3

    2count <- c(5, 12, 8)3sort_mode <- 34mode <- c("name", "count_desc", "count_asc")[sort_mode]
    values this step3sort_mode
  4. mode ← count_asc

    3sort_mode <- 34mode <- c("name", "count_desc", "count_asc")[sort_mode]5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))
    values this stepcount_ascmode3sort_mode
  5. order_index ← 1, 3, 2

    4mode <- c("name", "count_desc", "count_asc")[sort_mode]5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))6rows <- paste(item[order_index], count[order_index], sep = "=")
    values this step1, 3, 2order_indexcount_ascmode5, 12, 8count
  6. rows ← alpha=5, gamma=8, beta=12

    5order_index <- switch(mode, name = order(item), count_desc = order(-count), count_asc = order(count))6rows <- paste(item[order_index], count[order_index], sep = "=")7label <- paste(rows, collapse = ",")
    values this stepalpha=5, gamma=8, beta=12rows1, 3, 2order_index
  7. label ← alpha=5,gamma=8,beta=12

    6rows <- paste(item[order_index], count[order_index], sep = "=")7label <- paste(rows, collapse = ",")8cat(label, "\n", sep = "")
    values this stepalpha=5,gamma=8,beta=12label3 sorted rowsrows
  8. cat(label, " ", sep = "")

    7label <- paste(rows, collapse = ",")8cat(label, "\n", sep = "")
    outputalpha=5,gamma=8,beta=12
    values this stepalpha=5,gamma=8,beta=12label
order `order(...)` returns row positions in sorted order.
switch `switch(mode, ...)` selects the active sort rule.
row integrity `item[order_index]` and `count[order_index]` keep columns aligned.