Interactive Tables
Table Filter
Keep Matching Rows
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.
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 = "")
name ← Ada, Bo, Chen, Dia
1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)values this stepAda, Bo, Chen, Dianamescore ← 91, 84, 88, 76
1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)3min_score <- 85values this step91, 84, 88, 76scoremin_score ← 85
2score <- c(91, 84, 88, 76)3min_score <- 854keep <- score >= min_scorevalues this step85min_scorekeep ← TRUE, FALSE, TRUE, FALSE
3min_score <- 854keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")values this stepTRUE, FALSE, TRUE, FALSEkeep4 valuesscore85min_scorerows ← 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]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 rowsrowscat(label, " ", sep = "")
6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")outputAda=91,Chen=88values this stepAda=91,Chen=88label
name ← Ada, Bo, Chen, Dia
1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)values this stepAda, Bo, Chen, Dianamescore ← 91, 84, 88, 76
1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)3min_score <- 80values this step91, 84, 88, 76scoremin_score ← 80
2score <- c(91, 84, 88, 76)3min_score <- 804keep <- score >= min_scorevalues this step80min_scorekeep ← TRUE, TRUE, TRUE, FALSE
3min_score <- 804keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")values this stepTRUE, TRUE, TRUE, FALSEkeep4 valuesscore80min_scorerows ← 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]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 rowsrowscat(label, " ", sep = "")
6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")outputAda=91,Bo=84,Chen=88values this stepAda=91,Bo=84,Chen=88label
name ← Ada, Bo, Chen, Dia
1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)values this stepAda, Bo, Chen, Dianamescore ← 91, 84, 88, 76
1name <- c("Ada", "Bo", "Chen", "Dia")2score <- c(91, 84, 88, 76)3min_score <- 90values this step91, 84, 88, 76scoremin_score ← 90
2score <- c(91, 84, 88, 76)3min_score <- 904keep <- score >= min_scorevalues this step90min_scorekeep ← TRUE, FALSE, FALSE, FALSE
3min_score <- 904keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")values this stepTRUE, FALSE, FALSE, FALSEkeep4 valuesscore90min_scorerows ← Ada=91
4keep <- score >= min_score5rows <- paste(name[keep], score[keep], sep = "=")6label <- paste(rows, collapse = ",")values this stepAda=91rowsAdaname[keep]91score[keep]label ← Ada=91
5rows <- paste(name[keep], score[keep], sep = "=")6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")values this stepAda=91label1 visible rowrowscat(label, " ", sep = "")
6label <- paste(rows, collapse = ",")7cat(label, "\n", sep = "")outputAda=91values 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.