Как передать имя столбца в качестве аргумента функции, которая использует dplyr, не передавая его в виде строки? - PullRequest
0 голосов
/ 12 февраля 2020

Здесь: 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) 

Но, угадайте что, это не работает. Как заставить это работать, не используя строки? Я был бы заинтересован в результате, возможно, сделанном в базе R, если бы потребовалось столько строк кода для записи в результате в каком-то конкретном c пакете.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Пакет MASS имеет собственную функцию select(). Если вы загружаете MASS после загрузки dplyr, вы маскируете версию функции dplyr. Вы можете узнать, какую функцию выбора вы хотите:

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

not.fun(MASS::Cars93, Length)
1 голос
/ 12 февраля 2020

Вероятно, это проблема маскировки функций, как @MrFlick описал в своем посте. Если эта проблема решена, вместо enquo/!! можно использовать оператор curly-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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...