为什么在函数内容工作时,tidyverse函数会出错?

时间:2020-02-13 00:53:55

标签: r dplyr tidyverse

以下代码失败,并显示错误消息“ .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 个答案:

答案 0 :(得分:1)

因为它没有被引用,所以我们可以使用{{}}进行评估。它执行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

答案 1 :(得分:0)

您可以尝试非标准评估,在这种情况下,代码可以简化为

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