I want to write a custom function that wrangles data. The function's input should be:
- data.frame object
- names of columns in the data that are relevant to what the function is going to do.
I want to program this function such that the argument specifying the column names will be as flexible as possible. Thus, I decided to use dot-dot-dot (...
).
However, I don't know how to incorporate tidyselect
's selection helpers (i.e., contains
, starts_with
, etc.)
Example
For the sake of example, let's say that I want to write a wrapper for dplyr::coalesce()
.
library(rlang)
library(dplyr)
my_coalesce_func <- function(dat, ...) {
# step 1: save `...` into cols (https://tidyeval.tidyverse.org/multiple.html)
cols <- enquos(...)
# step 2: mutate new column `new_col` that coalesces columns of interest
mutate(dat, new_col = coalesce(!!!cols))
}
# toy data
my_df <-
data.frame(
col_a = c(2, 2, 5, 5, 3),
col_b = c(NA, 4, 2, 3, 1),
col_c = c(4, 5, 3, 1, 2),
col_d = c(1, NA, 4, 2, 4),
col_e = c(3, 3, 1, 4, 5),
extra_col = 1:5
)
# run the function -- works fine when we explicitly provide column names
my_coalesce_func(dat = my_df, col_a, col_b, col_c, col_d, col_e)
#> col_a col_b col_c col_d col_e extra_col new_col
#> 1 2 NA 4 1 3 1 2
#> 2 2 4 5 NA 3 2 2
#> 3 5 2 3 4 1 3 5
#> 4 5 3 1 2 4 4 5
#> 5 3 1 2 4 5 5 3
# run the function -- fails to use a select helper
my_coalesce_func(dat = my_df, starts_with("col"))
#> Error: Problem with `mutate()` column `new_col`.
#> i `new_col = coalesce(starts_with("col"))`.
#> x `starts_with()` must be used within a *selecting* function.
#> i See <https://tidyselect.r-lib.org/reference/faq-selection-context.html>.
Created on 2021-07-01 by the reprex package (v2.0.0)
What do I need to add to my_coalesce_func()
for it to be able to run successfully
my_coalesce_func(dat = my_df, starts_with("col"))
Or any other select helper passed to ...
.
Thanks!