Почему функция Tidyverse выдает ошибку при работе содержимого функции? - PullRequest
1 голос
/ 13 февраля 2020

Следующий код завершается ошибкой с сообщением об ошибке «Ошибка в .f (.x [[i]], ...): объект« область »не найден»

И все же он работает, если я вхожу в содержание функции вручную.

library(tidyverse)
df <- data.frame(
       'id'=1:10,
       'inp'=c(1,1,1,2,2,3,3,7,8,7),
       'out'=c(3,3,3,2,2,4,4,9,8,9),
       'area'=c('A','A','A','A','A','A','B','B','B','C')
      )

uniqdashc <- function(x,y) {
    x %>%
        select(y) %>%
        group_by(y) %>%
        dplyr::mutate(count=n()) %>%
        unique() %>%
        arrange(desc(count))
}
uniqdashc(df,area)

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Поскольку оно не указано в кавычках, мы можем использовать {{}} для оценки. Он выполняет тестирование enquo + !!

uniqdashc <- function(x,y) {
   x %>%
    select({{y}}) %>%
    group_by({{y}}) %>%
    dplyr::mutate(count=n()) %>%
    distinct %>%
    arrange(desc(count))
  }

uniqdashc(df, area)
# A tibble: 3 x 2
# Groups:   area [3]
#  area  count
#  <fct> <int>
#1 A         6
#2 B         3
#3 C         1

Мы показываем, почему произошла ошибка при первой публикации {{}}. Конечно, это может быть упрощено, но здесь вопрос заключается в том, почему возникает ошибка


Здесь есть еще один вариант, когда пользователь может либо передать в кавычки или без кавычек

uniqdashc <- function(x,y) {
   x %>%
      count(!! rlang::ensym(y), sort = FALSE) 
  }


uniqdashc(df, area)
# A tibble: 3 x 2
#  area      n
#  <fct> <int>
#1 A         6
#2 B         3
#3 C         1

uniqdashc(df, "area")
# A tibble: 3 x 2
#  area      n
#  <fct> <int>
#1 A         6
#2 B         3
#3 C         1
0 голосов
/ 13 февраля 2020

Вы можете попробовать нестандартную оценку, а в вашем случае код можно уменьшить до

library(dplyr)

uniqdashc <- function(x, y) x %>% count({{y}}, sort = TRUE)
uniqdashc(df, area)

# A tibble: 3 x 2
#  area      n
#  <fct> <int>
#1 A         6
#2 B         3
#3 C         1
...