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