r - 使用 tidy_eval/rlang 上下文将函数作为参数传递

标签 r dplyr tidyverse rlang tidyeval

我有一个函数,我想将一个函数传递给它。但是,我似乎无法使用 tidy_eval 上下文让它工作。

这里是一些数据:

df <- tribble(
  ~A, ~B,
  "hi", "hello",
  "bye", "later"
)

我希望能够像这样调用函数:

my_quoting_fn(df, A, str_detect(., pattern = "h*"))

第三个参数可以是任何不同的函数。

这是我第一次尝试编写函数:

my_quoting_fn <- function(df, col, func) {
  func <- enquo(func)
  expr <- quo_get_expr(func)

  df %>% 
    pull({{col}}) %>%
    eval(expr)

上面给出了错误:

Error in eval(., expr) : invalid 'envir' argument of type 'language'`

如果我尝试:

my_quoting_fn <- function(df, col, func) {

  df %>% 
    pull({{col}}) %>%
    {{func}}

我得到了错误

Error in stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)) : object '.' not found

最佳答案

如果您将函数作为带有波浪号 (~) 的公式传递,您可以使用 rlang::as_function()

my_quoting_fn <- function(df, col, func) {
    func = as_function(func)

    df %>%
        pull({{col}}) %>%
        func
}
my_quoting_fn(df, A, ~str_detect(., pattern = "h*"))
[1] TRUE TRUE

关于r - 使用 tidy_eval/rlang 上下文将函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57228055/

相关文章:

r - 每隔一行传播然后合并以在 dplyr 中附加行名称

r - 在 R 中使用 str_extract 在带有正则表达式的子字符串之前提取数字

r - 使用类次和数据表更新库存值

r - 删除重复的组合(与顺序无关)

r - 如何在 R 的 igraph 图中为重复值添加一行?

r - 如何整理标准水文交换格式 (SHEF) 数据

r - 为什么可以在 dplyr 辅助函数 "where"中检测到 tidyselect 辅助函数 "across"?

r - 如何用R进行汇总而不丢失额外的列信息?

r - 使用 tidyr unite 将某些选择列的列值与列名称组合

r - dplyr::case_when 可以返回 NA 和非 NA 的混合吗?