将 exec() 与使用 summarize with curly-curly 的函数一起使用

Use exec() with a function that uses summarise with curly-curly

我正在尝试 运行 使用 exec() 这个函数。我有一个使用 rlang::expr 然后 !! 的解决方法,但这意味着更改函数以接受表达式作为参数而不是引用变量。有没有办法在不失去传递引用参数的能力的情况下调用这个函数?

library(tidyverse)

calc_mean <- function(df, col) {
  df %>%
    summarise(mean({{ col }}))
}

#doesn't work
map(list('calc_mean'), ~exec(.x, df = mtcars, col = mpg))
#> Warning in mean.default(~structure(list(manufacturer = c("audi", "audi", :
#> argument is not numeric or logical: returning NA
#> [[1]]
#>   mean(...)
#> 1        NA

reprex package (v2.0.1)

于 2022-01-15 创建

我的预期输出与在 exec 外部调用函数相同:

calc_mean(mtcars, mpg)
#>   mean(mpg)
#> 1  20.09062

我想你想要遍历一个函数名列表,这只是一个最小的例子(否则就不需要 map)。

我们可以使用基数 R do.call,但我们必须 quote 参数并将它们放入列表中:

library(tidyverse)

calc_mean <- function(df, col) {
  df %>%
    summarise(mean({{ col }}))
}

map(list("calc_mean"), ~ do.call(.x, list(df = quote(mtcars), col = quote(mpg))))
#> [[1]]
#>   mean(mpg)
#> 1  20.09062

另一种可能的方法是使用 getmget(如果你有一个函数名称向量)然后我们可以做一些疯狂的事情。我们只是在您的 lambda 函数中调用 .x 作为函数。不需要 listquote。最好指定 getenvir 参数,我在下面的最小示例中跳过了它:

map(list(get("calc_mean")), ~ .x(df = mtcars, col = mpg))

#> [[1]]
#>   mean(mpg)
#> 1  20.09062

reprex package (v0.3.0)

创建于 2022-01-15