Как вы можете сделать tidyverse функции, которые поддерживают как кавычки, так и не кавычки аргументы? - PullRequest
5 голосов
/ 29 апреля 2020

Я знаю, как создавать функции, которые поддерживают квази-кавычку для аргумента с именем 'variable' {использование dplyr::enquo(variable) для аргументов без кавычек}} или функций, которые требуют, чтобы вы указывали аргумент {используя rlang::sym("variable")}. Есть ли простой способ сделать функции, которые поддерживают оба, заключенные в кавычки, без кавычек?

Например, dplyr::select() допускает как select(mtcars, mpg), так и select(mtcars, "mpg"). Какова лучшая практика для построения функции, которая может делать либо? Одним из соображений является влияние на маскирование данных, которое, я не уверен, нужно ли учитывать при создании более сложных функций.

Я просматривал страницы github для основных функций c dplyr, но простая функция, такая как select, основана на совершенно новом пакете (tidyselect), поэтому многое происходит. Я не видел четкого объяснения в книге оценки Tidy либо. Ниже приведена взломанная функция, которая поддерживает аргументы в кавычках и без кавычек, но это не является надежным решением. Я уверен, что есть более простой способ.

library(dplyr)

data(mtcars)

test_func <- function(variable) {
  if(nrow(count(mtcars, {{variable}})) == 1) {
    variable <- rlang::sym(variable)
  }
  count(mtcars, {{variable}})
}

all_equal(
  test_func(cyl),
  test_func("cyl")
)

1 Ответ

4 голосов
/ 29 апреля 2020

Если необходимо работать как в кавычках, так и в кавычках, используйте ensym

test_func <- function(variable) {  

    dplyr::count(mtcars, !!rlang::ensym(variable))    

  }

-testing

test_func(cyl)
#  cyl  n
#1   4 11
#2   6  7
#3   8 14
test_func('cyl')
#  cyl  n
#1   4 11
#2   6  7
#3   8 14

ПРИМЕЧАНИЕ. Лучше иметь данные также в качестве аргумента для функция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...