如何解决如何向使用 tidy eval 框架创建的函数添加检查?
假设我使用 tidy eval 框架创建了一个函数 -
library(tidyverse)
library(rlang)
my_function <- function(data,var){
var_expr <- enquo(var)
data %>%
group_by(!!var_expr) %>%
summarise(count = n()) %>%
ungroup()
}
当我运行下面的函数时,我得到了它下面的结果
my_function(mtcars,cyl)
# A tibble: 3 x 2
cyl count
<dbl> <int>
1 4 11
2 6 7
3 8 14
如何向该函数添加以下检查 -
- 检查
data
是否为数据框。如果不是,则返回错误data should be a dataframe
- 检查是否缺少
var
。如果是,则返回错误var is missing
解决方法
您可以进行以下修改。
- 为了检查我们的输入数据是否属于特定类,我们可以检查它的类属性,在这种情况下,它是数据框还是 tibble,它们都包含类
data.frame
- 同样对于
missing
函数,它通常在许多函数内部使用,以检查参数是否被赋值,以便它们生成一个值作为默认值。在您的情况下,我们可以终止函数的执行(您还可以检查length
函数的源代码,了解它如何在缺少size
参数时指定值) - 您可以使用
base::stop
代替亲爱的 @akrun 指定的rlang::abort
library(rlang)
my_function <- function(data,var){
if(!"data.frame" %in% attr(data,"class")) {
abort("data should be a data frame")
}
if(missing(var)) {
abort("var is missing")
}
var_expr <- enquo(var)
data %>%
group_by(!!var_expr) %>%
summarise(count = n()) %>%
ungroup()
}
特别感谢亲爱的@27 ϕ 9让我注意到这一宝贵的观点。我们还可以在 stopifnot
函数中自定义输出错误消息,这是检查输入参数的另一种方式:
my_function <- function(data,var){
stopifnot("The input data is not of class data frame" = "data.frame" %in% attr(data,"class"),"var is missing" = !missing(var))
var_expr <- enquo(var)
data %>%
group_by(!!var_expr) %>%
summarise(count = n()) %>%
ungroup()
}
特别感谢亲爱的 @IceCreamToucan 提供了另一个使用 inherits
函数代替 attr
的选项。如果输入数据的类属性中不包含 data.frame
,则返回 FALSE
:
my_function <- function(data,var){
if(!inherits(data,"data.frame")) {
stop("data is not of class data.frame")
}
if(missing(var)) {
stop("var is missing")
}
var_expr <- enquo(var)
data %>%
group_by(!!var_expr) %>%
summarise(count = n()) %>%
ungroup()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。