Comparisons over vectors produce logical masks. Those masks keep the values that match a condition.

Program

Play the script to see passing scores selected from a longer vector.

logical_filters.R
Replay: real traced execution (multi-file project)
scores <- c(65, 82, 91, 74)
passed <- scores >= 80
selected <- scores[passed]
cat(paste(selected, collapse = ","), "\n", sep = "")
  1. scores ← 65, 82, 91, 74

    1scores <- c(65, 82, 91, 74)2passed <- scores >= 80
    values this step65, 82, 91, 74scores
  2. passed ← FALSE, TRUE, TRUE, FALSE

    1scores <- c(65, 82, 91, 74)2passed <- scores >= 803selected <- scores[passed]
    values this stepFALSE, TRUE, TRUE, FALSEpassed65, 82, 91, 74scores
  3. selected ← 82, 91

    2passed <- scores >= 803selected <- scores[passed]4cat(paste(selected, collapse = ","), "\n", sep = "")
    values this step82, 91selectedFALSE, TRUE, TRUE, FALSEpassed
  4. cat(paste(selected, collapse = ","), " ", sep = "")

    3selected <- scores[passed]4cat(paste(selected, collapse = ","), "\n", sep = "")
    output82,91
    values this step82, 91selected

Follow the Filter

  1. scores starts as 65, 82, 91, and 74.
  2. scores >= 80 checks each value.
  3. passed becomes FALSE, TRUE, TRUE, FALSE.
  4. scores[passed] keeps 82 and 91.
  5. The script prints 82,91. | score | passed? | selected? | | --- | --- | --- | | 65 | FALSE | no | | 82 | TRUE | yes | | 91 | TRUE | yes | | 74 | FALSE | no |
comparison `scores >= 80` compares every score at once.
filter `scores[passed]` keeps positions where `passed` is `TRUE`.
collapse `paste(..., collapse = ",")` joins many values into one string.

Exercise: logical_filters.R

Reproduce 82,91, then identify the two TRUE positions that selected those scores.