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.

min_value
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 = "")
  1. min_value ← 5

    1min_value <- 52values <- c(2, 4, 6, 8)
    values this step5min_value
  2. values ← 2, 4, 6, 8

    1min_value <- 52values <- c(2, 4, 6, 8)3is_large <- values >= min_value
    values this step2, 4, 6, 8values
  3. is_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_value
  4. selected ← 6, 8

    3is_large <- values >= min_value4selected <- values[is_large]5count <- length(selected)
    values this step6, 8selected2, 4, 6, 8valuesFALSE, FALSE, TRUE, TRUEis_large
  5. count ← 2

    4selected <- values[is_large]5count <- length(selected)6label <- paste("kept", count, sep = ":")
    values this step2count6, 8selected
  6. label ← kept:2

    5count <- length(selected)6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")
    values this stepkept:2label2count
  7. cat(label, " ", sep = "")

    6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")
    outputkept:2
    values this stepkept:2label
  1. min_value ← 3

    1min_value <- 32values <- c(2, 4, 6, 8)
    values this step3min_value
  2. values ← 2, 4, 6, 8

    1min_value <- 32values <- c(2, 4, 6, 8)3is_large <- values >= min_value
    values this step2, 4, 6, 8values
  3. is_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_value
  4. selected ← 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_large
  5. count ← 3

    4selected <- values[is_large]5count <- length(selected)6label <- paste("kept", count, sep = ":")
    values this step3count4, 6, 8selected
  6. label ← kept:3

    5count <- length(selected)6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")
    values this stepkept:3label3count
  7. cat(label, " ", sep = "")

    6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")
    outputkept:3
    values this stepkept:3label
  1. min_value ← 7

    1min_value <- 72values <- c(2, 4, 6, 8)
    values this step7min_value
  2. values ← 2, 4, 6, 8

    1min_value <- 72values <- c(2, 4, 6, 8)3is_large <- values >= min_value
    values this step2, 4, 6, 8values
  3. is_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_value
  4. selected ← 8

    3is_large <- values >= min_value4selected <- values[is_large]5count <- length(selected)
    values this step8selected2, 4, 6, 8valuesFALSE, FALSE, FALSE, TRUEis_large
  5. count ← 1

    4selected <- values[is_large]5count <- length(selected)6label <- paste("kept", count, sep = ":")
    values this step1count8selected
  6. label ← kept:1

    5count <- length(selected)6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")
    values this stepkept:1label1count
  7. cat(label, " ", sep = "")

    6label <- paste("kept", count, sep = ":")7cat(label, "\n", sep = "")
    outputkept:1
    values 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.