使用enquo时如何测试变量类型?
How to test variable type when using enquo?
问题
在将自定义函数传递给 dplyr
链之前,我想确保我的 enquo
自定义函数参数的类型正确。
我试过的
我能够将参数组合成 dataframe
和 然后 测试每个变量的类型。但我想知道是否有一种解决方案可以在将每种类型放入 dataframe
?
之前对其进行测试
我也试过了,没用:
my_function_if <- function(data, numeric_arg, logic_arg, chr_arg){
if(is.numeric(data$numeric_arg)){
enq_numeric <- enquo(numeric_arg)
} else {
warning("Argument \"numeric_arg\" must be numeric")
}
if(is.logical(data$logic_arg)){
enq_logic <- enquo(logic_arg)
} else {
warning("Argument \"logic_arg\" must be logical")
}
if(is.character(data$chr_arg)){
enq_chr <- enquo(chr_arg)
} else {
warning("Argument \"chr_arg\" must be of type character")
}
df <- data %>%
mutate(numeric_col2 = UQ(enq_numeric)*2,
logic_col2 = !UQ(enq_numeric),
chr_col2 = UQ(enq_chr))
return(df)
}
示例数据和示例函数
这就是我用来测试使用 enquo 评估列的一般概念的内容:
library(dplyr)
dataFrame <- data.frame(numeric_col = c(1.5:10.5),
logic_col = c(rep(T, 10)),
chr_col = c(letters[1:10]),
stringsAsFactors = FALSE)
my_function <- function(data, numeric_arg, logic_arg, chr_arg){
enq_numeric <- enquo(numeric_arg)
enq_logic <- enquo(logic_arg)
enq_chr <- enquo(chr_arg)
df <- data %>%
mutate(numeric_col2 = UQ(enq_numeric)*2,
logic_col2 = !UQ(enq_numeric),
chr_col2 = UQ(enq_chr))
return(df)
}
正确输出无任何错误:
(虽然我正在寻找更通用的解决方案,因为这是一个示例函数)
numeric_col logic_col chr_col numeric_col2 logic_col2 chr_col2
1 1.5 TRUE a 3 FALSE a
2 2.5 TRUE b 5 FALSE b
3 3.5 TRUE c 7 FALSE c
4 4.5 TRUE d 9 FALSE d
5 5.5 TRUE e 11 FALSE e
6 6.5 TRUE f 13 FALSE f
7 7.5 TRUE g 15 FALSE g
8 8.5 TRUE h 17 FALSE h
9 9.5 TRUE i 19 FALSE i
10 10.5 TRUE j 21 FALSE j
另外
我尝试在 Hadley 的许多资源、Whosebug 和其他博客中搜索此内容。但我可能只是很难知道要搜索什么。如果你能给我指出正确的方向,我总是愿意自己弄清楚。我们非常欢迎任何其他资源。
提前致谢!
我会推荐这样的东西
check_class <- function(data, q, test) {
test(rlang::eval_tidy(q, data))
}
my_function <- function(data, numeric_arg, logic_arg, chr_arg){
enq_numeric <- enquo(numeric_arg)
enq_logic <- enquo(logic_arg)
enq_chr <- enquo(chr_arg)
stopifnot(check_class(data, enq_numeric, is.numeric))
stopifnot(check_class(data, enq_logic, is.logical))
stopifnot(check_class(data, enq_chr, is.character))
df <- data %>%
mutate(numeric_col2 = UQ(enq_numeric)*2,
logic_col2 = !UQ(enq_numeric),
chr_col2 = UQ(enq_chr))
return(df)
}
我们使用rlang::eval_tidy
在data.frame的上下文中评估quosures。您真的必须评估它们,因为在评估之前您真的不知道它们中可能包含什么。然后你可以检查任何结果的class。这也允许您执行这些变量的功能。这些都有效。
my_function(dataFrame, numeric_col, logic_col, chr_col)
my_function(dataFrame, as.numeric(logic_col), logic_col, as.character(logic_col))
问题
在将自定义函数传递给 dplyr
链之前,我想确保我的 enquo
自定义函数参数的类型正确。
我试过的
我能够将参数组合成 dataframe
和 然后 测试每个变量的类型。但我想知道是否有一种解决方案可以在将每种类型放入 dataframe
?
我也试过了,没用:
my_function_if <- function(data, numeric_arg, logic_arg, chr_arg){
if(is.numeric(data$numeric_arg)){
enq_numeric <- enquo(numeric_arg)
} else {
warning("Argument \"numeric_arg\" must be numeric")
}
if(is.logical(data$logic_arg)){
enq_logic <- enquo(logic_arg)
} else {
warning("Argument \"logic_arg\" must be logical")
}
if(is.character(data$chr_arg)){
enq_chr <- enquo(chr_arg)
} else {
warning("Argument \"chr_arg\" must be of type character")
}
df <- data %>%
mutate(numeric_col2 = UQ(enq_numeric)*2,
logic_col2 = !UQ(enq_numeric),
chr_col2 = UQ(enq_chr))
return(df)
}
示例数据和示例函数
这就是我用来测试使用 enquo 评估列的一般概念的内容:
library(dplyr)
dataFrame <- data.frame(numeric_col = c(1.5:10.5),
logic_col = c(rep(T, 10)),
chr_col = c(letters[1:10]),
stringsAsFactors = FALSE)
my_function <- function(data, numeric_arg, logic_arg, chr_arg){
enq_numeric <- enquo(numeric_arg)
enq_logic <- enquo(logic_arg)
enq_chr <- enquo(chr_arg)
df <- data %>%
mutate(numeric_col2 = UQ(enq_numeric)*2,
logic_col2 = !UQ(enq_numeric),
chr_col2 = UQ(enq_chr))
return(df)
}
正确输出无任何错误: (虽然我正在寻找更通用的解决方案,因为这是一个示例函数)
numeric_col logic_col chr_col numeric_col2 logic_col2 chr_col2
1 1.5 TRUE a 3 FALSE a
2 2.5 TRUE b 5 FALSE b
3 3.5 TRUE c 7 FALSE c
4 4.5 TRUE d 9 FALSE d
5 5.5 TRUE e 11 FALSE e
6 6.5 TRUE f 13 FALSE f
7 7.5 TRUE g 15 FALSE g
8 8.5 TRUE h 17 FALSE h
9 9.5 TRUE i 19 FALSE i
10 10.5 TRUE j 21 FALSE j
另外
我尝试在 Hadley 的许多资源、Whosebug 和其他博客中搜索此内容。但我可能只是很难知道要搜索什么。如果你能给我指出正确的方向,我总是愿意自己弄清楚。我们非常欢迎任何其他资源。
提前致谢!
我会推荐这样的东西
check_class <- function(data, q, test) {
test(rlang::eval_tidy(q, data))
}
my_function <- function(data, numeric_arg, logic_arg, chr_arg){
enq_numeric <- enquo(numeric_arg)
enq_logic <- enquo(logic_arg)
enq_chr <- enquo(chr_arg)
stopifnot(check_class(data, enq_numeric, is.numeric))
stopifnot(check_class(data, enq_logic, is.logical))
stopifnot(check_class(data, enq_chr, is.character))
df <- data %>%
mutate(numeric_col2 = UQ(enq_numeric)*2,
logic_col2 = !UQ(enq_numeric),
chr_col2 = UQ(enq_chr))
return(df)
}
我们使用rlang::eval_tidy
在data.frame的上下文中评估quosures。您真的必须评估它们,因为在评估之前您真的不知道它们中可能包含什么。然后你可以检查任何结果的class。这也允许您执行这些变量的功能。这些都有效。
my_function(dataFrame, numeric_col, logic_col, chr_col)
my_function(dataFrame, as.numeric(logic_col), logic_col, as.character(logic_col))