如何将列名作为使用dplyr的函数的参数传递,而不将其作为字符串传递?

时间:2020-02-12 15:55:36

标签: r dplyr

在这里:https://rpubs.com/hadley/dplyr-programming他们写了以下内容。

my_summarise <- function(df, group_by) {
  group_by <- enquo(group_by)
  print(group_by)

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

my_summarise(df, g1)
#> ~g1
#> # A tibble: 2 × 2
#>      g1     a
#>   <dbl> <dbl>
#> 1     1   4.5
#> 2     2   2.0

所以我尝试使用我对函数和数据的想法来复制它。

library(MASS)
not.fun <- function(data, column) {
  column <- enquo(column)
  data %>% slice(1:10) %>% select(!!column)
}

not.fun(MASS::Cars93, Length)
Error in select(., !!column) : unused argument (!!column) 

但是,您猜怎么着,它不起作用。 如何使其工作而不使用字符串? 如果要在某个特定的程序包中写入尽可能多的代码行,我会对可能在base R中完成的结果感兴趣。

2 个答案:

答案 0 :(得分:2)

MASS程序包具有自己的select()函数。如果在加载dplyr之后加载MASS,则将掩盖该功能的dplyr版本。您可能会想知道想要哪个选择功能:

library(MASS)
not.fun <- function(data, column) {
  column <- enquo(column)
  data %>% slice(1:10) %>% dplyr::select(!!column)
}

not.fun(MASS::Cars93, Length)

答案 1 :(得分:1)

@MrFlick在他的帖子中描述过,这很可能是功能屏蔽的问题。如果该问题已解决,那么也可以使用enquo/!!代替curl-curly运算符来代替{{..}}

not.fun <- function(data, column) { 
                    data %>%
                         slice(1:10) %>%
                         dplyr::select({{column}})
   }


not.fun(MASS::Cars93, Length)
#   Length
#1     177
#2     195
#3     180
#4     193
#5     186
#6     189
#7     200
#8     216
#9     198
#10    206
相关问题