R Style and Readability
Readable Filter
Name the Predicate
A named logical vector makes a filter easier to review than a hidden condition inside brackets.
Program
Play the script to change the minimum value and see the predicate drive the filtered result.
readable_filter.R
Replay: real traced execution (multi-file project)
min_value <- 5
values <- c(2, 4, 6, 8)
is_large <- values >= min_value
selected <- values[is_large]
count <- length(selected)
label <- paste("kept", count, sep = ":")
cat(label, "\n", sep = "")
min_value <- 3
values <- c(2, 4, 6, 8)
is_large <- values >= min_value
selected <- values[is_large]
count <- length(selected)
label <- paste("kept", count, sep = ":")
cat(label, "\n", sep = "")
min_value <- 7
values <- c(2, 4, 6, 8)
is_large <- values >= min_value
selected <- values[is_large]
count <- length(selected)
label <- paste("kept", count, sep = ":")
cat(label, "\n", sep = "")
min_value ← 5
1min_value <- 52values <- c(2, 4, 6, 8)values this step5min_valuevalues ← 2, 4, 6, 8
1min_value <- 52values <- c(2, 4, 6, 8)3is_large <- values >= min_valuevalues this step2, 4, 6, 8valuesis_large ← FALSE, FALSE, TRUE, TRUE
2values <- c(2, 4, 6, 8)3is_large <- values >= min_value4selected <- values[is_large]values this stepFALSE, FALSE, TRUE, TRUEis_large2, 4, 6, 8values5min_valueselected ← 6, 8
3is_large <- values >= min_value4selected <- values[is_large]5count <- length(selected)values this step6, 8selected2, 4, 6, 8valuesFALSE, FALSE, TRUE, TRUEis_largecount ← 2
4selected <- values[is_large]5count <- length(selected)6label <- paste("kept", count, sep = ":")values this step2count6, 8selectedlabel ← kept:2
5count <- length(selected)6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")values this stepkept:2label2countcat(label, " ", sep = "")
6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")outputkept:2values this stepkept:2label
min_value ← 3
1min_value <- 32values <- c(2, 4, 6, 8)values this step3min_valuevalues ← 2, 4, 6, 8
1min_value <- 32values <- c(2, 4, 6, 8)3is_large <- values >= min_valuevalues this step2, 4, 6, 8valuesis_large ← FALSE, TRUE, TRUE, TRUE
2values <- c(2, 4, 6, 8)3is_large <- values >= min_value4selected <- values[is_large]values this stepFALSE, TRUE, TRUE, TRUEis_large2, 4, 6, 8values3min_valueselected ← 4, 6, 8
3is_large <- values >= min_value4selected <- values[is_large]5count <- length(selected)values this step4, 6, 8selected2, 4, 6, 8valuesFALSE, TRUE, TRUE, TRUEis_largecount ← 3
4selected <- values[is_large]5count <- length(selected)6label <- paste("kept", count, sep = ":")values this step3count4, 6, 8selectedlabel ← kept:3
5count <- length(selected)6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")values this stepkept:3label3countcat(label, " ", sep = "")
6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")outputkept:3values this stepkept:3label
min_value ← 7
1min_value <- 72values <- c(2, 4, 6, 8)values this step7min_valuevalues ← 2, 4, 6, 8
1min_value <- 72values <- c(2, 4, 6, 8)3is_large <- values >= min_valuevalues this step2, 4, 6, 8valuesis_large ← FALSE, FALSE, FALSE, TRUE
2values <- c(2, 4, 6, 8)3is_large <- values >= min_value4selected <- values[is_large]values this stepFALSE, FALSE, FALSE, TRUEis_large2, 4, 6, 8values7min_valueselected ← 8
3is_large <- values >= min_value4selected <- values[is_large]5count <- length(selected)values this step8selected2, 4, 6, 8valuesFALSE, FALSE, FALSE, TRUEis_largecount ← 1
4selected <- values[is_large]5count <- length(selected)6label <- paste("kept", count, sep = ":")values this step1count8selectedlabel ← kept:1
5count <- length(selected)6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")values this stepkept:1label1countcat(label, " ", sep = "")
6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")outputkept:1values this stepkept:1label
predicate name
`is_large` documents why each value is kept or dropped.
logical vector
A logical vector can filter another vector of the same length.
readable review
Naming the predicate gives reviewers an intermediate value to inspect.