Interactive tables often filter rows from user controls. The same idea can be modeled with logical indexing.

Program

Play the script to change the minimum score and see which rows remain visible.

min_score
table_filter.R
Replay: real traced execution (multi-file project)
name <- c("Ada", "Bo", "Chen", "Dia")
score <- c(91, 84, 88, 76)
min_score <- 85
keep <- score >= min_score
rows <- paste(name[keep], score[keep], sep = "=")
label <- paste(rows, collapse = ",")
cat(label, "\n", sep = "")
name <- c("Ada", "Bo", "Chen", "Dia")
score <- c(91, 84, 88, 76)
min_score <- 80
keep <- score >= min_score
rows <- paste(name[keep], score[keep], sep = "=")
label <- paste(rows, collapse = ",")
cat(label, "\n", sep = "")
name <- c("Ada", "Bo", "Chen", "Dia")
score <- c(91, 84, 88, 76)
min_score <- 90
keep <- score >= min_score
rows <- paste(name[keep], score[keep], sep = "=")
label <- paste(rows, collapse = ",")
cat(label, "\n", sep = "")
  1. name ← Ada, Bo, Chen, Dia

    1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)
    values this stepAda, Bo, Chen, Dianame
  2. score ← 91, 84, 88, 76

    1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)3min_score <- 85
    values this step91, 84, 88, 76score
  3. min_score ← 85

    2score <- c(91, 84, 88, 76)3min_score <- 854keep <- score >= min_score
    values this step85min_score
  4. keep ← TRUE, FALSE, TRUE, FALSE

    3min_score <- 854keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")
    values this stepTRUE, FALSE, TRUE, FALSEkeep4 valuesscore85min_score
  5. rows ← Ada=91, Chen=88

    4keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")6label <- paste(rows, collapse = ",")
    values this stepAda=91, Chen=88rowsAda, Chenname[keep]91, 88score[keep]
  6. label ← Ada=91,Chen=88

    5rows <- paste(name[keep], score[keep], sep = "=")6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")
    values this stepAda=91,Chen=88label2 visible rowsrows
  7. cat(label, " ", sep = "")

    6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")
    outputAda=91,Chen=88
    values this stepAda=91,Chen=88label
  1. name ← Ada, Bo, Chen, Dia

    1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)
    values this stepAda, Bo, Chen, Dianame
  2. score ← 91, 84, 88, 76

    1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)3min_score <- 80
    values this step91, 84, 88, 76score
  3. min_score ← 80

    2score <- c(91, 84, 88, 76)3min_score <- 804keep <- score >= min_score
    values this step80min_score
  4. keep ← TRUE, TRUE, TRUE, FALSE

    3min_score <- 804keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")
    values this stepTRUE, TRUE, TRUE, FALSEkeep4 valuesscore80min_score
  5. rows ← Ada=91, Bo=84, Chen=88

    4keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")6label <- paste(rows, collapse = ",")
    values this stepAda=91, Bo=84, Chen=88rowsAda, Bo, Chenname[keep]91, 84, 88score[keep]
  6. label ← Ada=91,Bo=84,Chen=88

    5rows <- paste(name[keep], score[keep], sep = "=")6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")
    values this stepAda=91,Bo=84,Chen=88label3 visible rowsrows
  7. cat(label, " ", sep = "")

    6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")
    outputAda=91,Bo=84,Chen=88
    values this stepAda=91,Bo=84,Chen=88label
  1. name ← Ada, Bo, Chen, Dia

    1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)
    values this stepAda, Bo, Chen, Dianame
  2. score ← 91, 84, 88, 76

    1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)3min_score <- 90
    values this step91, 84, 88, 76score
  3. min_score ← 90

    2score <- c(91, 84, 88, 76)3min_score <- 904keep <- score >= min_score
    values this step90min_score
  4. keep ← TRUE, FALSE, FALSE, FALSE

    3min_score <- 904keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")
    values this stepTRUE, FALSE, FALSE, FALSEkeep4 valuesscore90min_score
  5. rows ← Ada=91

    4keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")6label <- paste(rows, collapse = ",")
    values this stepAda=91rowsAdaname[keep]91score[keep]
  6. label ← Ada=91

    5rows <- paste(name[keep], score[keep], sep = "=")6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")
    values this stepAda=91label1 visible rowrows
  7. cat(label, " ", sep = "")

    6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")
    outputAda=91
    values this stepAda=91label
logical filter `score >= min_score` creates one keep/drop value per row.
row subset `name[keep]` keeps names whose score passed the filter.
display row `paste(name[keep], score[keep], sep = "=")` formats visible rows.