Мне интересно написать функцию, которая возвращает фрейм данных с подмножеством по умолчанию в его строках и столбцах.
Я могу получить следующий код для работы:
library(rlang)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
default_cols <- quos(mpg, cyl, vs)
default_filters <- quos(mpg > 20, cyl == 6)
my_filter_select <- function(
filters = default_filters,
selects = default_cols
) {
mtcars %>%
filter(!!! filters) %>%
select(!!! selects)
}
my_filter_select()
#> mpg cyl vs
#> 1 21.0 6 0
#> 2 21.0 6 0
#> 3 21.4 6 1
Создан в 2020-03-19 пакетом Представить (v0.3.0)
Но добавление к значению по умолчанию кажется громоздким, поскольку мне пришлось бы использовать append(default_filters, quos(<filter-expr>))
.
Мне интересно, есть ли более простой способ сделать это.
Я попробовал следующее, передав фильтр по умолчанию и выбрав выражения в виде списка (предположительно, более простой интерфейс), и он вылетел:
library(rlang)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
default_cols <- function() list(mpg, cyl, vs)
default_filters <- function() list(mpg > 20, cyl == 6)
my_filter_select2 <- function(
filters = default_filters(),
selects = default_cols()
) {
fff <- enquos(filters)
sss <- enquos(selects)
mtcars %>%
filter(!!! filters) %>%
select(!!! selects)
}
my_filter_select2()
#> Error in default_filters(): object 'mpg' not found
Создано в 2020-03-19 пакет prex (v0.3.0)
Таким образом, цель состоит в том, чтобы каким-то образом передать списки в качестве аргументов в функцию, которая в конечном итоге будет оцениваться либо в filter
, либо select
.