Создание функции dplyr, которая может определить, является ли переменная input строкой или символом - PullRequest
0 голосов
/ 08 июня 2018

Я изучал "Программирование с помощью dplyr" , потому что я хочу создавать функции, которые используют функции dplyr.Я хотел бы использовать функции, которые я делаю, как в блестящих приложениях, так и в интерактивном R.Для использования в глянце я хотел бы, чтобы эти функции принимали строковые аргументы и преобразовывали их в символы с помощью функции sym.Для использования в интерактивных сеансах я хотел бы, чтобы эти функции имели возможность не использовать строки.Поэтому функциям, которые я создаю, потребуется способ определить, являются ли определенные аргументы строками или нет.

Я нашел путь к этому.Мне просто любопытно, есть ли лучший и / или более элегантный способ сделать это.

В качестве примера я сделал простую функцию "my_summarise".Это другая версия функции "my_summarise" от виньетки.Он использует tryCatch, чтобы проверить, является ли аргумент group_var строкой.

library(dplyr)
df <- data.frame(g1 = c(1, 1, 2, 2, 2),
  g2 = c(1, 2, 1, 2, 1),
  a = c(1, 5, 4, 3, 2),
  b = c(3, 1, 2, 5, 4))

# df:

#  g1 g2 a b
#  1  1 1 3
#  1  2 5 1
#  2  1 4 2
#  2  2 3 5
#  2  1 2 4

my_summarise <- function(df, group_var) {

  is_string <- tryCatch(sym(group_var), error = function(group_var) group_var)

  if ("error" %in% class(is_string)) { 
    group_var <- enquo(group_var)      
  } else {
    group_var <- sym(group_var)   
  }

  df %>% group_by(!! group_var) %>% 
    summarise(a = mean(a))
}

my_summarise(df, g1)
# g1     a
# 1     3
# 2     3

my_summarise(df, "g1")
# g1     a
# 1     3
# 2     3

Редактировать: ответ Онямбу идеален.Я просто настроил использование нескольких функций Rlang вместо их базовых эквивалентов.

my_summarise <- function(df, group_var) {

  group_var <- enexpr(group_var)

  if(!is_symbol(group_var)) group_var <- sym(group_var) # instead of is.name and as.name you can use is.symbol and as.symbol or a mixture. 

  group_var <- enquo(group_var)      

  df %>% group_by(!! group_var) %>% 
    summarise(a = mean(a))
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Мы можем сделать это с помощью parse_expr

my_summarise <- function(df, group_var) {    


  group_var <- parse_expr(quo_name(enquo(group_var)))   

  df %>%
     group_by(!! group_var) %>% 
     summarise(a = mean(a))
}

-checking

my_summarise(df, g1)
# A tibble: 2 x 2
#     g1     a
#  <dbl> <dbl>
#1     1     3
#2     2     3

my_summarise(df, 'g1')
# A tibble: 2 x 2
#     g1     a
#  <dbl> <dbl>
#1     1     3
#2     2     3
0 голосов
/ 08 июня 2018
my_summarise <- function(df, group_var) {

  group_var <- substitute(group_var)

 if(!is.name(group_var)) group_var <- as.name(group_var) # instead of is.name and as.name you can use is.symbol and as.symbol or a mixture. 

  group_var <- enquo(group_var)      

  df %>% group_by(!! group_var) %>% 
    summarise(a = mean(a))
}

Вы также можете полностью игнорировать условие if:

my_summarise <- function(df, group_var) {

group_var<- as.name(substitute(group_var))

  group_var <- enquo(group_var)      

  df %>% group_by(!! group_var) %>% 
    summarise(a = mean(a))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...