我正在尝试编写一个自定义函数,该函数将使用quosures作为参数连接到left_join()函数“ by = c()”部分中的参数,从而将两个数据集连接起来。
这是我目前对该函数的尝试,在“ by = c(!! left_index = !! right_index))”部分失败。left_join期望将这些参数加引号,并且用引用加引号会使!!无效。
join_by_quosure <- function(data, left_index, var_to_impute, right_index){
require(dplyr)
left_index <- enquo(left_index)
right_index <- enquo(right_index)
var_to_impute <- enquo(var_to_impute)
left_join(data,
data %>% select(!!right_index, !!var_to_impute),
by = c(!!left_index = !!right_index))
}
Run Code Online (Sandbox Code Playgroud)
我已经在下面编写了该功能如何工作的示例:
# join_by_quosure(data = mtcars, left_index = vs, var_to_impute = mpg, right_index = am)
left_join(mtcars,
mtcars %>% select(am, mpg),
by = c("vs" = "am"))
Run Code Online (Sandbox Code Playgroud)
如果有人能提供有关如何在left_join()函数的“ by = c()”部分中调用quosure的见解,我将不胜感激。
该c()函数不支持rlang bang,因此您必须采用更传统的方法来构建参数。你可以做
join_by_quosure <- function(data, left_index, var_to_impute, right_index){
require(dplyr)
left_index <- enquo(left_index)
right_index <- enquo(right_index)
var_to_impute <- enquo(var_to_impute)
by = set_names(quo_name(right_index), quo_name(left_index))
left_join(data,
data %>% select(!!right_index, !!var_to_impute),
by = by)
}
Run Code Online (Sandbox Code Playgroud)