如果没有函数,这就是你如何使用dplyr
:
library(dplyr)
df %>%
select(starts_with("z_"))
您还可以创建一个函数并为变量名称传递一个字符串,如下所示:
get_var= function(df, var){
df %>%
select(starts_with(paste0(var, "_")))
}
get_var(df, "z")
现在,当您尝试传入变量名而不将其引用到函数(R 代码,而不是它包含的值)时,棘手的部分就来了。一种方法是在 Base R 中使用deparse
+ 。这会将提供的符号转换为字符串,以便以后在函数中使用:substitute
var
get_var = function(df, var){
var_quo = deparse(substitute(var))
df %>%
select(starts_with(paste0(var_quo, "_")))
}
最后,这里是如何使用enquo
和quo_name
在rlang/tidyverse
包中执行相同的操作:
library(rlang)
get_var = function(df, var){
var_quo = quo_name(enquo(var))
df %>%
select(starts_with(paste0(var_quo, "_")))
}
get_var(df, z)
get_var(df, y)
结果:
# A tibble: 1 x 2
z_1 z_2
<dbl> <dbl>
1 1 2
# A tibble: 1 × 2
y_1 y_2
<dbl> <dbl>
1 10 20
笔记:
- quosures 是跟踪环境的引用表达式。
enquo
接受一个引用函数参数的符号,引用 R 代码并将其与函数的环境捆绑在一个 quosure 中。
quo_name
将 quosure 格式化为字符串,稍后可以在函数中使用。
quo_text
类似于quo_name
但不检查输入是否为符号。
检查这些:
rlang
文件
- R中的非标准评估
?enquo
?quo_name