3

我正在寻找一种连接 quosure 和结果为 quosure 的字符串的方法。实际上,如果我使用paste0()and 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
4

1 回答 1

3

如果没有函数,这就是你如何使用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+ 。这会将提供的符号转换为字符串,以便以后在函数中使用:substitutevar

get_var = function(df, var){
  var_quo = deparse(substitute(var))
  df %>%
    select(starts_with(paste0(var_quo, "_")))
}

最后,这里是如何使用enquoquo_namerlang/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

笔记:

  1. quosures 是跟踪环境的引用表达式。
  2. enquo接受一个引用函数参数的符号,引用 R 代码并将其与函数的环境捆绑在一个 quosure 中。
  3. quo_name将 quosure 格式化为字符串,稍后可以在函数中使用。
  4. quo_text类似于quo_name但不检查输入是否为符号。

检查这些:

  1. rlang文件
  2. R中的非标准评估
  3. ?enquo
  4. ?quo_name
于 2017-09-13T21:03:49.780 回答