我正在学习使用tidy
评估和非标准评估进行编程,并且一直在尝试解决如何限制函数中参数的可能状态。
例如给定一个数据集:
set.seed(123)
data <- data_frame(GROUP_ONE = sample(LETTERS[1:3], 10, replace = TRUE),
GROUP_TWO = sample(letters[4:6], 10, replace = TRUE),
result = rnorm(10))
我可以创建一个函数,该函数有一个参数,我使用这样的 quosure 对数据进行分组:
my_function <- function(data, group = GROUP_ONE){
require(dplyr)
require(magrittr)
group <- enquo(group)
result <- data %>%
group_by(!!group) %>%
summarise(mean=mean(result))
return(result)
}
这就是我想要的
my_function(data)
# A tibble: 3 x 2
GROUP_ONE mean
<chr> <dbl>
1 A 1.5054975
2 B 0.2817966
3 C -0.5129904
我可以提供不同的组:
my_function(data, group = GROUP_TWO)
# A tibble: 3 x 2
GROUP_TWO mean
<chr> <dbl>
1 d -0.3308130
2 e 0.2352483
3 f 0.7347437
但是,我不能按数据中不存在的列进行分组。
例如
my_function(data, group = GROUP_THREE)
grouped_df_impl(data, unname(vars), drop) 中的错误:列
GROUP_THREE
未知
我想在函数的开头添加一个步骤,以便在 group 参数不是 GROUP_ONE 或 GROUP_TWO 时函数停止并显示自定义错误消息
就像是:
if(!group %in% c(~GROUP_ONE, ~GROUP_TWO)) stop("CUSTOM ERROR MESSAGE")
除非这不起作用,因为您显然不能将 quosures 放入向量中。应该可以以某种方式将 quosure 转换为字符串并具有字符串向量,但我不知道如何。
这是怎么做到的?