连接quosures和字符串

连接quosures和字符串,r,dplyr,rlang,tidyeval,R,Dplyr,Rlang,Tidyeval,我正在寻找一种方法来连接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)

我正在寻找一种方法来连接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)

df没有函数,这就是使用dplyr的方法:

library(dplyr)
df %>%
  select(starts_with("z_"))
您还可以创建一个函数并为变量名传入一个字符串,如下所示:

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

get_var(df, "z")
现在,当您试图传入变量名而不将其引用到函数中(R代码,而不是它包含的值)时,会出现棘手的部分。一种方法是将
deparse
+
substitute
放在基数R中。这会将提供给
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
#一个tible:1 x 2
z_1 z_2
1     1     2
#一个tibble:1×2
y_1 y_2
1    10    20
注意事项:

# 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
  • Quosure是跟踪环境的引用表达式
  • enquo
    获取引用函数参数的符号,引用R代码,并将其与函数环境捆绑在一起
  • quo_name
    将quosure格式化为字符串,以后可以在函数中使用
  • quo_text
    quo_name
    类似,但不检查输入是否为符号
  • 检查以下各项:

  • ?enquo
  • ?quo_名称

  • 如果您可以将变量名传递给select,我将向上投票<代码>以
    开始是我想要的方法use@CPark我懂了。所以您希望能够传递变量本身,而不是像
    “z”
    这样的字符串?例如,
    get_var(df,“z”)
    会不满意吗?顺便说一句,我不是OP。基本上OP想要定义一个函数,其中要选择的数据帧和列作为参数动态传递。@CPak My bad。这看起来更像OP想要的吗?