连接quosures和字符串
concatenate quosures and string
我正在寻找一种方法来连接一个 quosure 和一个结果为 quosure 的字符串。实际上,如果我使用paste0()
和quo_name()
,我就可以做到。但我想知道是否有更优雅的替代方法来在我的包中编写一个函数。这是一个通用示例:
library(dplyr)
df <- data_frame(
z_1 = 1,
z_2 = 2,
y_1 = 10,
y_2 = 20
)
get_var <- function(.data, var) {
xx = enquo(var)
select(.data, paste0(quo_name(xx), "_1"), paste0(quo_name(xx), "_2"))
}
get_var(df, z)
# A tibble: 1 x 2
z_1 z_2
<dbl> <dbl>
1 1 2
没有函数,这就是你如何使用 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, "_")))
}
最后,这里是如何对 rlang/tidyverse
包中的 enquo
和 quo_name
做同样的事情:
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 代码并将其与函数的环境捆绑在一起。
quo_name
将一个quosure格式化为一个字符串,可以在后面的函数中使用。
quo_text
类似于 quo_name
但不检查输入是否为符号。
检查这些:
rlang
documentation
- Non-Standard Evaluation in R
?enquo
?quo_name
我正在寻找一种方法来连接一个 quosure 和一个结果为 quosure 的字符串。实际上,如果我使用paste0()
和quo_name()
,我就可以做到。但我想知道是否有更优雅的替代方法来在我的包中编写一个函数。这是一个通用示例:
library(dplyr)
df <- data_frame(
z_1 = 1,
z_2 = 2,
y_1 = 10,
y_2 = 20
)
get_var <- function(.data, var) {
xx = enquo(var)
select(.data, paste0(quo_name(xx), "_1"), paste0(quo_name(xx), "_2"))
}
get_var(df, z)
# A tibble: 1 x 2
z_1 z_2
<dbl> <dbl>
1 1 2
没有函数,这就是你如何使用 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, "_")))
}
最后,这里是如何对 rlang/tidyverse
包中的 enquo
和 quo_name
做同样的事情:
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 代码并将其与函数的环境捆绑在一起。quo_name
将一个quosure格式化为一个字符串,可以在后面的函数中使用。quo_text
类似于quo_name
但不检查输入是否为符号。
检查这些:
rlang
documentation- Non-Standard Evaluation in R
?enquo
?quo_name