Main event
The detect.R
file looks like this (well, I’ve
abbreviated it slightly):
#' Detect the presence or absence of a pattern in a string.
#'
#' Vectorised over `string` and `pattern`.
#'
#' @param string Input vector. Either a character vector, or something
#' coercible to one.
#' @param pattern Pattern to look for.
#'
#' @return A logical vector.
#'
#' @export
#' @examples
#' fruit <- c("apple", "banana", "pear", "pinapple")
#' str_detect(fruit, "a")
#' str_detect(fruit, "^a")
#' str_detect(fruit, "a$")
#' str_detect(fruit, "b")
#' str_detect(fruit, "[aeiou]")
str_detect <- function(string, pattern) {
switch(type(pattern),
empty = ,
bound = str_count(string, pattern) > 0,
fixed = stri_detect_fixed(string, pattern, opts_fixed = opts(pattern)),
coll = stri_detect_coll(string, pattern,
opts_collator = opts(pattern)
),
regex = stri_detect_regex(string, pattern, opts_regex = opts(pattern))
)
}
We can make the unit tests shell file for the
str_match()
function using
make_tests_shells_file()
:
This outputs a test-detect.R
file in the
tests/testthat
folder with contents
test_that("`str_detect()` works", {
fruit <- c("apple", "banana", "pear", "pinapple")
expect_equal(str_detect(fruit, "a"), )
expect_equal(str_detect(fruit, "^a"), )
expect_equal(str_detect(fruit, "a$"), )
expect_equal(str_detect(fruit, "b"), )
expect_equal(str_detect(fruit, "[aeiou]"), )
expect_equal(str_detect("aecfg", letters), )
})
which can be sensibly completed as
test_that("`str_detect()` works", {
fruit <- c("apple", "banana", "pear", "pinapple")
expect_equal(str_detect(fruit, "a"), rep(TRUE, 4))
expect_equal(str_detect(fruit, "^a"), c(TRUE, rep(FALSE, 3)))
expect_equal(str_detect(fruit, "a$"), c(FALSE, TRUE, FALSE, FALSE))
expect_equal(str_detect(fruit, "b"), c(FALSE, TRUE, FALSE, FALSE))
expect_equal(str_detect(fruit, "[aeiou]"), rep(TRUE, 4))
expect_equal(
str_detect("aecfg", letters),
letters %in% c("a", "c", "e", "f", "g")
)
})
#> Test passed 😀