The functions map_if() and map_at() take .x as input, apply
the function .f to some of the elements of .x, and return a
list of the same length as the input.
map_if()takes a predicate function.pas input to determine which elements of.xare transformed with.f.map_at()takes a vector of names or positions.atto specify which elements of.xare transformed with.f.
Usage
map_if(.x, .p, .f, ..., .else = NULL, .progress = FALSE)
map_at(.x, .at, .f, ..., .progress = FALSE)Arguments
- .x
A list or atomic vector.
- .p
A predicate function specified in one of the following ways:
A named function, e.g.
is.character.An anonymous function, e.g.
\(x) all(x < 0)orfunction(x) all(x < 0).A logical vector of the same length as
.x.A string, if the elements of
.xare themselves lists of objects, giving the name of a logical element in the inner lists.
Only those elements where
.pevaluates toTRUEwill be modified.Wrap a function with
in_parallel()to declare that it should be performed in parallel. Seein_parallel()for more details. Use of...is not permitted in this context.- .f
A function, specified in one of the following ways:
A named function, e.g.
mean.An anonymous function, e.g.
\(x) x + 1orfunction(x) x + 1.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.defaultto set a default value if the indexed element isNULLor does not exist.
Wrap a function with
in_parallel()to declare that it should be performed in parallel. Seein_parallel()for more details. Use of...is not permitted in this context.- ...
Additional arguments passed on to the mapped function.
We now generally recommend against using
...to pass additional (constant) arguments to.f. Instead use a shorthand anonymous function:This makes it easier to understand which arguments belong to which function and will tend to yield better error messages.
- .else
A function applied to elements of
.xfor which.preturnsFALSE.- .progress
Whether to show a progress bar. Use
TRUEto turn on a basic progress bar, use a string to give it a name, or see progress_bars for more details.- .at
A logical, integer, or character vector giving the elements to select. Alternatively, a function that takes a vector of names, and returns a logical, integer, or character vector of elements to select.
Examples
# Use a predicate function to decide whether to map a function:
iris |> map_if(is.factor, as.character) |> str()
#> List of 5
#> $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#> $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#> $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#> $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#> $ Species : chr [1:150] "setosa" "setosa" "setosa" "setosa" ...
# Specify an alternative with the `.else` argument:
iris |> map_if(is.factor, as.character, .else = as.integer) |> str()
#> List of 5
#> $ Sepal.Length: int [1:150] 5 4 4 4 5 5 4 5 4 4 ...
#> $ Sepal.Width : int [1:150] 3 3 3 3 3 3 3 3 2 3 ...
#> $ Petal.Length: int [1:150] 1 1 1 1 1 1 1 1 1 1 ...
#> $ Petal.Width : int [1:150] 0 0 0 0 0 0 0 0 0 0 ...
#> $ Species : chr [1:150] "setosa" "setosa" "setosa" "setosa" ...
# Use numeric vector of positions select elements to change:
iris |> map_at(c(4, 5), is.numeric) |> str()
#> List of 5
#> $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#> $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#> $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#> $ Petal.Width : logi TRUE
#> $ Species : logi FALSE
# Use vector of names to specify which elements to change:
iris |> map_at("Species", toupper) |> str()
#> List of 5
#> $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#> $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#> $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#> $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#> $ Species : chr [1:150] "SETOSA" "SETOSA" "SETOSA" "SETOSA" ...
