Find the value or position of the first match
Arguments
- .x
A list or vector.
- .f
A function, specified in one of the following ways:
A named function, e.g.
mean
.An anonymous function, e.g.
\(x) x + 1
orfunction(x) x + 1
.A formula, e.g.
~ .x + 1
. You must use.x
to refer to the first argument. Only recommended if you require backward compatibility with older versions of R.A string, integer, or list, e.g.
"idx"
,1
, orlist("idx", 1)
which are shorthand for\(x) pluck(x, "idx")
,\(x) pluck(x, 1)
, and\(x) pluck(x, "idx", 1)
respectively. Optionally supply.default
to set a default value if the indexed element isNULL
or does not exist.
- ...
Additional arguments passed on to
.p
.- .dir
If
"forward"
, the default, starts at the beginning of the vector and move towards the end; if"backward"
, starts at the end of the vector and moves towards the beginning.- .right
- .default
The value returned when nothing is detected.
Value
detect
the value of the first item that matches the
predicate; detect_index
the position of the matching item.
If not found, detect
returns NULL
and detect_index
returns 0.
See also
keep()
for keeping all matching values.
Examples
is_even <- function(x) x %% 2 == 0
3:10 |> detect(is_even)
#> [1] 4
3:10 |> detect_index(is_even)
#> [1] 2
3:10 |> detect(is_even, .dir = "backward")
#> [1] 10
3:10 |> detect_index(is_even, .dir = "backward")
#> [1] 8
# Since `.f` is passed to as_mapper(), you can supply a
# lambda-formula or a pluck object:
x <- list(
list(1, foo = FALSE),
list(2, foo = TRUE),
list(3, foo = TRUE)
)
detect(x, "foo")
#> [[1]]
#> [1] 2
#>
#> $foo
#> [1] TRUE
#>
detect_index(x, "foo")
#> [1] 2
# If you need to find all values, use keep():
keep(x, "foo")
#> [[1]]
#> [[1]][[1]]
#> [1] 2
#>
#> [[1]]$foo
#> [1] TRUE
#>
#>
#> [[2]]
#> [[2]][[1]]
#> [1] 3
#>
#> [[2]]$foo
#> [1] TRUE
#>
#>
# If you need to find all positions, use map_lgl():
which(map_lgl(x, "foo"))
#> [1] 2 3